diff --git a/_build/html/v0.0.10/.buildinfo b/_build/html/v0.0.10/.buildinfo new file mode 100644 index 000000000..a5a3eecc6 --- /dev/null +++ b/_build/html/v0.0.10/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: b75ee6c592f4416888987109785aeaa6 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/v0.0.10/.doctrees/acknowledgements.doctree b/_build/html/v0.0.10/.doctrees/acknowledgements.doctree new file mode 100644 index 000000000..c7813a3dd Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/acknowledgements.doctree differ diff --git a/_build/html/v0.0.10/.doctrees/changelog.doctree b/_build/html/v0.0.10/.doctrees/changelog.doctree new file mode 100644 index 000000000..8f84795c3 Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/changelog.doctree differ diff --git a/_build/html/v0.0.10/.doctrees/citations.doctree b/_build/html/v0.0.10/.doctrees/citations.doctree new file mode 100644 index 000000000..9f9719d6a Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/citations.doctree differ diff --git a/_build/html/v0.0.10/.doctrees/contributors.doctree b/_build/html/v0.0.10/.doctrees/contributors.doctree new file mode 100644 index 000000000..a0da0ed69 Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/contributors.doctree differ diff --git a/_build/html/v0.0.10/.doctrees/data_management.doctree b/_build/html/v0.0.10/.doctrees/data_management.doctree new file mode 100644 index 000000000..51c9e992d Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/data_management.doctree differ diff --git a/_build/html/v0.0.10/.doctrees/eda_plots.doctree b/_build/html/v0.0.10/.doctrees/eda_plots.doctree new file mode 100644 index 000000000..9fa23699f Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/eda_plots.doctree differ diff --git a/_build/html/v0.0.10/.doctrees/environment.pickle b/_build/html/v0.0.10/.doctrees/environment.pickle new file mode 100644 index 000000000..096e3c9b3 Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/environment.pickle differ diff --git a/_build/html/v0.0.10/.doctrees/getting_started.doctree b/_build/html/v0.0.10/.doctrees/getting_started.doctree new file mode 100644 index 000000000..aac12b374 Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/getting_started.doctree differ diff --git a/_build/html/v0.0.10/.doctrees/index.doctree b/_build/html/v0.0.10/.doctrees/index.doctree new file mode 100644 index 000000000..a50bdc3ec Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/index.doctree differ diff --git a/_build/html/v0.0.10/.doctrees/references.doctree b/_build/html/v0.0.10/.doctrees/references.doctree new file mode 100644 index 000000000..12285ed06 Binary files /dev/null and b/_build/html/v0.0.10/.doctrees/references.doctree differ diff --git a/_build/html/v0.0.10/_images/2d_pdp_grid.svg b/_build/html/v0.0.10/_images/2d_pdp_grid.svg new file mode 100644 index 000000000..641db4ba6 --- /dev/null +++ b/_build/html/v0.0.10/_images/2d_pdp_grid.svg @@ -0,0 +1,4405 @@ + + + + + + + + 2024-09-08T21:59:22.990207 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/3d_pdp.svg b/_build/html/v0.0.10/_images/3d_pdp.svg new file mode 100644 index 000000000..535371233 --- /dev/null +++ b/_build/html/v0.0.10/_images/3d_pdp.svg @@ -0,0 +1,8326 @@ + + + + + + + + 2024-09-12T22:36:25.786914 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/Bar_Age_regular_income.svg b/_build/html/v0.0.10/_images/Bar_Age_regular_income.svg new file mode 100644 index 000000000..6f8aa40d4 --- /dev/null +++ b/_build/html/v0.0.10/_images/Bar_Age_regular_income.svg @@ -0,0 +1,1201 @@ + + + + + + + + 2024-08-04T12:01:07.319833 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/Stacked_Bar_Age_income.svg b/_build/html/v0.0.10/_images/Stacked_Bar_Age_income.svg new file mode 100644 index 000000000..d5510308b --- /dev/null +++ b/_build/html/v0.0.10/_images/Stacked_Bar_Age_income.svg @@ -0,0 +1,1943 @@ + + + + + + + + 2024-08-04T11:47:19.816889 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/Stacked_Bar_Age_income_pivoted.svg b/_build/html/v0.0.10/_images/Stacked_Bar_Age_income_pivoted.svg new file mode 100644 index 000000000..2147fce1a --- /dev/null +++ b/_build/html/v0.0.10/_images/Stacked_Bar_Age_income_pivoted.svg @@ -0,0 +1,2043 @@ + + + + + + + + 2024-08-04T11:56:38.571027 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/Stacked_Bar_Age_income_regular.svg b/_build/html/v0.0.10/_images/Stacked_Bar_Age_income_regular.svg new file mode 100644 index 000000000..04478581f --- /dev/null +++ b/_build/html/v0.0.10/_images/Stacked_Bar_Age_income_regular.svg @@ -0,0 +1,1347 @@ + + + + + + + + 2024-08-04T11:54:36.826244 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/Stacked_Bar_Age_sex.svg b/_build/html/v0.0.10/_images/Stacked_Bar_Age_sex.svg new file mode 100644 index 000000000..7b2bcb137 --- /dev/null +++ b/_build/html/v0.0.10/_images/Stacked_Bar_Age_sex.svg @@ -0,0 +1,1970 @@ + + + + + + + + 2024-08-04T11:55:12.796551 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/all_plots_comparisons_boxplot.png b/_build/html/v0.0.10/_images/all_plots_comparisons_boxplot.png new file mode 100644 index 000000000..c4f54b520 Binary files /dev/null and b/_build/html/v0.0.10/_images/all_plots_comparisons_boxplot.png differ diff --git a/_build/html/v0.0.10/_images/all_plots_comparisons_violinplot.png b/_build/html/v0.0.10/_images/all_plots_comparisons_violinplot.png new file mode 100644 index 000000000..cc236e21c Binary files /dev/null and b/_build/html/v0.0.10/_images/all_plots_comparisons_violinplot.png differ diff --git a/_build/html/v0.0.10/_images/all_plots_comparisons_violinplot_pivoted.png b/_build/html/v0.0.10/_images/all_plots_comparisons_violinplot_pivoted.png new file mode 100644 index 000000000..b05150e06 Binary files /dev/null and b/_build/html/v0.0.10/_images/all_plots_comparisons_violinplot_pivoted.png differ diff --git a/_build/html/v0.0.10/_images/count_hist_distributions.svg b/_build/html/v0.0.10/_images/count_hist_distributions.svg new file mode 100644 index 000000000..f08328f86 --- /dev/null +++ b/_build/html/v0.0.10/_images/count_hist_distributions.svg @@ -0,0 +1,1719 @@ + + + + + + + + 2024-09-17T18:49:36.706975 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/density_hist_dist_age.svg b/_build/html/v0.0.10/_images/density_hist_dist_age.svg new file mode 100644 index 000000000..717ca6bf8 --- /dev/null +++ b/_build/html/v0.0.10/_images/density_hist_dist_age.svg @@ -0,0 +1,1375 @@ + + + + + + + + 2024-09-16T23:27:50.927548 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/density_hist_dist_mean_median.svg b/_build/html/v0.0.10/_images/density_hist_dist_mean_median.svg new file mode 100644 index 000000000..cd480f5ed --- /dev/null +++ b/_build/html/v0.0.10/_images/density_hist_dist_mean_median.svg @@ -0,0 +1,1935 @@ + + + + + + + + 2024-09-16T22:16:05.594049 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/eda_toolkit_logo.svg b/_build/html/v0.0.10/_images/eda_toolkit_logo.svg new file mode 100644 index 000000000..d039d6f79 --- /dev/null +++ b/_build/html/v0.0.10/_images/eda_toolkit_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_build/html/v0.0.10/_images/hist_density_distributions.svg b/_build/html/v0.0.10/_images/hist_density_distributions.svg new file mode 100644 index 000000000..5ce1a7191 --- /dev/null +++ b/_build/html/v0.0.10/_images/hist_density_distributions.svg @@ -0,0 +1,1744 @@ + + + + + + + + 2024-09-17T18:44:23.458508 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/kde_density_distributions.svg b/_build/html/v0.0.10/_images/kde_density_distributions.svg new file mode 100644 index 000000000..b42cfeb18 --- /dev/null +++ b/_build/html/v0.0.10/_images/kde_density_distributions.svg @@ -0,0 +1,2301 @@ + + + + + + + + 2024-09-16T21:17:44.672843 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/normal_distribution.png b/_build/html/v0.0.10/_images/normal_distribution.png new file mode 100644 index 000000000..837c60e0c Binary files /dev/null and b/_build/html/v0.0.10/_images/normal_distribution.png differ diff --git a/_build/html/v0.0.10/_images/scatter_plots_all_grid.png b/_build/html/v0.0.10/_images/scatter_plots_all_grid.png new file mode 100644 index 000000000..78652ac74 Binary files /dev/null and b/_build/html/v0.0.10/_images/scatter_plots_all_grid.png differ diff --git a/_build/html/v0.0.10/_images/scatter_plots_grid.png b/_build/html/v0.0.10/_images/scatter_plots_grid.png new file mode 100644 index 000000000..5a51facd8 Binary files /dev/null and b/_build/html/v0.0.10/_images/scatter_plots_grid.png differ diff --git a/_build/html/v0.0.10/_images/scatter_plots_grid_grouped.png b/_build/html/v0.0.10/_images/scatter_plots_grid_grouped.png new file mode 100644 index 000000000..02a3b3916 Binary files /dev/null and b/_build/html/v0.0.10/_images/scatter_plots_grid_grouped.png differ diff --git a/_build/html/v0.0.10/_images/summarize_combos.gif b/_build/html/v0.0.10/_images/summarize_combos.gif new file mode 100644 index 000000000..402ee1efc Binary files /dev/null and b/_build/html/v0.0.10/_images/summarize_combos.gif differ diff --git a/_build/html/v0.0.10/_images/us_census_correlation_matrix.svg b/_build/html/v0.0.10/_images/us_census_correlation_matrix.svg new file mode 100644 index 000000000..2a41e1afa --- /dev/null +++ b/_build/html/v0.0.10/_images/us_census_correlation_matrix.svg @@ -0,0 +1,1766 @@ + + + + + + + + 2024-08-09T18:12:33.390718 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_images/us_census_correlation_matrix_full.svg b/_build/html/v0.0.10/_images/us_census_correlation_matrix_full.svg new file mode 100644 index 000000000..d0df5da46 --- /dev/null +++ b/_build/html/v0.0.10/_images/us_census_correlation_matrix_full.svg @@ -0,0 +1,1907 @@ + + + + + + + + 2024-08-09T18:30:04.884359 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_sources/acknowledgements.rst.txt b/_build/html/v0.0.10/_sources/acknowledgements.rst.txt new file mode 100644 index 000000000..e62da5a10 --- /dev/null +++ b/_build/html/v0.0.10/_sources/acknowledgements.rst.txt @@ -0,0 +1,30 @@ +.. _acknowledgements: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Acknowledgements +================= + +We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists. + +We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors. diff --git a/_build/html/v0.0.10/_sources/changelog.rst.txt b/_build/html/v0.0.10/_sources/changelog.rst.txt new file mode 100644 index 000000000..72a6f4449 --- /dev/null +++ b/_build/html/v0.0.10/_sources/changelog.rst.txt @@ -0,0 +1,621 @@ +.. _changelog: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Changelog +========= + +`Version 0.0.10`_ +---------------------- + +.. _Version 0.0.10: https://lshpaner.github.io/eda_toolkit/v0.0.10/index.html + +**Legend Handling** + +- The legend is now displayed only if there are valid legend handles (``len(handles) > 0``) and if ``show_legend`` is set to ``True``. + +- The check ``ax.get_legend().remove()`` ensures that unnecessary legends are removed if they are empty or if ``show_legend`` is set to ``False``. + +**Error Handling** +- Error handling in the ``except`` block has been enhanced to ensure that any exceptions related to legends or labels are managed properly. The legend handling logic still respects the ``show_legend`` flag even in cases where exceptions occur. + +This update prevents empty legend squares from appearing and maintains the intended default behavior of showing legends only when they contain relevant content. + + +`Version 0.0.9`_ +---------------------- + +.. _Version 0.0.9: https://lshpaner.github.io/eda_toolkit/v0.0.9/index.html + +**Bug Fixes and Minor Improvements** + +Improved error messages and validation checks across multiple functions to prevent common pitfalls and ensure smoother user experience. + +**Visualization Enhancements** + +**DataFrame Columns:** Added a ``background_color`` variable to ``dataframe_columns```, +allowing the user to enter a string representing a color name, or hex value. +Try/Except on the output, in case the end user has a deprecated version of Pandas, +where the styler would use ``hide()`` instead of ``hide_index()``. The highlighted +columns allow for easier null versus unique value analysis. + +The docstring now clearly describes the purpose of the function—analyzing +DataFrame columns to provide summary statistics. + +**Args:** + +- The ``df`` argument is specified as a ``pandas.DataFrame``. + +- The ``background_color`` argument is marked as optional, with a brief description of its role. + +- The ``return_df`` argument is also marked as optional, explaining what it controls. + + +**Returns:** The return type is specified as ``pandas.DataFrame``, with a clear explanation of the difference based on the ``return_df`` flag. + +**KDE Distribution Plots:** Improved ``kde_distributions()`` with enhanced options for log scaling, mean/median plotting, custom standard deviation lines, and better handling of legends and scientific notation. + +**Scatter Plots:** Enhanced ``scatter_fit_plot()`` with support for hue-based coloring, best fit lines, correlation display, and flexible grid plotting options. + + +`Version 0.0.8`_ +---------------------- + +.. _Version 0.0.8: https://lshpaner.github.io/eda_toolkit/v0.0.8/index.html + + +:class:`stacked_crosstab_plot` + +- **Flexible `save_formats` Input**: + - `save_formats` now accepts a string, tuple, or list for specifying formats (e.g., `"png"`, `("png", "svg")`, or `["png", "svg"]`). + - Single strings or tuples are automatically converted to lists for consistent processing. + +- **Dynamic Error Handling**: + - Added checks to ensure a valid path is provided for each format in `save_formats`. + - Raises a `ValueError` if a format is specified without a corresponding path, with a clear, dynamic error message. + +- **Improved Plot Saving Logic**: + - Updated logic allows saving plots in one format (e.g., only `"png"` or `"svg"`) without requiring the other. + - Simplified and more intuitive path handling for saving plots. + + +:class:`plot_3d_pdp` + +This update introduces several key changes to the `plot_3d_pdp` function, simplifying the function's interface and improving usability, while maintaining the flexibility needed for diverse visualization needs. + +**1. Parameter Changes** + + +- **Removed Parameters:** + + - The parameters ``x_label_plotly``, ``y_label_plotly``, and ``z_label_plotly`` have been removed. These parameters previously allowed custom axis labels specifically for the Plotly plot, defaulting to the general ``x_label``, ``y_label``, and ``z_label``. Removing these parameters simplifies the function signature while maintaining flexibility. + +- **Default Values for Labels:** + + - The parameters ``x_label``, ``y_label``, and ``z_label`` are now optional, with ``None`` as the default. If not provided, these labels will automatically default to the names of the features in the ``feature_names_list``. This change makes the function more user-friendly, particularly for cases where default labels are sufficient. + +- **Changes in Default Values for View Angles:** + + - The default values for camera positioning parameters have been updated: ``horizontal`` is now ``-1.25``, ``depth`` is now ``1.25``, and ``vertical`` is now ``1.25``. These adjustments refine the default 3D view perspective for the Plotly plot, providing a more intuitive starting view. + +**2. Plot Generation Logic** + +- **Conditionally Checking Labels:** + + - The function now checks whether ``x_label``, ``y_label``, and ``z_label`` are provided. If these are ``None``, the function will automatically assign default labels based on the ``feature_names_list``. This enhancement reduces the need for users to manually specify labels, making the function more adaptive. + +- **Camera Position Adjustments:** + + - The camera positions for the Plotly plot are now adjusted by multiplying ``horizontal``, ``depth``, and ``vertical`` by ``zoom_out_factor``. This change allows for more granular control over the 3D view, enhancing the interactivity and flexibility of the Plotly visualizations. + +- **Surface Plot Coordinates Adjustments:** + + - The order of the coordinates for the Plotly plot’s surface has been changed from ``ZZ, XX, YY[::-1]`` to ``ZZ, XX, YY``. This adjustment ensures the proper alignment of axes and grids, resulting in more accurate visual representations. + +**3. Code Simplifications** + +- **Removed Complexity:** + + - By removing the ``x_label_plotly``, ``y_label_plotly``, and ``z_label_plotly`` parameters, the code is now simpler and easier to maintain. This change reduces potential confusion and streamlines the function for users who do not need distinct labels for Matplotlib and Plotly plots. + +- **Fallback Mechanism for Grid Values:** + + - The function continues to implement a fallback mechanism when extracting grid values, ensuring compatibility with various versions of scikit-learn. This makes the function robust across different environments. + +**4. Style Adjustments** + +- **Label Formatting:** + + - The new version consistently uses ``y_label``, ``x_label``, and ``z_label`` for axis labels in the Matplotlib plot, aligning the formatting across different plot types. + +- **Color Bar Adjustments:** + + - The color bar configuration in the Matplotlib plot has been slightly adjusted with a shrink value of ``0.6`` and a pad value of ``0.02``. These adjustments result in a more refined visual appearance, particularly in cases where space is limited. + +**5. Potential Use Case Differences** + +- **Simplified Interface:** + + - The updated function is more streamlined for users who prefer a simplified interface without the need for separate label customizations for Plotly and Matplotlib plots. This makes it easier to use in common scenarios. + +- **Less Granular Control:** + + - Users who need more granular control, particularly for presentations or specific formatting, may find the older version more suitable. The removal of the ``*_plotly`` label parameters means that all plots now use the same labels across Matplotlib and Plotly. + +**6. Matplotlib Plot Adjustments** + +- **Wireframe and Surface Plot Enhancements:** + + - The logic for plotting wireframes and surface plots in Matplotlib remains consistent with previous versions, with subtle enhancements to color and layout management to improve overall aesthetics. + +**Summary** + +- Version ``0.0.8d`` of the `plot_3d_pdp` function introduces simplifications that reduce the number of parameters and streamline the plotting process. While some customizability has been removed, the function remains flexible enough for most use cases and is easier to use. +- Key updates include adjusted default camera views for 3D plots, removal of Plotly-specific label parameters, and improved automatic labeling and plotting logic. + +**Decision Point** + +- This update may be especially useful for users who prefer a cleaner and more straightforward interface. However, those requiring detailed customizations may want to continue using the older version, depending on their specific needs. + + +Version 0.0.8c +------------------------ + +Version 0.0.8c is a follow-up release to version 0.0.8b. This update includes minor enhancements and refinements based on feedback and additional testing. It serves as an incremental step towards improving the stability and functionality of the toolkit. + +**Key Updates in 0.0.8c:** + +- **Bug Fixes:** Addressed minor issues identified in version ``0.0.8b`` to ensure smoother performance and better user experience. +- **Additional Testing:** Incorporated further tests to validate the changes introduced in previous versions and to prepare for future stable releases. +- **Refinements:** Made small enhancements to existing features based on user feedback and internal testing results. + +**Summary of Changes** + +1. New Features & Enhancements + +- ``plot_3d_pdp`` Function: + + - Added ``show_modebar`` Parameter: Introduced a new boolean parameter, ``show_modebar``, to allow users to toggle the visibility of the mode bar in Plotly interactive plots. + + - Custom Margins and Layout Adjustments: + + - Added parameters for ``left_margin``, ``right_margin``, and ``top_margin`` to provide users with more control over the plot layout in Plotly. + + - Adjusted default values and added options for better customization of the Plotly color bar (``cbar_x``, ``cbar_thickness``) and title positioning (``title_x``, ``title_y``). + + - Plotly Configuration: + + - Enhanced the configuration options to allow users to enable or disable zoom functionality (``enable_zoom``) in the interactive Plotly plots. + + - Updated the code to reflect these new parameters, allowing for greater flexibility in the appearance and interaction with the Plotly plots. + + - Error Handling: + + - Added input validation for ``html_file_path`` and ``html_file_name`` to ensure these are provided when necessary based on the selected ``plot_type``. + +- ``plot_2d_pdp`` Function: + + - Introduced ``file_prefix`` Parameter: + + - Added a new ``file_prefix`` parameter to allow users to specify a prefix for filenames when saving grid plots. This change streamlines the naming process for saved plots and improves file organization. + + - Enhanced Plot Type Flexibility: + + - The ``plot_type`` parameter now includes an option to generate both grid and individual plots (``both``). This feature allows users to create a combination of both layout styles in one function call. + + - Updated input validation and logic to handle this new option effectively. + + - Added ``save_plots`` Parameter: + + - Introduced a new parameter, ``save_plots``, to control the saving of plots. Users can specify whether to save all plots, only individual plots, only grid plots, or none. + + - Custom Margins and Layout Adjustments: + + - Included the ``save_plots`` parameter in the validation process to ensure paths are provided when needed for saving the plots. + +2. Documentation Updates + +- Docstrings: + + - Updated docstrings for both functions to reflect the new parameters and enhancements, providing clearer and more comprehensive guidance for users. + + - Detailed the use of new parameters such as ``show_modebar``, ``file_prefix``, ``save_plots``, and others, ensuring that the function documentation is up-to-date with the latest changes. + +3. Refactoring & Code Cleanup + +- Code Structure: + + - Improved the code structure to maintain clarity and readability, particularly around the new functionality. + + - Consolidated the layout configuration settings for the Plotly plots into a more flexible and user-friendly format, making it easier for users to customize their plots. + + +Version 0.0.8b +-------------------------------- + +Version 0.0.8b is an exact replica of version ``0.0.8a``. The purpose of this +beta release was to test whether releasing it as the latest version would update +its status on PyPI to reflect it as the latest release. However, it continues to +be identified as a pre-release on PyPI. + + +Version 0.0.8a +-------------------------------- + +Version 0.0.8a introduces significant enhancements and new features to improve +the usability and functionality of the EDA Toolkit. + +**New Features:** + +1. Optional ``file_prefix`` in ``stacked_crosstab_plot`` Function + + - The ``stacked_crosstab_plot`` function has been updated to make the ``file_prefix`` argument optional. If the user does not provide a ``file_prefix``, the function will now automatically generate a default prefix based on the ``col`` and ``func_col`` parameters. This change streamlines the process of generating plots by reducing the number of required arguments. + + - **Key Improvement:** + + - Users can now omit the ``file_prefix`` argument, and the function will still produce appropriately named plot files, enhancing ease of use. + + - Backward compatibility is maintained, allowing users who prefer to specify a custom ``file_prefix`` to continue doing so without any issues. + +2. **Introduction of 3D and 2D Partial Dependence Plot Functions** + + - Two new functions, ``plot_3d_pdp`` and ``plot_2d_pdp``, have been added to the toolkit, expanding the visualization capabilities for machine learning models. + + - ``plot_3d_pdp``: Generates 3D partial dependence plots for two features, supporting both static visualizations (using Matplotlib) and interactive plots (using Plotly). The function offers extensive customization options, including labels, color maps, and saving formats. + + - ``plot_2d_pdp``: Creates 2D partial dependence plots for specified features with flexible layout options (grid or individual plots) and customization of figure size, font size, and saving formats. + + - **Key Features:** + + - **Compatibility:** Both functions are compatible with various versions of scikit-learn, ensuring broad usability. + + - **Customization:** Extensive options for customizing visual elements, including figure size, font size, and color maps. + + - **Interactive 3D Plots:** The ``plot_3d_pdp`` function supports interactive visualizations, providing an enhanced user experience for exploring model predictions in 3D space. + +**Impact:** + +- These updates improve the user experience by reducing the complexity of function calls and introducing powerful new tools for model interpretation. +- The optional ``file_prefix`` enhancement simplifies plot generation while maintaining the flexibility to define custom filenames. +- The new partial dependence plot functions offer robust visualization options, making it easier to analyze and interpret the influence of specific features in machine learning models. + + + +`Version 0.0.7`_ +---------------------- + +.. _Version 0.0.7: https://lshpaner.github.io/eda_toolkit/v0.0.7/index.html + +**Added Function for Customizable Correlation Matrix Visualization** + +This release introduces a new function, ``flex_corr_matrix``, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to ``seaborn.heatmap()``. + +**Summary of Changes** + +- **New Function**: ``flex_corr_matrix``. + + - **Functionality**: + - Generates a correlation heatmap for a given DataFrame. + - Supports both full and upper triangular correlation matrices based on the ``triangular`` parameter. + - Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. + - Accepts additional keyword arguments via ``**kwargs`` to pass directly to ``seaborn.heatmap()``. + - Includes validation to ensure the ``triangular``, ``annot``, and ``save_plots`` parameters are boolean values. + - Raises an exception if ``save_plots=True`` but neither ``image_path_png`` nor ``image_path_svg`` is specified. + +**Usage** + +.. code-block:: python + + # Full correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True) + + # Upper triangular correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True) + + +**Contingency table df to object type** + +Convert all columns in the DataFrame to object type to prevent issues with numerical columns. + +.. code-block:: python + + df = df.astype(str).fillna("") + + +`Version 0.0.6`_ +---------------------- + +.. _Version 0.0.6: https://lshpaner.github.io/eda_toolkit/v0.0.6/index.html + +**Added validation for Plot Type Parameter in KDE Distributions Function** + +This release adds a validation step for the ``plot_type`` parameter in the ``kde_distributions`` function. The allowed values for ``plot_type`` are ``"hist"``, ``"kde"``, and ``"both"``. If an invalid value is provided, the function will now raise a ``ValueError`` with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values. + +.. code-block:: python + + # Validate plot_type parameter + valid_plot_types = ["hist", "kde", "both"] + if plot_type.lower() not in valid_plot_types: + raise ValueError( + f"Invalid plot_type value. Expected one of {valid_plot_types}, " + f"got '{plot_type}' instead." + ) + +`Version 0.0.5`_ +---------------------- + +.. _Version 0.0.5: https://lshpaner.github.io/eda_toolkit/v0.0.5/index.html + + +**Ensure Consistent Font Size and Text Wrapping Across Plot Elements** + +This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the ``stacked_crosstab_plot`` function. The following updates have been implemented to ensure uniformity and improve the readability of plots: + +1. **Title Font Size and Text Wrapping:** + - Added a ``text_wrap`` parameter to control the wrapping of plot titles. + - Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ``ax.set_title()`` after plot generation. + +2. **Legend Font Size Consistency:** + - Incorporated ``label_fontsize`` into the legend font size by directly setting the font size of the legend text using ``plt.setp(legend.get_texts(), fontsize=label_fontsize)``. + - This ensures that the legend labels are consistent with the title and axis labels. + +**Testing** + +- Verified that titles now wrap correctly and match the specified ``label_fontsize``. +- Confirmed that legend text scales according to ``label_fontsize``, ensuring consistent font sizes across all plot elements. + + +Version 0.0.4 +--------------------------- + +- **Stable release** + + - No new updates to the codebase. + + - Updated the project ``description`` variable in ``setup.py`` to re-emphasize key elements of the library. + + - Minor README cleanup: + + - Added icons for sections that did not have them. + + +Version 0.0.3 +--------------------------- + +- **Stable release** + + - Updated logo size, fixed citation title, and made minor README cleanup: + + - Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support. + +Version 0.0.2 +--------------------------- + +- **First stable release** + - No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + - Added logo, badges, and Zenodo-certified citation to README. + +Version 0.0.1rc0 +------------------------------- + +- No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + +Version 0.0.1b0 +----------------------------- + +**New Scatter Fit Plot and Additional Updates** + +- Added new ``scatter_fit_plot()``, removed unused ``data_types()``, and added comment section headers. + +**Added xlim and ylim Inputs to KDE Distribution** + +- ``kde_distribution()``: + + - Added ``xlim`` and ``ylim`` inputs to allow users to customize axes limits in ``kde_distribution()``. + +**Added xlim and ylim Params to Stacked Crosstab Plot** + +- ``stacked_crosstab_plot()``: + + - Added ``xlim`` and ``ylim`` input parameters to ``stacked_crosstab_plot()`` to give users more flexibility in controlling axes limits. + +**Added x and y Limits to Box and Violin Plots** + +- ``box_violin_plot()``: + + - Changed function name from ``metrics_box_violin()`` to ``box_violin_plot()``. + - Added ``xlim`` and ``ylim`` inputs to control x and y-axis limits of ``box_violin_plot()`` (formerly ``metrics_box_violin``). + +**Added Ability to Remove Stacks from Plots, Plot All or One at a Time** + +**Key Changes** + +1. **Plot Type Parameter** + - ``plot_type``: This parameter allows the user to choose between ``"regular"``, ``"normalized"``, or ``"both"`` plot types. + +2. **Remove Stacks Parameter** + - ``remove_stacks``: This parameter, when set to ``True``, generates a regular bar plot using only the ``col`` parameter instead of a stacked bar plot. It only works when ``plot_type`` is set to "regular". If ``remove_stacks`` is set to ``True`` while ``plot_type`` is anything other than "regular", the function will raise an exception. + +**Explanation of Changes** + +- **Plot Type Parameter** + + - Provides flexibility to the user, allowing specification of the type of plot to generate: + + - ``"regular"``: Standard bar plot. + + - ``"normalized"``: Normalized bar plot. + + - ``"both"``: Both regular and normalized bar plots. + +- **Remove Stacks Parameter** + - ``remove_stacks``: Generates a regular bar plot using only the ``col`` parameter, removing the stacking of the bars. Applicable only when ``plot_type`` is set to "regular". An exception is raised if used with any other ``plot_type``. + +These changes enhance the flexibility and functionality of the ``stacked_crosstab_plot`` function, allowing for more customizable and specific plot generation based on user requirements. + +Version 0.0.1b0 +----------------------------- + +**Refined KDE Distributions** + +**Key Changes** + +1. **Alpha Transparency for Histogram Fill** + - Added a ``fill_alpha`` parameter to control the transparency of the histogram bars' fill color. + - Default value is ``0.6``. An exception is raised if ``fill=False`` and ``fill_alpha`` is specified. + +2. **Custom Font Sizes** + - Introduced ``label_fontsize`` and ``tick_fontsize`` parameters to control font size of axis labels and tick marks independently. + +3. **Scientific Notation Toggle** + - Added a ``disable_sci_notation`` parameter to enable or disable scientific notation on axes. + +4. **Improved Error Handling** + - Added validation for the ``stat`` parameter to ensure valid options are accepted. + - Added checks for proper usage of ``fill_alpha`` and ``hist_edgecolor`` when ``fill`` is set to ``False``. + +5. **General Enhancements** + - Updated the function's docstring to reflect new parameters and provide comprehensive guidance on usage. + +Version 0.0.1b0 +----------------------------- + +**Enhanced KDE Distributions Function** + +**Added Parameters** + +1. **Grid Figsize and Single Figsize** + - Control the size of the overall grid figure and individual figures separately. + +2. **Hist Color and KDE Color`** + - Allow customization of histogram and KDE plot colors. + +3. **Edge Color** + - Allows customization of histogram bar edges. + +4. **Hue** + - Allows grouping data by a column. + +5. **Fill** + - Controls whether to fill histogram bars with color. + +6. **Y-axis Label`** + - Customizable y-axis label. + +7. **Log-Scaling** + - Specifies which variables to apply log scale. + +8. **Bins and Bin Width** + - Control the number and width of bins. + +9. **``stat``:** + - Allows different statistics for the histogram (``count``, ``density``, ``frequency``, ``probability``, ``proportion``, ``percent``). + +**Improvements** + +1. **Validation and Error Handling** + - Checks for invalid ``log_scale_vars`` and throws a ``ValueError`` if any are found. + - Throws a ``ValueError`` if ``edgecolor`` is changed while ``fill`` is set to ``False``. + - Issues a ``PerformanceWarning`` if both ``bins`` and ``binwidth`` are specified, warning of potential performance impacts. + +2. **Customizable Y-Axis Label** + - Allows users to specify custom y-axis labels. + +3. **Warning for KDE with Count** + - Issues a warning if KDE is used with ``stat='count'``, as it may produce misleading plots. + +**Updated Function to Ensure Unique IDs and Index Check** + +- Ensured that each generated ID in ``add_ids`` starts with a non-zero digit. +- Added a check to verify that the DataFrame index is unique. +- Printed a warning message if duplicate index entries are found. + +These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique. + +**Check for Unique Indices** +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries. + +**Generate Non-Zero Starting IDs** + +- The ID generation process is updated to ensure that the first digit of each ID is always non-zero. + +**Ensure Unique IDs** + +- A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame. + +**Fix Int Conversion for Numeric Columns, Reset Decimal Places** + +- Fixed integer conversion issue for numeric columns when ``decimal_places=0`` in the ``save_dataframes_to_excel`` function. +- Reset ``decimal_places`` default value to ``0``. + +These changes ensure correct formatting and avoid errors during conversion. + +**Contingency Table Updates** + +1. **Error Handling for Columns** + - Added a check to ensure at least one column is specified. + - Updated the function to accept a single column as a string or multiple columns as a list. + - Raised a ``ValueError`` if no columns are provided or if ``cols`` is not correctly specified. + +2. **Function Parameters** + - Changed parameters from ``col1`` and ``col2`` to a single parameter ``cols`` which can be either a string or a list. + +3. **Error Handling** + - Renamed ``SortBy`` to ``sort_by`` to standardize nomenclature. + - Added a check to ensure ``sort_by`` is either 0 or 1. + - Raised a ``ValueError`` if ``sort_by`` is not 0 or 1. + +5. **Sorting Logic** + - Updated the sorting logic to handle the new ``cols`` parameter structure. + +6. **Handling Categorical Data** + - Modified code to convert categorical columns to strings to avoid issues with ``fillna("")``. + +7. **Handling Missing Values** + - Added ``df = df.fillna('')`` to fill NA values within the function to account for missing data. + +8. **Improved Function Documentation** + - Updated function documentation to reflect new parameters and error handling. + +Version 0.0.1b0 +----------------------------- + +**Contingency Table Updates** + +- ``fillna('')`` added to output so that null values come through, removed ``'All'`` column name from output, sort options ``0`` and ``1``, updated docstring documentation. Tested successfully on ``Python 3.7.3``. + +**Compatibility Enhancement** + +1. Added a version check for ``Python 3.7`` and above. + + - Conditional import of ``datetime`` to handle different Python versions. + +.. code-block:: python + + if sys.version_info >= (3, 7): + from datetime import datetime + else: + import datetime diff --git a/_build/html/v0.0.10/_sources/citations.rst.txt b/_build/html/v0.0.10/_sources/citations.rst.txt new file mode 100644 index 000000000..402d27d99 --- /dev/null +++ b/_build/html/v0.0.10/_sources/citations.rst.txt @@ -0,0 +1,42 @@ +.. _citations: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Citing EDA Toolkit +=================== + +Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.10). Zenodo. https://doi.org/10.5281/zenodo.13163208 + +.. code:: bash + + @software{shpaner_2024_13162633, + author = {Shpaner, Leonid and + Gil, Oscar}, + title = {EDA Toolkit}, + month = aug, + year = 2024, + publisher = {Zenodo}, + version = {0.0.10}, + doi = {10.5281/zenodo.13162633}, + url = {https://doi.org/10.5281/zenodo.13162633} + } + diff --git a/_build/html/v0.0.10/_sources/contributors.rst.txt b/_build/html/v0.0.10/_sources/contributors.rst.txt new file mode 100644 index 000000000..4da2fa18b --- /dev/null +++ b/_build/html/v0.0.10/_sources/contributors.rst.txt @@ -0,0 +1,59 @@ +.. _contributors: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Contributors/Maintainers +========================= + +.. raw:: html + +
+ +.. image:: https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + :align: left + :width: 150 + :height: 150 + +.. raw:: html + +
+ +`Leonid Shpaner `_ is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego's M.S. Applied Artificial Intelligence program. + +.. raw:: html + +


+ +.. raw:: html + +
+ +.. image:: https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + :align: left + :width: 150 + :height: 150 + +.. raw:: html + +
+ +`Oscar Gil `_ is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego. diff --git a/_build/html/v0.0.10/_sources/data_management.rst.txt b/_build/html/v0.0.10/_sources/data_management.rst.txt new file mode 100644 index 000000000..3ee514b66 --- /dev/null +++ b/_build/html/v0.0.10/_sources/data_management.rst.txt @@ -0,0 +1,1384 @@ +.. _data_management: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Data Management Overview +=========================== + +In any data-driven project, effective management of data is crucial. This +section provides essential techniques for handling and preparing data to ensure +consistency, accuracy, and ease of analysis. From directory setup and data +cleaning to advanced data processing, these methods form the backbone of reliable +data management. Dive into the following topics to enhance your data handling +capabilities and streamline your workflow. + +Data Management Techniques +=============================== + +Path directories +---------------- + +**Ensure that the directory exists. If not, create it.** + +.. function:: ensure_directory(path) + + :param path: The path to the directory that needs to be ensured. + :type path: str + + :returns: None + + +The ``ensure_directory`` function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``ensure_directory`` function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them. + +First, we define the base path as the parent directory of the current directory. +The ``os.pardir`` constant, equivalent to ``"..""``, is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory. + + +Next, we set paths for the PNG and SVG image directories, located within an +``images`` folder in the parent directory. Using the ``ensure_directory`` +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them. + +.. code-block:: python + + from eda_toolkit import ensure_directory + + import os # import operating system for dir + + + base_path = os.path.join(os.pardir) + + # Go up one level from 'notebooks' to parent directory, + # then into the 'data' folder + data_path = os.path.join(os.pardir, "data") + data_output = os.path.join(os.pardir, "data_output") + + # create image paths + image_path_png = os.path.join(base_path, "images", "png_images") + image_path_svg = os.path.join(base_path, "images", "svg_images") + + # Use the function to ensure'data' directory exists + ensure_directory(data_path) + ensure_directory(data_output) + ensure_directory(image_path_png) + ensure_directory(image_path_svg) + +**Output** + +.. code-block:: python + + Created directory: ../data + Created directory: ../data_output + Created directory: ../images/png_images + Created directory: ../images/svg_images + + +Adding Unique Identifiers +-------------------------- + +**Add a column of unique IDs with a specified number of digits to the dataframe.** + +.. function:: add_ids(df, id_colname="ID", num_digits=9, seed=None, set_as_index=True) + + :param df: The dataframe to add IDs to. + :type df: pd.DataFrame + :param id_colname: The name of the new column for the IDs. Defaults to ``"ID"``. + :type id_colname: str, optional + :param num_digits: The number of digits for the unique IDs. Defaults to ``9``. + :type num_digits: int, optional + :param seed: The seed for the random number generator. Defaults to ``None``. + :type seed: int, optional + :param set_as_index: Whether to set the new ID column as the index. Defaults to ``False``. + :type set_as_index: bool, optional + + :returns: The updated dataframe with the new ID column. + :rtype: pd.DataFrame + +.. note:: + - If the dataframe index is not unique, a warning is printed. + - The function does not check if the number of rows exceeds the number of + unique IDs that can be generated with the specified number of digits. + - The first digit of the generated IDs is ensured to be non-zero. + +The ``add_ids`` function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe. + +**Example Usage** + +In the example below, we demonstrate how to use the ``add_ids`` function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the ``add_ids`` function to generate +and append a column of unique IDs with a specified number of digits to the dataframe. + +First, we import the pandas library and the ``add_ids`` function from the ``eda_toolkit``. +Then, we create a sample dataframe with some data. We call the ``add_ids`` function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe. + +.. code-block:: python + + from eda_toolkit import add_ids + + # Add a column of unique IDs with 9 digits and call it "census_id" + df = add_ids( + df=df, + id_colname="census_id", + num_digits=9, + seed=111, + set_as_index=True, + ) + +**Output** + +`First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: bash + + DataFrame index is unique. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+
+ + +\ + + +Trailing Period Removal +----------------------- + +**Strip the trailing period from floats in a specified column of a DataFrame, if present.** + +.. function:: strip_trailing_period(df, column_name) + + :param df: The DataFrame containing the column to be processed. + :type df: pd.DataFrame + :param column_name: The name of the column containing floats with potential trailing periods. + :type column_name: str + + :returns: The updated DataFrame with the trailing periods removed from the specified column. + :rtype: pd.DataFrame + + + The ``strip_trailing_period`` function is designed to remove trailing periods + from float values in a specified column of a DataFrame. This can be particularly + useful when dealing with data that has been inconsistently formatted, ensuring + that all float values are correctly represented. + +**Example Usage** + +In the example below, we demonstrate how to use the ``strip_trailing_period`` function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the ``strip_trailing_period`` function to remove any trailing periods from the specified column. + +.. code-block:: python + + from eda_toolkit import strip_trailing_period + + # Create a sample dataframe with trailing periods in some values + data = { + "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.], + } + df = pd.DataFrame(data) + + # Remove trailing periods from the 'values' column + df = strip_trailing_period(df=df, column_name="values") + + +**Output** + +`First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)` + +.. raw:: html + + + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +
+ + +\ + +`Note:` The last row shows 6 as an `int` with a trailing period with its conversion to `float`. + + +\ + +Standardized Dates +------------------- + +**Parse and standardize date strings based on the provided rule.** + +.. function:: parse_date_with_rule(date_str) + + This function takes a date string and standardizes it to the ``ISO 8601`` format + (``YYYY-MM-DD``). It assumes dates are provided in either `day/month/year` or + `month/day/year` format. The function first checks if the first part of the + date string (day or month) is greater than 12, which unambiguously indicates + a `day/month/year` format. If the first part is 12 or less, the function + attempts to parse the date as `month/day/year`, falling back to `day/month/year` + if the former raises a ``ValueError`` due to an impossible date (e.g., month + being greater than 12). + + :param date_str: A date string to be standardized. + :type date_str: str + + :returns: A standardized date string in the format ``YYYY-MM-DD``. + :rtype: str + + :raises ValueError: If ``date_str`` is in an unrecognized format or if the function + cannot parse the date. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``parse_date_with_rule`` +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the ``parse_date_with_rule`` +function to parse and standardize each date string to the ``ISO 8601`` format. + +.. code-block:: python + + from eda_toolkit import parse_date_with_rule + + # Sample date strings + date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"] + + # Standardize the date strings + standardized_dates = [parse_date_with_rule(date) for date in date_strings] + + print(standardized_dates) + +**Output** + +.. code-block:: python + + ['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12'] + + + +.. important:: + + In the next example, we demonstrate how to apply the ``parse_date_with_rule`` + function to a DataFrame column containing date strings using the ``.apply()`` method. + This is particularly useful when you need to standardize date formats across an + entire column in a DataFrame. + +.. code-block:: python + + # Creating the DataFrame + data = { + "date_column": [ + "31/12/2021", + "01/01/2022", + "12/31/2021", + "13/02/2022", + "07/04/2022", + ], + "name": ["Alice", "Bob", "Charlie", "David", "Eve"], + "amount": [100.0, 150.5, 200.75, 250.25, 300.0], + } + + df = pd.DataFrame(data) + + # Apply the function to the DataFrame column + df["standardized_date"] = df["date_column"].apply(parse_date_with_rule) + + print(df) + +**Output** + +.. code-block:: python + + date_column name amount standardized_date + 0 31/12/2021 Alice 100.00 2021-12-31 + 1 01/01/2022 Bob 150.50 2022-01-01 + 2 12/31/2021 Charlie 200.75 2021-12-31 + 3 13/02/2022 David 250.25 2022-02-13 + 4 07/04/2022 Eve 300.00 2022-04-07 + + +DataFrame Analysis +------------------- + +**Analyze DataFrame columns, including dtype, null values, and unique value counts.** + +.. function:: dataframe_columns(df, background_color=None, return_df=False) + + Analyze DataFrame columns to provide summary statistics such as data type, + null counts, unique values, and most frequent values. + + This function analyzes the columns of a DataFrame, providing details about the data type, + the number and percentage of ``null`` values, the total number of unique values, and the most + frequent unique value along with its count and percentage. It handles special cases such as + converting date columns and replacing empty strings with Pandas ``NA`` values. + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param background_color: Hex color code or color name for background styling in the output + DataFrame. Defaults to ``None``. + :type background_color: str, optional + :param return_df: If ``True``, returns the plain DataFrame with the summary statistics. If + ``False``, returns a styled DataFrame for visual presentation. Defaults to ``False``. + :type return_df: bool, optional + + :returns: If `return_df` is ``True``, returns the plain DataFrame containing column summary + statistics. If `return_df` is ``False``, returns a styled DataFrame with optional + background color for specific columns. + :rtype: pandas.DataFrame + + +**Example Usage** + +In the example below, we demonstrate how to use the ``dataframe_columns`` +function to analyze a DataFrame's columns. + +.. code-block:: python + + from eda_toolkit import dataframe_columns + + dataframe_columns(df=df) + + +**Output** + +`Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: python + + Shape: (48842, 16) + + Total seconds of processing time: 0.861555 + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+
+ + + +\ + +Generating Summary Tables for Variable Combinations +----------------------------------------------------- + +**This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.** + + +.. function:: summarize_all_combinations(df, variables, data_path, data_name, min_length=2) + + :param df: The pandas DataFrame containing the data. + :type df: pandas.DataFrame + :param variables: List of column names from the DataFrame to generate combinations. + :type variables: list of str + :param data_path: Path where the output Excel file will be saved. + :type data_path: str + :param data_name: Name of the output Excel file. + :type data_name: str + :param min_length: Minimum size of the combinations to generate. Defaults to ``2``. + :type min_length: int, optional + + :returns: A tuple containing a dictionary of summary tables and a list of all generated combinations. + :rtype: tuple(dict, list) + +.. note:: + - The function will create an Excel file with a sheet for each combination + of the specified variables, as well as a "Table of Contents" sheet with + hyperlinks to each summary table. + - The sheet names are limited to 31 characters due to Excel's constraints. + +The function returns two outputs: + +1. ``summary_tables``: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values. + +2. ``all_combinations``: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables. + +**Example Usage** + +Below, we use the ``summarize_all_combinations`` function to generate summary tables for the specified +variables from a DataFrame containing the census data [1]_. + +.. code-block:: python + + from eda_toolkit import summarize_all_combinations + + # Define unique variables for the analysis + unique_vars = [ + "age_group", + "workclass", + "education", + "occupation", + "race", + "sex", + "income", + ] + + # Generate summary tables for all combinations of the specified variables + summary_tables, all_combinations = summarize_all_combinations( + df=df, + data_path=data_output, + variables=unique_vars, + data_name="census_summary_tables.xlsx", + ) + + # Print all combinations of variables + print(all_combinations) + +**Output** + +.. code-blocK:: python + + [('age_group', 'workclass'), + ('age_group', 'education'), + ('age_group', 'occupation'), + ('age_group', 'race'), + ('age_group', 'sex'), + ('age_group', 'income'), + ('workclass', 'education'), + ('workclass', 'occupation'), + ('workclass', 'race'), + ('workclass', 'sex'), + ('workclass', 'income'), + ('education', 'occupation'), + ('education', 'race'), + ('education', 'sex'), + ('education', 'income'), + ('occupation', 'race'), + ('occupation', 'sex'), + ('occupation', 'income'), + ('race', 'sex'), + ('race', 'income'), + ('sex', 'income'), + ('age_group', 'workclass', 'education'), + ('age_group', 'workclass', 'occupation'), + ('age_group', 'workclass', 'race'), + ('age_group', 'workclass', 'sex'), + ('age_group', 'workclass', 'income'), + ('age_group', 'education', 'occupation'), + ('age_group', 'education', 'race'), + ('age_group', 'education', 'sex'), + ('age_group', 'education', 'income'), + ('age_group', 'occupation', 'race'), + ('age_group', 'occupation', 'sex'), + ('age_group', 'occupation', 'income'), + ('age_group', 'race', 'sex'), + ('age_group', 'race', 'income'), + ('age_group', 'sex', 'income'), + ('workclass', 'education', 'occupation'), + ('workclass', 'education', 'race'), + ('workclass', 'education', 'sex'), + ('workclass', 'education', 'income'), + ('workclass', 'occupation', 'race'), + ('workclass', 'occupation', 'sex'), + ('workclass', 'occupation', 'income'), + ('workclass', 'race', 'sex'), + ('workclass', 'race', 'income'), + ('workclass', 'sex', 'income'), + ('education', 'occupation', 'race'), + ('education', 'occupation', 'sex'), + ('education', 'occupation', 'income'), + ('education', 'race', 'sex'), + ('education', 'race', 'income'), + ('education', 'sex', 'income'), + ('occupation', 'race', 'sex'), + ('occupation', 'race', 'income'), + ('occupation', 'sex', 'income'), + ('race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation'), + ('age_group', 'workclass', 'education', 'race'), + ('age_group', 'workclass', 'education', 'sex'), + ('age_group', 'workclass', 'education', 'income'), + ('age_group', 'workclass', 'occupation', 'race'), + ('age_group', 'workclass', 'occupation', 'sex'), + ('age_group', 'workclass', 'occupation', 'income'), + ('age_group', 'workclass', 'race', 'sex'), + ('age_group', 'workclass', 'race', 'income'), + ('age_group', 'workclass', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race'), + ('age_group', 'education', 'occupation', 'sex'), + ('age_group', 'education', 'occupation', 'income'), + ('age_group', 'education', 'race', 'sex'), + ('age_group', 'education', 'race', 'income'), + ('age_group', 'education', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex'), + ('age_group', 'occupation', 'race', 'income'), + ('age_group', 'occupation', 'sex', 'income'), + ('age_group', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race'), + ('workclass', 'education', 'occupation', 'sex'), + ('workclass', 'education', 'occupation', 'income'), + ('workclass', 'education', 'race', 'sex'), + ('workclass', 'education', 'race', 'income'), + ('workclass', 'education', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex'), + ('workclass', 'occupation', 'race', 'income'), + ('workclass', 'occupation', 'sex', 'income'), + ('workclass', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex'), + ('education', 'occupation', 'race', 'income'), + ('education', 'occupation', 'sex', 'income'), + ('education', 'race', 'sex', 'income'), + ('occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race'), + ('age_group', 'workclass', 'education', 'occupation', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'race', 'income'), + ('age_group', 'workclass', 'education', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'education', 'occupation', 'race', 'income'), + ('age_group', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'education', 'race', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex'), + ('workclass', 'education', 'occupation', 'race', 'income'), + ('workclass', 'education', 'occupation', 'sex', 'income'), + ('workclass', 'education', 'race', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex', 'income'), + ('age_group', + 'workclass', + 'education', + 'occupation', + 'race', + 'sex', + 'income')] + + +When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table. + +.. raw:: html + +
+ +.. image:: ../assets/summarize_combos.gif + :alt: EDA Toolkit Logo + :align: left + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Saving DataFrames to Excel with Customized Formatting +------------------------------------------------------- +**Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.** + + +This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the ``save_dataframes_to_excel`` function. + + +.. function:: save_dataframes_to_excel(file_path, df_dict, decimal_places=0) + + :param file_path: Full path to the output Excel file. + :type file_path: str + :param df_dict: Dictionary where keys are sheet names and values are DataFrames to save. + :type df_dict: dict + :param decimal_places: Number of decimal places to round numeric columns. Default is 0. + :type decimal_places: int + +.. note:: + - The function will autofit columns and left-align text. + - Numeric columns will be formatted with the specified number of decimal places. + - Headers will be bold and left-aligned without borders. + +The function performs the following tasks: + +- Writes each DataFrame to its respective sheet in the Excel file. +- Rounds numeric columns to the specified number of decimal places. +- Applies customized formatting to headers and cells. +- Autofits columns based on the content length. + +**Example Usage** + +Below, we use the ``save_dataframes_to_excel`` function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between `18` and `40`. + +.. code-block:: python + + from eda_toolkit import save_dataframes_to_excel + + # Example usage + file_name = "df_census.xlsx" # Name of the output Excel file + file_path = os.path.join(data_path, file_name) + + # filter DataFrame to Ages 18-40 + filtered_df = df[(df["age"] > 18) & (df["age"] < 40)] + + df_dict = { + "original_df": df, + "ages_18_to_40": filtered_df, + } + + save_dataframes_to_excel( + file_path=file_path, + df_dict=df_dict, + decimal_places=0, + ) + + +**Output** + +The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between `18` and `40`, each on separate sheets with customized formatting. + + +Creating Contingency Tables +---------------------------- + +**Create a contingency table from one or more columns in a DataFrame, with sorting options.** + +This section explains how to create contingency tables from one or more columns in a DataFrame, with options to sort the results using the ``contingency_table`` function. + +.. function:: contingency_table(df, cols=None, sort_by=0) + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param cols: Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column. + :type cols: str or list of str, optional + :param sort_by: Enter ``0`` to sort results by column groups; enter ``1`` to sort results by totals in descending order. Defaults to ``0``. + :type sort_by: int, optional + :raises ValueError: If no columns are specified or if ``sort_by`` is not ``0`` or ``1``. + :returns: A DataFrame containing the contingency table with the specified columns, a ``'Total'`` column representing the count of occurrences, and a ``'Percentage'`` column representing the percentage of the total count. + :rtype: pandas.DataFrame + +**Example Usage** + +Below, we use the ``contingency_table`` function to create a contingency table +from the specified columns in a DataFrame containing census data [1]_ + +.. code-block:: python + + from eda_toolkit import contingency_table + + # Example usage + contingency_table( + df=df, + cols=[ + "age_group", + "workclass", + "race", + "sex", + ], + sort_by=1, + ) + +**Output** + +The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the ``'Total'`` column in descending order because ``sort_by`` +is set to ``1``. + + +.. code-block:: python + + + age_group workclass race sex Total Percentage + 0 30-39 Private White Male 5856 11.99 + 1 18-29 Private White Male 5623 11.51 + 2 40-49 Private White Male 4267 8.74 + 3 18-29 Private White Female 3680 7.53 + 4 50-59 Private White Male 2565 5.25 + .. ... ... ... ... ... ... + 467 50-59 Federal-gov Other Male 1 0.00 + 468 50-59 Local-gov Asian-Pac-Islander Female 1 0.00 + 469 70-79 Self-emp-inc Black Male 1 0.00 + 470 80-89 Local-gov Asian-Pac-Islander Male 1 0.00 + 471 48842 100.00 + + [472 rows x 6 columns] + + +\ + +Highlighting Specific Columns in a DataFrame +--------------------------------------------- + +This section explains how to highlight specific columns in a DataFrame using the ``highlight_columns`` function. + +**Highlight specific columns in a DataFrame with a specified background color.** + +.. function:: highlight_columns(df, columns, color="yellow") + + :param df: The DataFrame to be styled. + :type df: pandas.DataFrame + :param columns: List of column names to be highlighted. + :type columns: list of str + :param color: The background color to be applied for highlighting (default is `"yellow"`). + :type color: str, optional + + :returns: A Styler object with the specified columns highlighted. + :rtype: pandas.io.formats.style.Styler + +**Example Usage** + +Below, we use the ``highlight_columns`` function to highlight the ``age`` and ``education`` +columns in the first 5 rows of the census [1]_ DataFrame with a pink background color. + +.. code-block:: python + + from eda_toolkit import highlight_columns + + # Applying the highlight function + highlighted_df = highlight_columns( + df=df, + columns=["age", "education"], + color="#F8C5C8", + ) + + highlighted_df + +**Output** + +The output will be a DataFrame with the specified columns highlighted in the given background color. +The ``age`` and ``education`` columns will be highlighted in pink. + +The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the ``.render()`` method of the Styler object. + + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+ +\ + +Binning Numerical Columns +--------------------------- + +Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or "bins." This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or "bins," and +then assigning each value to one of these intervals. + +.. note:: + + The code snippets below create age bins and assign a corresponding age group + label to each age in the DataFrame. The ``pd.cut`` function from pandas is used to + categorize the ages and assign them to a new column, ``age_group``. Adjust the bins + and labels as needed for your specific data. + + +Below, we use the ``age`` column of the census data [1]_ from the UCI Machine Learning Repository as an example: + +1. **Bins Definition**: + The bins are defined by specifying the boundaries of each interval. For example, + in the code snippet below, the ``bin_ages`` list specifies the boundaries for age groups: + + .. code-block:: python + + bin_ages = [ + 0, + 18, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + float("inf"), + ] + + + Each pair of consecutive elements in ``bin_ages`` defines a bin. For example: + + - The first bin is ``[0, 18)``, + - The second bin is ``[18, 30)``, + - and so on. + +\ + +2. **Labels for Bins**: + The `label_ages` list provides labels corresponding to each bin: + + .. code-block:: python + + label_ages = [ + "< 18", + "18-29", + "30-39", + "40-49", + "50-59", + "60-69", + "70-79", + "80-89", + "90-99", + "100 +", + ] + + These labels are used to categorize the numerical values into meaningful groups. + +3. **Applying the Binning**: + The `pd.cut `_ function + from Pandas is used to apply the binning process. For each value in the ``age`` + column of the DataFrame, it assigns a corresponding label based on which bin the + value falls into. Here, ``right=False`` indicates that each bin includes the + left endpoint but excludes the right endpoint. For example, if ``bin_ages = + [0, 10, 20, 30]``, then a value of ``10`` will fall into the bin ``[10, 20)`` and + be labeled accordingly. + + .. code-block:: python + + df["age_group"] = pd.cut( + df["age"], + bins=bin_ages, + labels=label_ages, + right=False, + ) + + **Mathematically**, for a given value `x` in the ``age`` column: + + .. math:: + + \text{age_group} = + \begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 + \end{cases} + + The parameter ``right=False`` in ``pd.cut`` means that the bins are left-inclusive + and right-exclusive, except for the last bin, which is always right-inclusive + when the upper bound is infinity (``float("inf")``). + + +.. [1] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + diff --git a/_build/html/v0.0.10/_sources/eda_plots.rst.txt b/_build/html/v0.0.10/_sources/eda_plots.rst.txt new file mode 100644 index 000000000..59ae2c981 --- /dev/null +++ b/_build/html/v0.0.10/_sources/eda_plots.rst.txt @@ -0,0 +1,2666 @@ +.. _eda_plots: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Plotting and Theoretical Overview +======================================= + +Gaussian Assumption for Normality +---------------------------------- + +The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF): + +.. math:: + + f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) + +where: + +- :math:`\mu` is the mean +- :math:`\sigma^2` is the variance + +In a normally distributed dataset: + +- 68% of data falls within :math:`\mu \pm \sigma` +- 95% within :math:`\mu \pm 2\sigma` +- 99.7% within :math:`\mu \pm 3\sigma` + +.. raw:: html + +
+ +.. image:: ../assets/normal_distribution.png + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histograms and Kernel Density Estimation (KDE) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Histograms**: + +- Visualize data distribution by binning values and counting frequencies. +- If data is Gaussian, the histogram approximates a bell curve. + +**KDE**: + +- A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function. +- The KDE for a dataset :math:`X = \{x_1, x_2, \ldots, x_n\}` is given by: + +.. math:: + + \hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right) + +where: + +- :math:`K` is the kernel function (often Gaussian) +- :math:`h` is the bandwidth (smoothing parameter) + +.. raw:: html + + Combined Use of Histograms and KDE + +\ + +- **Histograms** offer a discrete, binned view of the data. +- **KDE** provides a smooth, continuous estimate of the underlying distribution. +- Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality. + + +Pearson Correlation Coefficient +-------------------------------- + +The Pearson correlation coefficient, often denoted as :math:`r`, is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from :math:`-1` to :math:`1`, where: + +- :math:`r = 1` indicates a perfect positive linear relationship. +- :math:`r = -1` indicates a perfect negative linear relationship. +- :math:`r = 0` indicates no linear relationship. + +The Pearson correlation coefficient between two variables :math:`X` and :math:`Y` is defined as: + +.. math:: + + r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} + +where: + +- :math:`\text{Cov}(X, Y)` is the covariance of :math:`X` and :math:`Y`. +- :math:`\sigma_X` is the standard deviation of :math:`X`. +- :math:`\sigma_Y` is the standard deviation of :math:`Y`. + +Covariance measures how much two variables change together. It is defined as: + +.. math:: + + \text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y) + +where: + +- :math:`n` is the number of data points. +- :math:`X_i` and :math:`Y_i` are the individual data points. +- :math:`\mu_X` and :math:`\mu_Y` are the means of :math:`X` and :math:`Y`. + +The standard deviation measures the dispersion or spread of a set of values. For +a variable :math:`X`, the standard deviation :math:`\sigma_X` is: + +.. math:: + + \sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2} + +Substituting the covariance and standard deviation into the Pearson correlation formula: + +.. math:: + + r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}} + +This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between :math:`X` and :math:`Y`. + +- :math:`r > 0`: Positive correlation. As :math:`X` increases, :math:`Y` tends to increase. +- :math:`r < 0`: Negative correlation. As :math:`X` increases, :math:`Y` tends to decrease. +- :math:`r = 0`: No linear correlation. There is no consistent linear relationship between :math:`X` and :math:`Y`. + +The closer the value of :math:`r` is to :math:`\pm 1`, the stronger the linear relationship between the two variables. + + +Partial Dependence Foundations +-------------------------------- + +Let :math:`\mathbf{X}` represent the complete set of input features for a machine +learning model, where :math:`\mathbf{X} = \{X_1, X_2, \dots, X_p\}`. Suppose we're +particularly interested in a subset of these features, denoted by :math:`\mathbf{X}_S`. +The complementary set, :math:`\mathbf{X}_C`, contains all the features in :math:`\mathbf{X}` +that are not in :math:`\mathbf{X}_S`. Mathematically, this relationship is expressed as: + +.. math:: + + \mathbf{X}_C = \mathbf{X} \setminus \mathbf{X}_S + +where :math:`\mathbf{X}_C` is the set of features in :math:`\mathbf{X}` after +removing the features in :math:`\mathbf{X}_S`. + +Partial Dependence Plots (PDPs) are used to illustrate the effect of the features +in :math:`\mathbf{X}_S` on the model's predictions, while averaging out the +influence of the features in :math:`\mathbf{X}_C`. This is mathematically defined as: + +.. math:: + \begin{align*} + \text{PD}_{\mathbf{X}_S}(x_S) &= \mathbb{E}_{\mathbf{X}_C} \left[ f(x_S, \mathbf{X}_C) \right] \\ + &= \int f(x_S, x_C) \, p(x_C) \, dx_C \\ + &= \int \left( \int f(x_S, x_C) \, p(x_C \mid x_S) \, dx_C \right) p(x_S) \, dx_S + \end{align*} + + +where: + +- :math:`\mathbb{E}_{\mathbf{X}_C} \left[ \cdot \right]` indicates that we are taking the expected value over the possible values of the features in the set :math:`\mathbf{X}_C`. +- :math:`p(x_C)` represents the probability density function of the features in :math:`\mathbf{X}_C`. + +This operation effectively summarizes the model's output over all potential values of the complementary features, providing a clear view of how the features in :math:`\mathbf{X}_S` alone impact the model's predictions. + + +**2D Partial Dependence Plots** + +Consider a trained machine learning model `2D Partial Dependence Plots`_ :math:`f(\mathbf{X})`, where :math:`\mathbf{X} = (X_1, X_2, \dots, X_p)` represents the vector of input features. The partial dependence of the predicted response :math:`\hat{y}` on a single feature :math:`X_j` is defined as: + +.. math:: + + \text{PD}(X_j) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, \mathbf{X}_{C_i}) + +where: + +- :math:`X_j` is the feature of interest. +- :math:`\mathbf{X}_{C_i}` represents the complement set of :math:`X_j`, meaning the remaining features in :math:`\mathbf{X}` not included in :math:`X_j` for the :math:`i`-th instance. +- :math:`n` is the number of observations in the dataset. + +For two features, :math:`X_j` and :math:`X_k`, the partial dependence is given by: + +.. math:: + + \text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i}) + +This results in a 2D surface plot (or contour plot) that shows how the predicted outcome changes as the values of :math:`X_j` and :math:`X_k` vary, while the effects of the other features are averaged out. + +- **Single Feature PDP:** When plotting :math:`\text{PD}(X_j)`, the result is a 2D line plot showing the marginal effect of feature :math:`X_j` on the predicted outcome, averaged over all possible values of the other features. +- **Two Features PDP:** When plotting :math:`\text{PD}(X_j, X_k)`, the result is a 3D surface plot (or a contour plot) that shows the combined marginal effect of :math:`X_j` and :math:`X_k` on the predicted outcome. The surface represents the expected value of the prediction as :math:`X_j` and :math:`X_k` vary, while all other features are averaged out. + + +**3D Partial Dependence Plots** + +For a more comprehensive analysis, especially when exploring interactions between two features, `3D Partial Dependence Plots`_ are invaluable. The partial dependence function for two features in a 3D context is: + +.. math:: + + \text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i}) + +Here, the function :math:`f(X_j, X_k, \mathbf{X}_{C_i})` is evaluated across a grid of values for :math:`X_j` and :math:`X_k`. The resulting 3D surface plot represents how the model's prediction changes over the joint range of these two features. + +The 3D plot offers a more intuitive visualization of feature interactions compared to 2D contour plots, allowing for a better understanding of the combined effects of features on the model's predictions. The surface plot is particularly useful when you need to capture complex relationships that might not be apparent in 2D. + +- **Feature Interaction Visualization:** The 3D PDP provides a comprehensive view of the interaction between two features. The resulting surface plot allows for the visualization of how the model’s output changes when the values of two features are varied simultaneously, making it easier to understand complex interactions. +- **Enhanced Interpretation:** 3D PDPs offer enhanced interpretability in scenarios where feature interactions are not linear or where the effect of one feature depends on the value of another. The 3D visualization makes these dependencies more apparent. + + +KDE and Histogram Distribution Plots +======================================= + +.. raw:: html + + + +KDE Distribution Function +----------------------------- + +**Generate KDE or histogram distribution plots for specified columns in a DataFrame.** + +The ``kde_distributions`` function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2]_ for plotting, which is built on top of +matplotlib [3]_ and provides a high-level interface for drawing attractive and informative +statistical graphics. + + +**Key Features and Parameters** + +- **Flexible Plotting**: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively. +- **Leverages Seaborn Library**: The function is built on the `seaborn` library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code. +- **Customization**: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs. +- **Scientific Notation Control**: The function allows disabling scientific notation on the axes, providing better readability for certain types of data. +- **Log Scaling**: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude. +- **Output Options**: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations. + +.. function:: kde_distributions(df, vars_of_interest=None, figsize=(5, 5), grid_figsize=None, hist_color="#0000FF", kde_color="#FF0000", mean_color="#000000", median_color="#000000", hist_edgecolor="#000000", hue=None, fill=True, fill_alpha=1, n_rows=None, n_cols=None, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_filename=None, y_axis_label="Density", plot_type="both", log_scale_vars=None, bins="auto", binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat="density", xlim=None, ylim=None, plot_mean=False, plot_median=False, std_dev_levels=None, std_color="#808080", label_names=None, show_legend=True, **kwargs) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param vars_of_interest: List of column names for which to generate distribution plots. If 'all', plots will be generated for all numeric columns. + :type vars_of_interest: list of str, optional + :param figsize: Size of each individual plot, default is ``(5, 5)``. Used when only one plot is being generated or when saving individual plots. + :type figsize: tuple of int, optional + :param grid_figsize: Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on ``figsize``, ``n_rows``, and ``n_cols``. + :type grid_figsize: tuple of int, optional + :param hist_color: Color of the histogram bars, default is ``'#0000FF'``. + :type hist_color: str, optional + :param kde_color: Color of the KDE plot, default is ``'#FF0000'``. + :type kde_color: str, optional + :param mean_color: Color of the mean line if ``plot_mean`` is True, default is ``'#000000'``. + :type mean_color: str, optional + :param median_color: Color of the median line if ``plot_median`` is True, default is ``'#000000'``. + :type median_color: str, optional + :param hist_edgecolor: Color of the histogram bar edges, default is ``'#000000'``. + :type hist_edgecolor: str, optional + :param hue: Column name to group data by, adding different colors for each group. + :type hue: str, optional + :param fill: Whether to fill the histogram bars with color, default is ``True``. + :type fill: bool, optional + :param fill_alpha: Alpha transparency for the fill color of the histogram bars, where ``0`` is fully transparent and ``1`` is fully opaque. Default is ``1``. + :type fill_alpha: float, optional + :param n_rows: Number of rows in the subplot grid. If not provided, it will be calculated automatically. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid. If not provided, it will be calculated automatically. + :type n_cols: int, optional + :param w_pad: Width padding between subplots, default is ``1.0``. + :type w_pad: float, optional + :param h_pad: Height padding between subplots, default is ``1.0``. + :type h_pad: float, optional + :param image_path_png: Directory path to save the PNG image of the overall distribution plots. + :type image_path_png: str, optional + :param image_path_svg: Directory path to save the SVG image of the overall distribution plots. + :type image_path_svg: str, optional + :param image_filename: Filename to use when saving the overall distribution plots. + :type image_filename: str, optional + :param bbox_inches: Bounding box to use when saving the figure. For example, ``'tight'``. + :type bbox_inches: str, optional + :param single_var_image_filename: Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses ``figsize`` for determining the plot size, ignoring ``grid_figsize``. + :type single_var_image_filename: str, optional + :param y_axis_label: The label to display on the ``y-axis``, default is ``'Density'``. + :type y_axis_label: str, optional + :param plot_type: The type of plot to generate, options are ``'hist'``, ``'kde'``, or ``'both'``. Default is ``'both'``. + :type plot_type: str, optional + :param log_scale_vars: Variable name(s) to apply log scaling. Can be a single string or a list of strings. + :type log_scale_vars: str or list of str, optional + :param bins: Specification of histogram bins, default is ``'auto'``. + :type bins: int or sequence, optional + :param binwidth: Width of each bin, overrides bins but can be used with binrange. + :type binwidth: float, optional + :param label_fontsize: Font size for axis labels, including xlabel, ylabel, and tick marks, default is ``10``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: Maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param disable_sci_notation: Toggle to disable scientific notation on axes, default is ``False``. + :type disable_sci_notation: bool, optional + :param stat: Aggregate statistic to compute in each bin (e.g., ``'count'``, ``'frequency'``, ``'probability'``, ``'percent'``, ``'density'``), default is ``'density'``. + :type stat: str, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (``min``, ``max``). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (``min``, ``max``). + :type ylim: tuple or list, optional + :param plot_mean: Whether to plot the mean as a vertical line, default is ``False``. + :type plot_mean: bool, optional + :param plot_median: Whether to plot the median as a vertical line, default is ``False``. + :type plot_median: bool, optional + :param std_dev_levels: Levels of standard deviation to plot around the mean. + :type std_dev_levels: list of int, optional + :param std_color: Color(s) for the standard deviation lines, default is ``'#808080'``. + :type std_color: str or list of str, optional + :param label_names: Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display. + :type label_names: dict, optional + :param show_legend: Whether to show the legend on the plots, default is ``True``. + :type show_legend: bool, optional + :param kwargs: Additional keyword arguments passed to the Seaborn plotting function. + :type kwargs: additional keyword arguments + + :raises ValueError: + - If ``plot_type`` is not one of ``'hist'``, ``'kde'``, or ``'both'``. + - If ``stat`` is not one of ``'count'``, ``'density'``, ``'frequency'``, ``'probability'``, ``'proportion'``, ``'percent'``. + - If ``log_scale_vars`` contains variables that are not present in the DataFrame. + - If ``fill`` is set to ``False`` and ``hist_edgecolor`` is not the default. + - If ``grid_figsize`` is provided when only one plot is being created. + + :raises UserWarning: + - If both ``bins`` and ``binwidth`` are specified, which may affect performance. + + :returns: ``None`` + + +\ + +.. raw:: html + +
+ + + +KDE and Histograms Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the below example, the ``kde_distributions`` function is used to generate +histograms for several variables of interest: ``"age"``, ``"education-num"``, and +``"hours-per-week"``. These variables represent different demographic and +financial attributes from the dataset. The ``plot_type="both"`` parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data's probability density. + +The visualizations are arranged in a single row of four columns, as specified +by ``n_rows=1`` and ``n_cols=3``, respectively. The overall size of the grid +figure is set to `14 inches` wide and `4 inches tall` (``grid_figsize=(14, 4)``), +while each individual plot is configured to be `4 inches` by `4 inches` +(``single_figsize=(4, 4)``). The ``fill=True`` parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +``w_pad=1`` and ``h_pad=1``, which add `1 inch` of padding both horizontally and +vertically. + +.. note:: + If you do not set ``n_rows`` or ``n_cols`` to any values, the function will + automatically calculate and create a grid based on the number of variables being + plotted, ensuring an optimal arrangement of the plots. + +To handle longer titles, the ``text_wrap=50`` parameter ensures that the title +text wraps to a new line after `50 characters`. The ``bbox_inches="tight"`` setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in ``vars_of_interest`` are +passed directly to the function for visualization. + +Each plot is saved individually with filenames that are prefixed by +``"kde_density_single_distribution"``, followed by the variable name. The ```y-axis``` +for all plots is labeled as "Density" (``y_axis_label="Density"``), reflecting that +the height of the bars or KDE line represents the data's density. The histograms +are divided into `10 bins` (``bins=10``), offering a clear view of the distribution +of each variable. + +Additionally, the font sizes for the axis labels and tick labels +are set to `16 points` (``label_fontsize=16``) and `14 points` (``tick_fontsize=14``), +respectively, ensuring that all text within the plots is legible and well-formatted. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + fill=True, + fill_alpha=0.60, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="both", # Can also just plot KDE by itself by passing "kde" + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + +.. raw:: html + +
+ +.. image:: ../assets/kde_density_distributions.svg + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Density) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is used to generate histograms for +the variables ``"age"``, ``"education-num"``, and ``"hours-per-week"`` but with +``plot_type="hist"``, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (``n_rows=1, n_cols=3``), +with a grid size of `14x4 inches` (``grid_figsize=(14, 4)``). The histograms are +divided into `10 bins` (``bins=10``), and the ``y-axis`` is labeled "Density" (``y_axis_label="Density"``). +Font sizes for the axis labels and tick labels are set to `16` and `14` points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + fill=True, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/hist_density_distributions.svg + :alt: KDE Distributions - Histograms (Density) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Count) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is modified to generate histograms +with a few key changes. The ``hist_color`` is set to `"orange"`, changing the color of the +histogram bars. The ``y-axis`` label is updated to "Count" (``y_axis_label="Count"``), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to ``"Count"`` to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (``n_rows=1, n_cols=3``), +a grid size of `14x4 inches`, and a bin count of `10`. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + text_wrap=50, + hist_color="orange", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Count", + bins=10, + plot_type="hist", + stat="Count", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + +.. raw:: html + +
+ +.. image:: ../assets/count_hist_distributions.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Histogram Example - (Mean and Median) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is customized to generate +histograms that include mean and median lines. The ``mean_color`` is set to ``"blue"`` +and the ``median_color`` is set to ``"black"``, allowing for a clear distinction +between the two statistical measures. The function parameters are adjusted to +ensure that both the mean and median lines are plotted ``(plot_mean=True, plot_median=True)``. +The ``y_axis_label`` remains ``"Density"``, indicating that the histograms +represent the density of observations within each bin. The histogram bars are +colored using ``hist_color="brown"``, with a ``fill_alpha=0.60`` while the s +tatistical overlays enhance the interpretability of the data. The layout is +configured with a single row and multiple columns ``(n_rows=1, n_cols=3)``, and +the grid size is set to `15x5 inches`. This example highlights how to visualize +central tendencies within the data using a histogram that prominently displays +the mean and median. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + text_wrap=50, + hist_color="brown", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + fill_alpha=0.60, + plot_type="hist", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + plot_mean=True, + plot_median=True, + mean_color="blue", + ) + +.. raw:: html + +
+ +.. image:: ../assets/density_hist_dist_mean_median.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Histogram Example - (Mean, Median, and Std. Deviation) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is customized to generate +a histogram that include mean, median, and 3 standard deviation lines. The +``mean_color`` is set to ``"blue"`` and the median_color is set to ``"black"``, +allowing for a clear distinction between these two central tendency measures. +The function parameters are adjusted to ensure that both the mean and median lines +are plotted ``(plot_mean=True, plot_median=True)``. The ``y_axis_label`` remains +``"Density"``, indicating that the histograms represent the density of observations +within each bin. The histogram bars are colored using ``hist_color="brown"``, +with a ``fill_alpha=0.40``, which adjusts the transparency of the fill color. +Additionally, standard deviation bands are plotted using colors ``"purple"``, +``"green"``, and ``"silver"`` for one, two, and three standard deviations, respectively. + +The layout is configured with a single row and multiple columns ``(n_rows=1, n_cols=3)``, +and the grid size is set to `15x5 inches`. This setup is particularly useful for +visualizing the central tendencies within the data while also providing a clear +view of the distribution and spread through the standard deviation bands. The +configuration used in this example showcases how histograms can be enhanced with +statistical overlays to provide deeper insights into the data. + +.. note:: + + You have the freedom to choose whether to plot the mean, median, and + standard deviation lines. You can display one, none, or all of these simultaneously. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + ] + + kde_distributions( + df=df, + figsize=(10, 6), + text_wrap=50, + hist_color="brown", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + fill_alpha=0.40, + plot_type="both", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + plot_mean=True, + plot_median=True, + mean_color="blue", + image_path_svg=image_path_svg, + image_path_png=image_path_png, + std_dev_levels=[ + 1, + 2, + 3, + ], + std_color=[ + "purple", + "green", + "silver", + ], + ) + +.. raw:: html + +
+ +.. image:: ../assets/density_hist_dist_age.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Stacked Crosstab Plots +======================= + +**Generates stacked bar plots and crosstabs for specified columns in a DataFrame.** + +The ``stacked_crosstab_plot`` function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats. + +The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis. + +.. function:: stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind="bar", width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output="both", return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type="both", show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False) + + Generates stacked or regular bar plots and crosstabs for specified columns. + + This function allows users to create stacked bar plots (or regular bar plots + if stacks are removed) and corresponding crosstabs for specific columns + in a DataFrame. It provides options to customize the appearance, including + font sizes for axis labels, tick labels, and title text wrapping, and to + choose between regular or normalized plots. + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param col: The name of the column in the DataFrame to be analyzed. + :type col: str + :param func_col: List of ground truth columns to be analyzed. + :type func_col: list + :param legend_labels_list: List of legend labels for each ground truth column. + :type legend_labels_list: list + :param title: List of titles for the plots. + :type title: list + :param kind: The kind of plot to generate (``'bar'`` or ``'barh'`` for horizontal bars), default is ``'bar'``. + :type kind: str, optional + :param width: The width of the bars in the bar plot, default is ``0.9``. + :type width: float, optional + :param rot: The rotation angle of the ``x-axis`` labels, default is ``0``. + :type rot: int, optional + :param custom_order: Specifies a custom order for the categories in the ``col``. + :type custom_order: list, optional + :param image_path_png: Directory path where generated PNG plot images will be saved. + :type image_path_png: str, optional + :param image_path_svg: Directory path where generated SVG plot images will be saved. + :type image_path_svg: str, optional + :param save_formats: List of file formats to save the plot images in. + :type save_formats: list, optional + :param color: List of colors to use for the plots. If not provided, a default color scheme is used. + :type color: list, optional + :param output: Specify the output type: ``"plots_only"``, ``"crosstabs_only"``, or ``"both"``. Default is ``"both"``. + :type output: str, optional + :param return_dict: Specify whether to return the crosstabs dictionary, default is ``False``. + :type return_dict: bool, optional + :param x: The width of the figure. + :type x: int, optional + :param y: The height of the figure. + :type y: int, optional + :param p: The padding between the subplots. + :type p: int, optional + :param file_prefix: Prefix for the filename when output includes plots. + :type file_prefix: str, optional + :param logscale: Apply log scale to the ``y-axis``, default is ``False``. + :type logscale: bool, optional + :param plot_type: Specify the type of plot to generate: ``"both"``, ``"regular"``, ``"normalized"``. Default is ``"both"``. + :type plot_type: str, optional + :param show_legend: Specify whether to show the legend, default is ``True``. + :type show_legend: bool, optional + :param label_fontsize: Font size for axis labels, default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param remove_stacks: If ``True``, removes stacks and creates a regular bar plot using only the ``col`` parameter. Only works when ``plot_type`` is set to ``'regular'``. Default is ``False``. + :type remove_stacks: bool, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``output`` is not one of ``"both"``, ``"plots_only"``, or ``"crosstabs_only"``. + - If ``plot_type`` is not one of ``"both"``, ``"regular"``, ``"normalized"``. + - If ``remove_stacks`` is set to True and ``plot_type`` is not ``"regular"``. + - If the lengths of ``title``, ``func_col``, and ``legend_labels_list`` are not equal. + :raises KeyError: If any columns specified in ``col`` or ``func_col`` are missing in the DataFrame. + + :returns: Dictionary of crosstabs DataFrames if ``return_dict`` is ``True``. Otherwise, returns ``None``. + :rtype: ``dict`` or ``None`` + + + +Stacked Bar Plots With Crosstabs Example +----------------------------------------- + +The provided code snippet demonstrates how to use the ``stacked_crosstab_plot`` +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here's a detailed breakdown of the code using the census +dataset as an example [1]_. + +First, the ``func_col`` list is defined, specifying the columns ``["sex", "income"]`` +to be analyzed. These columns will be used in the loop to generate separate plots. +The ``legend_labels_list`` is then defined, with each entry corresponding to a +column in ``func_col``. In this case, the labels for the ``sex`` column are +``["Male", "Female"]``, and for the ``income`` column, they are ``["<=50K", ">50K"]``. +These labels will be used to annotate the legends of the plots. + +Next, the ``title`` list is defined, providing titles for each plot corresponding +to the columns in ``func_col``. The titles are set to ``["Sex", "Income"]``, +which will be displayed on top of each respective plot. + +.. note:: + + The ``legend_labels_list`` parameter should be a list of lists, where each + inner list corresponds to the ground truth labels for the respective item in + the ``func_col`` list. Each element in the ``func_col`` list represents a + column in your DataFrame that you wish to analyze, and the corresponding + inner list in ``legend_labels_list`` should contain the labels that will be + used in the legend of your plots. + +For example: + +.. code-block:: python + + # Define the func_col to use in the loop in order of usage + func_col = ["sex", "income"] + + # Define the legend_labels to use in the loop + legend_labels_list = [ + ["Male", "Female"], # Corresponds to "sex" + ["<=50K", ">50K"], # Corresponds to "income" + ] + + # Define titles for the plots + title = [ + "Sex", + "Income", + ] + +.. important:: + + Ensure that the number of elements in ``func_col``, ``legend_labels_list``, + and ``title`` are the same. Each item in ``func_col`` must have a corresponding + list of labels in ``legend_labels_list`` and a title in ``title``. This + consistency is essential for the function to correctly generate the plots + with the appropriate labels and titles. + + +In this example: + +- ``func_col`` contains two elements: ``"sex"`` and ``"income"``. Each corresponds to a specific column in your DataFrame. +- ``legend_labels_list`` is a nested list containing two inner lists: + + - The first inner list, ``["Male", "Female"]``, corresponds to the ``"sex"`` column in ``func_col``. + - The second inner list, ``["<=50K", ">50K"]``, corresponds to the ``"income"`` column in ``func_col``. + +- ``title`` contains two elements: ``"Sex"`` and ``"Income"``, which will be used as the titles for the respective plots. + +.. note:: + + If you assign the function to a variable, the dictionary returned when + ``return_dict=True`` will be suppressed in the output. However, the dictionary + is still available within the assigned variable for further use. + + +.. code-block:: python + + from eda_toolkit import stacked_crosstab_plot + + # Call the stacked_crosstab_plot function + stacked_crosstabs = stacked_crosstab_plot( + df=df, + col="age_group", + func_col=func_col, + legend_labels_list=legend_labels_list, + title=title, + kind="bar", + width=0.8, + rot=45, # axis rotation angle + custom_order=None, + color=["#00BFC4", "#F8766D"], # default color schema + output="both", + return_dict=True, + x=14, + y=8, + p=10, + logscale=False, + plot_type="both", + show_legend=True, + label_fontsize=14, + tick_fontsize=12, + ) + +The above example generates stacked bar plots for ``"sex"`` and ``"income"`` +grouped by ``"education"``. The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export. + +.. important:: + + **Importance of Correctly Aligning Labels** + + It is crucial to properly align the elements in the ``legend_labels_list``, + ``title``, and ``func_col`` parameters when using the ``stacked_crosstab_plot`` + function. Each of these lists must be ordered consistently because the function + relies on their alignment to correctly assign labels and titles to the + corresponding plots and legends. + + **For instance, in the example above:** + + - The first element in ``func_col`` is ``"sex"``, and it is aligned with the first set of labels ``["Male", "Female"]`` in ``legend_labels_list`` and the first title ``"Sex"`` in the ``title`` list. + - Similarly, the second element in ``func_col``, ``"income"``, aligns with the labels ``["<=50K", ">50K"]`` and the title ``"Income"``. + + **Misalignment between these lists would result in incorrect labels or titles being + applied to the plots, potentially leading to confusion or misinterpretation of the data. + Therefore, it's important to ensure that each list is ordered appropriately and + consistently to accurately reflect the data being visualized.** + + **Proper Setup of Lists** + + When setting up the ``legend_labels_list``, ``title``, and ``func_col``, ensure + that each element in the lists corresponds to the correct variable in the DataFrame. + This involves: + + - **Ordering**: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted. + - **Consistency**: Double-checking that each label in ``legend_labels_list`` matches the categories present in the corresponding ``func_col``, and that the ``title`` accurately describes the plot. + + By adhering to these guidelines, you can ensure that the ``stacked_crosstab_plot`` + function produces accurate and meaningful visualizations that are easy to interpret and analyze. + +**Output** + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_sex.svg + :alt: KDE Distributions + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income.svg + :alt: Stacked Bar Plot Age vs. Income + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +.. note:: + + When you set ``return_dict=True``, you are able to see the crosstabs printed out + as shown below. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93
+ +\ + +When you set ``return_dict=True``, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example: + +.. code-block:: python + + crosstab_age_sex = crosstabs_dict["sex"] + crosstab_age_income = crosstabs_dict["income"] + + +Pivoted Stacked Bar Plots Example +----------------------------------- + +Using the census dataset [1]_, to create horizontal stacked bar plots, set the ``kind`` parameter to +``"barh"`` in the ``stacked_crosstab_plot function``. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the ``y-axis``. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_pivoted.svg + :alt: Stacked Bar Plot Age vs. Income (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Non-Normalized Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to create stacked bar plots without the normalized versions, +set the ``plot_type`` parameter to ``"regular"`` in the ``stacked_crosstab_plot`` +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the ``plot_type`` to ``"normalized"`` will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_regular.svg + :alt: Stacked Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Regular Non-Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the ``plot_type`` parameter to ``"regular"`` +in the ``stacked_crosstab_plot`` function and enable ``remove_stacks`` by setting +it to ``True``. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +``plot_type`` to ``"normalized"`` will display only the normalized plots. + +When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories. + +In the example below, the color of the bars has been set to a dark grey (``#333333``), +and the legend has been removed by setting ``show_legend=False``. This illustrates +regular bar plots for income by age, without stacking. + + +.. raw:: html + +
+ +.. image:: ../assets/Bar_Age_regular_income.svg + :alt: Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Box and Violin Plots +=========================== + +**Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.** + +The ``box_violin_plot`` function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories. + +With options to customize the plot type (``boxplot`` or ``violinplot``), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis. + +Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures. + +The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset. + +.. function:: box_violin_plot(df, metrics_list, metrics_comp, n_rows=None, n_cols=None, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type="boxplot", xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None, label_names=None, **kwargs) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param metrics_list: List of metric names (columns in df) to plot. + :type metrics_list: list of str + :param metrics_comp: List of comparison categories (columns in df). + :type metrics_comp: list of str + :param n_rows: Number of rows in the subplot grid. Calculated automatically if not provided. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid. Calculated automatically if not provided. + :type n_cols: int, optional + :param image_path_png: Optional directory path to save ``.png`` images. + :type image_path_png: str, optional + :param image_path_svg: Optional directory path to save ``.svg`` images. + :type image_path_svg: str, optional + :param save_plots: String, ``"all"``, ``"individual"``, or ``"grid"`` to control saving plots. + :type save_plots: str, optional + :param show_legend: Boolean, True if showing the legend in the plots. Default is ``True``. + :type show_legend: bool, optional + :param plot_type: Specify the type of plot, either ``"boxplot"`` or ``"violinplot"``. Default is ``"boxplot"``. + :type plot_type: str, optional + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + :param show_plot: Specify the plot display mode: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + :param rotate_plot: Boolean, True if rotating (pivoting) the plots. Default is ``False``. + :type rotate_plot: bool, optional + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (``min``, ``max``). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (``min``, ``max``). + :type ylim: tuple or list, optional + :param label_names: Dictionary mapping original column names to custom labels. Default is ``None``. + :type label_names: dict, optional + :param kwargs: Additional keyword arguments passed to the Seaborn plotting function. + :type kwargs: additional keyword arguments + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set without specifying ``image_path_png`` or ``image_path_svg``. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` is not a tuple or list of two numbers. + - If ``grid_figsize`` is provided and is not a tuple or list of two numbers. + + :returns: ``None`` + + + +This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels. + +Box Plots Grid Example +----------------------- + +In this example with the US census data [1]_, the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the ``"age_group"`` column in the +DataFrame. The ``metrics_comp`` parameter is set to [``"age_group"``], meaning +that the comparison will be based on different age groups. The ``metrics_list`` is +provided as ``age_boxplot_list``, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid formatThe ``image_path_png`` and +``image_path_svg`` parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to ``"all"``, ensuring that both +individual and grid plots are saved. + +The plots are displayed in a grid format, as indicated by the ``show_plot="grid"`` +parameter. The ``plot_type`` is set to ``"boxplot"``, so the function will generate +boxplots for each metric in the list. Additionally, the ```x-axis``` labels are rotated +by 90 degrees (``xlabel_rot=90``) to ensure that the labels are legible. The legend is +hidden by setting ``show_legend=False``, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication. + + +.. code-block:: python + + age_boxplot_list = df[ + [ + "education-num", + "hours-per-week", + ] + ].columns.to_list() + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_comp, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="boxplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_boxplot.png + :alt: Box Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Violin Plots Grid Example +-------------------------- + +In this example with the US census data [1]_, we keep everything the same as the prior example, but change the +``plot_type`` to ``violinplot``. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings. + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_comp=metrics_comp, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="violinplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot.png + :alt: Violin Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Pivoted Violin Plots Grid Example +------------------------------------ + +In this example with the US census data [1]_, we set ``xlabel_rot=0`` and ``rotate_plot=True`` +to pivot the plot, changing the orientation of the axes while keeping the ``x-axis`` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution. + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_comp, + show_plot="both", + rotate_plot=True, + show_legend=False, + plot_type="violinplot", + xlabel_rot=0, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot_pivoted.png + :alt: Violin Plot Comparisons (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots and Best Fit Lines +================================== + +Scatter Fit Plot +------------------ + +**Create and Save Scatter Plots or a Grid of Scatter Plots** + +This function, ``scatter_fit_plot``, is designed to generate scatter plots for +one or more pairs of variables (``x_vars`` and ``y_vars``) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view. + +**Optional Best Fit Line** + +An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s + +**Customizable Plot Aesthetics** + +The function offers a wide range of customization options to tailor the appearance +of the scatter plots: + +- **Point Color**: You can specify a default color for the scatter points or use a ``hue`` parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data. + +- **Point Size**: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable. + +- **Markers**: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data. + +**Axis and Label Configuration** + +The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges. + +**Plot Display and Saving Options** + +The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations. + +**Correlation Coefficient Display** + +For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship. + +.. function:: scatter_fit_plot(df, x_vars=None, y_vars=None, n_rows=None, n_cols=None, max_cols=4, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color="C0", best_fit_linecolor="red", best_fit_linestyle="-", hue=None, hue_palette=None, size=None, sizes=None, marker="o", show_correlation=True, xlim=None, ylim=None, all_vars=None, label_names=None, **kwargs) + + Create and save scatter plots or a grid of scatter plots for given ``x_vars`` + and ``y_vars``, with an optional best fit line and customizable point color, + size, and markers. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param x_vars: List of variable names to plot on the ``x-axis``. + :type x_vars: list of str, optional + + :param y_vars: List of variable names to plot on the ``y-axis``. + :type y_vars: list of str, optional + + :param n_rows: Number of rows in the subplot grid. Calculated based on the number of plots and ``n_cols`` if not specified. + :type n_rows: int, optional + + :param n_cols: Number of columns in the subplot grid. Calculated based on the number of plots and ``max_cols`` if not specified. + :type n_cols: int, optional + + :param max_cols: Maximum number of columns in the subplot grid. Default is ``4``. + :type max_cols: int, optional + + :param image_path_png: Directory path to save PNG images of the scatter plots. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the scatter plots. + :type image_path_svg: str, optional + + :param save_plots: Controls which plots to save: ``"all"``, ``"individual"``, or ``"grid"``. If None, plots will not be saved. + :type save_plots: str, optional + + :param show_legend: Whether to display the legend on the plots. Default is ``True``. + :type show_legend: bool, optional + + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + + :param show_plot: Controls plot display: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + + :param rotate_plot: Whether to rotate (pivot) the plots. Default is ``False``. + :type rotate_plot: bool, optional + + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + + :param grid_figsize: Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified. + :type grid_figsize: tuple or list, optional + + :param label_fontsize: Font size for axis labels. Default is 12. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is 10. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + + :param add_best_fit_line: Whether to add a best fit line to the scatter plots. Default is ``False``. + :type add_best_fit_line: bool, optional + + :param scatter_color: Color code for the scattered points. Default is ``"C0"``. + :type scatter_color: str, optional + + :param best_fit_linecolor: Color code for the best fit line. Default is ``"red"``. + :type best_fit_linecolor: str, optional + + :param best_fit_linestyle: Linestyle for the best fit line. Default is ``"-"``. + :type best_fit_linestyle: str, optional + + :param hue: Column name for the grouping variable that will produce points with different colors. + :type hue: str, optional + + :param hue_palette: Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the ``hue`` parameter to be set. + :type hue_palette: dict, list, or str, optional + + :param size: Column name for the grouping variable that will produce points with different sizes. + :type size: str, optional + + :param sizes: Dictionary mapping sizes (smallest and largest) to min and max values. + :type sizes: dict, optional + + :param marker: Marker style used for the scatter points. Default is ``"o"``. + :type marker: str, optional + + :param show_correlation: Whether to display the Pearson correlation coefficient in the plot title. Default is ``True``. + :type show_correlation: bool, optional + + :param xlim: Limits for the ``x-axis`` as a tuple or list of (``min``, ``max``). + :type xlim: tuple or list, optional + + :param ylim: Limits for the ``y-axis`` as a tuple or list of (``min``, ``max``). + :type ylim: tuple or list, optional + + :param all_vars: If provided, automatically generates scatter plots for all combinations of variables in this list, overriding `x_vars` and `y_vars`. + :type all_vars: list of str, optional + + :param label_names: A dictionary to rename columns for display in the plot titles and labels. + :type label_names: dict, optional + + :param kwargs: Additional keyword arguments to pass to ``sns.scatterplot``. + :type kwargs: dict, optional + + :raises ValueError: + - If ``all_vars`` is provided and either ``x_vars`` or ``y_vars`` is also provided. + - If neither ``all_vars`` nor both ``x_vars`` and ``y_vars`` are provided. + - If ``hue_palette`` is specified without ``hue``. + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set but no image paths are provided. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` or ``grid_figsize`` are not tuples/lists with two numeric values. + + :returns: ``None``. This function does not return any value but generates and optionally saves scatter plots for the specified ``x_vars`` and ``y_vars``, or for all combinations of variables in ``all_vars`` if it is provided. + + + +Regression-Centric Scatter Plots Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this US census data [1]_ example, the ``scatter_fit_plot`` function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the ``show_correlation=True`` parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the ``add_best_fit_line=True`` parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + show_legend=True, + show_plot="grid", + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid.png + :alt: Scatter Plot Comparisons (with Best Fit Lines) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Scatter Plots Grouped by Category Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of +scatter plots that examine the relationships between ``age`` and ``hours-per-week`` +as well as ``education-num`` and ``hours-per-week``. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots: + +1. **Hue and Hue Palette**: The ``hue`` parameter is set to ``"income"``, meaning that the + data points in the scatter plots are colored according to the values in the ``income`` + column. A custom color mapping is provided via the ``hue_palette`` parameter, where the + income categories ``"<=50K"`` and ``">50K"`` are assigned the colors ``"brown"`` and + ``"green"``, respectively. This change visually distinguishes the data points based on + income levels. + +2. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, which applies + a grey color to the scatter points when no ``hue`` is provided. However, since a ``hue`` + is specified in this example, the ``hue_palette`` takes precedence and overrides this color setting. + +3. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``False``, meaning that + no best fit line is added to the scatter plots. This differs from the previous example where + a best fit line was included. + +4. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``False``, so the + Pearson correlation coefficient will not be displayed in the plot titles. This is another + change from the previous example where the correlation coefficient was included. + +5. **Hue Legend**: The ``show_legend`` parameter remains set to ``True``, ensuring that the + legend displaying the hue categories (``"<=50K"`` and ``">50K"``) appears on the plots, + helping to interpret the color coding of the data points. + +These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths. + + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + hue_dict = {"<=50K": "brown", ">50K": "green"} + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + show_legend=True, + show_plot="grid", + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=False, + scatter_color="#808080", + hue="income", + hue_palette=hue_dict, + show_correlation=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid_grouped.png + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots (All Combinations Example) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of scatter plots that explore the relationships between all numeric variables in the ``df`` DataFrame. The function automatically identifies and plots all possible combinations of these variables. Below are key aspects of this example: + +1. **All Variables Combination**: The ``all_vars`` parameter is used to automatically generate scatter plots for all possible combinations of numerical variables in the DataFrame. This means you don't need to manually specify ``x_vars`` and ``y_vars``, as the function will iterate through each possible pair. + +2. **Grid Display**: The ``show_plot`` parameter is set to ``"grid"``, so the scatter plots are displayed in a grid format. This is useful for comparing multiple relationships simultaneously. + +3. **Font Sizes**: The ``label_fontsize`` and ``tick_fontsize`` parameters are set to ``14`` and ``12``, respectively. This increases the readability of axis labels and tick marks, making the plots more visually accessible. + +4. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``True``, meaning that a best fit line is added to each scatter plot. This helps in visualizing the linear relationship between variables. + +5. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, applying a grey color to the scatter points. This provides a neutral color that does not distract from the data itself. + +6. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``True``, so the Pearson correlation coefficient will be displayed in the plot titles. This helps to quantify the strength of the relationship between the variables. + +These settings allow for the creation of scatter plots that comprehensively explore the relationships between all numeric variables in the DataFrame. The plots are saved in a grid format, with added best fit lines and correlation coefficients for deeper analysis. The resulting images can be stored in the specified directory for future reference. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + all_vars=df.select_dtypes(np.number).columns.to_list(), + show_legend=True, + show_plot="grid", + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_all_grid.png + :alt: Scatter Plot Comparisons (Grouped2) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Correlation Matrices +===================== + +**Generate and Save Customizable Correlation Heatmaps** + +The ``flex_corr_matrix`` function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats. + +**Customizable Plot Appearance** + +The function provides extensive customization options for the heatmap's appearance: + +- **Colormap Selection**: Choose from a variety of colormaps to represent the strength of correlations. The default is ``"coolwarm"``, but this can be adjusted to fit the needs of the analysis. + +- **Annotation**: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance. + +- **Figure Size and Layout**: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards. + +**Triangular vs. Full Correlation Matrix** + + +A key feature of the ``flex_corr_matrix`` function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations. + +**Label and Axis Configuration** + + +The function offers flexibility in configuring axis labels and titles: + +- **Label Rotation**: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names. +- **Font Sizes**: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable. +- **Title Wrapping**: Control the wrapping of long titles to fit within the plot without overlapping other elements. + +**Plot Display and Saving Options** + + +The ``flex_corr_matrix`` function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images. + +.. function:: flex_corr_matrix(df, cols=None, annot=True, cmap="coolwarm", save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title="Cervical Cancer Data: Correlation Matrix", label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment="right", ylabel_alignment="center_baseline", text_wrap=50, vmin=-1, vmax=1, cbar_label="Correlation Index", triangular=True, **kwargs) + + Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param cols: List of column names to include in the correlation matrix. If None, all columns are included. + :type cols: list of str, optional + + :param annot: Whether to annotate the heatmap with correlation coefficients. Default is ``True``. + :type annot: bool, optional + + :param cmap: The colormap to use for the heatmap. Default is ``"coolwarm"``. + :type cmap: str, optional + + :param save_plots: Controls whether to save the plots. Default is ``False``. + :type save_plots: bool, optional + + :param image_path_png: Directory path to save PNG images of the heatmap. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the heatmap. + :type image_path_svg: str, optional + + :param figsize: Width and height of the figure for the heatmap. Default is ``(10, 10)``. + :type figsize: tuple, optional + + :param title: Title of the heatmap. Default is ``"Cervical Cancer Data: Correlation Matrix"``. + :type title: str, optional + + :param label_fontsize: Font size for tick labels and colorbar label. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param xlabel_rot: Rotation angle for x-axis labels. Default is ``45``. + :type xlabel_rot: int, optional + + :param ylabel_rot: Rotation angle for y-axis labels. Default is ``0``. + :type ylabel_rot: int, optional + + :param xlabel_alignment: Horizontal alignment for x-axis labels. Default is ``"right"``. + :type xlabel_alignment: str, optional + + :param ylabel_alignment: Vertical alignment for y-axis labels. Default is ``"center_baseline"``. + :type ylabel_alignment: str, optional + + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + + :param vmin: Minimum value for the heatmap color scale. Default is ``-1``. + :type vmin: float, optional + + :param vmax: Maximum value for the heatmap color scale. Default is ``1``. + :type vmax: float, optional + + :param cbar_label: Label for the colorbar. Default is ``"Correlation Index"``. + :type cbar_label: str, optional + + :param triangular: Whether to show only the upper triangle of the correlation matrix. Default is ``True``. + :type triangular: bool, optional + + :param kwargs: Additional keyword arguments to pass to ``seaborn.heatmap()``. + :type kwargs: dict, optional + + :raises ValueError: + - If ``annot`` is not a boolean. + - If ``cols`` is not a list. + - If ``save_plots`` is not a boolean. + - If ``triangular`` is not a boolean. + - If ``save_plots`` is True but no image paths are provided. + + :returns: ``None`` + This function does not return any value but generates and optionally saves a correlation heatmap. + +Triangular Correlation Matrix Example +-------------------------------------- + +The provided code filters the census [1]_ DataFrame ``df`` to include only numeric columns using +``select_dtypes(np.number)``. It then utilizes the ``flex_corr_matrix()`` function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options. + +.. note:: + + This triangular matrix format is particularly useful for avoiding + redundancy in correlation matrices, as it excludes the lower half, + making it easier to focus on unique pairwise correlations. + +The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations. + +.. code-block:: python + + # Select only numeric data to pass into the function + df_num = df.select_dtypes(np.number) + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="coolwarm", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Full Correlation Matrix Example +---------------------------------- + +In this modified census [1]_ example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting ``cmap="viridis"``, the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting ``triangular=False``, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset. + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="viridis", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix_full.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Partial Dependence Plots +========================= + +**Partial Dependence Plots (PDPs)** are a powerful tool in machine learning +interpretability, providing insights into how features influence the predicted +outcome of a model. PDPs can be generated in both 2D and 3D, depending on +whether you want to analyze the effect of one feature or the interaction between +two features on the model's predictions. + +2D Partial Dependence Plots +----------------------------- + +The ``plot_2d_pdp`` function generates 2D partial dependence plots for individual features or pairs of features. These plots are essential for examining the marginal effect of features on the predicted outcome. + +- **Grid and Individual Plots**: Generate all 2D partial dependence plots in a grid layout or as separate individual plots, offering flexibility in presentation. +- **Customization Options**: Control the figure size, font sizes for labels and ticks, and the wrapping of long titles to ensure the plots are clear and informative. +- **Saving Plots**: The function provides options to save the plots in PNG or SVG formats, and you can specify whether to save all plots, only individual plots, or just the grid plot. + +.. function:: plot_2d_pdp(model, X_train, feature_names, features, title="PDP of house value on CA non-location features", grid_resolution=50, plot_type="grid", grid_figsize=(12, 8), individual_figsize=(6, 4), label_fontsize=12, tick_fontsize=10, text_wrap=50, image_path_png=None, image_path_svg=None, save_plots=None, file_prefix="partial_dependence") + + Generate 2D partial dependence plots for specified features using the given machine learning model. The function allows for plotting in grid or individual layouts, with various customization options for figure size, font sizes, and title wrapping. Additionally, the plots can be saved in PNG or SVG formats with a customizable filename prefix. + + :param model: The trained machine learning model used to generate partial dependence plots. + :type model: estimator object + + :param X_train: The training data used to compute partial dependence. Should correspond to the features used to train the model. + :type X_train: pandas.DataFrame or numpy.ndarray + + :param feature_names: A list of feature names corresponding to the columns in ``X_train``. + :type feature_names: list of str + + :param features: A list of feature indices or tuples of feature indices for which to generate partial dependence plots. + :type features: list of int or tuple of int + + :param title: The title for the entire plot. Default is ``"PDP of house value on CA non-location features"``. + :type title: str, optional + + :param grid_resolution: The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is ``50``. + :type grid_resolution: int, optional + + :param plot_type: The type of plot to generate. Choose ``"grid"`` for a grid layout, ``"individual"`` for separate plots, or ``"both"`` to generate both layouts. Default is ``"grid"``. + :type plot_type: str, optional + + :param grid_figsize: Tuple specifying the width and height of the figure for the grid layout. Default is ``(12, 8)``. + :type grid_figsize: tuple, optional + + :param individual_figsize: Tuple specifying the width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple, optional + + :param label_fontsize: Font size for the axis labels and titles. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for the axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping. Useful for managing long titles. Default is ``50``. + :type text_wrap: int, optional + + :param image_path_png: The directory path where PNG images of the plots will be saved, if saving is enabled. + :type image_path_png: str, optional + + :param image_path_svg: The directory path where SVG images of the plots will be saved, if saving is enabled. + :type image_path_svg: str, optional + + :param save_plots: Controls whether to save the plots. Options include ``"all"``, ``"individual"``, ``"grid"``, or ``None`` (default). If saving is enabled, ensure ``image_path_png`` or ``image_path_svg`` are provided. + :type save_plots: str, optional + + :param file_prefix: Prefix for the filenames of the saved grid plots. Default is ``"partial_dependence"``. + :type file_prefix: str, optional + + :raises ValueError: + - If ``plot_type`` is not one of ``"grid"``, ``"individual"``, or ``"both"``. + - If ``save_plots`` is enabled but neither ``image_path_png`` nor ``image_path_svg`` is provided. + + :returns: ``None`` + This function generates partial dependence plots and displays them. It does not return any values. + + +2D Plots - CA Housing Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Consider a scenario where you have a machine learning model predicting median +house values in California. [4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (``AveOccup``) and the +age of the house (``HouseAge``) jointly influence house values. A 2D partial +dependence plot allows you to visualize this relationship in two ways: either as +individual plots for each feature or as a combined plot showing the interaction +between two features. + +For instance, the 2D partial dependence plot can help you analyze how the age of +the house impacts house values while holding the number of occupants constant, or +vice versa. This is particularly useful for identifying the most influential +features and understanding how changes in these features might affect the +predicted house value. + +If you extend this to two interacting features, such as ``AveOccup`` and ``HouseAge``, +you can explore their combined effect on house prices. The plot can reveal how +different combinations of occupancy levels and house age influence the value, +potentially uncovering non-linear relationships or interactions that might not be +immediately obvious from a simple 1D analysis. + +Here’s how you can generate and visualize these 2D partial dependence plots using +the California housing dataset: + +**Fetch The CA Housing Dataset and Prepare The DataFrame** + +.. code-block:: python + + from sklearn.datasets import fetch_california_housing + from sklearn.model_selection import train_test_split + from sklearn.ensemble import GradientBoostingRegressor + import pandas as pd + + # Load the dataset + data = fetch_california_housing() + df = pd.DataFrame(data.data, columns=data.feature_names) + +**Split The Data Into Training and Testing Sets** + +.. code-block:: python + + X_train, X_test, y_train, y_test = train_test_split( + df, data.target, test_size=0.2, random_state=42 + ) + +**Train a GradientBoostingRegressor Model** + +.. code-block:: python + + model = GradientBoostingRegressor( + n_estimators=100, + max_depth=4, + learning_rate=0.1, + loss="huber", + random_state=42, + ) + model.fit(X_train, y_train) + + +**Create 2D Partial Dependence Plot Grid** + +.. code-block:: python + + # import the plot_2d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_2d_pdp + + # Feature names + names = data.feature_names + + # Generate 2D partial dependence plots + plot_2d_pdp( + model=model, + X_train=X_train, + feature_names=names, + features=[ + "MedInc", + "AveOccup", + "HouseAge", + "AveRooms", + "Population", + ("AveOccup", "HouseAge"), + ], + title="PDP of house value on CA non-location features", + grid_figsize=(14, 10), + individual_figsize=(12, 4), + label_fontsize=14, + tick_fontsize=12, + text_wrap=120, + plot_type="grid", + image_path_png="path/to/save/png", + save_plots="all", + ) + +.. raw:: html + +
+ +.. image:: ../assets/2d_pdp_grid.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +3D Partial Dependence Plots +----------------------------- + +The ``plot_3d_pdp`` function extends the concept of partial dependence to three dimensions, allowing you to visualize the interaction between two features and their combined effect on the model’s predictions. + +- **Interactive and Static 3D Plots**: Generate static 3D plots using Matplotlib or interactive 3D plots using Plotly. The function also allows for generating both types simultaneously. +- **Colormap and Layout Customization**: Customize the colormaps for both Matplotlib and Plotly plots. Adjust figure size, camera angles, and zoom levels to create plots that fit perfectly within your presentation or report. +- **Axis and Title Configuration**: Customize axis labels for both Matplotlib and Plotly plots. Adjust font sizes and control the wrapping of long titles to maintain readability. + +.. function:: plot_3d_pdp(model, dataframe, feature_names_list, x_label=None, y_label=None, z_label=None, title, html_file_path=None, html_file_name=None, image_filename=None, plot_type="both", matplotlib_colormap=None, plotly_colormap="Viridis", zoom_out_factor=None, wireframe_color=None, view_angle=(22, 70), figsize=(7, 4.5), text_wrap=50, horizontal=-1.25, depth=1.25, vertical=1.25, cbar_x=1.05, cbar_thickness=25, title_x=0.5, title_y=0.95, top_margin=100, image_path_png=None, image_path_svg=None, show_cbar=True, grid_resolution=20, left_margin=20, right_margin=65, label_fontsize=8, tick_fontsize=6, enable_zoom=True, show_modebar=True) + + Generate 3D partial dependence plots for two features of a machine learning model. + + This function supports both static (Matplotlib) and interactive (Plotly) visualizations, allowing for flexible and comprehensive analysis of the relationship between two features and the target variable in a model. + + :param model: The trained machine learning model used to generate partial dependence plots. + :type model: estimator object + + :param dataframe: The dataset on which the model was trained or a representative sample. If a DataFrame is provided, ``feature_names_list`` should correspond to the column names. If a NumPy array is provided, ``feature_names_list`` should correspond to the indices of the columns. + :type dataframe: pandas.DataFrame or numpy.ndarray + + :param feature_names_list: A list of two feature names or indices corresponding to the features for which partial dependence plots are generated. + :type feature_names_list: list of str + + :param x_label: Label for the x-axis in the plots. Default is ``None``. + :type x_label: str, optional + + :param y_label: Label for the y-axis in the plots. Default is ``None``. + :type y_label: str, optional + + :param z_label: Label for the z-axis in the plots. Default is ``None``. + :type z_label: str, optional + + :param title: The title for the plots. + :type title: str + + :param html_file_path: Path to save the interactive Plotly HTML file. Required if ``plot_type`` is ``"interactive"`` or ``"both"``. Default is ``None``. + :type html_file_path: str, optional + + :param html_file_name: Name of the HTML file to save the interactive Plotly plot. Required if ``plot_type`` is ``"interactive"`` or ``"both"``. Default is ``None``. + :type html_file_name: str, optional + + :param image_filename: Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is ``None``. + :type image_filename: str, optional + + :param plot_type: The type of plots to generate. Options are: + - ``"static"``: Generate only static Matplotlib plots. + - ``"interactive"``: Generate only interactive Plotly plots. + - ``"both"``: Generate both static and interactive plots. Default is ``"both"``. + :type plot_type: str, optional + + :param matplotlib_colormap: Custom colormap for the Matplotlib plot. If not provided, a default colormap is used. + :type matplotlib_colormap: matplotlib.colors.Colormap, optional + + :param plotly_colormap: Colormap for the Plotly plot. Default is ``"Viridis"``. + :type plotly_colormap: str, optional + + :param zoom_out_factor: Factor to adjust the zoom level of the Plotly plot. Default is ``None``. + :type zoom_out_factor: float, optional + + :param wireframe_color: Color for the wireframe in the Matplotlib plot. If ``None``, no wireframe is plotted. Default is ``None``. + :type wireframe_color: str, optional + + :param view_angle: Elevation and azimuthal angles for the Matplotlib plot view. Default is ``(22, 70)``. + :type view_angle: tuple, optional + + :param figsize: Figure size for the Matplotlib plot. Default is ``(7, 4.5)``. + :type figsize: tuple, optional + + :param text_wrap: Maximum width of the title text before wrapping. Useful for managing long titles. Default is ``50``. + :type text_wrap: int, optional + + :param horizontal: Horizontal camera position for the Plotly plot. Default is ``-1.25``. + :type horizontal: float, optional + + :param depth: Depth camera position for the Plotly plot. Default is ``1.25``. + :type depth: float, optional + + :param vertical: Vertical camera position for the Plotly plot. Default is ``1.25``. + :type vertical: float, optional + + :param cbar_x: Position of the color bar along the x-axis in the Plotly plot. Default is ``1.05``. + :type cbar_x: float, optional + + :param cbar_thickness: Thickness of the color bar in the Plotly plot. Default is ``25``. + :type cbar_thickness: int, optional + + :param title_x: Horizontal position of the title in the Plotly plot. Default is ``0.5``. + :type title_x: float, optional + + :param title_y: Vertical position of the title in the Plotly plot. Default is ``0.95``. + :type title_y: float, optional + + :param top_margin: Top margin for the Plotly plot layout. Default is ``100``. + :type top_margin: int, optional + + :param image_path_png: Directory path to save the PNG file of the Matplotlib plot. Default is None. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save the SVG file of the Matplotlib plot. Default is None. + :type image_path_svg: str, optional + + :param show_cbar: Whether to display the color bar in the Matplotlib plot. Default is ``True``. + :type show_cbar: bool, optional + + :param grid_resolution: The resolution of the grid for computing partial dependence. Default is ``20``. + :type grid_resolution: int, optional + + :param left_margin: Left margin for the Plotly plot layout. Default is ``20``. + :type left_margin: int, optional + + :param right_margin: Right margin for the Plotly plot layout. Default is ``65``. + :type right_margin: int, optional + + :param label_fontsize: Font size for axis labels in the Matplotlib plot. Default is ``8``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for tick labels in the Matplotlib plot. Default is ``6``. + :type tick_fontsize: int, optional + + :param enable_zoom: Whether to enable zooming in the Plotly plot. Default is ``True``. + :type enable_zoom: bool, optional + + :param show_modebar: Whether to display the mode bar in the Plotly plot. Default is ``True``. + :type show_modebar: bool, optional + + :raises ValueError: + - If `plot_type` is not one of ``"static"``, ``"interactive"``, or ``"both"``. + - If `plot_type` is ``"interactive"`` or ``"both"`` and ``html_file_path`` or ``html_file_name`` are not provided. + + :returns: ``None`` + This function generates 3D partial dependence plots and displays or saves them. It does not return any values. + + :notes: + - This function handles warnings related to scikit-learn's ``partial_dependence`` function, specifically a ``FutureWarning`` related to non-tuple sequences for multidimensional indexing. This warning is suppressed as it stems from the internal workings of scikit-learn in Python versions like 3.7.4. + - To maintain compatibility with different versions of scikit-learn, the function attempts to use ``"values"`` for grid extraction in newer versions and falls back to ``"grid_values"`` for older versions. + + +3D Plots - CA Housing Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Consider a scenario where you have a machine learning model predicting median +house values in California.[4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (``AveOccup``) and the +age of the house (``HouseAge``) jointly influence house values. A 3D partial +dependence plot allows you to visualize this relationship in a more comprehensive +manner, providing a detailed view of how these two features interact to affect +the predicted house value. + +For instance, the 3D partial dependence plot can help you explore how different +combinations of house age and occupancy levels influence house values. By +visualizing the interaction between AveOccup and HouseAge in a 3D space, you can +uncover complex, non-linear relationships that might not be immediately apparent +in 2D plots. + +This type of plot is particularly useful when you need to understand the joint +effect of two features on the target variable, as it provides a more intuitive +and detailed view of how changes in both features impact predictions simultaneously. + +Here’s how you can generate and visualize these 3D partial dependence plots +using the California housing dataset: + +Static Plot +^^^^^^^^^^^^^^^^^ + +**Fetch The CA Housing Dataset and Prepare The DataFrame** + +.. code-block:: python + + from sklearn.ensemble import GradientBoostingRegressor + from sklearn.datasets import fetch_california_housing + from sklearn.model_selection import train_test_split + import pandas as pd + + # Load the dataset + data = fetch_california_housing() + df = pd.DataFrame(data.data, columns=data.feature_names) + +**Split The Data Into Training and Testing Sets** + +.. code-block:: python + + X_train, X_test, y_train, y_test = train_test_split( + df, data.target, test_size=0.2, random_state=42 + ) + +**Train a GradientBoostingRegressor Model** + +.. code-block:: python + + model = GradientBoostingRegressor( + n_estimators=100, + max_depth=4, + learning_rate=0.1, + loss="huber", + random_state=1, + ) + model.fit(X_train, y_train) + +**Create Static 3D Partial Dependence Plot** + +.. code-block:: python + + # import the plot_3d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_3d_pdp + + # Call the function to generate the plot + plot_3d_pdp( + model=model, + dataframe=X_test, # Use the test dataset + feature_names_list=["HouseAge", "AveOccup"], + x_label="House Age", + y_label="Average Occupancy", + z_label="Partial Dependence", + title="3D Partial Dependence Plot of House Age vs. Average Occupancy", + image_filename="3d_pdp", + plot_type="static", + figsize=[8, 5], + text_wrap=40, + wireframe_color="black", + image_path_png=image_path_png, + grid_resolution=30, + ) + +.. raw:: html + +
+ +.. image:: ../assets/3d_pdp.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Interactive Plot +^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # import the plot_3d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_3d_pdp + + # Call the function to generate the plot + plot_3d_pdp( + model=model, + dataframe=X_test, # Use the test dataset + feature_names_list=["HouseAge", "AveOccup"], + x_label="House Age", + y_label="Average Occupancy", + z_label="Partial Dependence", + title="3D Partial Dependence Plot of House Age vs. Average Occupancy", + html_file_path=image_path_png, + image_filename="3d_pdp", + html_file_name="3d_pdp.html", + plot_type="interactive", + text_wrap=40, + zoom_out_factor=0.5, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + grid_resolution=30, + label_fontsize=8, + tick_fontsize=6, + title_x=0.38, + top_margin=10, + right_margin=250, + cbar_x=0.9, + cbar_thickness=25, + show_modebar=False, + enable_zoom=True, + ) + +.. warning:: + + **Scrolling Notice:** + + While interacting with the interactive Plotly plot below, scrolling down the + page using the mouse wheel may be blocked when the mouse pointer is hovering + over the plot. To continue scrolling, either move the mouse pointer outside + the plot area or use the keyboard arrow keys to navigate down the page. + + +.. raw:: html + + + +
+ + +This interactive plot was generated using Plotly, which allows for rich, +interactive visualizations directly in the browser. The plot above is an example +of an interactive 3D Partial Dependence Plot. Here's how it differs from +generating a static plot using Matplotlib. + +**Key Differences** + +**Plot Type**: + +- The ``plot_type`` is set to ``"interactive"`` for the Plotly plot and ``"static"`` for the Matplotlib plot. + +**Interactive-Specific Parameters**: + +- **HTML File Path and Name**: The ``html_file_path`` and ``html_file_name`` parameters are required to save the interactive Plotly plot as an HTML file. These parameters are not needed for static plots. + +- **Zoom and Positioning**: The interactive plot includes parameters like ``zoom_out_factor``, ``title_x``, ``cbar_x``, and ``cbar_thickness`` to control the zoom level, title position, and color bar position in the Plotly plot. These parameters do not affect the static plot. + +- **Mode Bar and Zoom**: The ``show_modebar`` and ``enable_zoom`` parameters are specific to the interactive Plotly plot, allowing you to toggle the visibility of the mode bar and enable or disable zoom functionality. + +**Static-Specific Parameters**: + +- **Figure Size and Wireframe Color**: The static plot uses parameters like ``figsize`` to control the size of the Matplotlib plot and ``wireframe_color`` to define the color of the wireframe in the plot. These parameters are not applicable to the interactive Plotly plot. + +By adjusting these parameters, you can customize the behavior and appearance of your 3D Partial Dependence Plots according to your needs, whether for static or interactive visualization. + + + + +.. [1] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +.. [2] Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +.. [3] Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +.. [4] Pace, R. K., & Barry, R. (1997). *Sparse Spatial Autoregressions*. *Statistics & Probability Letters*, 33(3), 291-297. `https://doi.org/10.1016/S0167-7152(96)00140-X `_. + diff --git a/_build/html/v0.0.10/_sources/getting_started.rst.txt b/_build/html/v0.0.10/_sources/getting_started.rst.txt new file mode 100644 index 000000000..68e4cd440 --- /dev/null +++ b/_build/html/v0.0.10/_sources/getting_started.rst.txt @@ -0,0 +1,136 @@ +.. _getting_started: + +.. KFRE Python Library Documentation documentation master file, created by + sphinx-quickstart on Thu May 2 15:44:56 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Welcome to the EDA Toolkit Python Library Documentation! +======================================================== +.. note:: + This documentation is for ``eda_toolkit`` version ``0.0.10``. + + +The ``eda_toolkit`` is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data. + +Project Links +--------------- + +1. `PyPI Page `_ + +2. `GitHub Repository `_ + + +What is EDA? +------------- + +Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data. + + +Purpose of EDA Toolkit +----------------------- +The ``eda_toolkit`` library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including: + +- **Data Management:** Tools for managing directories, generating unique IDs, + standardizing dates, and handling common DataFrame manipulations. +- **Data Cleaning:** Functions to address missing values, remove outliers, and + correct formatting issues, ensuring data is ready for analysis. +- **Data Visualization:** A variety of plotting functions, including KDE + distribution plots, stacked bar plots, scatter plots with optional best fit + lines, and box/violin plots, to visually explore data distributions, + relationships, and trends. +- **Descriptive and Summary Statistics:** Methods to generate comprehensive + reports on data types, summary statistics (mean, median, standard deviation, + etc.), and to summarize all possible combinations of specified variables. +- **Reporting and Export:** Features to save DataFrames to Excel with + customizable formatting, create contingency tables, and export generated + plots in multiple formats. + + + +Key Features +------------- + +- **Ease of Use:** The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions. +- **Customizable:** Users can customize various aspects of the toolkit to fit their specific needs. +- **Integration:** Seamlessly integrates with popular data science libraries such as ``Pandas``, ``NumPy``, ``Matplotlib``, and ``Seaborn``. +- **Documentation and Examples:** Comprehensive documentation and examples to help users get started quickly and effectively. + +.. _prerequisites: + +Prerequisites +------------- +Before you install ``eda_toolkit``, ensure your system meets the following requirements: + +- **Python**: version ``3.7.4`` or higher is required to run ``eda_toolkit``. + +Additionally, ``eda_toolkit`` depends on the following packages, which will be automatically installed when you install ``eda_toolkit``: + +- ``jinja2``: version ``3.1.4`` or higher +- ``matplotlib``: version ``3.5.3`` or higher +- ``nbformat``: version ``4.2.0`` or higher +- ``numpy``: version ``1.21.6`` or higher +- ``pandas``: version ``1.3.5`` or higher +- ``plotly``: version ``5.18.0`` or higher +- ``scikit-learn``: version ``1.0.2`` or higher +- ``seaborn``: version ``0.12.2`` or higher +- ``xlsxwriter``: version ``3.2.0`` or higher + +.. _installation: + +Installation +------------- + +You can install ``eda_toolkit`` directly from PyPI: + +.. code-block:: bash + + pip install eda_toolkit + + +Description +=============== + +This guide provides detailed instructions and examples for using the functions +provided in the ``eda_toolkit`` library and how to use them effectively in your projects. + +For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [#]_. This dataset provides a rich source of +information for demonstrating the functionalities of the ``eda_toolkit``. + +.. [#] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + diff --git a/_build/html/v0.0.10/_sources/index.rst.txt b/_build/html/v0.0.10/_sources/index.rst.txt new file mode 100644 index 000000000..5f0dc6c56 --- /dev/null +++ b/_build/html/v0.0.10/_sources/index.rst.txt @@ -0,0 +1,57 @@ +.. EDA Toolkit documentation master file, created by + sphinx-quickstart on Mon Jul 29 08:15:33 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Table of Contents +=================== + +.. toctree:: + :maxdepth: 4 + :caption: Getting Started + + getting_started + + +.. toctree:: + :maxdepth: 4 + :caption: Data Management + + data_management + +.. toctree:: + :maxdepth: 4 + :caption: Plotting Heuristics + + eda_plots + +.. toctree:: + :maxdepth: 4 + :caption: About EDA Toolkit + + acknowledgements + contributors + citations + changelog + references + + \ No newline at end of file diff --git a/_build/html/v0.0.10/_sources/references.rst.txt b/_build/html/v0.0.10/_sources/references.rst.txt new file mode 100644 index 000000000..335337c3a --- /dev/null +++ b/_build/html/v0.0.10/_sources/references.rst.txt @@ -0,0 +1,33 @@ +.. _references: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +References +=========== + +1. Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +2. Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +3. Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +4. Pace, R. K., & Barry, R. (1997). *Sparse Spatial Autoregressions*. *Statistics & Probability Letters*, 33(3), 291-297. `https://doi.org/10.1016/S0167-7152(96)00140-X `_. diff --git a/_build/html/v0.0.10/_static/_sphinx_javascript_frameworks_compat.js b/_build/html/v0.0.10/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/_build/html/v0.0.10/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * 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/_build/html/v0.0.10/_static/basic.css b/_build/html/v0.0.10/_static/basic.css new file mode 100644 index 000000000..7ebbd6d07 --- /dev/null +++ b/_build/html/v0.0.10/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- 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: 230px; + 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-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +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; +} + +a:visited { + color: #551A8B; +} + +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; +} + +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; +} + +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 > 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; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +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; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- 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/_build/html/v0.0.10/_static/check-solid.svg b/_build/html/v0.0.10/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_build/html/v0.0.10/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_build/html/v0.0.10/_static/clipboard.min.js b/_build/html/v0.0.10/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_build/html/v0.0.10/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * 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/_build/html/v0.0.10/_static/copybutton.css b/_build/html/v0.0.10/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_build/html/v0.0.10/_static/copybutton.css @@ -0,0 +1,94 @@ +/* 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/_build/html/v0.0.10/_static/copybutton.js b/_build/html/v0.0.10/_static/copybutton.js new file mode 100644 index 000000000..0ea5f6c60 --- /dev/null +++ b/_build/html/v0.0.10/_static/copybutton.js @@ -0,0 +1,248 @@ +// 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, '>|\\$ ', true, 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/_build/html/v0.0.10/_static/copybutton_funcs.js b/_build/html/v0.0.10/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_build/html/v0.0.10/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +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/_build/html/v0.0.10/_static/css/badge_only.css b/_build/html/v0.0.10/_static/css/badge_only.css new file mode 100644 index 000000000..88ba55b96 --- /dev/null +++ b/_build/html/v0.0.10/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Bold.woff b/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Regular.woff b/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.eot b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.svg b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.ttf b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.woff b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.woff2 b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_build/html/v0.0.10/_static/css/fonts/lato-bold-italic.woff b/_build/html/v0.0.10/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_build/html/v0.0.10/_static/css/fonts/lato-bold-italic.woff2 b/_build/html/v0.0.10/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_build/html/v0.0.10/_static/css/fonts/lato-bold.woff b/_build/html/v0.0.10/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/lato-bold.woff differ diff --git a/_build/html/v0.0.10/_static/css/fonts/lato-bold.woff2 b/_build/html/v0.0.10/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/lato-bold.woff2 differ diff --git a/_build/html/v0.0.10/_static/css/fonts/lato-normal-italic.woff b/_build/html/v0.0.10/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_build/html/v0.0.10/_static/css/fonts/lato-normal-italic.woff2 b/_build/html/v0.0.10/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_build/html/v0.0.10/_static/css/fonts/lato-normal.woff b/_build/html/v0.0.10/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/lato-normal.woff differ diff --git a/_build/html/v0.0.10/_static/css/fonts/lato-normal.woff2 b/_build/html/v0.0.10/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.10/_static/css/fonts/lato-normal.woff2 differ diff --git a/_build/html/v0.0.10/_static/css/theme.css b/_build/html/v0.0.10/_static/css/theme.css new file mode 100644 index 000000000..0f14f1064 --- /dev/null +++ b/_build/html/v0.0.10/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_build/html/v0.0.10/_static/doctools.js b/_build/html/v0.0.10/_static/doctools.js new file mode 100644 index 000000000..0398ebb9f --- /dev/null +++ b/_build/html/v0.0.10/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + 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; + }, + + /** + * 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; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + 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; + } + } + + // 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/_build/html/v0.0.10/_static/documentation_options.js b/_build/html/v0.0.10/_static/documentation_options.js new file mode 100644 index 000000000..c04a1db7e --- /dev/null +++ b/_build/html/v0.0.10/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.0.10', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_build/html/v0.0.10/_static/file.png b/_build/html/v0.0.10/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_build/html/v0.0.10/_static/file.png differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.eot b/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.eot differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.ttf b/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.ttf differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.woff b/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.woff differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.woff2 b/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.eot b/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.ttf b/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff b/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff2 b/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.eot b/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.eot differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.ttf b/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.ttf differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.woff b/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.woff differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.woff2 b/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.eot b/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.eot differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.ttf b/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.ttf differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.woff b/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.woff differ diff --git a/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.woff2 b/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/_build/html/v0.0.10/_static/jquery.js b/_build/html/v0.0.10/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/_build/html/v0.0.10/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/_build/html/v0.0.10/_static/language_data.js b/_build/html/v0.0.10/_static/language_data.js new file mode 100644 index 000000000..c7fe6c6fa --- /dev/null +++ b/_build/html/v0.0.10/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_build/html/v0.0.10/_static/minus.png b/_build/html/v0.0.10/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/_build/html/v0.0.10/_static/minus.png differ diff --git a/_build/html/v0.0.10/_static/plus.png b/_build/html/v0.0.10/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/_build/html/v0.0.10/_static/plus.png differ diff --git a/_build/html/v0.0.10/_static/pygments.css b/_build/html/v0.0.10/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/_build/html/v0.0.10/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_build/html/v0.0.10/_static/searchtools.js b/_build/html/v0.0.10/_static/searchtools.js new file mode 100644 index 000000000..2c774d17a --- /dev/null +++ b/_build/html/v0.0.10/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_build/html/v0.0.10/_static/sphinx_highlight.js b/_build/html/v0.0.10/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/_build/html/v0.0.10/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * 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))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + 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 SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + 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")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_build/html/v0.0.10/acknowledgements.html b/_build/html/v0.0.10/acknowledgements.html new file mode 100644 index 000000000..c3d4c7d33 --- /dev/null +++ b/_build/html/v0.0.10/acknowledgements.html @@ -0,0 +1,144 @@ + + + + + + + + + Acknowledgements — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Acknowledgements

+

We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists.

+

We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/changelog.html b/_build/html/v0.0.10/changelog.html new file mode 100644 index 000000000..4ebc5ddf9 --- /dev/null +++ b/_build/html/v0.0.10/changelog.html @@ -0,0 +1,739 @@ + + + + + + + + + Changelog — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Changelog

+
+

Version 0.0.10

+

Legend Handling

+
    +
  • The legend is now displayed only if there are valid legend handles (len(handles) > 0) and if show_legend is set to True.

  • +
  • The check ax.get_legend().remove() ensures that unnecessary legends are removed if they are empty or if show_legend is set to False.

  • +
+

Error Handling +- Error handling in the except block has been enhanced to ensure that any exceptions related to legends or labels are managed properly. The legend handling logic still respects the show_legend flag even in cases where exceptions occur.

+

This update prevents empty legend squares from appearing and maintains the intended default behavior of showing legends only when they contain relevant content.

+
+
+

Version 0.0.9

+

Bug Fixes and Minor Improvements

+

Improved error messages and validation checks across multiple functions to prevent common pitfalls and ensure smoother user experience.

+

Visualization Enhancements

+

DataFrame Columns: Added a background_color variable to dataframe_columns`, +allowing the user to enter a string representing a color name, or hex value. +Try/Except on the output, in case the end user has a deprecated version of Pandas, +where the styler would use hide() instead of hide_index(). The highlighted +columns allow for easier null versus unique value analysis.

+

The docstring now clearly describes the purpose of the function—analyzing +DataFrame columns to provide summary statistics.

+

Args:

+
    +
  • The df argument is specified as a pandas.DataFrame.

  • +
  • The background_color argument is marked as optional, with a brief description of its role.

  • +
  • The return_df argument is also marked as optional, explaining what it controls.

  • +
+

Returns: The return type is specified as pandas.DataFrame, with a clear explanation of the difference based on the return_df flag.

+

KDE Distribution Plots: Improved kde_distributions() with enhanced options for log scaling, mean/median plotting, custom standard deviation lines, and better handling of legends and scientific notation.

+

Scatter Plots: Enhanced scatter_fit_plot() with support for hue-based coloring, best fit lines, correlation display, and flexible grid plotting options.

+
+
+

Version 0.0.8

+

stacked_crosstab_plot

+
    +
  • Flexible `save_formats` Input: +- save_formats now accepts a string, tuple, or list for specifying formats (e.g., “png”, (“png”, “svg”), or [“png”, “svg”]). +- Single strings or tuples are automatically converted to lists for consistent processing.

  • +
  • Dynamic Error Handling: +- Added checks to ensure a valid path is provided for each format in save_formats. +- Raises a ValueError if a format is specified without a corresponding path, with a clear, dynamic error message.

  • +
  • Improved Plot Saving Logic: +- Updated logic allows saving plots in one format (e.g., only “png” or “svg”) without requiring the other. +- Simplified and more intuitive path handling for saving plots.

  • +
+

plot_3d_pdp

+

This update introduces several key changes to the plot_3d_pdp function, simplifying the function’s interface and improving usability, while maintaining the flexibility needed for diverse visualization needs.

+

1. Parameter Changes

+
    +
  • Removed Parameters:

    +
      +
    • The parameters x_label_plotly, y_label_plotly, and z_label_plotly have been removed. These parameters previously allowed custom axis labels specifically for the Plotly plot, defaulting to the general x_label, y_label, and z_label. Removing these parameters simplifies the function signature while maintaining flexibility.

    • +
    +
  • +
  • Default Values for Labels:

    +
      +
    • The parameters x_label, y_label, and z_label are now optional, with None as the default. If not provided, these labels will automatically default to the names of the features in the feature_names_list. This change makes the function more user-friendly, particularly for cases where default labels are sufficient.

    • +
    +
  • +
  • Changes in Default Values for View Angles:

    +
      +
    • The default values for camera positioning parameters have been updated: horizontal is now -1.25, depth is now 1.25, and vertical is now 1.25. These adjustments refine the default 3D view perspective for the Plotly plot, providing a more intuitive starting view.

    • +
    +
  • +
+

2. Plot Generation Logic

+
    +
  • Conditionally Checking Labels:

    +
      +
    • The function now checks whether x_label, y_label, and z_label are provided. If these are None, the function will automatically assign default labels based on the feature_names_list. This enhancement reduces the need for users to manually specify labels, making the function more adaptive.

    • +
    +
  • +
  • Camera Position Adjustments:

    +
      +
    • The camera positions for the Plotly plot are now adjusted by multiplying horizontal, depth, and vertical by zoom_out_factor. This change allows for more granular control over the 3D view, enhancing the interactivity and flexibility of the Plotly visualizations.

    • +
    +
  • +
  • Surface Plot Coordinates Adjustments:

    +
      +
    • The order of the coordinates for the Plotly plot’s surface has been changed from ZZ, XX, YY[::-1] to ZZ, XX, YY. This adjustment ensures the proper alignment of axes and grids, resulting in more accurate visual representations.

    • +
    +
  • +
+

3. Code Simplifications

+
    +
  • Removed Complexity:

    +
      +
    • By removing the x_label_plotly, y_label_plotly, and z_label_plotly parameters, the code is now simpler and easier to maintain. This change reduces potential confusion and streamlines the function for users who do not need distinct labels for Matplotlib and Plotly plots.

    • +
    +
  • +
  • Fallback Mechanism for Grid Values:

    +
      +
    • The function continues to implement a fallback mechanism when extracting grid values, ensuring compatibility with various versions of scikit-learn. This makes the function robust across different environments.

    • +
    +
  • +
+

4. Style Adjustments

+
    +
  • Label Formatting:

    +
      +
    • The new version consistently uses y_label, x_label, and z_label for axis labels in the Matplotlib plot, aligning the formatting across different plot types.

    • +
    +
  • +
  • Color Bar Adjustments:

    +
      +
    • The color bar configuration in the Matplotlib plot has been slightly adjusted with a shrink value of 0.6 and a pad value of 0.02. These adjustments result in a more refined visual appearance, particularly in cases where space is limited.

    • +
    +
  • +
+

5. Potential Use Case Differences

+
    +
  • Simplified Interface:

    +
      +
    • The updated function is more streamlined for users who prefer a simplified interface without the need for separate label customizations for Plotly and Matplotlib plots. This makes it easier to use in common scenarios.

    • +
    +
  • +
  • Less Granular Control:

    +
      +
    • Users who need more granular control, particularly for presentations or specific formatting, may find the older version more suitable. The removal of the *_plotly label parameters means that all plots now use the same labels across Matplotlib and Plotly.

    • +
    +
  • +
+

6. Matplotlib Plot Adjustments

+
    +
  • Wireframe and Surface Plot Enhancements:

    +
      +
    • The logic for plotting wireframes and surface plots in Matplotlib remains consistent with previous versions, with subtle enhancements to color and layout management to improve overall aesthetics.

    • +
    +
  • +
+

Summary

+
    +
  • Version 0.0.8d of the plot_3d_pdp function introduces simplifications that reduce the number of parameters and streamline the plotting process. While some customizability has been removed, the function remains flexible enough for most use cases and is easier to use.

  • +
  • Key updates include adjusted default camera views for 3D plots, removal of Plotly-specific label parameters, and improved automatic labeling and plotting logic.

  • +
+

Decision Point

+
    +
  • This update may be especially useful for users who prefer a cleaner and more straightforward interface. However, those requiring detailed customizations may want to continue using the older version, depending on their specific needs.

  • +
+
+
+

Version 0.0.8c

+

Version 0.0.8c is a follow-up release to version 0.0.8b. This update includes minor enhancements and refinements based on feedback and additional testing. It serves as an incremental step towards improving the stability and functionality of the toolkit.

+

Key Updates in 0.0.8c:

+
    +
  • Bug Fixes: Addressed minor issues identified in version 0.0.8b to ensure smoother performance and better user experience.

  • +
  • Additional Testing: Incorporated further tests to validate the changes introduced in previous versions and to prepare for future stable releases.

  • +
  • Refinements: Made small enhancements to existing features based on user feedback and internal testing results.

  • +
+

Summary of Changes

+
    +
  1. New Features & Enhancements

  2. +
+
    +
  • plot_3d_pdp Function:

    +
      +
    • Added show_modebar Parameter: Introduced a new boolean parameter, show_modebar, to allow users to toggle the visibility of the mode bar in Plotly interactive plots.

    • +
    • Custom Margins and Layout Adjustments:

      +
        +
      • Added parameters for left_margin, right_margin, and top_margin to provide users with more control over the plot layout in Plotly.

      • +
      • Adjusted default values and added options for better customization of the Plotly color bar (cbar_x, cbar_thickness) and title positioning (title_x, title_y).

      • +
      +
    • +
    • Plotly Configuration:

      +
        +
      • Enhanced the configuration options to allow users to enable or disable zoom functionality (enable_zoom) in the interactive Plotly plots.

      • +
      • Updated the code to reflect these new parameters, allowing for greater flexibility in the appearance and interaction with the Plotly plots.

      • +
      +
    • +
    • Error Handling:

      +
        +
      • Added input validation for html_file_path and html_file_name to ensure these are provided when necessary based on the selected plot_type.

      • +
      +
    • +
    +
  • +
  • plot_2d_pdp Function:

    +
      +
    • Introduced file_prefix Parameter:

      +
        +
      • Added a new file_prefix parameter to allow users to specify a prefix for filenames when saving grid plots. This change streamlines the naming process for saved plots and improves file organization.

      • +
      +
    • +
    • Enhanced Plot Type Flexibility:

      +
        +
      • The plot_type parameter now includes an option to generate both grid and individual plots (both). This feature allows users to create a combination of both layout styles in one function call.

      • +
      • Updated input validation and logic to handle this new option effectively.

      • +
      +
    • +
    • Added save_plots Parameter:

      +
        +
      • Introduced a new parameter, save_plots, to control the saving of plots. Users can specify whether to save all plots, only individual plots, only grid plots, or none.

      • +
      +
    • +
    • Custom Margins and Layout Adjustments:

      +
        +
      • Included the save_plots parameter in the validation process to ensure paths are provided when needed for saving the plots.

      • +
      +
    • +
    +
  • +
+
    +
  1. Documentation Updates

  2. +
+
    +
  • Docstrings:

    +
      +
    • Updated docstrings for both functions to reflect the new parameters and enhancements, providing clearer and more comprehensive guidance for users.

    • +
    • Detailed the use of new parameters such as show_modebar, file_prefix, save_plots, and others, ensuring that the function documentation is up-to-date with the latest changes.

    • +
    +
  • +
+
    +
  1. Refactoring & Code Cleanup

  2. +
+
    +
  • Code Structure:

    +
      +
    • Improved the code structure to maintain clarity and readability, particularly around the new functionality.

    • +
    • Consolidated the layout configuration settings for the Plotly plots into a more flexible and user-friendly format, making it easier for users to customize their plots.

    • +
    +
  • +
+
+
+

Version 0.0.8b

+

Version 0.0.8b is an exact replica of version 0.0.8a. The purpose of this +beta release was to test whether releasing it as the latest version would update +its status on PyPI to reflect it as the latest release. However, it continues to +be identified as a pre-release on PyPI.

+
+
+

Version 0.0.8a

+

Version 0.0.8a introduces significant enhancements and new features to improve +the usability and functionality of the EDA Toolkit.

+

New Features:

+
    +
  1. Optional file_prefix in stacked_crosstab_plot Function

    +
      +
    • The stacked_crosstab_plot function has been updated to make the file_prefix argument optional. If the user does not provide a file_prefix, the function will now automatically generate a default prefix based on the col and func_col parameters. This change streamlines the process of generating plots by reducing the number of required arguments.

    • +
    • Key Improvement:

      +
        +
      • Users can now omit the file_prefix argument, and the function will still produce appropriately named plot files, enhancing ease of use.

      • +
      • Backward compatibility is maintained, allowing users who prefer to specify a custom file_prefix to continue doing so without any issues.

      • +
      +
    • +
    +
  2. +
  3. Introduction of 3D and 2D Partial Dependence Plot Functions

    +
      +
    • Two new functions, plot_3d_pdp and plot_2d_pdp, have been added to the toolkit, expanding the visualization capabilities for machine learning models.

      +
        +
      • plot_3d_pdp: Generates 3D partial dependence plots for two features, supporting both static visualizations (using Matplotlib) and interactive plots (using Plotly). The function offers extensive customization options, including labels, color maps, and saving formats.

      • +
      • plot_2d_pdp: Creates 2D partial dependence plots for specified features with flexible layout options (grid or individual plots) and customization of figure size, font size, and saving formats.

      • +
      +
    • +
    • Key Features:

      +
        +
      • Compatibility: Both functions are compatible with various versions of scikit-learn, ensuring broad usability.

      • +
      • Customization: Extensive options for customizing visual elements, including figure size, font size, and color maps.

      • +
      • Interactive 3D Plots: The plot_3d_pdp function supports interactive visualizations, providing an enhanced user experience for exploring model predictions in 3D space.

      • +
      +
    • +
    +
  4. +
+

Impact:

+
    +
  • These updates improve the user experience by reducing the complexity of function calls and introducing powerful new tools for model interpretation.

  • +
  • The optional file_prefix enhancement simplifies plot generation while maintaining the flexibility to define custom filenames.

  • +
  • The new partial dependence plot functions offer robust visualization options, making it easier to analyze and interpret the influence of specific features in machine learning models.

  • +
+
+
+

Version 0.0.7

+

Added Function for Customizable Correlation Matrix Visualization

+

This release introduces a new function, flex_corr_matrix, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to seaborn.heatmap().

+

Summary of Changes

+
    +
  • New Function: flex_corr_matrix.

    +
      +
    • Functionality: +- Generates a correlation heatmap for a given DataFrame. +- Supports both full and upper triangular correlation matrices based on the triangular parameter. +- Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. +- Accepts additional keyword arguments via **kwargs to pass directly to seaborn.heatmap(). +- Includes validation to ensure the triangular, annot, and save_plots parameters are boolean values. +- Raises an exception if save_plots=True but neither image_path_png nor image_path_svg is specified.

    • +
    +
  • +
+

Usage

+
# Full correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True)
+
+# Upper triangular correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True)
+
+
+

Contingency table df to object type

+

Convert all columns in the DataFrame to object type to prevent issues with numerical columns.

+
df = df.astype(str).fillna("")
+
+
+
+
+

Version 0.0.6

+

Added validation for Plot Type Parameter in KDE Distributions Function

+

This release adds a validation step for the plot_type parameter in the kde_distributions function. The allowed values for plot_type are "hist", "kde", and "both". If an invalid value is provided, the function will now raise a ValueError with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values.

+
# Validate plot_type parameter
+valid_plot_types = ["hist", "kde", "both"]
+if plot_type.lower() not in valid_plot_types:
+    raise ValueError(
+        f"Invalid plot_type value. Expected one of {valid_plot_types}, "
+        f"got '{plot_type}' instead."
+    )
+
+
+
+
+

Version 0.0.5

+

Ensure Consistent Font Size and Text Wrapping Across Plot Elements

+

This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the stacked_crosstab_plot function. The following updates have been implemented to ensure uniformity and improve the readability of plots:

+
    +
  1. Title Font Size and Text Wrapping: +- Added a text_wrap parameter to control the wrapping of plot titles. +- Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ax.set_title() after plot generation.

  2. +
  3. Legend Font Size Consistency: +- Incorporated label_fontsize into the legend font size by directly setting the font size of the legend text using plt.setp(legend.get_texts(), fontsize=label_fontsize). +- This ensures that the legend labels are consistent with the title and axis labels.

  4. +
+

Testing

+
    +
  • Verified that titles now wrap correctly and match the specified label_fontsize.

  • +
  • Confirmed that legend text scales according to label_fontsize, ensuring consistent font sizes across all plot elements.

  • +
+
+
+

Version 0.0.4

+
    +
  • Stable release

    +
      +
    • No new updates to the codebase.

    • +
    • Updated the project description variable in setup.py to re-emphasize key elements of the library.

    • +
    • Minor README cleanup:

      +
        +
      • Added icons for sections that did not have them.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.3

+
    +
  • Stable release

    +
      +
    • Updated logo size, fixed citation title, and made minor README cleanup:

      +
        +
      • Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.2

+
    +
  • +
    First stable release
      +
    • No new updates to the codebase; minimal documentation updates to README and setup.py files.

    • +
    • Added logo, badges, and Zenodo-certified citation to README.

    • +
    +
    +
    +
  • +
+
+
+

Version 0.0.1rc0

+
    +
  • No new updates to the codebase; minimal documentation updates to README and setup.py files.

  • +
+
+
+

Version 0.0.1b0

+

New Scatter Fit Plot and Additional Updates

+
    +
  • Added new scatter_fit_plot(), removed unused data_types(), and added comment section headers.

  • +
+

Added xlim and ylim Inputs to KDE Distribution

+
    +
  • kde_distribution():

    +
    +
      +
    • Added xlim and ylim inputs to allow users to customize axes limits in kde_distribution().

    • +
    +
    +
  • +
+

Added xlim and ylim Params to Stacked Crosstab Plot

+
    +
  • stacked_crosstab_plot():

    +
    +
      +
    • Added xlim and ylim input parameters to stacked_crosstab_plot() to give users more flexibility in controlling axes limits.

    • +
    +
    +
  • +
+

Added x and y Limits to Box and Violin Plots

+
    +
  • box_violin_plot():

    +
    +
      +
    • Changed function name from metrics_box_violin() to box_violin_plot().

    • +
    • Added xlim and ylim inputs to control x and y-axis limits of box_violin_plot() (formerly metrics_box_violin).

    • +
    +
    +
  • +
+

Added Ability to Remove Stacks from Plots, Plot All or One at a Time

+

Key Changes

+
    +
  1. Plot Type Parameter +- plot_type: This parameter allows the user to choose between "regular", "normalized", or "both" plot types.

  2. +
  3. Remove Stacks Parameter +- remove_stacks: This parameter, when set to True, generates a regular bar plot using only the col parameter instead of a stacked bar plot. It only works when plot_type is set to “regular”. If remove_stacks is set to True while plot_type is anything other than “regular”, the function will raise an exception.

  4. +
+

Explanation of Changes

+
    +
  • Plot Type Parameter

    +
      +
    • Provides flexibility to the user, allowing specification of the type of plot to generate:

      +
        +
      • "regular": Standard bar plot.

      • +
      • "normalized": Normalized bar plot.

      • +
      • "both": Both regular and normalized bar plots.

      • +
      +
    • +
    +
  • +
  • Remove Stacks Parameter +- remove_stacks: Generates a regular bar plot using only the col parameter, removing the stacking of the bars. Applicable only when plot_type is set to “regular”. An exception is raised if used with any other plot_type.

  • +
+

These changes enhance the flexibility and functionality of the stacked_crosstab_plot function, allowing for more customizable and specific plot generation based on user requirements.

+
+
+

Version 0.0.1b0

+

Refined KDE Distributions

+

Key Changes

+
    +
  1. Alpha Transparency for Histogram Fill +- Added a fill_alpha parameter to control the transparency of the histogram bars’ fill color. +- Default value is 0.6. An exception is raised if fill=False and fill_alpha is specified.

  2. +
  3. Custom Font Sizes +- Introduced label_fontsize and tick_fontsize parameters to control font size of axis labels and tick marks independently.

  4. +
  5. Scientific Notation Toggle +- Added a disable_sci_notation parameter to enable or disable scientific notation on axes.

  6. +
  7. Improved Error Handling +- Added validation for the stat parameter to ensure valid options are accepted. +- Added checks for proper usage of fill_alpha and hist_edgecolor when fill is set to False.

  8. +
  9. General Enhancements +- Updated the function’s docstring to reflect new parameters and provide comprehensive guidance on usage.

  10. +
+
+
+

Version 0.0.1b0

+

Enhanced KDE Distributions Function

+

Added Parameters

+
    +
  1. Grid Figsize and Single Figsize +- Control the size of the overall grid figure and individual figures separately.

  2. +
  3. Hist Color and KDE Color` +- Allow customization of histogram and KDE plot colors.

  4. +
  5. Edge Color +- Allows customization of histogram bar edges.

  6. +
  7. Hue +- Allows grouping data by a column.

  8. +
  9. Fill +- Controls whether to fill histogram bars with color.

  10. +
  11. Y-axis Label` +- Customizable y-axis label.

  12. +
  13. Log-Scaling +- Specifies which variables to apply log scale.

  14. +
  15. Bins and Bin Width +- Control the number and width of bins.

  16. +
  17. ``stat``: +- Allows different statistics for the histogram (count, density, frequency, probability, proportion, percent).

  18. +
+

Improvements

+
    +
  1. Validation and Error Handling +- Checks for invalid log_scale_vars and throws a ValueError if any are found. +- Throws a ValueError if edgecolor is changed while fill is set to False. +- Issues a PerformanceWarning if both bins and binwidth are specified, warning of potential performance impacts.

  2. +
  3. Customizable Y-Axis Label +- Allows users to specify custom y-axis labels.

  4. +
  5. Warning for KDE with Count +- Issues a warning if KDE is used with stat='count', as it may produce misleading plots.

  6. +
+

Updated Function to Ensure Unique IDs and Index Check

+
    +
  • Ensured that each generated ID in add_ids starts with a non-zero digit.

  • +
  • Added a check to verify that the DataFrame index is unique.

  • +
  • Printed a warning message if duplicate index entries are found.

  • +
+

These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique.

+

Check for Unique Indices +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries.

+

Generate Non-Zero Starting IDs

+
    +
  • The ID generation process is updated to ensure that the first digit of each ID is always non-zero.

  • +
+

Ensure Unique IDs

+
    +
  • A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame.

  • +
+

Fix Int Conversion for Numeric Columns, Reset Decimal Places

+
    +
  • Fixed integer conversion issue for numeric columns when decimal_places=0 in the save_dataframes_to_excel function.

  • +
  • Reset decimal_places default value to 0.

  • +
+

These changes ensure correct formatting and avoid errors during conversion.

+

Contingency Table Updates

+
    +
  1. Error Handling for Columns +- Added a check to ensure at least one column is specified. +- Updated the function to accept a single column as a string or multiple columns as a list. +- Raised a ValueError if no columns are provided or if cols is not correctly specified.

  2. +
  3. Function Parameters +- Changed parameters from col1 and col2 to a single parameter cols which can be either a string or a list.

  4. +
  5. Error Handling +- Renamed SortBy to sort_by to standardize nomenclature. +- Added a check to ensure sort_by is either 0 or 1. +- Raised a ValueError if sort_by is not 0 or 1.

  6. +
+
    +
  1. Sorting Logic +- Updated the sorting logic to handle the new cols parameter structure.

  2. +
  3. Handling Categorical Data +- Modified code to convert categorical columns to strings to avoid issues with fillna("").

  4. +
  5. Handling Missing Values +- Added df = df.fillna('') to fill NA values within the function to account for missing data.

  6. +
  7. Improved Function Documentation +- Updated function documentation to reflect new parameters and error handling.

  8. +
+
+
+

Version 0.0.1b0

+

Contingency Table Updates

+
    +
  • fillna('') added to output so that null values come through, removed 'All' column name from output, sort options 0 and 1, updated docstring documentation. Tested successfully on Python 3.7.3.

  • +
+

Compatibility Enhancement

+
    +
  1. Added a version check for Python 3.7 and above.

    +
      +
    • Conditional import of datetime to handle different Python versions.

    • +
    +
  2. +
+
if sys.version_info >= (3, 7):
+    from datetime import datetime
+else:
+    import datetime
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/citations.html b/_build/html/v0.0.10/citations.html new file mode 100644 index 000000000..1865176b9 --- /dev/null +++ b/_build/html/v0.0.10/citations.html @@ -0,0 +1,156 @@ + + + + + + + + + Citing EDA Toolkit — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Citing EDA Toolkit

+

Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.10). Zenodo. https://doi.org/10.5281/zenodo.13163208

+
@software{shpaner_2024_13162633,
+author       = {Shpaner, Leonid and
+                Gil, Oscar},
+title        = {EDA Toolkit},
+month        = aug,
+year         = 2024,
+publisher    = {Zenodo},
+version      = {0.0.10},
+doi          = {10.5281/zenodo.13162633},
+url          = {https://doi.org/10.5281/zenodo.13162633}
+}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/contributors.html b/_build/html/v0.0.10/contributors.html new file mode 100644 index 000000000..04245cff8 --- /dev/null +++ b/_build/html/v0.0.10/contributors.html @@ -0,0 +1,148 @@ + + + + + + + + + Contributors/Maintainers — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Contributors/Maintainers

+
https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + +

Leonid Shpaner is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego’s M.S. Applied Artificial Intelligence program.

+


https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + +

Oscar Gil is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/data_management.html b/_build/html/v0.0.10/data_management.html new file mode 100644 index 000000000..494fb2f26 --- /dev/null +++ b/_build/html/v0.0.10/data_management.html @@ -0,0 +1,1474 @@ + + + + + + + + + Data Management Overview — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Data Management Overview

+

In any data-driven project, effective management of data is crucial. This +section provides essential techniques for handling and preparing data to ensure +consistency, accuracy, and ease of analysis. From directory setup and data +cleaning to advanced data processing, these methods form the backbone of reliable +data management. Dive into the following topics to enhance your data handling +capabilities and streamline your workflow.

+
+
+

Data Management Techniques

+
+

Path directories

+

Ensure that the directory exists. If not, create it.

+
+
+ensure_directory(path)
+
+
Parameters:
+

path (str) – The path to the directory that needs to be ensured.

+
+
Returns:
+

None

+
+
+
+ +

The ensure_directory function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories.

+

Example Usage

+

In the example below, we demonstrate how to use the ensure_directory function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them.

+

First, we define the base path as the parent directory of the current directory. +The os.pardir constant, equivalent to ".."", is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory.

+

Next, we set paths for the PNG and SVG image directories, located within an +images folder in the parent directory. Using the ensure_directory +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them.

+
from eda_toolkit import ensure_directory
+
+import os # import operating system for dir
+
+
+base_path = os.path.join(os.pardir)
+
+# Go up one level from 'notebooks' to parent directory,
+# then into the 'data' folder
+data_path = os.path.join(os.pardir, "data")
+data_output = os.path.join(os.pardir, "data_output")
+
+# create image paths
+image_path_png = os.path.join(base_path, "images", "png_images")
+image_path_svg = os.path.join(base_path, "images", "svg_images")
+
+# Use the function to ensure'data' directory exists
+ensure_directory(data_path)
+ensure_directory(data_output)
+ensure_directory(image_path_png)
+ensure_directory(image_path_svg)
+
+
+

Output

+
Created directory: ../data
+Created directory: ../data_output
+Created directory: ../images/png_images
+Created directory: ../images/svg_images
+
+
+
+
+

Adding Unique Identifiers

+

Add a column of unique IDs with a specified number of digits to the dataframe.

+
+
+add_ids(df, id_colname='ID', num_digits=9, seed=None, set_as_index=True)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The dataframe to add IDs to.

  • +
  • id_colname (str, optional) – The name of the new column for the IDs. Defaults to "ID".

  • +
  • num_digits (int, optional) – The number of digits for the unique IDs. Defaults to 9.

  • +
  • seed (int, optional) – The seed for the random number generator. Defaults to None.

  • +
  • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

  • +
+
+
Returns:
+

The updated dataframe with the new ID column.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+

Note

+
    +
  • If the dataframe index is not unique, a warning is printed.

  • +
  • +
    The function does not check if the number of rows exceeds the number of

    unique IDs that can be generated with the specified number of digits.

    +
    +
    +
  • +
  • The first digit of the generated IDs is ensured to be non-zero.

  • +
+
+

The add_ids function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe.

+

Example Usage

+

In the example below, we demonstrate how to use the add_ids function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the add_ids function to generate +and append a column of unique IDs with a specified number of digits to the dataframe.

+

First, we import the pandas library and the add_ids function from the eda_toolkit. +Then, we create a sample dataframe with some data. We call the add_ids function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe.

+
from eda_toolkit import add_ids
+
+# Add a column of unique IDs with 9 digits and call it "census_id"
+df = add_ids(
+    df=df,
+    id_colname="census_id",
+    num_digits=9,
+    seed=111,
+    set_as_index=True,
+)
+
+
+

Output

+

First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
DataFrame index is unique.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+

+
+
+

Trailing Period Removal

+

Strip the trailing period from floats in a specified column of a DataFrame, if present.

+
+
+strip_trailing_period(df, column_name)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The DataFrame containing the column to be processed.

  • +
  • column_name (str) – The name of the column containing floats with potential trailing periods.

  • +
+
+
Returns:
+

The updated DataFrame with the trailing periods removed from the specified column.

+
+
Return type:
+

pd.DataFrame

+
+
+

The strip_trailing_period function is designed to remove trailing periods +from float values in a specified column of a DataFrame. This can be particularly +useful when dealing with data that has been inconsistently formatted, ensuring +that all float values are correctly represented.

+
+ +

Example Usage

+

In the example below, we demonstrate how to use the strip_trailing_period function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the strip_trailing_period function to remove any trailing periods from the specified column.

+
from eda_toolkit import strip_trailing_period
+
+# Create a sample dataframe with trailing periods in some values
+data = {
+    "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.],
+}
+df = pd.DataFrame(data)
+
+# Remove trailing periods from the 'values' column
+df = strip_trailing_period(df=df, column_name="values")
+
+
+

Output

+

First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)

+ + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +

+

Note: The last row shows 6 as an int with a trailing period with its conversion to float.

+

+
+
+

Standardized Dates

+

Parse and standardize date strings based on the provided rule.

+
+
+parse_date_with_rule(date_str)
+

This function takes a date string and standardizes it to the ISO 8601 format +(YYYY-MM-DD). It assumes dates are provided in either day/month/year or +month/day/year format. The function first checks if the first part of the +date string (day or month) is greater than 12, which unambiguously indicates +a day/month/year format. If the first part is 12 or less, the function +attempts to parse the date as month/day/year, falling back to day/month/year +if the former raises a ValueError due to an impossible date (e.g., month +being greater than 12).

+
+
Parameters:
+

date_str (str) – A date string to be standardized.

+
+
Returns:
+

A standardized date string in the format YYYY-MM-DD.

+
+
Return type:
+

str

+
+
Raises:
+

ValueError – If date_str is in an unrecognized format or if the function +cannot parse the date.

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the parse_date_with_rule +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the parse_date_with_rule +function to parse and standardize each date string to the ISO 8601 format.

+
from eda_toolkit import parse_date_with_rule
+
+# Sample date strings
+date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"]
+
+# Standardize the date strings
+standardized_dates = [parse_date_with_rule(date) for date in date_strings]
+
+print(standardized_dates)
+
+
+

Output

+
['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12']
+
+
+
+

Important

+

In the next example, we demonstrate how to apply the parse_date_with_rule +function to a DataFrame column containing date strings using the .apply() method. +This is particularly useful when you need to standardize date formats across an +entire column in a DataFrame.

+
+
# Creating the DataFrame
+data = {
+    "date_column": [
+        "31/12/2021",
+        "01/01/2022",
+        "12/31/2021",
+        "13/02/2022",
+        "07/04/2022",
+    ],
+    "name": ["Alice", "Bob", "Charlie", "David", "Eve"],
+    "amount": [100.0, 150.5, 200.75, 250.25, 300.0],
+}
+
+df = pd.DataFrame(data)
+
+# Apply the function to the DataFrame column
+df["standardized_date"] = df["date_column"].apply(parse_date_with_rule)
+
+print(df)
+
+
+

Output

+
   date_column     name  amount standardized_date
+0   31/12/2021    Alice  100.00        2021-12-31
+1   01/01/2022      Bob  150.50        2022-01-01
+2   12/31/2021  Charlie  200.75        2021-12-31
+3   13/02/2022    David  250.25        2022-02-13
+4   07/04/2022      Eve  300.00        2022-04-07
+
+
+
+
+

DataFrame Analysis

+

Analyze DataFrame columns, including dtype, null values, and unique value counts.

+
+
+dataframe_columns(df, background_color=None, return_df=False)
+

Analyze DataFrame columns to provide summary statistics such as data type, +null counts, unique values, and most frequent values.

+

This function analyzes the columns of a DataFrame, providing details about the data type, +the number and percentage of null values, the total number of unique values, and the most +frequent unique value along with its count and percentage. It handles special cases such as +converting date columns and replacing empty strings with Pandas NA values.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • background_color (str, optional) – Hex color code or color name for background styling in the output +DataFrame. Defaults to None.

  • +
  • return_df (bool, optional) – If True, returns the plain DataFrame with the summary statistics. If +False, returns a styled DataFrame for visual presentation. Defaults to False.

  • +
+
+
Returns:
+

If return_df is True, returns the plain DataFrame containing column summary +statistics. If return_df is False, returns a styled DataFrame with optional +background color for specific columns.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the dataframe_columns +function to analyze a DataFrame’s columns.

+
from eda_toolkit import dataframe_columns
+
+dataframe_columns(df=df)
+
+
+

Output

+

Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
Shape:  (48842, 16)
+
+Total seconds of processing time: 0.861555
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+

+
+
+

Generating Summary Tables for Variable Combinations

+

This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.

+
+
+summarize_all_combinations(df, variables, data_path, data_name, min_length=2)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The pandas DataFrame containing the data.

  • +
  • variables (list of str) – List of column names from the DataFrame to generate combinations.

  • +
  • data_path (str) – Path where the output Excel file will be saved.

  • +
  • data_name (str) – Name of the output Excel file.

  • +
  • min_length (int, optional) – Minimum size of the combinations to generate. Defaults to 2.

  • +
+
+
Returns:
+

A tuple containing a dictionary of summary tables and a list of all generated combinations.

+
+
Return type:
+

tuple(dict, list)

+
+
+
+ +
+

Note

+
    +
  • +
    The function will create an Excel file with a sheet for each combination

    of the specified variables, as well as a “Table of Contents” sheet with +hyperlinks to each summary table.

    +
    +
    +
  • +
  • The sheet names are limited to 31 characters due to Excel’s constraints.

  • +
+
+

The function returns two outputs:

+

1. summary_tables: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values.

+

2. all_combinations: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables.

+

Example Usage

+

Below, we use the summarize_all_combinations function to generate summary tables for the specified +variables from a DataFrame containing the census data [1].

+
from eda_toolkit import summarize_all_combinations
+
+# Define unique variables for the analysis
+unique_vars = [
+    "age_group",
+    "workclass",
+    "education",
+    "occupation",
+    "race",
+    "sex",
+    "income",
+]
+
+# Generate summary tables for all combinations of the specified variables
+summary_tables, all_combinations = summarize_all_combinations(
+    df=df,
+    data_path=data_output,
+    variables=unique_vars,
+    data_name="census_summary_tables.xlsx",
+)
+
+# Print all combinations of variables
+print(all_combinations)
+
+
+

Output

+
[('age_group', 'workclass'),
+('age_group', 'education'),
+('age_group', 'occupation'),
+('age_group', 'race'),
+('age_group', 'sex'),
+('age_group', 'income'),
+('workclass', 'education'),
+('workclass', 'occupation'),
+('workclass', 'race'),
+('workclass', 'sex'),
+('workclass', 'income'),
+('education', 'occupation'),
+('education', 'race'),
+('education', 'sex'),
+('education', 'income'),
+('occupation', 'race'),
+('occupation', 'sex'),
+('occupation', 'income'),
+('race', 'sex'),
+('race', 'income'),
+('sex', 'income'),
+('age_group', 'workclass', 'education'),
+('age_group', 'workclass', 'occupation'),
+('age_group', 'workclass', 'race'),
+('age_group', 'workclass', 'sex'),
+('age_group', 'workclass', 'income'),
+('age_group', 'education', 'occupation'),
+('age_group', 'education', 'race'),
+('age_group', 'education', 'sex'),
+('age_group', 'education', 'income'),
+('age_group', 'occupation', 'race'),
+('age_group', 'occupation', 'sex'),
+('age_group', 'occupation', 'income'),
+('age_group', 'race', 'sex'),
+('age_group', 'race', 'income'),
+('age_group', 'sex', 'income'),
+('workclass', 'education', 'occupation'),
+('workclass', 'education', 'race'),
+('workclass', 'education', 'sex'),
+('workclass', 'education', 'income'),
+('workclass', 'occupation', 'race'),
+('workclass', 'occupation', 'sex'),
+('workclass', 'occupation', 'income'),
+('workclass', 'race', 'sex'),
+('workclass', 'race', 'income'),
+('workclass', 'sex', 'income'),
+('education', 'occupation', 'race'),
+('education', 'occupation', 'sex'),
+('education', 'occupation', 'income'),
+('education', 'race', 'sex'),
+('education', 'race', 'income'),
+('education', 'sex', 'income'),
+('occupation', 'race', 'sex'),
+('occupation', 'race', 'income'),
+('occupation', 'sex', 'income'),
+('race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation'),
+('age_group', 'workclass', 'education', 'race'),
+('age_group', 'workclass', 'education', 'sex'),
+('age_group', 'workclass', 'education', 'income'),
+('age_group', 'workclass', 'occupation', 'race'),
+('age_group', 'workclass', 'occupation', 'sex'),
+('age_group', 'workclass', 'occupation', 'income'),
+('age_group', 'workclass', 'race', 'sex'),
+('age_group', 'workclass', 'race', 'income'),
+('age_group', 'workclass', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race'),
+('age_group', 'education', 'occupation', 'sex'),
+('age_group', 'education', 'occupation', 'income'),
+('age_group', 'education', 'race', 'sex'),
+('age_group', 'education', 'race', 'income'),
+('age_group', 'education', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex'),
+('age_group', 'occupation', 'race', 'income'),
+('age_group', 'occupation', 'sex', 'income'),
+('age_group', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race'),
+('workclass', 'education', 'occupation', 'sex'),
+('workclass', 'education', 'occupation', 'income'),
+('workclass', 'education', 'race', 'sex'),
+('workclass', 'education', 'race', 'income'),
+('workclass', 'education', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex'),
+('workclass', 'occupation', 'race', 'income'),
+('workclass', 'occupation', 'sex', 'income'),
+('workclass', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex'),
+('education', 'occupation', 'race', 'income'),
+('education', 'occupation', 'sex', 'income'),
+('education', 'race', 'sex', 'income'),
+('occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race'),
+('age_group', 'workclass', 'education', 'occupation', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'race', 'income'),
+('age_group', 'workclass', 'education', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'education', 'occupation', 'race', 'income'),
+('age_group', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'education', 'race', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex'),
+('workclass', 'education', 'occupation', 'race', 'income'),
+('workclass', 'education', 'occupation', 'sex', 'income'),
+('workclass', 'education', 'race', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex', 'income'),
+('age_group',
+'workclass',
+'education',
+'occupation',
+'race',
+'sex',
+'income')]
+
+
+

When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table.

+
EDA Toolkit Logo + +
+
+

Saving DataFrames to Excel with Customized Formatting

+

Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.

+

This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the save_dataframes_to_excel function.

+
+
+save_dataframes_to_excel(file_path, df_dict, decimal_places=0)
+
+
Parameters:
+
    +
  • file_path (str) – Full path to the output Excel file.

  • +
  • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

  • +
  • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

  • +
+
+
+
+ +
+

Note

+
    +
  • The function will autofit columns and left-align text.

  • +
  • Numeric columns will be formatted with the specified number of decimal places.

  • +
  • Headers will be bold and left-aligned without borders.

  • +
+
+

The function performs the following tasks:

+
    +
  • Writes each DataFrame to its respective sheet in the Excel file.

  • +
  • Rounds numeric columns to the specified number of decimal places.

  • +
  • Applies customized formatting to headers and cells.

  • +
  • Autofits columns based on the content length.

  • +
+

Example Usage

+

Below, we use the save_dataframes_to_excel function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between 18 and 40.

+
from eda_toolkit import save_dataframes_to_excel
+
+# Example usage
+file_name = "df_census.xlsx"  # Name of the output Excel file
+file_path = os.path.join(data_path, file_name)
+
+# filter DataFrame to Ages 18-40
+filtered_df = df[(df["age"] > 18) & (df["age"] < 40)]
+
+df_dict = {
+    "original_df": df,
+    "ages_18_to_40": filtered_df,
+}
+
+save_dataframes_to_excel(
+    file_path=file_path,
+    df_dict=df_dict,
+    decimal_places=0,
+)
+
+
+

Output

+

The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between 18 and 40, each on separate sheets with customized formatting.

+
+
+

Creating Contingency Tables

+

Create a contingency table from one or more columns in a DataFrame, with sorting options.

+

This section explains how to create contingency tables from one or more columns in a DataFrame, with options to sort the results using the contingency_table function.

+
+
+contingency_table(df, cols=None, sort_by=0)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • cols (str or list of str, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

  • +
  • sort_by (int, optional) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order. Defaults to 0.

  • +
+
+
Raises:
+

ValueError – If no columns are specified or if sort_by is not 0 or 1.

+
+
Returns:
+

A DataFrame containing the contingency table with the specified columns, a 'Total' column representing the count of occurrences, and a 'Percentage' column representing the percentage of the total count.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

Below, we use the contingency_table function to create a contingency table +from the specified columns in a DataFrame containing census data [1]

+
from eda_toolkit import contingency_table
+
+# Example usage
+contingency_table(
+    df=df,
+    cols=[
+        "age_group",
+        "workclass",
+        "race",
+        "sex",
+    ],
+    sort_by=1,
+)
+
+
+

Output

+

The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the 'Total' column in descending order because sort_by +is set to 1.

+
    age_group     workclass                race     sex  Total  Percentage
+0       30-39       Private               White    Male   5856       11.99
+1       18-29       Private               White    Male   5623       11.51
+2       40-49       Private               White    Male   4267        8.74
+3       18-29       Private               White  Female   3680        7.53
+4       50-59       Private               White    Male   2565        5.25
+..        ...           ...                 ...     ...    ...         ...
+467     50-59   Federal-gov               Other    Male      1        0.00
+468     50-59     Local-gov  Asian-Pac-Islander  Female      1        0.00
+469     70-79  Self-emp-inc               Black    Male      1        0.00
+470     80-89     Local-gov  Asian-Pac-Islander    Male      1        0.00
+471                                                      48842      100.00
+
+[472 rows x 6 columns]
+
+
+

+
+
+

Highlighting Specific Columns in a DataFrame

+

This section explains how to highlight specific columns in a DataFrame using the highlight_columns function.

+

Highlight specific columns in a DataFrame with a specified background color.

+
+
+highlight_columns(df, columns, color='yellow')
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to be styled.

  • +
  • columns (list of str) – List of column names to be highlighted.

  • +
  • color (str, optional) – The background color to be applied for highlighting (default is “yellow”).

  • +
+
+
Returns:
+

A Styler object with the specified columns highlighted.

+
+
Return type:
+

pandas.io.formats.style.Styler

+
+
+
+ +

Example Usage

+

Below, we use the highlight_columns function to highlight the age and education +columns in the first 5 rows of the census [1] DataFrame with a pink background color.

+
from eda_toolkit import highlight_columns
+
+# Applying the highlight function
+highlighted_df = highlight_columns(
+    df=df,
+    columns=["age", "education"],
+    color="#F8C5C8",
+)
+
+highlighted_df
+
+
+

Output

+

The output will be a DataFrame with the specified columns highlighted in the given background color. +The age and education columns will be highlighted in pink.

+

The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the .render() method of the Styler object.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife

+
+
+

Binning Numerical Columns

+

Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or “bins.” This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or “bins,” and +then assigning each value to one of these intervals.

+
+

Note

+

The code snippets below create age bins and assign a corresponding age group +label to each age in the DataFrame. The pd.cut function from pandas is used to +categorize the ages and assign them to a new column, age_group. Adjust the bins +and labels as needed for your specific data.

+
+

Below, we use the age column of the census data [1] from the UCI Machine Learning Repository as an example:

+
    +
  1. Bins Definition: +The bins are defined by specifying the boundaries of each interval. For example, +in the code snippet below, the bin_ages list specifies the boundaries for age groups:

    +
    bin_ages = [
    +    0,
    +    18,
    +    30,
    +    40,
    +    50,
    +    60,
    +    70,
    +    80,
    +    90,
    +    100,
    +    float("inf"),
    +]
    +
    +
    +

    Each pair of consecutive elements in bin_ages defines a bin. For example:

    +
      +
    • The first bin is [0, 18),

    • +
    • The second bin is [18, 30),

    • +
    • and so on.

    • +
    +
  2. +
+

+
    +
  1. Labels for Bins: +The label_ages list provides labels corresponding to each bin:

    +
    label_ages = [
    +    "< 18",
    +    "18-29",
    +    "30-39",
    +    "40-49",
    +    "50-59",
    +    "60-69",
    +    "70-79",
    +    "80-89",
    +    "90-99",
    +    "100 +",
    +]
    +
    +
    +

    These labels are used to categorize the numerical values into meaningful groups.

    +
  2. +
  3. Applying the Binning: +The pd.cut function +from Pandas is used to apply the binning process. For each value in the age +column of the DataFrame, it assigns a corresponding label based on which bin the +value falls into. Here, right=False indicates that each bin includes the +left endpoint but excludes the right endpoint. For example, if bin_ages = +[0, 10, 20, 30], then a value of 10 will fall into the bin [10, 20) and +be labeled accordingly.

    +
    df["age_group"] = pd.cut(
    +    df["age"],
    +    bins=bin_ages,
    +    labels=label_ages,
    +    right=False,
    +)
    +
    +
    +

    Mathematically, for a given value x in the age column:

    +
    +\[\begin{split}\text{age_group} = +\begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 +\end{cases}\end{split}\]
    +

    The parameter right=False in pd.cut means that the bins are left-inclusive +and right-exclusive, except for the last bin, which is always right-inclusive +when the upper bound is infinity (float("inf")).

    +
  4. +
+ +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/eda_plots.html b/_build/html/v0.0.10/eda_plots.html new file mode 100644 index 000000000..3420baf9e --- /dev/null +++ b/_build/html/v0.0.10/eda_plots.html @@ -0,0 +1,2084 @@ + + + + + + + + + Plotting and Theoretical Overview — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Plotting and Theoretical Overview

+
+

Gaussian Assumption for Normality

+

The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF):

+
+\[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)\]
+

where:

+
    +
  • \(\mu\) is the mean

  • +
  • \(\sigma^2\) is the variance

  • +
+

In a normally distributed dataset:

+
    +
  • 68% of data falls within \(\mu \pm \sigma\)

  • +
  • 95% within \(\mu \pm 2\sigma\)

  • +
  • 99.7% within \(\mu \pm 3\sigma\)

  • +
+
KDE Distributions - KDE (+) Histograms (Density) + +
+

Histograms and Kernel Density Estimation (KDE)

+

Histograms:

+
    +
  • Visualize data distribution by binning values and counting frequencies.

  • +
  • If data is Gaussian, the histogram approximates a bell curve.

  • +
+

KDE:

+
    +
  • A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function.

  • +
  • The KDE for a dataset \(X = \{x_1, x_2, \ldots, x_n\}\) is given by:

  • +
+
+\[\hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right)\]
+

where:

+
    +
  • \(K\) is the kernel function (often Gaussian)

  • +
  • \(h\) is the bandwidth (smoothing parameter)

  • +
+Combined Use of Histograms and KDE

+
    +
  • Histograms offer a discrete, binned view of the data.

  • +
  • KDE provides a smooth, continuous estimate of the underlying distribution.

  • +
  • Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality.

  • +
+
+
+
+

Pearson Correlation Coefficient

+

The Pearson correlation coefficient, often denoted as \(r\), is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from \(-1\) to \(1\), where:

+
    +
  • \(r = 1\) indicates a perfect positive linear relationship.

  • +
  • \(r = -1\) indicates a perfect negative linear relationship.

  • +
  • \(r = 0\) indicates no linear relationship.

  • +
+

The Pearson correlation coefficient between two variables \(X\) and \(Y\) is defined as:

+
+\[r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y}\]
+

where:

+
    +
  • \(\text{Cov}(X, Y)\) is the covariance of \(X\) and \(Y\).

  • +
  • \(\sigma_X\) is the standard deviation of \(X\).

  • +
  • \(\sigma_Y\) is the standard deviation of \(Y\).

  • +
+

Covariance measures how much two variables change together. It is defined as:

+
+\[\text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)\]
+

where:

+
    +
  • \(n\) is the number of data points.

  • +
  • \(X_i\) and \(Y_i\) are the individual data points.

  • +
  • \(\mu_X\) and \(\mu_Y\) are the means of \(X\) and \(Y\).

  • +
+

The standard deviation measures the dispersion or spread of a set of values. For +a variable \(X\), the standard deviation \(\sigma_X\) is:

+
+\[\sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2}\]
+

Substituting the covariance and standard deviation into the Pearson correlation formula:

+
+\[r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}}\]
+

This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between \(X\) and \(Y\).

+
    +
  • \(r > 0\): Positive correlation. As \(X\) increases, \(Y\) tends to increase.

  • +
  • \(r < 0\): Negative correlation. As \(X\) increases, \(Y\) tends to decrease.

  • +
  • \(r = 0\): No linear correlation. There is no consistent linear relationship between \(X\) and \(Y\).

  • +
+

The closer the value of \(r\) is to \(\pm 1\), the stronger the linear relationship between the two variables.

+
+
+

Partial Dependence Foundations

+

Let \(\mathbf{X}\) represent the complete set of input features for a machine +learning model, where \(\mathbf{X} = \{X_1, X_2, \dots, X_p\}\). Suppose we’re +particularly interested in a subset of these features, denoted by \(\mathbf{X}_S\). +The complementary set, \(\mathbf{X}_C\), contains all the features in \(\mathbf{X}\) +that are not in \(\mathbf{X}_S\). Mathematically, this relationship is expressed as:

+
+\[\mathbf{X}_C = \mathbf{X} \setminus \mathbf{X}_S\]
+

where \(\mathbf{X}_C\) is the set of features in \(\mathbf{X}\) after +removing the features in \(\mathbf{X}_S\).

+

Partial Dependence Plots (PDPs) are used to illustrate the effect of the features +in \(\mathbf{X}_S\) on the model’s predictions, while averaging out the +influence of the features in \(\mathbf{X}_C\). This is mathematically defined as:

+
+\[\begin{split}\begin{align*} +\text{PD}_{\mathbf{X}_S}(x_S) &= \mathbb{E}_{\mathbf{X}_C} \left[ f(x_S, \mathbf{X}_C) \right] \\ +&= \int f(x_S, x_C) \, p(x_C) \, dx_C \\ +&= \int \left( \int f(x_S, x_C) \, p(x_C \mid x_S) \, dx_C \right) p(x_S) \, dx_S +\end{align*}\end{split}\]
+

where:

+
    +
  • \(\mathbb{E}_{\mathbf{X}_C} \left[ \cdot \right]\) indicates that we are taking the expected value over the possible values of the features in the set \(\mathbf{X}_C\).

  • +
  • \(p(x_C)\) represents the probability density function of the features in \(\mathbf{X}_C\).

  • +
+

This operation effectively summarizes the model’s output over all potential values of the complementary features, providing a clear view of how the features in \(\mathbf{X}_S\) alone impact the model’s predictions.

+

2D Partial Dependence Plots

+

Consider a trained machine learning model 2D Partial Dependence Plots \(f(\mathbf{X})\), where \(\mathbf{X} = (X_1, X_2, \dots, X_p)\) represents the vector of input features. The partial dependence of the predicted response \(\hat{y}\) on a single feature \(X_j\) is defined as:

+
+\[\text{PD}(X_j) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, \mathbf{X}_{C_i})\]
+

where:

+
    +
  • \(X_j\) is the feature of interest.

  • +
  • \(\mathbf{X}_{C_i}\) represents the complement set of \(X_j\), meaning the remaining features in \(\mathbf{X}\) not included in \(X_j\) for the \(i\)-th instance.

  • +
  • \(n\) is the number of observations in the dataset.

  • +
+

For two features, \(X_j\) and \(X_k\), the partial dependence is given by:

+
+\[\text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i})\]
+

This results in a 2D surface plot (or contour plot) that shows how the predicted outcome changes as the values of \(X_j\) and \(X_k\) vary, while the effects of the other features are averaged out.

+
    +
  • Single Feature PDP: When plotting \(\text{PD}(X_j)\), the result is a 2D line plot showing the marginal effect of feature \(X_j\) on the predicted outcome, averaged over all possible values of the other features.

  • +
  • Two Features PDP: When plotting \(\text{PD}(X_j, X_k)\), the result is a 3D surface plot (or a contour plot) that shows the combined marginal effect of \(X_j\) and \(X_k\) on the predicted outcome. The surface represents the expected value of the prediction as \(X_j\) and \(X_k\) vary, while all other features are averaged out.

  • +
+

3D Partial Dependence Plots

+

For a more comprehensive analysis, especially when exploring interactions between two features, 3D Partial Dependence Plots are invaluable. The partial dependence function for two features in a 3D context is:

+
+\[\text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i})\]
+

Here, the function \(f(X_j, X_k, \mathbf{X}_{C_i})\) is evaluated across a grid of values for \(X_j\) and \(X_k\). The resulting 3D surface plot represents how the model’s prediction changes over the joint range of these two features.

+

The 3D plot offers a more intuitive visualization of feature interactions compared to 2D contour plots, allowing for a better understanding of the combined effects of features on the model’s predictions. The surface plot is particularly useful when you need to capture complex relationships that might not be apparent in 2D.

+
    +
  • Feature Interaction Visualization: The 3D PDP provides a comprehensive view of the interaction between two features. The resulting surface plot allows for the visualization of how the model’s output changes when the values of two features are varied simultaneously, making it easier to understand complex interactions.

  • +
  • Enhanced Interpretation: 3D PDPs offer enhanced interpretability in scenarios where feature interactions are not linear or where the effect of one feature depends on the value of another. The 3D visualization makes these dependencies more apparent.

  • +
+
+
+
+

KDE and Histogram Distribution Plots

+
+

KDE Distribution Function

+

Generate KDE or histogram distribution plots for specified columns in a DataFrame.

+

The kde_distributions function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2] for plotting, which is built on top of +matplotlib [3] and provides a high-level interface for drawing attractive and informative +statistical graphics.

+

Key Features and Parameters

+
    +
  • Flexible Plotting: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively.

  • +
  • Leverages Seaborn Library: The function is built on the seaborn library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code.

  • +
  • Customization: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs.

  • +
  • Scientific Notation Control: The function allows disabling scientific notation on the axes, providing better readability for certain types of data.

  • +
  • Log Scaling: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude.

  • +
  • Output Options: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations.

  • +
+
+
+kde_distributions(df, vars_of_interest=None, figsize=(5, 5), grid_figsize=None, hist_color='#0000FF', kde_color='#FF0000', mean_color='#000000', median_color='#000000', hist_edgecolor='#000000', hue=None, fill=True, fill_alpha=1, n_rows=None, n_cols=None, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_filename=None, y_axis_label='Density', plot_type='both', log_scale_vars=None, bins='auto', binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat='density', xlim=None, ylim=None, plot_mean=False, plot_median=False, std_dev_levels=None, std_color='#808080', label_names=None, show_legend=True, **kwargs)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots. If ‘all’, plots will be generated for all numeric columns.

  • +
  • figsize (tuple of int, optional) – Size of each individual plot, default is (5, 5). Used when only one plot is being generated or when saving individual plots.

  • +
  • grid_figsize (tuple of int, optional) – Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on figsize, n_rows, and n_cols.

  • +
  • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

  • +
  • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

  • +
  • mean_color (str, optional) – Color of the mean line if plot_mean is True, default is '#000000'.

  • +
  • median_color (str, optional) – Color of the median line if plot_median is True, default is '#000000'.

  • +
  • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

  • +
  • hue (str, optional) – Column name to group data by, adding different colors for each group.

  • +
  • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

  • +
  • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid. If not provided, it will be calculated automatically.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid. If not provided, it will be calculated automatically.

  • +
  • w_pad (float, optional) – Width padding between subplots, default is 1.0.

  • +
  • h_pad (float, optional) – Height padding between subplots, default is 1.0.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

  • +
  • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

  • +
  • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

  • +
  • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses figsize for determining the plot size, ignoring grid_figsize.

  • +
  • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

  • +
  • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

  • +
  • log_scale_vars (str or list of str, optional) – Variable name(s) to apply log scaling. Can be a single string or a list of strings.

  • +
  • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

  • +
  • binwidth (float, optional) – Width of each bin, overrides bins but can be used with binrange.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

  • +
  • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

  • +
  • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
  • plot_mean (bool, optional) – Whether to plot the mean as a vertical line, default is False.

  • +
  • plot_median (bool, optional) – Whether to plot the median as a vertical line, default is False.

  • +
  • std_dev_levels (list of int, optional) – Levels of standard deviation to plot around the mean.

  • +
  • std_color (str or list of str, optional) – Color(s) for the standard deviation lines, default is '#808080'.

  • +
  • label_names (dict, optional) – Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display.

  • +
  • show_legend (bool, optional) – Whether to show the legend on the plots, default is True.

  • +
  • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If plot_type is not one of 'hist', 'kde', or 'both'.

    • +
    • If stat is not one of 'count', 'density', 'frequency', 'probability', 'proportion', 'percent'.

    • +
    • If log_scale_vars contains variables that are not present in the DataFrame.

    • +
    • If fill is set to False and hist_edgecolor is not the default.

    • +
    • If grid_figsize is provided when only one plot is being created.

    • +
    +

  • +
  • UserWarning

      +
    • If both bins and binwidth are specified, which may affect performance.

    • +
    +

  • +
+
+
Returns:
+

None

+
+
+
+ +

+
+

KDE and Histograms Example

+

In the below example, the kde_distributions function is used to generate +histograms for several variables of interest: "age", "education-num", and +"hours-per-week". These variables represent different demographic and +financial attributes from the dataset. The plot_type="both" parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data’s probability density.

+

The visualizations are arranged in a single row of four columns, as specified +by n_rows=1 and n_cols=3, respectively. The overall size of the grid +figure is set to 14 inches wide and 4 inches tall (grid_figsize=(14, 4)), +while each individual plot is configured to be 4 inches by 4 inches +(single_figsize=(4, 4)). The fill=True parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +w_pad=1 and h_pad=1, which add 1 inch of padding both horizontally and +vertically.

+
+

Note

+

If you do not set n_rows or n_cols to any values, the function will +automatically calculate and create a grid based on the number of variables being +plotted, ensuring an optimal arrangement of the plots.

+
+

To handle longer titles, the text_wrap=50 parameter ensures that the title +text wraps to a new line after 50 characters. The bbox_inches="tight" setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in vars_of_interest are +passed directly to the function for visualization.

+

Each plot is saved individually with filenames that are prefixed by +"kde_density_single_distribution", followed by the variable name. The `y-axis` +for all plots is labeled as “Density” (y_axis_label="Density"), reflecting that +the height of the bars or KDE line represents the data’s density. The histograms +are divided into 10 bins (bins=10), offering a clear view of the distribution +of each variable.

+

Additionally, the font sizes for the axis labels and tick labels +are set to 16 points (label_fontsize=16) and 14 points (tick_fontsize=14), +respectively, ensuring that all text within the plots is legible and well-formatted.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    fill=True,
+    fill_alpha=0.60,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="both", # Can also just plot KDE by itself by passing "kde"
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - KDE (+) Histograms (Density) + +
+
+

Histogram Example (Density)

+

In this example, the kde_distributions() function is used to generate histograms for +the variables "age", "education-num", and "hours-per-week" but with +plot_type="hist", meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (n_rows=1, n_cols=3), +with a grid size of 14x4 inches (grid_figsize=(14, 4)). The histograms are +divided into 10 bins (bins=10), and the y-axis is labeled “Density” (y_axis_label="Density"). +Font sizes for the axis labels and tick labels are set to 16 and 14 points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    fill=True,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Density) + +
+
+

Histogram Example (Count)

+

In this example, the kde_distributions() function is modified to generate histograms +with a few key changes. The hist_color is set to “orange”, changing the color of the +histogram bars. The y-axis label is updated to “Count” (y_axis_label="Count"), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to "Count" to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (n_rows=1, n_cols=3), +a grid size of 14x4 inches, and a bin count of 10. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    text_wrap=50,
+    hist_color="orange",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Count",
+    bins=10,
+    plot_type="hist",
+    stat="Count",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+

Histogram Example - (Mean and Median)

+

In this example, the kde_distributions() function is customized to generate +histograms that include mean and median lines. The mean_color is set to "blue" +and the median_color is set to "black", allowing for a clear distinction +between the two statistical measures. The function parameters are adjusted to +ensure that both the mean and median lines are plotted (plot_mean=True, plot_median=True). +The y_axis_label remains "Density", indicating that the histograms +represent the density of observations within each bin. The histogram bars are +colored using hist_color="brown", with a fill_alpha=0.60 while the s +tatistical overlays enhance the interpretability of the data. The layout is +configured with a single row and multiple columns (n_rows=1, n_cols=3), and +the grid size is set to 15x5 inches. This example highlights how to visualize +central tendencies within the data using a histogram that prominently displays +the mean and median.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    text_wrap=50,
+    hist_color="brown",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    fill_alpha=0.60,
+    plot_type="hist",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+    plot_mean=True,
+    plot_median=True,
+    mean_color="blue",
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+

Histogram Example - (Mean, Median, and Std. Deviation)

+

In this example, the kde_distributions() function is customized to generate +a histogram that include mean, median, and 3 standard deviation lines. The +mean_color is set to "blue" and the median_color is set to "black", +allowing for a clear distinction between these two central tendency measures. +The function parameters are adjusted to ensure that both the mean and median lines +are plotted (plot_mean=True, plot_median=True). The y_axis_label remains +"Density", indicating that the histograms represent the density of observations +within each bin. The histogram bars are colored using hist_color="brown", +with a fill_alpha=0.40, which adjusts the transparency of the fill color. +Additionally, standard deviation bands are plotted using colors "purple", +"green", and "silver" for one, two, and three standard deviations, respectively.

+

The layout is configured with a single row and multiple columns (n_rows=1, n_cols=3), +and the grid size is set to 15x5 inches. This setup is particularly useful for +visualizing the central tendencies within the data while also providing a clear +view of the distribution and spread through the standard deviation bands. The +configuration used in this example showcases how histograms can be enhanced with +statistical overlays to provide deeper insights into the data.

+
+

Note

+

You have the freedom to choose whether to plot the mean, median, and +standard deviation lines. You can display one, none, or all of these simultaneously.

+
+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+]
+
+kde_distributions(
+    df=df,
+    figsize=(10, 6),
+    text_wrap=50,
+    hist_color="brown",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    fill_alpha=0.40,
+    plot_type="both",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+    plot_mean=True,
+    plot_median=True,
+    mean_color="blue",
+    image_path_svg=image_path_svg,
+    image_path_png=image_path_png,
+    std_dev_levels=[
+        1,
+        2,
+        3,
+    ],
+    std_color=[
+        "purple",
+        "green",
+        "silver",
+    ],
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+
+
+

Stacked Crosstab Plots

+

Generates stacked bar plots and crosstabs for specified columns in a DataFrame.

+

The stacked_crosstab_plot function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats.

+

The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis.

+
+
+stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind='bar', width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output='both', return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type='both', show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False)
+

Generates stacked or regular bar plots and crosstabs for specified columns.

+

This function allows users to create stacked bar plots (or regular bar plots +if stacks are removed) and corresponding crosstabs for specific columns +in a DataFrame. It provides options to customize the appearance, including +font sizes for axis labels, tick labels, and title text wrapping, and to +choose between regular or normalized plots.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • col (str) – The name of the column in the DataFrame to be analyzed.

  • +
  • func_col (list) – List of ground truth columns to be analyzed.

  • +
  • legend_labels_list (list) – List of legend labels for each ground truth column.

  • +
  • title (list) – List of titles for the plots.

  • +
  • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

  • +
  • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

  • +
  • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

  • +
  • custom_order (list, optional) – Specifies a custom order for the categories in the col.

  • +
  • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

  • +
  • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

  • +
  • save_formats (list, optional) – List of file formats to save the plot images in.

  • +
  • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

  • +
  • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

  • +
  • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

  • +
  • x (int, optional) – The width of the figure.

  • +
  • y (int, optional) – The height of the figure.

  • +
  • p (int, optional) – The padding between the subplots.

  • +
  • file_prefix (str, optional) – Prefix for the filename when output includes plots.

  • +
  • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

  • +
  • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

  • +
  • show_legend (bool, optional) – Specify whether to show the legend, default is True.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If output is not one of "both", "plots_only", or "crosstabs_only".

    • +
    • If plot_type is not one of "both", "regular", "normalized".

    • +
    • If remove_stacks is set to True and plot_type is not "regular".

    • +
    • If the lengths of title, func_col, and legend_labels_list are not equal.

    • +
    +

  • +
  • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

  • +
+
+
Returns:
+

Dictionary of crosstabs DataFrames if return_dict is True. Otherwise, returns None.

+
+
Return type:
+

dict or None

+
+
+
+ +
+

Stacked Bar Plots With Crosstabs Example

+

The provided code snippet demonstrates how to use the stacked_crosstab_plot +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here’s a detailed breakdown of the code using the census +dataset as an example [1].

+

First, the func_col list is defined, specifying the columns ["sex", "income"] +to be analyzed. These columns will be used in the loop to generate separate plots. +The legend_labels_list is then defined, with each entry corresponding to a +column in func_col. In this case, the labels for the sex column are +["Male", "Female"], and for the income column, they are ["<=50K", ">50K"]. +These labels will be used to annotate the legends of the plots.

+

Next, the title list is defined, providing titles for each plot corresponding +to the columns in func_col. The titles are set to ["Sex", "Income"], +which will be displayed on top of each respective plot.

+
+

Note

+

The legend_labels_list parameter should be a list of lists, where each +inner list corresponds to the ground truth labels for the respective item in +the func_col list. Each element in the func_col list represents a +column in your DataFrame that you wish to analyze, and the corresponding +inner list in legend_labels_list should contain the labels that will be +used in the legend of your plots.

+
+

For example:

+
# Define the func_col to use in the loop in order of usage
+func_col = ["sex", "income"]
+
+# Define the legend_labels to use in the loop
+legend_labels_list = [
+    ["Male", "Female"],  # Corresponds to "sex"
+    ["<=50K", ">50K"],   # Corresponds to "income"
+]
+
+# Define titles for the plots
+title = [
+    "Sex",
+    "Income",
+]
+
+
+
+

Important

+

Ensure that the number of elements in func_col, legend_labels_list, +and title are the same. Each item in func_col must have a corresponding +list of labels in legend_labels_list and a title in title. This +consistency is essential for the function to correctly generate the plots +with the appropriate labels and titles.

+
+

In this example:

+
    +
  • func_col contains two elements: "sex" and "income". Each corresponds to a specific column in your DataFrame.

  • +
  • legend_labels_list is a nested list containing two inner lists:

    +
    +
      +
    • The first inner list, ["Male", "Female"], corresponds to the "sex" column in func_col.

    • +
    • The second inner list, ["<=50K", ">50K"], corresponds to the "income" column in func_col.

    • +
    +
    +
  • +
  • title contains two elements: "Sex" and "Income", which will be used as the titles for the respective plots.

  • +
+
+

Note

+

If you assign the function to a variable, the dictionary returned when +return_dict=True will be suppressed in the output. However, the dictionary +is still available within the assigned variable for further use.

+
+
from eda_toolkit import stacked_crosstab_plot
+
+# Call the stacked_crosstab_plot function
+stacked_crosstabs = stacked_crosstab_plot(
+    df=df,
+    col="age_group",
+    func_col=func_col,
+    legend_labels_list=legend_labels_list,
+    title=title,
+    kind="bar",
+    width=0.8,
+    rot=45, # axis rotation angle
+    custom_order=None,
+    color=["#00BFC4", "#F8766D"], # default color schema
+    output="both",
+    return_dict=True,
+    x=14,
+    y=8,
+    p=10,
+    logscale=False,
+    plot_type="both",
+    show_legend=True,
+    label_fontsize=14,
+    tick_fontsize=12,
+)
+
+
+

The above example generates stacked bar plots for "sex" and "income" +grouped by "education". The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export.

+
+

Important

+

Importance of Correctly Aligning Labels

+

It is crucial to properly align the elements in the legend_labels_list, +title, and func_col parameters when using the stacked_crosstab_plot +function. Each of these lists must be ordered consistently because the function +relies on their alignment to correctly assign labels and titles to the +corresponding plots and legends.

+

For instance, in the example above:

+
    +
  • The first element in func_col is "sex", and it is aligned with the first set of labels ["Male", "Female"] in legend_labels_list and the first title "Sex" in the title list.

  • +
  • Similarly, the second element in func_col, "income", aligns with the labels ["<=50K", ">50K"] and the title "Income".

  • +
+

Misalignment between these lists would result in incorrect labels or titles being +applied to the plots, potentially leading to confusion or misinterpretation of the data. +Therefore, it’s important to ensure that each list is ordered appropriately and +consistently to accurately reflect the data being visualized.

+

Proper Setup of Lists

+

When setting up the legend_labels_list, title, and func_col, ensure +that each element in the lists corresponds to the correct variable in the DataFrame. +This involves:

+
    +
  • Ordering: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted.

  • +
  • Consistency: Double-checking that each label in legend_labels_list matches the categories present in the corresponding func_col, and that the title accurately describes the plot.

  • +
+

By adhering to these guidelines, you can ensure that the stacked_crosstab_plot +function produces accurate and meaningful visualizations that are easy to interpret and analyze.

+
+

Output

+
KDE Distributions + +
Stacked Bar Plot Age vs. Income + +
+

Note

+

When you set return_dict=True, you are able to see the crosstabs printed out +as shown below.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93

+

When you set return_dict=True, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example:

+
crosstab_age_sex = crosstabs_dict["sex"]
+crosstab_age_income = crosstabs_dict["income"]
+
+
+
+
+

Pivoted Stacked Bar Plots Example

+

Using the census dataset [1], to create horizontal stacked bar plots, set the kind parameter to +"barh" in the stacked_crosstab_plot function. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the y-axis.

+
Stacked Bar Plot Age vs. Income (Pivoted) + +
+
+

Non-Normalized Stacked Bar Plots Example

+

In the census data [1], to create stacked bar plots without the normalized versions, +set the plot_type parameter to "regular" in the stacked_crosstab_plot +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the plot_type to "normalized" will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age.

+
Stacked Bar Plot Age vs. Income (Regular) + +
+
+

Regular Non-Stacked Bar Plots Example

+

In the census data [1], to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the plot_type parameter to "regular" +in the stacked_crosstab_plot function and enable remove_stacks by setting +it to True. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +plot_type to "normalized" will display only the normalized plots.

+

When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories.

+

In the example below, the color of the bars has been set to a dark grey (#333333), +and the legend has been removed by setting show_legend=False. This illustrates +regular bar plots for income by age, without stacking.

+
Bar Plot Age vs. Income (Regular) + +
+
+
+

Box and Violin Plots

+

Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.

+

The box_violin_plot function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories.

+

With options to customize the plot type (boxplot or violinplot), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis.

+

Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures.

+

The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset.

+
+
+box_violin_plot(df, metrics_list, metrics_comp, n_rows=None, n_cols=None, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type='boxplot', xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None, label_names=None, **kwargs)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • metrics_list (list of str) – List of metric names (columns in df) to plot.

  • +
  • metrics_comp (list of str) – List of comparison categories (columns in df).

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid. Calculated automatically if not provided.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid. Calculated automatically if not provided.

  • +
  • image_path_png (str, optional) – Optional directory path to save .png images.

  • +
  • image_path_svg (str, optional) – Optional directory path to save .svg images.

  • +
  • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

  • +
  • show_legend (bool, optional) – Boolean, True if showing the legend in the plots. Default is True.

  • +
  • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
  • label_names (dict, optional) – Dictionary mapping original column names to custom labels. Default is None.

  • +
  • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set without specifying image_path_png or image_path_svg.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize is not a tuple or list of two numbers.

  • +
  • If grid_figsize is provided and is not a tuple or list of two numbers.

  • +
+

+
+
Returns:
+

None

+
+
+
+ +

This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels.

+
+

Box Plots Grid Example

+

In this example with the US census data [1], the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the "age_group" column in the +DataFrame. The metrics_comp parameter is set to ["age_group"], meaning +that the comparison will be based on different age groups. The metrics_list is +provided as age_boxplot_list, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid formatThe image_path_png and +image_path_svg parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to "all", ensuring that both +individual and grid plots are saved.

+

The plots are displayed in a grid format, as indicated by the show_plot="grid" +parameter. The plot_type is set to "boxplot", so the function will generate +boxplots for each metric in the list. Additionally, the `x-axis` labels are rotated +by 90 degrees (xlabel_rot=90) to ensure that the labels are legible. The legend is +hidden by setting show_legend=False, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication.

+
age_boxplot_list = df[
+    [
+        "education-num",
+        "hours-per-week",
+    ]
+].columns.to_list()
+
+
+
from eda_toolkit import box_violin_plot
+
+metrics_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_comp,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="boxplot",
+    xlabel_rot=90,
+)
+
+
+
Box Plot Comparisons + +
+
+

Violin Plots Grid Example

+

In this example with the US census data [1], we keep everything the same as the prior example, but change the +plot_type to violinplot. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings.

+
from eda_toolkit import box_violin_plot
+
+metrics_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_comp=metrics_comp,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=90,
+)
+
+
+
Violin Plot Comparisons + +
+
+

Pivoted Violin Plots Grid Example

+

In this example with the US census data [1], we set xlabel_rot=0 and rotate_plot=True +to pivot the plot, changing the orientation of the axes while keeping the x-axis labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution.

+
from eda_toolkit import box_violin_plot
+
+metrics_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_comp,
+    show_plot="both",
+    rotate_plot=True,
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=0,
+)
+
+
+
Violin Plot Comparisons (Pivoted) + +
+
+
+

Scatter Plots and Best Fit Lines

+
+

Scatter Fit Plot

+

Create and Save Scatter Plots or a Grid of Scatter Plots

+

This function, scatter_fit_plot, is designed to generate scatter plots for +one or more pairs of variables (x_vars and y_vars) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view.

+

Optional Best Fit Line

+

An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s

+

Customizable Plot Aesthetics

+

The function offers a wide range of customization options to tailor the appearance +of the scatter plots:

+
    +
  • Point Color: You can specify a default color for the scatter points or use a hue parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data.

  • +
  • Point Size: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable.

  • +
  • Markers: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data.

  • +
+

Axis and Label Configuration

+

The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges.

+

Plot Display and Saving Options

+

The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations.

+

Correlation Coefficient Display

+

For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship.

+
+
+scatter_fit_plot(df, x_vars=None, y_vars=None, n_rows=None, n_cols=None, max_cols=4, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color='C0', best_fit_linecolor='red', best_fit_linestyle='-', hue=None, hue_palette=None, size=None, sizes=None, marker='o', show_correlation=True, xlim=None, ylim=None, all_vars=None, label_names=None, **kwargs)
+

Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • x_vars (list of str, optional) – List of variable names to plot on the x-axis.

  • +
  • y_vars (list of str, optional) – List of variable names to plot on the y-axis.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid. Calculated based on the number of plots and n_cols if not specified.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid. Calculated based on the number of plots and max_cols if not specified.

  • +
  • max_cols (int, optional) – Maximum number of columns in the subplot grid. Default is 4.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

  • +
  • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid". If None, plots will not be saved.

  • +
  • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

  • +
  • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

  • +
  • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

  • +
  • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

  • +
  • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

  • +
  • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the hue parameter to be set.

  • +
  • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

  • +
  • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

  • +
  • marker (str, optional) – Marker style used for the scatter points. Default is "o".

  • +
  • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
  • all_vars (list of str, optional) – If provided, automatically generates scatter plots for all combinations of variables in this list, overriding x_vars and y_vars.

  • +
  • label_names (dict, optional) – A dictionary to rename columns for display in the plot titles and labels.

  • +
  • kwargs (dict, optional) – Additional keyword arguments to pass to sns.scatterplot.

  • +
+
+
Raises:
+

ValueError

    +
  • If all_vars is provided and either x_vars or y_vars is also provided.

  • +
  • If neither all_vars nor both x_vars and y_vars are provided.

  • +
  • If hue_palette is specified without hue.

  • +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set but no image paths are provided.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize or grid_figsize are not tuples/lists with two numeric values.

  • +
+

+
+
Returns:
+

None. This function does not return any value but generates and optionally saves scatter plots for the specified x_vars and y_vars, or for all combinations of variables in all_vars if it is provided.

+
+
+
+ +
+

Regression-Centric Scatter Plots Example

+

In this US census data [1] example, the scatter_fit_plot function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the show_correlation=True parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the add_best_fit_line=True parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    show_legend=True,
+    show_plot="grid",
+    grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (with Best Fit Lines) + +
+
+

Scatter Plots Grouped by Category Example

+

In this example, the scatter_fit_plot function is used to generate a grid of +scatter plots that examine the relationships between age and hours-per-week +as well as education-num and hours-per-week. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots:

+
    +
  1. Hue and Hue Palette: The hue parameter is set to "income", meaning that the +data points in the scatter plots are colored according to the values in the income +column. A custom color mapping is provided via the hue_palette parameter, where the +income categories "<=50K" and ">50K" are assigned the colors "brown" and +"green", respectively. This change visually distinguishes the data points based on +income levels.

  2. +
  3. Scatter Color: The scatter_color parameter is set to "#808080", which applies +a grey color to the scatter points when no hue is provided. However, since a hue +is specified in this example, the hue_palette takes precedence and overrides this color setting.

  4. +
  5. Best Fit Line: The add_best_fit_line parameter is set to False, meaning that +no best fit line is added to the scatter plots. This differs from the previous example where +a best fit line was included.

  6. +
  7. Correlation Coefficient: The show_correlation parameter is set to False, so the +Pearson correlation coefficient will not be displayed in the plot titles. This is another +change from the previous example where the correlation coefficient was included.

  8. +
  9. Hue Legend: The show_legend parameter remains set to True, ensuring that the +legend displaying the hue categories ("<=50K" and ">50K") appears on the plots, +helping to interpret the color coding of the data points.

  10. +
+

These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths.

+
from eda_toolkit import scatter_fit_plot
+
+hue_dict = {"<=50K": "brown", ">50K": "green"}
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    show_legend=True,
+    show_plot="grid",
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=False,
+    scatter_color="#808080",
+    hue="income",
+    hue_palette=hue_dict,
+    show_correlation=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Scatter Plots (All Combinations Example)

+

In this example, the scatter_fit_plot function is used to generate a grid of scatter plots that explore the relationships between all numeric variables in the df DataFrame. The function automatically identifies and plots all possible combinations of these variables. Below are key aspects of this example:

+
    +
  1. All Variables Combination: The all_vars parameter is used to automatically generate scatter plots for all possible combinations of numerical variables in the DataFrame. This means you don’t need to manually specify x_vars and y_vars, as the function will iterate through each possible pair.

  2. +
  3. Grid Display: The show_plot parameter is set to "grid", so the scatter plots are displayed in a grid format. This is useful for comparing multiple relationships simultaneously.

  4. +
  5. Font Sizes: The label_fontsize and tick_fontsize parameters are set to 14 and 12, respectively. This increases the readability of axis labels and tick marks, making the plots more visually accessible.

  6. +
  7. Best Fit Line: The add_best_fit_line parameter is set to True, meaning that a best fit line is added to each scatter plot. This helps in visualizing the linear relationship between variables.

  8. +
  9. Scatter Color: The scatter_color parameter is set to "#808080", applying a grey color to the scatter points. This provides a neutral color that does not distract from the data itself.

  10. +
  11. Correlation Coefficient: The show_correlation parameter is set to True, so the Pearson correlation coefficient will be displayed in the plot titles. This helps to quantify the strength of the relationship between the variables.

  12. +
+

These settings allow for the creation of scatter plots that comprehensively explore the relationships between all numeric variables in the DataFrame. The plots are saved in a grid format, with added best fit lines and correlation coefficients for deeper analysis. The resulting images can be stored in the specified directory for future reference.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    all_vars=df.select_dtypes(np.number).columns.to_list(),
+    show_legend=True,
+    show_plot="grid",
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (Grouped2) + +
+
+
+
+

Correlation Matrices

+

Generate and Save Customizable Correlation Heatmaps

+

The flex_corr_matrix function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats.

+

Customizable Plot Appearance

+

The function provides extensive customization options for the heatmap’s appearance:

+
    +
  • Colormap Selection: Choose from a variety of colormaps to represent the strength of correlations. The default is "coolwarm", but this can be adjusted to fit the needs of the analysis.

  • +
  • Annotation: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance.

  • +
  • Figure Size and Layout: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards.

  • +
+

Triangular vs. Full Correlation Matrix

+

A key feature of the flex_corr_matrix function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations.

+

Label and Axis Configuration

+

The function offers flexibility in configuring axis labels and titles:

+
    +
  • Label Rotation: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names.

  • +
  • Font Sizes: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable.

  • +
  • Title Wrapping: Control the wrapping of long titles to fit within the plot without overlapping other elements.

  • +
+

Plot Display and Saving Options

+

The flex_corr_matrix function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images.

+
+
+flex_corr_matrix(df, cols=None, annot=True, cmap='coolwarm', save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title='Cervical Cancer Data: Correlation Matrix', label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment='right', ylabel_alignment='center_baseline', text_wrap=50, vmin=-1, vmax=1, cbar_label='Correlation Index', triangular=True, **kwargs)
+

Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

  • +
  • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

  • +
  • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

  • +
  • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

  • +
  • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

  • +
  • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

  • +
  • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

  • +
  • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

  • +
  • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

  • +
  • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

  • +
  • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

  • +
  • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

  • +
  • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

  • +
  • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

  • +
+
+
Raises:
+

ValueError

    +
  • If annot is not a boolean.

  • +
  • If cols is not a list.

  • +
  • If save_plots is not a boolean.

  • +
  • If triangular is not a boolean.

  • +
  • If save_plots is True but no image paths are provided.

  • +
+

+
+
Returns:
+

None +This function does not return any value but generates and optionally saves a correlation heatmap.

+
+
+
+ +
+

Triangular Correlation Matrix Example

+

The provided code filters the census [1] DataFrame df to include only numeric columns using +select_dtypes(np.number). It then utilizes the flex_corr_matrix() function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options.

+
+

Note

+

This triangular matrix format is particularly useful for avoiding +redundancy in correlation matrices, as it excludes the lower half, +making it easier to focus on unique pairwise correlations.

+
+

The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations.

+
# Select only numeric data to pass into the function
+df_num = df.select_dtypes(np.number)
+
+
+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="coolwarm",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=True,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Full Correlation Matrix Example

+

In this modified census [1] example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting cmap="viridis", the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting triangular=False, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset.

+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="viridis",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+

Partial Dependence Plots

+

Partial Dependence Plots (PDPs) are a powerful tool in machine learning +interpretability, providing insights into how features influence the predicted +outcome of a model. PDPs can be generated in both 2D and 3D, depending on +whether you want to analyze the effect of one feature or the interaction between +two features on the model’s predictions.

+
+

2D Partial Dependence Plots

+

The plot_2d_pdp function generates 2D partial dependence plots for individual features or pairs of features. These plots are essential for examining the marginal effect of features on the predicted outcome.

+
    +
  • Grid and Individual Plots: Generate all 2D partial dependence plots in a grid layout or as separate individual plots, offering flexibility in presentation.

  • +
  • Customization Options: Control the figure size, font sizes for labels and ticks, and the wrapping of long titles to ensure the plots are clear and informative.

  • +
  • Saving Plots: The function provides options to save the plots in PNG or SVG formats, and you can specify whether to save all plots, only individual plots, or just the grid plot.

  • +
+
+
+plot_2d_pdp(model, X_train, feature_names, features, title='PDP of house value on CA non-location features', grid_resolution=50, plot_type='grid', grid_figsize=(12, 8), individual_figsize=(6, 4), label_fontsize=12, tick_fontsize=10, text_wrap=50, image_path_png=None, image_path_svg=None, save_plots=None, file_prefix='partial_dependence')
+

Generate 2D partial dependence plots for specified features using the given machine learning model. The function allows for plotting in grid or individual layouts, with various customization options for figure size, font sizes, and title wrapping. Additionally, the plots can be saved in PNG or SVG formats with a customizable filename prefix.

+
+
Parameters:
+
    +
  • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

  • +
  • X_train (pandas.DataFrame or numpy.ndarray) – The training data used to compute partial dependence. Should correspond to the features used to train the model.

  • +
  • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

  • +
  • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

  • +
  • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

  • +
  • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

  • +
  • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

  • +
  • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

  • +
  • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

  • +
  • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

  • +
  • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

  • +
  • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

  • +
  • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

  • +
  • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

  • +
+
+
Raises:
+

ValueError

    +
  • If plot_type is not one of "grid", "individual", or "both".

  • +
  • If save_plots is enabled but neither image_path_png nor image_path_svg is provided.

  • +
+

+
+
Returns:
+

None +This function generates partial dependence plots and displays them. It does not return any values.

+
+
+
+ +
+

2D Plots - CA Housing Example

+

Consider a scenario where you have a machine learning model predicting median +house values in California. [4] Suppose you want to understand how non-location +features like the average number of occupants per household (AveOccup) and the +age of the house (HouseAge) jointly influence house values. A 2D partial +dependence plot allows you to visualize this relationship in two ways: either as +individual plots for each feature or as a combined plot showing the interaction +between two features.

+

For instance, the 2D partial dependence plot can help you analyze how the age of +the house impacts house values while holding the number of occupants constant, or +vice versa. This is particularly useful for identifying the most influential +features and understanding how changes in these features might affect the +predicted house value.

+

If you extend this to two interacting features, such as AveOccup and HouseAge, +you can explore their combined effect on house prices. The plot can reveal how +different combinations of occupancy levels and house age influence the value, +potentially uncovering non-linear relationships or interactions that might not be +immediately obvious from a simple 1D analysis.

+

Here’s how you can generate and visualize these 2D partial dependence plots using +the California housing dataset:

+

Fetch The CA Housing Dataset and Prepare The DataFrame

+
from sklearn.datasets import fetch_california_housing
+from sklearn.model_selection import train_test_split
+from sklearn.ensemble import GradientBoostingRegressor
+import pandas as pd
+
+# Load the dataset
+data = fetch_california_housing()
+df = pd.DataFrame(data.data, columns=data.feature_names)
+
+
+

Split The Data Into Training and Testing Sets

+
X_train, X_test, y_train, y_test = train_test_split(
+    df, data.target, test_size=0.2, random_state=42
+)
+
+
+

Train a GradientBoostingRegressor Model

+
model = GradientBoostingRegressor(
+    n_estimators=100,
+    max_depth=4,
+    learning_rate=0.1,
+    loss="huber",
+    random_state=42,
+)
+model.fit(X_train, y_train)
+
+
+

Create 2D Partial Dependence Plot Grid

+
# import the plot_2d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_2d_pdp
+
+# Feature names
+names = data.feature_names
+
+# Generate 2D partial dependence plots
+plot_2d_pdp(
+    model=model,
+    X_train=X_train,
+    feature_names=names,
+    features=[
+        "MedInc",
+        "AveOccup",
+        "HouseAge",
+        "AveRooms",
+        "Population",
+        ("AveOccup", "HouseAge"),
+    ],
+    title="PDP of house value on CA non-location features",
+    grid_figsize=(14, 10),
+    individual_figsize=(12, 4),
+    label_fontsize=14,
+    tick_fontsize=12,
+    text_wrap=120,
+    plot_type="grid",
+    image_path_png="path/to/save/png",
+    save_plots="all",
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+

3D Partial Dependence Plots

+

The plot_3d_pdp function extends the concept of partial dependence to three dimensions, allowing you to visualize the interaction between two features and their combined effect on the model’s predictions.

+
    +
  • Interactive and Static 3D Plots: Generate static 3D plots using Matplotlib or interactive 3D plots using Plotly. The function also allows for generating both types simultaneously.

  • +
  • Colormap and Layout Customization: Customize the colormaps for both Matplotlib and Plotly plots. Adjust figure size, camera angles, and zoom levels to create plots that fit perfectly within your presentation or report.

  • +
  • Axis and Title Configuration: Customize axis labels for both Matplotlib and Plotly plots. Adjust font sizes and control the wrapping of long titles to maintain readability.

  • +
+
+
+plot_3d_pdp(model, dataframe, feature_names_list, x_label=None, y_label=None, z_label=None, title, html_file_path=None, html_file_name=None, image_filename=None, plot_type="both", matplotlib_colormap=None, plotly_colormap="Viridis", zoom_out_factor=None, wireframe_color=None, view_angle=(22, 70), figsize=(7, 4.5), text_wrap=50, horizontal=-1.25, depth=1.25, vertical=1.25, cbar_x=1.05, cbar_thickness=25, title_x=0.5, title_y=0.95, top_margin=100, image_path_png=None, image_path_svg=None, show_cbar=True, grid_resolution=20, left_margin=20, right_margin=65, label_fontsize=8, tick_fontsize=6, enable_zoom=True, show_modebar=True)
+

Generate 3D partial dependence plots for two features of a machine learning model.

+

This function supports both static (Matplotlib) and interactive (Plotly) visualizations, allowing for flexible and comprehensive analysis of the relationship between two features and the target variable in a model.

+
+
Parameters:
+
    +
  • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

  • +
  • dataframe (pandas.DataFrame or numpy.ndarray) – The dataset on which the model was trained or a representative sample. If a DataFrame is provided, feature_names_list should correspond to the column names. If a NumPy array is provided, feature_names_list should correspond to the indices of the columns.

  • +
  • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

  • +
  • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

  • +
  • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

  • +
  • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

  • +
  • title (str) – The title for the plots.

  • +
  • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

  • +
  • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

  • +
  • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

  • +
  • plot_type (str, optional) – The type of plots to generate. Options are: +- "static": Generate only static Matplotlib plots. +- "interactive": Generate only interactive Plotly plots. +- "both": Generate both static and interactive plots. Default is "both".

  • +
  • matplotlib_colormap (matplotlib.colors.Colormap, optional) – Custom colormap for the Matplotlib plot. If not provided, a default colormap is used.

  • +
  • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

  • +
  • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

  • +
  • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

  • +
  • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

  • +
  • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

  • +
  • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

  • +
  • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

  • +
  • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

  • +
  • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

  • +
  • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

  • +
  • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

  • +
  • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

  • +
  • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

  • +
  • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

  • +
  • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

  • +
  • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

  • +
  • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

  • +
  • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

  • +
  • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

  • +
  • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

  • +
+
+
Raises:
+

ValueError

    +
  • If plot_type is not one of "static", "interactive", or "both".

  • +
  • If plot_type is "interactive" or "both" and html_file_path or html_file_name are not provided.

  • +
+

+
+
Returns:
+

None +This function generates 3D partial dependence plots and displays or saves them. It does not return any values.

+
+
Notes:
+
    +
  • This function handles warnings related to scikit-learn’s partial_dependence function, specifically a FutureWarning related to non-tuple sequences for multidimensional indexing. This warning is suppressed as it stems from the internal workings of scikit-learn in Python versions like 3.7.4.

  • +
  • To maintain compatibility with different versions of scikit-learn, the function attempts to use "values" for grid extraction in newer versions and falls back to "grid_values" for older versions.

  • +
+
+
+
+ +
+

3D Plots - CA Housing Example

+

Consider a scenario where you have a machine learning model predicting median +house values in California.[4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (AveOccup) and the +age of the house (HouseAge) jointly influence house values. A 3D partial +dependence plot allows you to visualize this relationship in a more comprehensive +manner, providing a detailed view of how these two features interact to affect +the predicted house value.

+

For instance, the 3D partial dependence plot can help you explore how different +combinations of house age and occupancy levels influence house values. By +visualizing the interaction between AveOccup and HouseAge in a 3D space, you can +uncover complex, non-linear relationships that might not be immediately apparent +in 2D plots.

+

This type of plot is particularly useful when you need to understand the joint +effect of two features on the target variable, as it provides a more intuitive +and detailed view of how changes in both features impact predictions simultaneously.

+

Here’s how you can generate and visualize these 3D partial dependence plots +using the California housing dataset:

+
+
+

Static Plot

+

Fetch The CA Housing Dataset and Prepare The DataFrame

+
from sklearn.ensemble import GradientBoostingRegressor
+from sklearn.datasets import fetch_california_housing
+from sklearn.model_selection import train_test_split
+import pandas as pd
+
+# Load the dataset
+data = fetch_california_housing()
+df = pd.DataFrame(data.data, columns=data.feature_names)
+
+
+

Split The Data Into Training and Testing Sets

+
X_train, X_test, y_train, y_test = train_test_split(
+    df, data.target, test_size=0.2, random_state=42
+)
+
+
+

Train a GradientBoostingRegressor Model

+
model = GradientBoostingRegressor(
+    n_estimators=100,
+    max_depth=4,
+    learning_rate=0.1,
+    loss="huber",
+    random_state=1,
+)
+model.fit(X_train, y_train)
+
+
+

Create Static 3D Partial Dependence Plot

+
# import the plot_3d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_3d_pdp
+
+# Call the function to generate the plot
+plot_3d_pdp(
+    model=model,
+    dataframe=X_test,  # Use the test dataset
+    feature_names_list=["HouseAge", "AveOccup"],
+    x_label="House Age",
+    y_label="Average Occupancy",
+    z_label="Partial Dependence",
+    title="3D Partial Dependence Plot of House Age vs. Average Occupancy",
+    image_filename="3d_pdp",
+    plot_type="static",
+    figsize=[8, 5],
+    text_wrap=40,
+    wireframe_color="black",
+    image_path_png=image_path_png,
+    grid_resolution=30,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Interactive Plot

+
# import the plot_3d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_3d_pdp
+
+# Call the function to generate the plot
+plot_3d_pdp(
+    model=model,
+    dataframe=X_test,  # Use the test dataset
+    feature_names_list=["HouseAge", "AveOccup"],
+    x_label="House Age",
+    y_label="Average Occupancy",
+    z_label="Partial Dependence",
+    title="3D Partial Dependence Plot of House Age vs. Average Occupancy",
+    html_file_path=image_path_png,
+    image_filename="3d_pdp",
+    html_file_name="3d_pdp.html",
+    plot_type="interactive",
+    text_wrap=40,
+    zoom_out_factor=0.5,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    grid_resolution=30,
+    label_fontsize=8,
+    tick_fontsize=6,
+    title_x=0.38,
+    top_margin=10,
+    right_margin=250,
+    cbar_x=0.9,
+    cbar_thickness=25,
+    show_modebar=False,
+    enable_zoom=True,
+)
+
+
+
+

Warning

+

Scrolling Notice:

+

While interacting with the interactive Plotly plot below, scrolling down the +page using the mouse wheel may be blocked when the mouse pointer is hovering +over the plot. To continue scrolling, either move the mouse pointer outside +the plot area or use the keyboard arrow keys to navigate down the page.

+
+ + +

This interactive plot was generated using Plotly, which allows for rich, +interactive visualizations directly in the browser. The plot above is an example +of an interactive 3D Partial Dependence Plot. Here’s how it differs from +generating a static plot using Matplotlib.

+

Key Differences

+

Plot Type:

+
    +
  • The plot_type is set to "interactive" for the Plotly plot and "static" for the Matplotlib plot.

  • +
+

Interactive-Specific Parameters:

+
    +
  • HTML File Path and Name: The html_file_path and html_file_name parameters are required to save the interactive Plotly plot as an HTML file. These parameters are not needed for static plots.

  • +
  • Zoom and Positioning: The interactive plot includes parameters like zoom_out_factor, title_x, cbar_x, and cbar_thickness to control the zoom level, title position, and color bar position in the Plotly plot. These parameters do not affect the static plot.

  • +
  • Mode Bar and Zoom: The show_modebar and enable_zoom parameters are specific to the interactive Plotly plot, allowing you to toggle the visibility of the mode bar and enable or disable zoom functionality.

  • +
+

Static-Specific Parameters:

+
    +
  • Figure Size and Wireframe Color: The static plot uses parameters like figsize to control the size of the Matplotlib plot and wireframe_color to define the color of the wireframe in the plot. These parameters are not applicable to the interactive Plotly plot.

  • +
+

By adjusting these parameters, you can customize the behavior and appearance of your 3D Partial Dependence Plots according to your needs, whether for static or interactive visualization.

+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/genindex.html b/_build/html/v0.0.10/genindex.html new file mode 100644 index 000000000..a7178c7cc --- /dev/null +++ b/_build/html/v0.0.10/genindex.html @@ -0,0 +1,359 @@ + + + + + + + + Index — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | H + | K + | P + | S + +
+

A

+ + +
+ +

B

+ + +
+ +

C

+ + +
+ +

D

+ + +
+ +

E

+ + +
+ +

F

+ + +
+ +

H

+ + +
+ +

K

+ + +
+ +

P

+ + + +
+ +

S

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/getting_started.html b/_build/html/v0.0.10/getting_started.html new file mode 100644 index 000000000..777901217 --- /dev/null +++ b/_build/html/v0.0.10/getting_started.html @@ -0,0 +1,247 @@ + + + + + + + + + Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Welcome to the EDA Toolkit Python Library Documentation!

+
+

Note

+

This documentation is for eda_toolkit version 0.0.10.

+
+

The eda_toolkit is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data.

+ +
+

What is EDA?

+

Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data.

+
+
+

Purpose of EDA Toolkit

+

The eda_toolkit library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including:

+
    +
  • Data Management: Tools for managing directories, generating unique IDs, +standardizing dates, and handling common DataFrame manipulations.

  • +
  • Data Cleaning: Functions to address missing values, remove outliers, and +correct formatting issues, ensuring data is ready for analysis.

  • +
  • Data Visualization: A variety of plotting functions, including KDE +distribution plots, stacked bar plots, scatter plots with optional best fit +lines, and box/violin plots, to visually explore data distributions, +relationships, and trends.

  • +
  • Descriptive and Summary Statistics: Methods to generate comprehensive +reports on data types, summary statistics (mean, median, standard deviation, +etc.), and to summarize all possible combinations of specified variables.

  • +
  • Reporting and Export: Features to save DataFrames to Excel with +customizable formatting, create contingency tables, and export generated +plots in multiple formats.

  • +
+
+
+

Key Features

+
    +
  • Ease of Use: The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions.

  • +
  • Customizable: Users can customize various aspects of the toolkit to fit their specific needs.

  • +
  • Integration: Seamlessly integrates with popular data science libraries such as Pandas, NumPy, Matplotlib, and Seaborn.

  • +
  • Documentation and Examples: Comprehensive documentation and examples to help users get started quickly and effectively.

  • +
+
+
+

Prerequisites

+

Before you install eda_toolkit, ensure your system meets the following requirements:

+
    +
  • Python: version 3.7.4 or higher is required to run eda_toolkit.

  • +
+

Additionally, eda_toolkit depends on the following packages, which will be automatically installed when you install eda_toolkit:

+
    +
  • jinja2: version 3.1.4 or higher

  • +
  • matplotlib: version 3.5.3 or higher

  • +
  • nbformat: version 4.2.0 or higher

  • +
  • numpy: version 1.21.6 or higher

  • +
  • pandas: version 1.3.5 or higher

  • +
  • plotly: version 5.18.0 or higher

  • +
  • scikit-learn: version 1.0.2 or higher

  • +
  • seaborn: version 0.12.2 or higher

  • +
  • xlsxwriter: version 3.2.0 or higher

  • +
+
+
+

Installation

+

You can install eda_toolkit directly from PyPI:

+
pip install eda_toolkit
+
+
+
+
+
+

Description

+

This guide provides detailed instructions and examples for using the functions +provided in the eda_toolkit library and how to use them effectively in your projects.

+

For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [1]. This dataset provides a rich source of +information for demonstrating the functionalities of the eda_toolkit.

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/index.html b/_build/html/v0.0.10/index.html new file mode 100644 index 000000000..91564ea62 --- /dev/null +++ b/_build/html/v0.0.10/index.html @@ -0,0 +1,302 @@ + + + + + + + + + Table of Contents — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Table of Contents

+ + + + +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/objects.inv b/_build/html/v0.0.10/objects.inv new file mode 100644 index 000000000..b0208d461 Binary files /dev/null and b/_build/html/v0.0.10/objects.inv differ diff --git a/_build/html/v0.0.10/references.html b/_build/html/v0.0.10/references.html new file mode 100644 index 000000000..d5529dbf1 --- /dev/null +++ b/_build/html/v0.0.10/references.html @@ -0,0 +1,146 @@ + + + + + + + + + References — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

References

+
    +
  1. Hunter, J. D. (2007). Matplotlib: A 2D Graphics Environment. Computing in Science & Engineering, 9(3), 90-95. https://doi.org/10.1109/MCSE.2007.55.

  2. +
  3. Kohavi, R. (1996). Census Income. UCI Machine Learning Repository. https://doi.org/10.24432/C5GP7S.

  4. +
  5. Waskom, M. (2021). Seaborn: Statistical Data Visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021.

  6. +
  7. Pace, R. K., & Barry, R. (1997). Sparse Spatial Autoregressions. Statistics & Probability Letters, 33(3), 291-297. https://doi.org/10.1016/S0167-7152(96)00140-X.

  8. +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/search.html b/_build/html/v0.0.10/search.html new file mode 100644 index 000000000..a51883c9d --- /dev/null +++ b/_build/html/v0.0.10/search.html @@ -0,0 +1,151 @@ + + + + + + + + Search — EDA Toolkit 0.0.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/_build/html/v0.0.10/searchindex.js b/_build/html/v0.0.10/searchindex.js new file mode 100644 index 000000000..16f495317 --- /dev/null +++ b/_build/html/v0.0.10/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[5, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[5, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[5, "id14"]], "3D Plots - CA Housing Example": [[5, "id15"]], "About EDA Toolkit": [[7, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[4, "adding-unique-identifiers"]], "Binning Numerical Columns": [[4, "binning-numerical-columns"]], "Box Plots Grid Example": [[5, "box-plots-grid-example"]], "Box and Violin Plots": [[5, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[5, "correlation-matrices"]], "Creating Contingency Tables": [[4, "creating-contingency-tables"]], "Data Management": [[7, null]], "Data Management Overview": [[4, null]], "Data Management Techniques": [[4, "data-management-techniques"]], "DataFrame Analysis": [[4, "dataframe-analysis"]], "Description": [[6, "description"]], "Full Correlation Matrix Example": [[5, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[5, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[4, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[7, null]], "Highlighting Specific Columns in a DataFrame": [[4, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[5, "histogram-example-count"]], "Histogram Example (Density)": [[5, "histogram-example-density"]], "Histogram Example - (Mean and Median)": [[5, "histogram-example-mean-and-median"]], "Histogram Example - (Mean, Median, and Std. Deviation)": [[5, "histogram-example-mean-median-and-std-deviation"]], "Histograms and Kernel Density Estimation (KDE)": [[5, "histograms-and-kernel-density-estimation-kde"]], "Installation": [[6, "installation"]], "Interactive Plot": [[5, "interactive-plot"]], "KDE Distribution Function": [[5, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[5, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[5, "kde-and-histograms-example"]], "Key Features": [[6, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[5, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Foundations": [[5, "partial-dependence-foundations"]], "Partial Dependence Plots": [[5, "partial-dependence-plots"]], "Path directories": [[4, "path-directories"]], "Pearson Correlation Coefficient": [[5, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[5, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[5, "pivoted-violin-plots-grid-example"]], "Plotting Heuristics": [[7, null]], "Plotting and Theoretical Overview": [[5, null]], "Prerequisites": [[6, "prerequisites"]], "Project Links": [[6, "project-links"]], "Purpose of EDA Toolkit": [[6, "purpose-of-eda-toolkit"]], "References": [[8, null]], "Regression-Centric Scatter Plots Example": [[5, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[5, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[4, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[5, "scatter-fit-plot"]], "Scatter Plots (All Combinations Example)": [[5, "scatter-plots-all-combinations-example"]], "Scatter Plots Grouped by Category Example": [[5, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[5, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[5, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[5, "stacked-crosstab-plots"]], "Standardized Dates": [[4, "standardized-dates"]], "Static Plot": [[5, "static-plot"]], "Table of Contents": [[7, null]], "Trailing Period Removal": [[4, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[5, "triangular-correlation-matrix-example"]], "Version 0.0.10": [[1, "version-0-0-10"]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id8"], [1, "id9"], [1, "id10"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Version 0.0.9": [[1, "version-0-0-9"]], "Violin Plots Grid Example": [[5, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[6, null]], "What is EDA?": [[6, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "data_management", "eda_plots", "getting_started", "index", "references"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "data_management.rst", "eda_plots.rst", "getting_started.rst", "index.rst", "references.rst"], "indexentries": {"add_ids()": [[4, "add_ids", false]], "box_violin_plot()": [[5, "box_violin_plot", false]], "built-in function": [[4, "add_ids", false], [4, "contingency_table", false], [4, "dataframe_columns", false], [4, "ensure_directory", false], [4, "highlight_columns", false], [4, "parse_date_with_rule", false], [4, "save_dataframes_to_excel", false], [4, "strip_trailing_period", false], [4, "summarize_all_combinations", false], [5, "box_violin_plot", false], [5, "flex_corr_matrix", false], [5, "kde_distributions", false], [5, "plot_2d_pdp", false], [5, "plot_3d_pdp", false], [5, "scatter_fit_plot", false], [5, "stacked_crosstab_plot", false]], "contingency_table()": [[4, "contingency_table", false]], "dataframe_columns()": [[4, "dataframe_columns", false]], "ensure_directory()": [[4, "ensure_directory", false]], "flex_corr_matrix()": [[5, "flex_corr_matrix", false]], "highlight_columns()": [[4, "highlight_columns", false]], "kde_distributions()": [[5, "kde_distributions", false]], "parse_date_with_rule()": [[4, "parse_date_with_rule", false]], "plot_2d_pdp()": [[5, "plot_2d_pdp", false]], "plot_3d_pdp()": [[5, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[4, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[5, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[5, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[4, "strip_trailing_period", false]], "summarize_all_combinations()": [[4, "summarize_all_combinations", false]]}, "objects": {"": [[4, 0, 1, "", "add_ids"], [5, 0, 1, "", "box_violin_plot"], [4, 0, 1, "", "contingency_table"], [4, 0, 1, "", "dataframe_columns"], [4, 0, 1, "", "ensure_directory"], [5, 0, 1, "", "flex_corr_matrix"], [4, 0, 1, "", "highlight_columns"], [5, 0, 1, "", "kde_distributions"], [4, 0, 1, "", "parse_date_with_rule"], [5, 0, 1, "", "plot_2d_pdp"], [5, 0, 1, "", "plot_3d_pdp"], [4, 0, 1, "", "save_dataframes_to_excel"], [5, 0, 1, "", "scatter_fit_plot"], [5, 0, 1, "", "stacked_crosstab_plot"], [4, 0, 1, "", "strip_trailing_period"], [4, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 4, 5], "0": [2, 4, 5, 6, 7], "00": 4, "000000": 5, "0000ff": 5, "00140": [5, 8], "00bfc4": 5, "01": 4, "02": [1, 4], "03021": [5, 8], "04": [4, 5], "05": 5, "07": [4, 5], "09": 5, "1": [1, 4, 5, 6], "10": [2, 4, 5, 6, 7, 8], "100": [4, 5], "1016": [5, 8], "10724": 5, "11": 4, "1109": [5, 8], "111": 4, "115": 5, "11687": 5, "11th": 4, "12": [4, 5, 6], "120": 5, "12202842": 4, "123": 4, "12929": 5, "13": [4, 5], "131": 5, "13162633": 2, "13163208": 2, "13174": 5, "1348": 4, "13920": [4, 5], "14": [4, 5], "147": 5, "14x4": 5, "15": [4, 5], "150": 4, "15784": 4, "15x5": 5, "16": [4, 5], "16192": 5, "17": 5, "18": [4, 5, 6], "1873": 5, "19716": 4, "1994": 6, "1996": [4, 5, 6, 8], "1997": [5, 8], "1b0": 7, "1d": 5, "1rc0": 7, "2": [4, 5, 6, 7], "20": [4, 5], "200": 4, "2007": [5, 8], "2020": 4, "2021": [4, 5, 8], "2022": 4, "2024": 2, "203488": 4, "21": [4, 5, 6], "21105": [5, 8], "2115": 5, "215646": 4, "22": 5, "22379": 4, "2245": 5, "22803": 4, "23": 5, "234721": 4, "24432": [4, 5, 6, 8], "24720": 4, "25": [1, 4, 5], "250": [4, 5], "2509": 5, "2565": 4, "26": 5, "27": 5, "274": 4, "28": [4, 5], "280": 5, "28523": 4, "29": [4, 5], "291": [5, 8], "295": 5, "297": [5, 8], "2d": [1, 7, 8], "3": [4, 5, 6, 7, 8], "30": [4, 5], "300": [4, 5], "3021": [5, 8], "3054": 5, "31": 4, "3188": 5, "32": 4, "32650": [4, 5], "33": [4, 5, 8], "333333": 5, "338409": 4, "33906": 4, "34": 5, "3461": 5, "35130194": 4, "36": [4, 5], "3680": 4, "37": [4, 5], "37155": 5, "38": [4, 5], "3853": 5, "39": [4, 5], "3986": 5, "3d": [1, 7], "3d_pdp": 5, "4": [4, 5, 6, 7], "40": [4, 5], "41": 5, "4110": 5, "41762": 4, "42": [4, 5], "42643227": 4, "4267": 4, "43832": 4, "44807": 4, "45": [4, 5], "46": 4, "46560": 4, "467": 4, "468": 4, "469": 4, "47": 5, "470": 4, "471": 4, "472": 4, "4746": 5, "48842": [4, 5], "49": [4, 5], "5": [4, 5, 6, 7], "50": [4, 5], "50k": [4, 5], "50k_": 5, "51": [4, 5], "5281": 2, "53": [4, 5], "535": 5, "55": [5, 8], "56": 4, "5623": 4, "5707": 5, "58": 5, "5856": 4, "59": [4, 5], "595": 5, "6": [4, 5, 6, 7, 8], "60": [4, 5, 8], "61": 4, "6172": 4, "62": 5, "64": [4, 5], "65": 5, "66": [4, 5], "6619": 5, "668": 5, "6738": 5, "68": 5, "69": [4, 5], "7": [4, 5, 6, 7], "70": [4, 5], "71": 5, "7152": [5, 8], "73": 5, "74": 4, "74130842": 4, "746": 5, "75": [4, 5], "7536": 5, "76": [4, 5], "77": 5, "77516": 4, "79": [4, 5], "8": [4, 5, 7], "80": [4, 5], "808080": 5, "809": 5, "81": 5, "815": 5, "82": 4, "8213": 5, "82943611": 4, "83": 5, "83311": 4, "85": [4, 5], "8601": 4, "861555": 4, "87": 5, "87104229": 4, "89": [4, 5], "8a": 7, "8b": 7, "8c": 7, "8d": 1, "9": [4, 5, 7, 8], "90": [4, 5, 8], "90069867": 4, "9076": 5, "91": [4, 5], "93": 5, "93837254": 4, "939": 5, "94": 5, "9468": 5, "95": [4, 5, 8], "96": [4, 5, 8], "96078789": 4, "963": 4, "966": 4, "97": 4, "97751875": 4, "98": 4, "99": [4, 5], "A": [1, 4, 5, 6, 8], "As": 5, "By": [1, 5], "For": [4, 5, 6], "If": [1, 4, 5], "In": [4, 5], "Into": 5, "It": [1, 4, 5, 6], "No": [1, 5], "Not": 4, "One": 1, "The": [1, 4, 5, 6], "Then": 4, "There": 5, "These": [1, 4, 5], "To": 5, "With": [3, 7], "_": 5, "_c": 5, "_plotli": 1, "abil": [1, 5], "abl": 5, "about": 4, "abov": [1, 5], "academ": 0, "accept": 1, "access": 5, "accord": [1, 5], "accordingli": 4, "account": 1, "accur": [1, 5], "accuraci": 4, "acknowledg": [1, 7], "across": [1, 4, 5], "actual": 5, "ad": [1, 5, 7], "adapt": [1, 4, 5], "add": [1, 4, 5], "add_best_fit_lin": 5, "add_id": [1, 4, 7], "addit": [1, 5], "addition": [4, 5, 6], "address": [1, 6], "adher": 5, "adjust": [1, 4, 5], "adm": 4, "advanc": 4, "aesthet": [1, 5], "affect": 5, "after": [1, 4, 5], "ag": [4, 5], "against": 5, "age_boxplot_list": 5, "age_group": [4, 5], "ages_18_to_40": 4, "aggreg": 5, "alic": 4, "align": [1, 4, 5], "all": [1, 4, 6, 7], "all_combin": 4, "all_var": 5, "allow": [1, 4, 5], "alon": 5, "along": [1, 4, 5], "alpha": [1, 5], "alreadi": 4, "also": [0, 1, 5], "altern": 5, "alwai": [1, 4], "amount": 4, "an": [0, 1, 3, 4, 5], "analysi": [1, 5, 6, 7], "analyst": 6, "analyt": 3, "analyz": [1, 4, 5], "angl": [1, 5], "ani": [1, 4, 5, 6], "annot": [1, 5], "anomali": 6, "anoth": 5, "anyth": 1, "appar": 5, "appear": [1, 5], "append": [4, 5], "appli": [0, 1, 3, 4, 5, 6], "applic": [1, 5], "approach": 5, "appropri": [1, 5], "approxim": 5, "ar": [1, 4, 5], "area": 5, "arg": 1, "argument": [1, 5], "around": [1, 5], "arrai": 5, "arrang": 5, "arrow": 5, "artifact": 4, "artifici": 3, "asian": 4, "aspect": [1, 5, 6], "assess": 5, "assign": [1, 4, 5], "associ": [5, 6], "assum": 4, "assumpt": 7, "astyp": 1, "attempt": [4, 5], "attent": 5, "attract": 5, "attribut": 5, "aug": 2, "author": [2, 3], "auto": 5, "autofit": 4, "autom": [3, 6], "automat": [1, 5, 6], "autoregress": [5, 8], "avail": 5, "aveoccup": 5, "averag": 5, "averoom": 5, "avoid": [1, 5], "ax": [1, 5], "axi": [1, 5], "azimuth": 5, "bachelor": 4, "back": [4, 5], "backbon": 4, "background": 4, "background_color": [1, 4], "backward": 1, "badg": 1, "band": 5, "bandwidth": 5, "bar": [1, 6, 7], "barh": 5, "barri": [5, 8], "base": [1, 4, 5], "base_path": 4, "bbox_inch": 5, "becaus": [4, 5], "been": [1, 4, 5], "befor": [1, 4, 5, 6], "begin": [4, 5], "behavior": [1, 5], "being": [4, 5], "bell": 5, "below": [4, 5], "beneath": 5, "benefici": 5, "best": [1, 6, 7], "best_fit_linecolor": 5, "best_fit_linestyl": 5, "beta": 1, "better": [1, 5, 6], "between": [1, 4, 5], "bin": [1, 5, 7], "bin_ag": 4, "binrang": 5, "binwidth": [1, 5], "black": [4, 5], "block": [1, 5], "blue": 5, "bob": 4, "bold": 4, "bool": [4, 5], "boolean": [1, 5], "border": 4, "both": [1, 4, 5], "bound": [4, 5], "boundari": 4, "box": [1, 6, 7], "box_violin_plot": [1, 5, 7], "boxplot": 5, "breakdown": 5, "brief": 1, "bring": 3, "broad": [1, 6], "brown": 5, "browser": 5, "bug": 1, "built": 5, "c0": 5, "c5gp7": [4, 5, 6, 8], "c_i": 5, "ca": 7, "calcul": 5, "california": [3, 5], "call": [1, 4, 5], "camera": [1, 5], "can": [1, 4, 5, 6], "cancer": 5, "cannot": 4, "capabl": [1, 4], "capit": 4, "captur": 5, "career": 0, "case": [1, 4, 5], "categor": [1, 4, 5], "categori": [4, 7], "cbar_label": 5, "cbar_thick": [1, 5], "cbar_x": [1, 5], "cdot": 5, "cell": 4, "censu": [4, 5, 6, 8], "census_id": 4, "census_summary_t": 4, "center_baselin": 5, "central": 5, "centric": 7, "certain": 5, "certifi": 1, "cervic": 5, "chang": [1, 5], "changelog": 7, "charact": [4, 5], "characterist": 6, "charli": 4, "check": [1, 4, 5], "choos": [1, 4, 5], "circl": 5, "citat": 1, "cite": 7, "civ": 4, "clariti": [1, 5], "clean": [1, 4, 5, 6], "cleaner": [1, 4], "cleanup": 1, "clear": [1, 5], "clearer": 1, "clearli": 1, "cleric": 4, "closer": 5, "clutter": 5, "cmap": [1, 5], "code": [1, 4, 5], "codebas": 1, "coeffici": 7, "cohes": 5, "col": [1, 4, 5], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 4, 5], "colorbar": 5, "colormap": [1, 5], "column": [1, 5, 7], "column_nam": 4, "combin": [1, 6, 7], "come": 1, "comment": 1, "common": [1, 4, 6], "compar": 5, "comparison": 5, "compat": [1, 5], "complement": 5, "complementari": 5, "complet": 5, "complex": [1, 5], "comprehens": [1, 5, 6], "comput": [5, 8], "concept": 5, "condit": 1, "condition": 1, "configur": [1, 5], "confirm": 1, "confus": [1, 5], "consecut": 4, "consid": 5, "consist": [1, 4, 5], "consolid": 1, "constant": [4, 5], "constraint": 4, "contain": [1, 4, 5], "content": [1, 4], "context": 5, "conting": [1, 5, 6, 7], "contingency_t": [4, 7], "continu": [1, 4, 5], "contour": 5, "contrast": 5, "contributor": 7, "control": [1, 5], "convers": [1, 4], "convert": [1, 4], "coolwarm": [1, 5], "coordin": 1, "cornel": 3, "correct": [1, 5, 6], "correctli": [1, 4, 5], "correl": [1, 7], "correspond": [1, 4, 5], "count": [1, 4, 7], "countri": 4, "cours": 3, "cov": 5, "covari": 5, "creat": [1, 5, 6, 7], "creation": 5, "crop": 5, "crosstab": [1, 7], "crosstab_age_incom": 5, "crosstab_age_sex": 5, "crosstabs_dict": 5, "crosstabs_onli": 5, "crucial": [4, 5, 6], "current": 4, "curv": 5, "custom": [1, 5, 6, 7], "custom_ord": 5, "customiz": [1, 5, 6], "cut": 4, "d": [5, 8], "dai": 4, "dark": 5, "dashboard": 5, "data": [0, 1, 3, 5, 6, 8], "data_nam": 4, "data_output": 4, "data_path": 4, "data_typ": 1, "datafram": [1, 5, 6, 7], "dataframe_column": [1, 4, 7], "dataset": [4, 5, 6], "date": [1, 6, 7], "date_column": 4, "date_str": 4, "datetim": 1, "david": 4, "dd": 4, "deal": [4, 5], "decad": 3, "decim": [1, 4], "decimal_plac": [1, 4], "decis": [1, 5], "decreas": 5, "dedic": 0, "deeper": 5, "deepest": 0, "default": [1, 4, 5], "defin": [1, 4, 5], "definit": 4, "degre": [1, 5], "demograph": 5, "demonstr": [4, 5, 6], "denot": 5, "densiti": [1, 7], "depend": [1, 4, 6, 7], "deprec": 1, "depth": [1, 5], "descend": [4, 5], "describ": [1, 5], "descript": [1, 7], "design": [4, 5, 6], "detail": [1, 4, 5, 6], "determin": 5, "develop": 3, "deviat": [1, 6, 7], "df": [1, 4, 5], "df_censu": 4, "df_dict": 4, "df_num": 5, "dict": [4, 5], "dictionari": [4, 5], "did": 1, "diego": [0, 3], "differ": [1, 5], "digit": [1, 4], "dimens": 5, "dimensionless": 5, "dir": 4, "direct": 5, "directli": [1, 5, 6], "directori": [5, 6, 7], "disabl": [1, 5], "disable_sci_not": [1, 5], "discov": 6, "discret": [4, 5], "dispers": 5, "displai": [1, 4, 5], "distinct": [1, 5], "distinguish": 5, "distract": 5, "distribut": [1, 4, 6, 7], "dive": 4, "divers": 1, "divid": [4, 5], "divorc": 4, "do": [1, 4, 5], "docstr": 1, "document": [1, 7], "doe": [1, 4, 5], "doi": [2, 4, 5, 6, 8], "don": 5, "dot": 5, "doubl": 5, "down": 5, "dr": 0, "draw": 5, "driven": 4, "dtype": 4, "due": [1, 4], "duplic": 1, "dure": [0, 1], "dx_": 5, "dx_c": 5, "dynam": 1, "e": [1, 4, 5], "each": [1, 4, 5], "eas": [1, 4, 6], "easi": [5, 6], "easier": [1, 5], "easili": 5, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 5, 6], "edg": [1, 5], "edgecolor": 1, "educ": [0, 3, 4, 5], "effect": [1, 3, 4, 5, 6], "either": [1, 4, 5], "element": [1, 4, 5], "elev": 5, "els": 1, "emp": 4, "emphas": 1, "emploi": 5, "empti": [1, 4], "enabl": [1, 5, 6], "enable_zoom": [1, 5], "end": [1, 4, 5], "endeavor": 0, "endpoint": 4, "engin": [0, 5, 8], "enhanc": [1, 4, 5, 6], "enough": 1, "ensembl": 5, "ensu": 6, "ensur": [1, 4, 5, 6], "ensure_directori": [4, 7], "enter": [1, 4], "entir": [4, 5], "entri": [1, 5], "environ": [0, 1, 5, 8], "equal": 5, "equat": 5, "equival": 4, "error": [1, 4], "especi": [1, 4, 5], "essenti": [4, 5, 6], "estim": 7, "etc": 6, "ev": 4, "evalu": 5, "even": [1, 5], "everyth": 5, "exact": 1, "examin": 5, "exampl": [1, 4, 6, 7], "exce": 4, "excel": [3, 6, 7], "except": [0, 1, 4], "excess": 5, "exclud": [4, 5], "exclus": 4, "exec": 4, "execut": 5, "exist": [1, 4], "exp": 5, "expand": 1, "expect": [1, 5], "experi": [1, 3], "explain": [1, 4], "explan": 1, "explicitli": 1, "explor": [1, 5, 6], "exploratori": 6, "export": [5, 6], "express": [0, 5], "extend": [0, 5], "extens": [1, 5], "extract": [1, 5], "f": [1, 5], "f8766d": 5, "f8c5c8": 4, "facilit": [3, 4, 6], "factor": 5, "fall": [4, 5], "fallback": 1, "fals": [1, 4, 5], "famili": 4, "fashion": 5, "featur": [1, 4, 5, 7], "feature_nam": 5, "feature_names_list": [1, 5], "feder": 4, "feedback": 1, "femal": [4, 5], "female_": 5, "fetch": 5, "fetch_california_h": 5, "few": 5, "ff0000": 5, "figsiz": [1, 5], "figur": [1, 5], "file": [1, 4, 5], "file_nam": 4, "file_path": 4, "file_prefix": [1, 5], "filenam": [1, 5], "fill": [1, 5], "fill_alpha": [1, 5], "fillna": 1, "filter": [4, 5], "filtered_df": 4, "financi": [3, 5], "find": 1, "first": [1, 4, 5], "fit": [1, 6, 7], "fix": 1, "flag": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 5], "flip": 5, "float": [4, 5], "fnlwgt": 4, "focu": 5, "focus": 5, "folder": 4, "follow": [1, 4, 5, 6], "font": [1, 5], "fontsiz": 1, "form": [4, 6], "format": [1, 5, 6, 7], "formatth": 5, "former": 4, "formerli": 1, "formula": 5, "found": 1, "foundat": 7, "four": 5, "frac": 5, "freedom": 5, "frequenc": [1, 5], "frequent": 4, "friendli": 1, "from": [0, 1, 3, 4, 5, 6], "full": [1, 4, 7], "fulli": 5, "func_col": [1, 5], "function": [1, 4, 6, 7], "further": [1, 5], "futur": [1, 5], "futurewarn": 5, "g": [1, 4, 5], "gain": [4, 6], "gaussian": 7, "gener": [1, 5, 6, 7], "geq": 4, "get": 6, "get_legend": 1, "get_text": 1, "gil": [2, 3], "github": 6, "give": 1, "given": [1, 4, 5], "glanc": 5, "go": 4, "got": 1, "gov": 4, "grad": 4, "gradientboostingregressor": 5, "graduat": 0, "granular": 1, "graphic": [5, 8], "gratitud": 0, "greater": [1, 4], "green": 5, "grei": 5, "grid": [1, 7], "grid_figs": 5, "grid_resolut": 5, "grid_valu": 5, "ground": 5, "group": [1, 4, 7], "gt": 5, "guid": [0, 6], "guidanc": 1, "guidelin": 5, "h": [4, 5], "h_pad": 5, "ha": [1, 3, 4, 5], "half": 5, "halv": 5, "handl": [1, 4, 5, 6], "handler": 4, "hat": 5, "have": [1, 5], "he": 3, "header": [1, 4], "health": 3, "healthcar": 3, "heatmap": [1, 5], "height": 5, "help": [1, 4, 5, 6], "here": [4, 5], "hex": [1, 4], "hi": 0, "hidden": 5, "hide": [1, 5], "hide_index": 1, "high": [1, 5], "higher": [5, 6], "highli": 5, "highlight": [1, 5, 7], "highlight_column": [4, 7], "highlighted_df": 4, "hist": [1, 5], "hist_color": 5, "hist_edgecolor": [1, 5], "histogram": [1, 7], "hold": [3, 5], "horizont": [1, 5], "hour": [4, 5], "hous": 7, "houseag": 5, "household": 5, "hover": 5, "how": [4, 5, 6], "howev": [1, 5], "html": [4, 5], "html_file_nam": [1, 5], "html_file_path": [1, 5], "http": [2, 4, 5, 6, 8], "huber": 5, "hue": [1, 5], "hue_dict": 5, "hue_palett": 5, "hunter": [5, 8], "husband": 4, "hyperlink": 4, "hypothes": 6, "i": [1, 3, 4, 5, 7], "icon": 1, "id": [1, 4, 6], "id_colnam": 4, "identifi": [1, 5, 6, 7], "ignor": 5, "illustr": 5, "imag": [4, 5], "image_filenam": 5, "image_path_png": [1, 4, 5], "image_path_svg": [1, 4, 5], "immedi": 5, "impact": [1, 5], "implement": 1, "import": [1, 4, 5], "imposs": 4, "improv": 1, "inc": 4, "inch": 5, "includ": [1, 4, 5, 6], "inclus": 4, "incom": [4, 5, 6, 8], "inconsist": [1, 4], "incorpor": 1, "incorrect": [1, 5], "increas": 5, "increment": 1, "independ": 1, "index": [1, 4, 5], "indic": [1, 4, 5], "individu": [1, 5], "individual_figs": 5, "industri": 3, "inf": 4, "infin": 4, "influenc": [1, 5], "influenti": 5, "inform": [5, 6], "initi": 6, "inner": 5, "input": [1, 5], "insight": [5, 6], "instal": 7, "instanc": 5, "instead": [1, 5], "instruct": 6, "int": [1, 4, 5], "int64": 4, "integ": 1, "integr": [5, 6], "intellig": 3, "intend": 1, "interact": [1, 7], "interest": 5, "interfac": [1, 5], "intern": [1, 5], "interpret": [1, 5], "interv": 4, "introduc": 1, "introduct": 1, "intuit": [1, 5, 6], "invalid": 1, "invalu": 5, "investig": 6, "involv": [4, 5, 6], "io": 4, "island": 4, "iso": 4, "issu": [1, 6], "item": 5, "iter": 5, "its": [1, 4], "itself": 5, "j": [5, 8], "jinja2": 6, "join": 4, "joint": 5, "jointli": 5, "joss": [5, 8], "journal": [5, 8], "journei": 0, "jupyt": 4, "just": 5, "k": [5, 8], "kde": [1, 6, 7], "kde_color": 5, "kde_density_single_distribut": 5, "kde_distribut": [1, 5, 7], "keep": 5, "kei": [1, 4, 5, 7], "kernel": 7, "keyboard": 5, "keyerror": 5, "keyword": [1, 5], "kind": 5, "kohavi": [4, 5, 6, 8], "kwarg": [1, 5], "l": 2, "label": [1, 4, 5], "label_ag": 4, "label_fonts": [1, 5], "label_nam": 5, "larg": 5, "largest": 5, "last": 4, "latest": 1, "layout": [1, 5], "ldot": 5, "lead": 5, "learn": [0, 1, 3, 4, 5, 6, 8], "learning_r": 5, "least": [1, 4], "lectur": 3, "left": [4, 5], "left_margin": [1, 5], "legend": [1, 5], "legend_label": 5, "legend_labels_list": 5, "legibl": 5, "len": 1, "length": [4, 5], "leonid": [2, 3], "leq": 4, "less": [1, 4], "let": 5, "letter": [5, 8], "level": [4, 5], "leverag": [5, 6], "librari": [1, 4, 5, 7], "licens": 1, "like": [0, 5], "limit": [1, 4, 5], "line": [1, 6, 7], "linear": 5, "linestyl": 5, "link": 7, "list": [1, 4, 5], "load": [4, 5], "local": 4, "locat": [4, 5], "log": [1, 5], "log_scale_var": [1, 5], "logarithm": 5, "logic": 1, "logo": 1, "logscal": 5, "long": 5, "longer": 5, "loop": 5, "loss": [4, 5], "lower": [1, 5], "lt": [4, 5], "m": [0, 3, 5, 8], "machin": [1, 3, 4, 5, 6, 8], "made": 1, "magnitud": 5, "mai": [1, 5], "main": 6, "maintain": [1, 5, 7], "make": [1, 4, 5], "male": [4, 5], "male_": 5, "manag": [1, 3, 5, 6], "manageri": 4, "mani": [5, 6], "manipul": 6, "manner": 5, "manual": [1, 5], "map": [1, 5], "marco": 0, "margin": [1, 5], "marit": 4, "mark": [1, 5], "marker": 5, "marri": 4, "master": 3, "match": [1, 5], "mathbb": 5, "mathbf": 5, "mathemat": [4, 5], "matplotlib": [1, 5, 6, 8], "matplotlib_colormap": 5, "matric": [1, 7], "matrix": [1, 7], "max": 5, "max_col": 5, "max_depth": 5, "max_unique_valu": 4, "max_unique_value_pct": 4, "max_unique_value_tot": 4, "maximum": 5, "mcse": [5, 8], "mean": [1, 4, 6, 7], "mean_color": 5, "meaning": [4, 5], "measur": 5, "mechan": 1, "median": [1, 6, 7], "median_color": 5, "medinc": 5, "meet": 6, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 5, 6], "metric": 5, "metrics_box_violin": 1, "metrics_boxplot_comp": 5, "metrics_comp": 5, "metrics_list": 5, "mid": 5, "might": 5, "min": 5, "min_length": 4, "mind": 6, "minim": [1, 5], "minimum": [4, 5], "minor": 1, "misalign": 5, "misinterpret": 5, "mislead": 1, "miss": [1, 4, 5, 6], "mm": 4, "mode": [1, 5], "model": [1, 5, 6], "model_select": 5, "modifi": [1, 5], "month": [2, 4], "more": [1, 4, 5], "most": [1, 4, 5, 6], "mous": 5, "move": [1, 5], "mu": 5, "mu_i": 5, "mu_x": 5, "much": 5, "multidimension": 5, "multipl": [1, 4, 5, 6], "multipli": 1, "must": [4, 5], "my_datafram": 1, "n": 5, "n_col": 5, "n_estim": 5, "n_row": 5, "na": [1, 4], "name": [1, 4, 5], "nativ": 4, "navig": [4, 5], "nbformat": 6, "ndarrai": 5, "necessari": [1, 4], "need": [1, 4, 5, 6], "neg": 5, "neither": [1, 5], "nest": 5, "neutral": 5, "never": 4, "new": [1, 4, 5], "newer": 5, "next": [4, 5], "nh": 5, "nomenclatur": 1, "non": [1, 4, 7], "none": [1, 4, 5], "nor": [1, 5], "normal": [1, 7], "notat": [1, 5], "note": [4, 5], "notebook": 4, "noth": 4, "notic": 5, "now": 1, "np": 5, "null": [1, 4], "null_pct": 4, "null_tot": 4, "num": [4, 5], "num_digit": 4, "number": [1, 4, 5], "numer": [1, 5, 7], "numpi": [5, 6], "o": [2, 4, 5], "object": [1, 4, 5], "observ": 5, "obviou": 5, "occup": [4, 5], "occur": 1, "occurr": 4, "offer": [1, 5, 6], "often": [5, 6], "older": [1, 5], "omit": 1, "one": [1, 4, 5], "onli": [1, 5], "opaqu": 5, "open": [5, 8], "oper": [4, 5], "optim": 5, "option": [1, 4, 5, 6], "orang": 5, "order": [1, 4, 5], "org": [2, 4, 5, 6, 8], "organ": [1, 5], "orient": 5, "origin": [4, 5], "original_df": 4, "oscar": [2, 3], "other": [1, 4, 5], "otherwis": 5, "our": 0, "out": 5, "outcom": 5, "outlier": 6, "output": [1, 4, 5], "outsid": 5, "over": [1, 3, 5], "overal": [1, 5], "overlai": 5, "overlaid": 5, "overlap": 5, "overrid": 5, "overview": 7, "own": 5, "p": 5, "pac": 4, "pace": [5, 8], "packag": 6, "pad": [1, 5], "page": [5, 6], "pair": [4, 5], "pairwis": 5, "palett": 5, "panda": [1, 4, 5, 6], "param": 1, "paramet": [1, 4, 5], "parametr": 5, "pardir": 4, "parent": 4, "pars": 4, "parse_date_with_rul": [4, 7], "part": 4, "partial": [1, 7], "partial_depend": 5, "particular": 5, "particularli": [1, 4, 5], "pass": [1, 5], "path": [1, 5, 7], "patient": 4, "pattern": [5, 6], "pd": [4, 5], "pdf": 5, "pdp": 5, "pearson": 7, "per": [4, 5], "percent": [1, 5], "percentag": 4, "perfect": 5, "perfectli": 5, "perform": [1, 4, 5], "performancewarn": 1, "period": 7, "person": 3, "perspect": [1, 5], "pi": 5, "pink": 4, "pip": 6, "pitfal": 1, "pivot": [0, 7], "place": [1, 4], "plai": 0, "plain": 4, "plot": [1, 6], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_mean": 5, "plot_median": 5, "plot_typ": [1, 5], "plotli": [1, 5, 6], "plotly_colormap": 5, "plots_onli": 5, "plt": 1, "pm": 5, "png": [1, 4, 5], "png_imag": 4, "point": [1, 5], "pointer": 5, "popul": 5, "popular": 6, "posit": [1, 5], "possibl": [4, 5, 6], "potenti": [1, 4, 5], "power": [1, 5], "pr": 1, "pre": 1, "preced": 5, "predict": [1, 5], "prefer": [1, 5], "prefix": [1, 5], "prepar": [1, 4, 5], "prerequisit": 7, "present": [1, 4, 5], "preval": 5, "prevent": [1, 4, 5], "previou": [1, 5], "previous": 1, "price": 5, "print": [1, 4, 5], "prior": 5, "privat": 4, "probabl": [1, 5, 8], "process": [1, 4, 6], "produc": [1, 5], "product": 5, "prof": 4, "profession": 3, "program": [0, 3], "project": [1, 3, 4, 7], "promin": 5, "proper": [1, 5], "properli": [1, 5], "proport": [1, 4, 5], "provid": [0, 1, 4, 5, 6], "public": 5, "publish": 2, "purpl": 5, "purpos": [1, 7], "pursu": 0, "py": 1, "pypi": [1, 6], "python": [1, 3, 5, 7], "qualiti": [5, 6], "quantifi": 5, "quantit": 5, "quick": 5, "quickli": [5, 6], "r": [3, 4, 5, 6, 8], "r_": 5, "race": 4, "rais": [1, 4, 5], "random": 4, "random_st": 5, "rang": [4, 5, 6], "raw": 5, "re": [1, 5], "read": 4, "readabl": [1, 5], "readi": 6, "readm": 1, "record": 4, "red": 5, "reduc": [1, 5], "redund": 5, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 5], "regress": 7, "regular": [1, 7], "relat": [1, 4, 5], "relationship": [4, 5, 6], "releas": 1, "relev": [1, 6], "reli": 5, "reliabl": 4, "remain": [1, 5], "remov": [1, 5, 6, 7], "remove_stack": [1, 5], "renam": [1, 5], "render": 4, "replac": 4, "replica": 1, "report": [3, 5, 6], "repositori": [4, 5, 6, 8], "repres": [1, 4, 5], "represent": [1, 5], "reproduc": 4, "requir": [1, 5, 6], "research": 6, "reset": 1, "resolut": 5, "respect": [1, 4, 5], "respons": 5, "rest": 5, "result": [1, 4, 5], "return": [1, 4, 5], "return_df": [1, 4], "return_dict": 5, "reveal": 5, "rich": [5, 6], "right": [4, 5], "right_margin": [1, 5], "riversid": 3, "robust": 1, "role": [0, 1], "rot": 5, "rotat": [1, 5], "rotate_plot": 5, "round": 4, "row": [4, 5], "rule": 4, "run": 6, "s0167": [5, 8], "same": [1, 5], "sampl": [4, 5], "san": [0, 3], "save": [1, 5, 6, 7], "save_dataframes_to_excel": [1, 4, 7], "save_format": [1, 5], "save_plot": [1, 5], "scale": [1, 5], "scatter": [1, 6, 7], "scatter_color": 5, "scatter_fit_plot": [1, 5, 7], "scatterplot": 5, "scenario": [1, 5], "schema": 5, "scheme": 5, "school": 0, "scienc": [0, 3, 4, 5, 6, 8], "scientif": [1, 5], "scientist": [0, 3, 6], "scikit": [1, 5, 6], "scroll": 5, "seaborn": [1, 5, 6, 8], "seamlessli": 6, "second": [4, 5], "section": [1, 4], "see": 5, "seed": 4, "select": [1, 5], "select_dtyp": 5, "self": 4, "separ": [1, 4, 5], "sequenc": 5, "seri": 4, "serv": [1, 3], "servic": 3, "set": [1, 4, 5], "set_as_index": 4, "set_titl": 1, "setminu": 5, "setp": 1, "setup": [1, 4, 5], "sever": [1, 5], "sex": [4, 5], "shape": [4, 5], "sheet": 4, "shilei": 0, "should": 5, "show": [1, 4, 5], "show_cbar": 5, "show_correl": 5, "show_legend": [1, 5], "show_modebar": [1, 5], "show_plot": 5, "showcas": 5, "shown": 5, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 5, "sigma_i": 5, "sigma_x": 5, "signatur": 1, "signific": 1, "silver": 5, "similarli": 5, "simpl": 5, "simpler": 1, "simplic": 6, "simplif": 1, "simplifi": [1, 4], "simultan": 5, "sinc": 5, "singl": [1, 4, 5], "single_figs": 5, "single_var_image_filenam": 5, "size": [1, 4, 5], "sklearn": 5, "slightli": 1, "small": 1, "smallest": 5, "smooth": 5, "smoother": [1, 5], "sn": 5, "snippet": [4, 5], "so": [1, 4, 5], "softwar": [2, 5, 8], "some": [1, 4], "sort": [1, 4], "sort_bi": [1, 4], "sortbi": 1, "sourc": [5, 6, 8], "space": [1, 5], "span": 5, "spars": [5, 8], "spatial": [5, 8], "special": 4, "specialti": 4, "specif": [1, 5, 6, 7], "specifi": [1, 4, 5, 6], "split": 5, "spous": 4, "spread": 5, "sql": 3, "sqrt": 5, "squar": [1, 5], "stabil": 1, "stabl": 1, "stack": [1, 6, 7], "stacked_crosstab": 5, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 5, 6, 7], "standardized_d": 4, "start": [1, 4, 6], "stat": [1, 5], "state": 4, "static": [1, 7], "statist": [1, 3, 4, 5, 6, 8], "statu": [1, 4], "std": 7, "std_color": 5, "std_dev_level": 5, "stem": 5, "step": [1, 6], "still": [1, 5], "store": [1, 5], "str": [1, 4, 5], "straightforward": 1, "streamlin": [1, 4, 6], "strength": 5, "string": [1, 4, 5], "strip": 4, "strip_trailing_period": [4, 7], "stronger": 5, "structur": [1, 6], "style": [1, 4, 5], "styler": [1, 4], "subplot": 5, "subset": 5, "substitut": 5, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suit": 6, "suitabl": 1, "sum_": 5, "summar": [5, 6], "summari": [1, 6, 7], "summarize_all_combin": [4, 7], "summary_t": 4, "support": [0, 1, 5], "suppos": 5, "suppress": 5, "sure": 4, "surfac": [1, 5], "svg": [1, 4, 5], "svg_imag": 4, "sy": 1, "system": [4, 6], "t": 5, "tab": 4, "tabl": [1, 5, 6], "tailor": 5, "take": [4, 5], "tall": 5, "target": 5, "tarshizi": 0, "task": [4, 6], "tatist": 5, "teach": 3, "techniqu": [6, 7], "ten": 3, "tend": 5, "tendenc": 5, "test": [1, 5], "test_siz": 5, "text": [1, 4, 5], "text_wrap": [1, 5], "th": 5, "than": [1, 4], "thank": 0, "thei": [1, 4, 5], "them": [1, 4, 5, 6], "theoret": 7, "therefor": 5, "thi": [1, 4, 5, 6], "thick": 5, "those": 1, "three": 5, "through": [1, 5], "throw": 1, "thu": 4, "tick": [1, 5], "tick_fonts": [1, 5], "tight": 5, "time": [0, 1, 4, 5], "titl": [1, 2, 5], "title_i": [1, 5], "title_x": [1, 5], "to_list": 5, "togeth": 5, "toggl": [1, 5], "tool": [1, 5, 6], "toolkit": 1, "top": 5, "top_margin": [1, 5], "topic": 4, "total": [4, 5], "toward": 1, "trail": 7, "train": 5, "train_test_split": 5, "transpar": [1, 5], "trend": [5, 6], "triangl": 5, "triangular": [1, 7], "true": [1, 4, 5], "truth": 5, "try": 1, "tupl": [1, 4, 5], "two": [1, 4, 5], "type": [1, 4, 5, 6], "u": [0, 4, 5], "uci": [4, 5, 6, 8], "ucla": 3, "unambigu": 4, "uncov": [5, 6], "underli": [5, 6], "understand": [4, 5, 6], "uniform": 1, "uniqu": [1, 5, 6, 7], "unique_values_tot": 4, "unique_var": 4, "unit": 4, "univers": [0, 3], "unnecessari": 1, "unrecogn": 4, "unstack": 5, "unus": 1, "unwav": 0, "up": [1, 4, 5], "updat": [1, 4, 5], "upper": [1, 4, 5], "upright": 5, "url": 2, "us": [1, 4, 5, 6], "usabl": 1, "usag": [1, 4, 5], "user": [1, 5, 6], "userwarn": 5, "util": [4, 5, 6], "v": 5, "valid": 1, "valid_plot_typ": 1, "valu": [1, 4, 5, 6], "valueerror": [1, 4, 5], "vari": 5, "variabl": [1, 5, 6, 7], "varianc": 5, "varieti": [3, 5, 6], "variou": [1, 5, 6], "vars_of_interest": 5, "vdot": 4, "vector": 5, "verbiag": 1, "verifi": [1, 4], "versa": 5, "versatil": 5, "version": [2, 5, 6, 7], "version_info": 1, "versu": 1, "vertic": [1, 5], "via": [1, 5], "vice": 5, "view": [1, 5], "view_angl": 5, "violin": [1, 6, 7], "violinplot": 5, "viridi": 5, "visibl": [1, 5], "visual": [1, 4, 5, 6, 8], "vmax": 5, "vmin": 5, "vriabl": 5, "w_pad": 5, "wa": [1, 5], "wai": 5, "want": [1, 5], "wareh": 3, "warn": [1, 4, 5], "waskom": [5, 8], "we": [0, 4, 5, 6], "week": [4, 5], "welcom": 7, "well": [4, 5], "were": 4, "what": [1, 7], "wheel": 5, "when": [1, 4, 5, 6], "where": [1, 4, 5], "whether": [1, 4, 5], "which": [1, 4, 5, 6], "while": [1, 5], "white": 4, "whitespac": 5, "who": 1, "wide": [3, 5], "width": [1, 5], "wife": 4, "wirefram": [1, 5], "wireframe_color": 5, "wish": 5, "within": [1, 3, 4, 5], "without": [1, 4, 5], "work": [1, 4, 5], "workclass": 4, "workflow": [4, 6], "would": [0, 1, 5], "wrangl": 3, "wrap": [1, 5], "write": 4, "x": [1, 4, 5, 8], "x_": 5, "x_1": 5, "x_2": 5, "x_c": 5, "x_i": 5, "x_j": 5, "x_k": 5, "x_label": [1, 5], "x_label_plotli": 1, "x_n": 5, "x_p": 5, "x_test": 5, "x_train": 5, "x_var": 5, "xlabel": 5, "xlabel_align": 5, "xlabel_rot": 5, "xlim": [1, 5], "xlsx": 4, "xlsxwriter": 6, "xx": 1, "xy": 5, "y": [1, 5], "y_axis_label": 5, "y_i": 5, "y_label": [1, 5], "y_label_plotli": 1, "y_test": 5, "y_train": 5, "y_var": 5, "year": [2, 3, 4], "yellow": 4, "ylabel": 5, "ylabel_align": 5, "ylabel_rot": 5, "ylim": [1, 5], "you": [4, 5, 6], "your": [4, 5, 6], "yy": 1, "yyyi": 4, "z": 5, "z_label": [1, 5], "z_label_plotli": 1, "zenodo": [1, 2], "zero": [1, 4], "zoom": [1, 5], "zoom_out_factor": [1, 5], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Data Management Overview", "Plotting and Theoretical Overview", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References"], "titleterms": {"0": 1, "10": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 5, "3": 1, "3d": 5, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "9": 1, "With": 5, "about": 7, "acknowledg": 0, "ad": 4, "all": 5, "analysi": 4, "assumpt": 5, "bar": 5, "best": 5, "bin": 4, "box": 5, "ca": 5, "categori": 5, "centric": 5, "changelog": 1, "cite": 2, "coeffici": 5, "column": 4, "combin": [4, 5], "content": 7, "conting": 4, "contributor": 3, "correl": 5, "count": 5, "creat": 4, "crosstab": 5, "custom": 4, "data": [4, 7], "datafram": 4, "date": 4, "densiti": 5, "depend": 5, "descript": 6, "deviat": 5, "directori": 4, "distribut": 5, "document": 6, "eda": [2, 6, 7], "estim": 5, "exampl": 5, "excel": 4, "featur": 6, "fit": 5, "format": 4, "foundat": 5, "full": 5, "function": 5, "gaussian": 5, "gener": 4, "get": 7, "grid": 5, "group": 5, "heurist": 7, "highlight": 4, "histogram": 5, "hous": 5, "i": 6, "identifi": 4, "instal": 6, "interact": 5, "kde": 5, "kei": 6, "kernel": 5, "librari": 6, "line": 5, "link": 6, "maintain": 3, "manag": [4, 7], "matric": 5, "matrix": 5, "mean": 5, "median": 5, "non": 5, "normal": 5, "numer": 4, "overview": [4, 5], "partial": 5, "path": 4, "pearson": 5, "period": 4, "pivot": 5, "plot": [5, 7], "prerequisit": 6, "project": 6, "purpos": 6, "python": 6, "refer": 8, "regress": 5, "regular": 5, "remov": 4, "save": 4, "scatter": 5, "specif": 4, "stack": 5, "standard": 4, "start": 7, "static": 5, "std": 5, "summari": 4, "tabl": [4, 7], "techniqu": 4, "theoret": 5, "toolkit": [2, 6, 7], "trail": 4, "triangular": 5, "uniqu": 4, "variabl": 4, "version": 1, "violin": 5, "welcom": 6, "what": 6}}) \ No newline at end of file diff --git a/_build/html/v0.0.11/.buildinfo b/_build/html/v0.0.11/.buildinfo new file mode 100644 index 000000000..8e26ab979 --- /dev/null +++ b/_build/html/v0.0.11/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 1aaf4e4c57172b247ab7f7fc57a42525 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/v0.0.11/.doctrees/acknowledgements.doctree b/_build/html/v0.0.11/.doctrees/acknowledgements.doctree new file mode 100644 index 000000000..ea936caed Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/acknowledgements.doctree differ diff --git a/_build/html/v0.0.11/.doctrees/changelog.doctree b/_build/html/v0.0.11/.doctrees/changelog.doctree new file mode 100644 index 000000000..09556d321 Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/changelog.doctree differ diff --git a/_build/html/v0.0.11/.doctrees/citations.doctree b/_build/html/v0.0.11/.doctrees/citations.doctree new file mode 100644 index 000000000..3ae506724 Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/citations.doctree differ diff --git a/_build/html/v0.0.11/.doctrees/contributors.doctree b/_build/html/v0.0.11/.doctrees/contributors.doctree new file mode 100644 index 000000000..bc761f665 Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/contributors.doctree differ diff --git a/_build/html/v0.0.11/.doctrees/data_management.doctree b/_build/html/v0.0.11/.doctrees/data_management.doctree new file mode 100644 index 000000000..ecff86f87 Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/data_management.doctree differ diff --git a/_build/html/v0.0.11/.doctrees/eda_plots.doctree b/_build/html/v0.0.11/.doctrees/eda_plots.doctree new file mode 100644 index 000000000..30b8139e3 Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/eda_plots.doctree differ diff --git a/_build/html/v0.0.11/.doctrees/environment.pickle b/_build/html/v0.0.11/.doctrees/environment.pickle new file mode 100644 index 000000000..849f93f70 Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/environment.pickle differ diff --git a/_build/html/v0.0.11/.doctrees/getting_started.doctree b/_build/html/v0.0.11/.doctrees/getting_started.doctree new file mode 100644 index 000000000..808d43479 Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/getting_started.doctree differ diff --git a/_build/html/v0.0.11/.doctrees/index.doctree b/_build/html/v0.0.11/.doctrees/index.doctree new file mode 100644 index 000000000..54d8a90cf Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/index.doctree differ diff --git a/_build/html/v0.0.11/.doctrees/references.doctree b/_build/html/v0.0.11/.doctrees/references.doctree new file mode 100644 index 000000000..0aee3c937 Binary files /dev/null and b/_build/html/v0.0.11/.doctrees/references.doctree differ diff --git a/_build/html/v0.0.11/_images/2d_pdp_grid.svg b/_build/html/v0.0.11/_images/2d_pdp_grid.svg new file mode 100644 index 000000000..641db4ba6 --- /dev/null +++ b/_build/html/v0.0.11/_images/2d_pdp_grid.svg @@ -0,0 +1,4405 @@ + + + + + + + + 2024-09-08T21:59:22.990207 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/3d_pdp.svg b/_build/html/v0.0.11/_images/3d_pdp.svg new file mode 100644 index 000000000..535371233 --- /dev/null +++ b/_build/html/v0.0.11/_images/3d_pdp.svg @@ -0,0 +1,8326 @@ + + + + + + + + 2024-09-12T22:36:25.786914 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/Bar_Age_regular_income.svg b/_build/html/v0.0.11/_images/Bar_Age_regular_income.svg new file mode 100644 index 000000000..6f8aa40d4 --- /dev/null +++ b/_build/html/v0.0.11/_images/Bar_Age_regular_income.svg @@ -0,0 +1,1201 @@ + + + + + + + + 2024-08-04T12:01:07.319833 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/Stacked_Bar_Age_income.svg b/_build/html/v0.0.11/_images/Stacked_Bar_Age_income.svg new file mode 100644 index 000000000..d5510308b --- /dev/null +++ b/_build/html/v0.0.11/_images/Stacked_Bar_Age_income.svg @@ -0,0 +1,1943 @@ + + + + + + + + 2024-08-04T11:47:19.816889 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/Stacked_Bar_Age_income_pivoted.svg b/_build/html/v0.0.11/_images/Stacked_Bar_Age_income_pivoted.svg new file mode 100644 index 000000000..2147fce1a --- /dev/null +++ b/_build/html/v0.0.11/_images/Stacked_Bar_Age_income_pivoted.svg @@ -0,0 +1,2043 @@ + + + + + + + + 2024-08-04T11:56:38.571027 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/Stacked_Bar_Age_income_regular.svg b/_build/html/v0.0.11/_images/Stacked_Bar_Age_income_regular.svg new file mode 100644 index 000000000..04478581f --- /dev/null +++ b/_build/html/v0.0.11/_images/Stacked_Bar_Age_income_regular.svg @@ -0,0 +1,1347 @@ + + + + + + + + 2024-08-04T11:54:36.826244 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/Stacked_Bar_Age_sex.svg b/_build/html/v0.0.11/_images/Stacked_Bar_Age_sex.svg new file mode 100644 index 000000000..7b2bcb137 --- /dev/null +++ b/_build/html/v0.0.11/_images/Stacked_Bar_Age_sex.svg @@ -0,0 +1,1970 @@ + + + + + + + + 2024-08-04T11:55:12.796551 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/all_plots_comparisons_boxplot.png b/_build/html/v0.0.11/_images/all_plots_comparisons_boxplot.png new file mode 100644 index 000000000..c4f54b520 Binary files /dev/null and b/_build/html/v0.0.11/_images/all_plots_comparisons_boxplot.png differ diff --git a/_build/html/v0.0.11/_images/all_plots_comparisons_violinplot.png b/_build/html/v0.0.11/_images/all_plots_comparisons_violinplot.png new file mode 100644 index 000000000..cc236e21c Binary files /dev/null and b/_build/html/v0.0.11/_images/all_plots_comparisons_violinplot.png differ diff --git a/_build/html/v0.0.11/_images/all_plots_comparisons_violinplot_pivoted.png b/_build/html/v0.0.11/_images/all_plots_comparisons_violinplot_pivoted.png new file mode 100644 index 000000000..b05150e06 Binary files /dev/null and b/_build/html/v0.0.11/_images/all_plots_comparisons_violinplot_pivoted.png differ diff --git a/_build/html/v0.0.11/_images/count_hist_distributions.svg b/_build/html/v0.0.11/_images/count_hist_distributions.svg new file mode 100644 index 000000000..f08328f86 --- /dev/null +++ b/_build/html/v0.0.11/_images/count_hist_distributions.svg @@ -0,0 +1,1719 @@ + + + + + + + + 2024-09-17T18:49:36.706975 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/density_hist_dist_age.svg b/_build/html/v0.0.11/_images/density_hist_dist_age.svg new file mode 100644 index 000000000..717ca6bf8 --- /dev/null +++ b/_build/html/v0.0.11/_images/density_hist_dist_age.svg @@ -0,0 +1,1375 @@ + + + + + + + + 2024-09-16T23:27:50.927548 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/density_hist_dist_mean_median.svg b/_build/html/v0.0.11/_images/density_hist_dist_mean_median.svg new file mode 100644 index 000000000..cd480f5ed --- /dev/null +++ b/_build/html/v0.0.11/_images/density_hist_dist_mean_median.svg @@ -0,0 +1,1935 @@ + + + + + + + + 2024-09-16T22:16:05.594049 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/eda_toolkit_logo.svg b/_build/html/v0.0.11/_images/eda_toolkit_logo.svg new file mode 100644 index 000000000..d039d6f79 --- /dev/null +++ b/_build/html/v0.0.11/_images/eda_toolkit_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_build/html/v0.0.11/_images/hist_density_distributions.svg b/_build/html/v0.0.11/_images/hist_density_distributions.svg new file mode 100644 index 000000000..5ce1a7191 --- /dev/null +++ b/_build/html/v0.0.11/_images/hist_density_distributions.svg @@ -0,0 +1,1744 @@ + + + + + + + + 2024-09-17T18:44:23.458508 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/kde_density_distributions.svg b/_build/html/v0.0.11/_images/kde_density_distributions.svg new file mode 100644 index 000000000..b42cfeb18 --- /dev/null +++ b/_build/html/v0.0.11/_images/kde_density_distributions.svg @@ -0,0 +1,2301 @@ + + + + + + + + 2024-09-16T21:17:44.672843 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/normal_distribution.png b/_build/html/v0.0.11/_images/normal_distribution.png new file mode 100644 index 000000000..837c60e0c Binary files /dev/null and b/_build/html/v0.0.11/_images/normal_distribution.png differ diff --git a/_build/html/v0.0.11/_images/scatter_plots_all_grid.png b/_build/html/v0.0.11/_images/scatter_plots_all_grid.png new file mode 100644 index 000000000..78652ac74 Binary files /dev/null and b/_build/html/v0.0.11/_images/scatter_plots_all_grid.png differ diff --git a/_build/html/v0.0.11/_images/scatter_plots_grid.png b/_build/html/v0.0.11/_images/scatter_plots_grid.png new file mode 100644 index 000000000..5a51facd8 Binary files /dev/null and b/_build/html/v0.0.11/_images/scatter_plots_grid.png differ diff --git a/_build/html/v0.0.11/_images/scatter_plots_grid_grouped.png b/_build/html/v0.0.11/_images/scatter_plots_grid_grouped.png new file mode 100644 index 000000000..02a3b3916 Binary files /dev/null and b/_build/html/v0.0.11/_images/scatter_plots_grid_grouped.png differ diff --git a/_build/html/v0.0.11/_images/summarize_combos.gif b/_build/html/v0.0.11/_images/summarize_combos.gif new file mode 100644 index 000000000..402ee1efc Binary files /dev/null and b/_build/html/v0.0.11/_images/summarize_combos.gif differ diff --git a/_build/html/v0.0.11/_images/us_census_correlation_matrix.svg b/_build/html/v0.0.11/_images/us_census_correlation_matrix.svg new file mode 100644 index 000000000..2a41e1afa --- /dev/null +++ b/_build/html/v0.0.11/_images/us_census_correlation_matrix.svg @@ -0,0 +1,1766 @@ + + + + + + + + 2024-08-09T18:12:33.390718 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_images/us_census_correlation_matrix_full.svg b/_build/html/v0.0.11/_images/us_census_correlation_matrix_full.svg new file mode 100644 index 000000000..d0df5da46 --- /dev/null +++ b/_build/html/v0.0.11/_images/us_census_correlation_matrix_full.svg @@ -0,0 +1,1907 @@ + + + + + + + + 2024-08-09T18:30:04.884359 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_sources/acknowledgements.rst.txt b/_build/html/v0.0.11/_sources/acknowledgements.rst.txt new file mode 100644 index 000000000..e62da5a10 --- /dev/null +++ b/_build/html/v0.0.11/_sources/acknowledgements.rst.txt @@ -0,0 +1,30 @@ +.. _acknowledgements: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Acknowledgements +================= + +We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists. + +We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors. diff --git a/_build/html/v0.0.11/_sources/changelog.rst.txt b/_build/html/v0.0.11/_sources/changelog.rst.txt new file mode 100644 index 000000000..1a113cbfc --- /dev/null +++ b/_build/html/v0.0.11/_sources/changelog.rst.txt @@ -0,0 +1,642 @@ +.. _changelog: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Changelog +========= + +`Version 0.0.11`_ +---------------------- + +.. _Version 0.0.11: https://lshpaner.github.io/eda_toolkit/v0.0.11/index.html + + +**Description** + +Fixes a ``TypeError`` in the ``stacked_crosstab_plot`` function when ``save_formats`` is ``None``. The update ensures that ``save_formats`` defaults to an empty list, preventing iteration over a ``NoneType`` object. + +**Changes** + +- Initializes ``save_formats`` as an empty list if not provided. +- Adds handling for string and tuple input types for ``save_formats``. + +**Issue Fixed** + +- Resolves ``TypeError`` when ``save_formats`` is ``None``. + + + +`Version 0.0.10`_ +---------------------- + +.. _Version 0.0.10: https://lshpaner.github.io/eda_toolkit/v0.0.10/index.html + +**Legend Handling** + +- The legend is now displayed only if there are valid legend handles (``len(handles) > 0``) and if ``show_legend`` is set to ``True``. + +- The check ``ax.get_legend().remove()`` ensures that unnecessary legends are removed if they are empty or if ``show_legend`` is set to ``False``. + +**Error Handling** +- Error handling in the ``except`` block has been enhanced to ensure that any exceptions related to legends or labels are managed properly. The legend handling logic still respects the ``show_legend`` flag even in cases where exceptions occur. + +This update prevents empty legend squares from appearing and maintains the intended default behavior of showing legends only when they contain relevant content. + + +`Version 0.0.9`_ +---------------------- + +.. _Version 0.0.9: https://lshpaner.github.io/eda_toolkit/v0.0.9/index.html + +**Bug Fixes and Minor Improvements** + +Improved error messages and validation checks across multiple functions to prevent common pitfalls and ensure smoother user experience. + +**Visualization Enhancements** + +**DataFrame Columns:** Added a ``background_color`` variable to ``dataframe_columns```, +allowing the user to enter a string representing a color name, or hex value. +Try/Except on the output, in case the end user has a deprecated version of Pandas, +where the styler would use ``hide()`` instead of ``hide_index()``. The highlighted +columns allow for easier null versus unique value analysis. + +The docstring now clearly describes the purpose of the function—analyzing +DataFrame columns to provide summary statistics. + +**Args:** + +- The ``df`` argument is specified as a ``pandas.DataFrame``. + +- The ``background_color`` argument is marked as optional, with a brief description of its role. + +- The ``return_df`` argument is also marked as optional, explaining what it controls. + + +**Returns:** The return type is specified as ``pandas.DataFrame``, with a clear explanation of the difference based on the ``return_df`` flag. + +**KDE Distribution Plots:** Improved ``kde_distributions()`` with enhanced options for log scaling, mean/median plotting, custom standard deviation lines, and better handling of legends and scientific notation. + +**Scatter Plots:** Enhanced ``scatter_fit_plot()`` with support for hue-based coloring, best fit lines, correlation display, and flexible grid plotting options. + + +`Version 0.0.8`_ +---------------------- + +.. _Version 0.0.8: https://lshpaner.github.io/eda_toolkit/v0.0.8/index.html + + +:class:`stacked_crosstab_plot` + +- **Flexible `save_formats` Input**: + - `save_formats` now accepts a string, tuple, or list for specifying formats (e.g., `"png"`, `("png", "svg")`, or `["png", "svg"]`). + - Single strings or tuples are automatically converted to lists for consistent processing. + +- **Dynamic Error Handling**: + - Added checks to ensure a valid path is provided for each format in `save_formats`. + - Raises a `ValueError` if a format is specified without a corresponding path, with a clear, dynamic error message. + +- **Improved Plot Saving Logic**: + - Updated logic allows saving plots in one format (e.g., only `"png"` or `"svg"`) without requiring the other. + - Simplified and more intuitive path handling for saving plots. + + +:class:`plot_3d_pdp` + +This update introduces several key changes to the `plot_3d_pdp` function, simplifying the function's interface and improving usability, while maintaining the flexibility needed for diverse visualization needs. + +**1. Parameter Changes** + + +- **Removed Parameters:** + + - The parameters ``x_label_plotly``, ``y_label_plotly``, and ``z_label_plotly`` have been removed. These parameters previously allowed custom axis labels specifically for the Plotly plot, defaulting to the general ``x_label``, ``y_label``, and ``z_label``. Removing these parameters simplifies the function signature while maintaining flexibility. + +- **Default Values for Labels:** + + - The parameters ``x_label``, ``y_label``, and ``z_label`` are now optional, with ``None`` as the default. If not provided, these labels will automatically default to the names of the features in the ``feature_names_list``. This change makes the function more user-friendly, particularly for cases where default labels are sufficient. + +- **Changes in Default Values for View Angles:** + + - The default values for camera positioning parameters have been updated: ``horizontal`` is now ``-1.25``, ``depth`` is now ``1.25``, and ``vertical`` is now ``1.25``. These adjustments refine the default 3D view perspective for the Plotly plot, providing a more intuitive starting view. + +**2. Plot Generation Logic** + +- **Conditionally Checking Labels:** + + - The function now checks whether ``x_label``, ``y_label``, and ``z_label`` are provided. If these are ``None``, the function will automatically assign default labels based on the ``feature_names_list``. This enhancement reduces the need for users to manually specify labels, making the function more adaptive. + +- **Camera Position Adjustments:** + + - The camera positions for the Plotly plot are now adjusted by multiplying ``horizontal``, ``depth``, and ``vertical`` by ``zoom_out_factor``. This change allows for more granular control over the 3D view, enhancing the interactivity and flexibility of the Plotly visualizations. + +- **Surface Plot Coordinates Adjustments:** + + - The order of the coordinates for the Plotly plot’s surface has been changed from ``ZZ, XX, YY[::-1]`` to ``ZZ, XX, YY``. This adjustment ensures the proper alignment of axes and grids, resulting in more accurate visual representations. + +**3. Code Simplifications** + +- **Removed Complexity:** + + - By removing the ``x_label_plotly``, ``y_label_plotly``, and ``z_label_plotly`` parameters, the code is now simpler and easier to maintain. This change reduces potential confusion and streamlines the function for users who do not need distinct labels for Matplotlib and Plotly plots. + +- **Fallback Mechanism for Grid Values:** + + - The function continues to implement a fallback mechanism when extracting grid values, ensuring compatibility with various versions of scikit-learn. This makes the function robust across different environments. + +**4. Style Adjustments** + +- **Label Formatting:** + + - The new version consistently uses ``y_label``, ``x_label``, and ``z_label`` for axis labels in the Matplotlib plot, aligning the formatting across different plot types. + +- **Color Bar Adjustments:** + + - The color bar configuration in the Matplotlib plot has been slightly adjusted with a shrink value of ``0.6`` and a pad value of ``0.02``. These adjustments result in a more refined visual appearance, particularly in cases where space is limited. + +**5. Potential Use Case Differences** + +- **Simplified Interface:** + + - The updated function is more streamlined for users who prefer a simplified interface without the need for separate label customizations for Plotly and Matplotlib plots. This makes it easier to use in common scenarios. + +- **Less Granular Control:** + + - Users who need more granular control, particularly for presentations or specific formatting, may find the older version more suitable. The removal of the ``*_plotly`` label parameters means that all plots now use the same labels across Matplotlib and Plotly. + +**6. Matplotlib Plot Adjustments** + +- **Wireframe and Surface Plot Enhancements:** + + - The logic for plotting wireframes and surface plots in Matplotlib remains consistent with previous versions, with subtle enhancements to color and layout management to improve overall aesthetics. + +**Summary** + +- Version ``0.0.8d`` of the `plot_3d_pdp` function introduces simplifications that reduce the number of parameters and streamline the plotting process. While some customizability has been removed, the function remains flexible enough for most use cases and is easier to use. +- Key updates include adjusted default camera views for 3D plots, removal of Plotly-specific label parameters, and improved automatic labeling and plotting logic. + +**Decision Point** + +- This update may be especially useful for users who prefer a cleaner and more straightforward interface. However, those requiring detailed customizations may want to continue using the older version, depending on their specific needs. + + +Version 0.0.8c +------------------------ + +Version 0.0.8c is a follow-up release to version 0.0.8b. This update includes minor enhancements and refinements based on feedback and additional testing. It serves as an incremental step towards improving the stability and functionality of the toolkit. + +**Key Updates in 0.0.8c:** + +- **Bug Fixes:** Addressed minor issues identified in version ``0.0.8b`` to ensure smoother performance and better user experience. +- **Additional Testing:** Incorporated further tests to validate the changes introduced in previous versions and to prepare for future stable releases. +- **Refinements:** Made small enhancements to existing features based on user feedback and internal testing results. + +**Summary of Changes** + +1. New Features & Enhancements + +- ``plot_3d_pdp`` Function: + + - Added ``show_modebar`` Parameter: Introduced a new boolean parameter, ``show_modebar``, to allow users to toggle the visibility of the mode bar in Plotly interactive plots. + + - Custom Margins and Layout Adjustments: + + - Added parameters for ``left_margin``, ``right_margin``, and ``top_margin`` to provide users with more control over the plot layout in Plotly. + + - Adjusted default values and added options for better customization of the Plotly color bar (``cbar_x``, ``cbar_thickness``) and title positioning (``title_x``, ``title_y``). + + - Plotly Configuration: + + - Enhanced the configuration options to allow users to enable or disable zoom functionality (``enable_zoom``) in the interactive Plotly plots. + + - Updated the code to reflect these new parameters, allowing for greater flexibility in the appearance and interaction with the Plotly plots. + + - Error Handling: + + - Added input validation for ``html_file_path`` and ``html_file_name`` to ensure these are provided when necessary based on the selected ``plot_type``. + +- ``plot_2d_pdp`` Function: + + - Introduced ``file_prefix`` Parameter: + + - Added a new ``file_prefix`` parameter to allow users to specify a prefix for filenames when saving grid plots. This change streamlines the naming process for saved plots and improves file organization. + + - Enhanced Plot Type Flexibility: + + - The ``plot_type`` parameter now includes an option to generate both grid and individual plots (``both``). This feature allows users to create a combination of both layout styles in one function call. + + - Updated input validation and logic to handle this new option effectively. + + - Added ``save_plots`` Parameter: + + - Introduced a new parameter, ``save_plots``, to control the saving of plots. Users can specify whether to save all plots, only individual plots, only grid plots, or none. + + - Custom Margins and Layout Adjustments: + + - Included the ``save_plots`` parameter in the validation process to ensure paths are provided when needed for saving the plots. + +2. Documentation Updates + +- Docstrings: + + - Updated docstrings for both functions to reflect the new parameters and enhancements, providing clearer and more comprehensive guidance for users. + + - Detailed the use of new parameters such as ``show_modebar``, ``file_prefix``, ``save_plots``, and others, ensuring that the function documentation is up-to-date with the latest changes. + +3. Refactoring & Code Cleanup + +- Code Structure: + + - Improved the code structure to maintain clarity and readability, particularly around the new functionality. + + - Consolidated the layout configuration settings for the Plotly plots into a more flexible and user-friendly format, making it easier for users to customize their plots. + + +Version 0.0.8b +-------------------------------- + +Version 0.0.8b is an exact replica of version ``0.0.8a``. The purpose of this +beta release was to test whether releasing it as the latest version would update +its status on PyPI to reflect it as the latest release. However, it continues to +be identified as a pre-release on PyPI. + + +Version 0.0.8a +-------------------------------- + +Version 0.0.8a introduces significant enhancements and new features to improve +the usability and functionality of the EDA Toolkit. + +**New Features:** + +1. Optional ``file_prefix`` in ``stacked_crosstab_plot`` Function + + - The ``stacked_crosstab_plot`` function has been updated to make the ``file_prefix`` argument optional. If the user does not provide a ``file_prefix``, the function will now automatically generate a default prefix based on the ``col`` and ``func_col`` parameters. This change streamlines the process of generating plots by reducing the number of required arguments. + + - **Key Improvement:** + + - Users can now omit the ``file_prefix`` argument, and the function will still produce appropriately named plot files, enhancing ease of use. + + - Backward compatibility is maintained, allowing users who prefer to specify a custom ``file_prefix`` to continue doing so without any issues. + +2. **Introduction of 3D and 2D Partial Dependence Plot Functions** + + - Two new functions, ``plot_3d_pdp`` and ``plot_2d_pdp``, have been added to the toolkit, expanding the visualization capabilities for machine learning models. + + - ``plot_3d_pdp``: Generates 3D partial dependence plots for two features, supporting both static visualizations (using Matplotlib) and interactive plots (using Plotly). The function offers extensive customization options, including labels, color maps, and saving formats. + + - ``plot_2d_pdp``: Creates 2D partial dependence plots for specified features with flexible layout options (grid or individual plots) and customization of figure size, font size, and saving formats. + + - **Key Features:** + + - **Compatibility:** Both functions are compatible with various versions of scikit-learn, ensuring broad usability. + + - **Customization:** Extensive options for customizing visual elements, including figure size, font size, and color maps. + + - **Interactive 3D Plots:** The ``plot_3d_pdp`` function supports interactive visualizations, providing an enhanced user experience for exploring model predictions in 3D space. + +**Impact:** + +- These updates improve the user experience by reducing the complexity of function calls and introducing powerful new tools for model interpretation. +- The optional ``file_prefix`` enhancement simplifies plot generation while maintaining the flexibility to define custom filenames. +- The new partial dependence plot functions offer robust visualization options, making it easier to analyze and interpret the influence of specific features in machine learning models. + + + +`Version 0.0.7`_ +---------------------- + +.. _Version 0.0.7: https://lshpaner.github.io/eda_toolkit/v0.0.7/index.html + +**Added Function for Customizable Correlation Matrix Visualization** + +This release introduces a new function, ``flex_corr_matrix``, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to ``seaborn.heatmap()``. + +**Summary of Changes** + +- **New Function**: ``flex_corr_matrix``. + + - **Functionality**: + - Generates a correlation heatmap for a given DataFrame. + - Supports both full and upper triangular correlation matrices based on the ``triangular`` parameter. + - Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. + - Accepts additional keyword arguments via ``**kwargs`` to pass directly to ``seaborn.heatmap()``. + - Includes validation to ensure the ``triangular``, ``annot``, and ``save_plots`` parameters are boolean values. + - Raises an exception if ``save_plots=True`` but neither ``image_path_png`` nor ``image_path_svg`` is specified. + +**Usage** + +.. code-block:: python + + # Full correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True) + + # Upper triangular correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True) + + +**Contingency table df to object type** + +Convert all columns in the DataFrame to object type to prevent issues with numerical columns. + +.. code-block:: python + + df = df.astype(str).fillna("") + + +`Version 0.0.6`_ +---------------------- + +.. _Version 0.0.6: https://lshpaner.github.io/eda_toolkit/v0.0.6/index.html + +**Added validation for Plot Type Parameter in KDE Distributions Function** + +This release adds a validation step for the ``plot_type`` parameter in the ``kde_distributions`` function. The allowed values for ``plot_type`` are ``"hist"``, ``"kde"``, and ``"both"``. If an invalid value is provided, the function will now raise a ``ValueError`` with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values. + +.. code-block:: python + + # Validate plot_type parameter + valid_plot_types = ["hist", "kde", "both"] + if plot_type.lower() not in valid_plot_types: + raise ValueError( + f"Invalid plot_type value. Expected one of {valid_plot_types}, " + f"got '{plot_type}' instead." + ) + +`Version 0.0.5`_ +---------------------- + +.. _Version 0.0.5: https://lshpaner.github.io/eda_toolkit/v0.0.5/index.html + + +**Ensure Consistent Font Size and Text Wrapping Across Plot Elements** + +This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the ``stacked_crosstab_plot`` function. The following updates have been implemented to ensure uniformity and improve the readability of plots: + +1. **Title Font Size and Text Wrapping:** + - Added a ``text_wrap`` parameter to control the wrapping of plot titles. + - Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ``ax.set_title()`` after plot generation. + +2. **Legend Font Size Consistency:** + - Incorporated ``label_fontsize`` into the legend font size by directly setting the font size of the legend text using ``plt.setp(legend.get_texts(), fontsize=label_fontsize)``. + - This ensures that the legend labels are consistent with the title and axis labels. + +**Testing** + +- Verified that titles now wrap correctly and match the specified ``label_fontsize``. +- Confirmed that legend text scales according to ``label_fontsize``, ensuring consistent font sizes across all plot elements. + + +Version 0.0.4 +--------------------------- + +- **Stable release** + + - No new updates to the codebase. + + - Updated the project ``description`` variable in ``setup.py`` to re-emphasize key elements of the library. + + - Minor README cleanup: + + - Added icons for sections that did not have them. + + +Version 0.0.3 +--------------------------- + +- **Stable release** + + - Updated logo size, fixed citation title, and made minor README cleanup: + + - Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support. + +Version 0.0.2 +--------------------------- + +- **First stable release** + - No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + - Added logo, badges, and Zenodo-certified citation to README. + +Version 0.0.1rc0 +------------------------------- + +- No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + +Version 0.0.1b0 +----------------------------- + +**New Scatter Fit Plot and Additional Updates** + +- Added new ``scatter_fit_plot()``, removed unused ``data_types()``, and added comment section headers. + +**Added xlim and ylim Inputs to KDE Distribution** + +- ``kde_distribution()``: + + - Added ``xlim`` and ``ylim`` inputs to allow users to customize axes limits in ``kde_distribution()``. + +**Added xlim and ylim Params to Stacked Crosstab Plot** + +- ``stacked_crosstab_plot()``: + + - Added ``xlim`` and ``ylim`` input parameters to ``stacked_crosstab_plot()`` to give users more flexibility in controlling axes limits. + +**Added x and y Limits to Box and Violin Plots** + +- ``box_violin_plot()``: + + - Changed function name from ``metrics_box_violin()`` to ``box_violin_plot()``. + - Added ``xlim`` and ``ylim`` inputs to control x and y-axis limits of ``box_violin_plot()`` (formerly ``metrics_box_violin``). + +**Added Ability to Remove Stacks from Plots, Plot All or One at a Time** + +**Key Changes** + +1. **Plot Type Parameter** + - ``plot_type``: This parameter allows the user to choose between ``"regular"``, ``"normalized"``, or ``"both"`` plot types. + +2. **Remove Stacks Parameter** + - ``remove_stacks``: This parameter, when set to ``True``, generates a regular bar plot using only the ``col`` parameter instead of a stacked bar plot. It only works when ``plot_type`` is set to "regular". If ``remove_stacks`` is set to ``True`` while ``plot_type`` is anything other than "regular", the function will raise an exception. + +**Explanation of Changes** + +- **Plot Type Parameter** + + - Provides flexibility to the user, allowing specification of the type of plot to generate: + + - ``"regular"``: Standard bar plot. + + - ``"normalized"``: Normalized bar plot. + + - ``"both"``: Both regular and normalized bar plots. + +- **Remove Stacks Parameter** + - ``remove_stacks``: Generates a regular bar plot using only the ``col`` parameter, removing the stacking of the bars. Applicable only when ``plot_type`` is set to "regular". An exception is raised if used with any other ``plot_type``. + +These changes enhance the flexibility and functionality of the ``stacked_crosstab_plot`` function, allowing for more customizable and specific plot generation based on user requirements. + +Version 0.0.1b0 +----------------------------- + +**Refined KDE Distributions** + +**Key Changes** + +1. **Alpha Transparency for Histogram Fill** + - Added a ``fill_alpha`` parameter to control the transparency of the histogram bars' fill color. + - Default value is ``0.6``. An exception is raised if ``fill=False`` and ``fill_alpha`` is specified. + +2. **Custom Font Sizes** + - Introduced ``label_fontsize`` and ``tick_fontsize`` parameters to control font size of axis labels and tick marks independently. + +3. **Scientific Notation Toggle** + - Added a ``disable_sci_notation`` parameter to enable or disable scientific notation on axes. + +4. **Improved Error Handling** + - Added validation for the ``stat`` parameter to ensure valid options are accepted. + - Added checks for proper usage of ``fill_alpha`` and ``hist_edgecolor`` when ``fill`` is set to ``False``. + +5. **General Enhancements** + - Updated the function's docstring to reflect new parameters and provide comprehensive guidance on usage. + +Version 0.0.1b0 +----------------------------- + +**Enhanced KDE Distributions Function** + +**Added Parameters** + +1. **Grid Figsize and Single Figsize** + - Control the size of the overall grid figure and individual figures separately. + +2. **Hist Color and KDE Color`** + - Allow customization of histogram and KDE plot colors. + +3. **Edge Color** + - Allows customization of histogram bar edges. + +4. **Hue** + - Allows grouping data by a column. + +5. **Fill** + - Controls whether to fill histogram bars with color. + +6. **Y-axis Label`** + - Customizable y-axis label. + +7. **Log-Scaling** + - Specifies which variables to apply log scale. + +8. **Bins and Bin Width** + - Control the number and width of bins. + +9. **``stat``:** + - Allows different statistics for the histogram (``count``, ``density``, ``frequency``, ``probability``, ``proportion``, ``percent``). + +**Improvements** + +1. **Validation and Error Handling** + - Checks for invalid ``log_scale_vars`` and throws a ``ValueError`` if any are found. + - Throws a ``ValueError`` if ``edgecolor`` is changed while ``fill`` is set to ``False``. + - Issues a ``PerformanceWarning`` if both ``bins`` and ``binwidth`` are specified, warning of potential performance impacts. + +2. **Customizable Y-Axis Label** + - Allows users to specify custom y-axis labels. + +3. **Warning for KDE with Count** + - Issues a warning if KDE is used with ``stat='count'``, as it may produce misleading plots. + +**Updated Function to Ensure Unique IDs and Index Check** + +- Ensured that each generated ID in ``add_ids`` starts with a non-zero digit. +- Added a check to verify that the DataFrame index is unique. +- Printed a warning message if duplicate index entries are found. + +These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique. + +**Check for Unique Indices** +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries. + +**Generate Non-Zero Starting IDs** + +- The ID generation process is updated to ensure that the first digit of each ID is always non-zero. + +**Ensure Unique IDs** + +- A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame. + +**Fix Int Conversion for Numeric Columns, Reset Decimal Places** + +- Fixed integer conversion issue for numeric columns when ``decimal_places=0`` in the ``save_dataframes_to_excel`` function. +- Reset ``decimal_places`` default value to ``0``. + +These changes ensure correct formatting and avoid errors during conversion. + +**Contingency Table Updates** + +1. **Error Handling for Columns** + - Added a check to ensure at least one column is specified. + - Updated the function to accept a single column as a string or multiple columns as a list. + - Raised a ``ValueError`` if no columns are provided or if ``cols`` is not correctly specified. + +2. **Function Parameters** + - Changed parameters from ``col1`` and ``col2`` to a single parameter ``cols`` which can be either a string or a list. + +3. **Error Handling** + - Renamed ``SortBy`` to ``sort_by`` to standardize nomenclature. + - Added a check to ensure ``sort_by`` is either 0 or 1. + - Raised a ``ValueError`` if ``sort_by`` is not 0 or 1. + +5. **Sorting Logic** + - Updated the sorting logic to handle the new ``cols`` parameter structure. + +6. **Handling Categorical Data** + - Modified code to convert categorical columns to strings to avoid issues with ``fillna("")``. + +7. **Handling Missing Values** + - Added ``df = df.fillna('')`` to fill NA values within the function to account for missing data. + +8. **Improved Function Documentation** + - Updated function documentation to reflect new parameters and error handling. + +Version 0.0.1b0 +----------------------------- + +**Contingency Table Updates** + +- ``fillna('')`` added to output so that null values come through, removed ``'All'`` column name from output, sort options ``0`` and ``1``, updated docstring documentation. Tested successfully on ``Python 3.7.3``. + +**Compatibility Enhancement** + +1. Added a version check for ``Python 3.7`` and above. + + - Conditional import of ``datetime`` to handle different Python versions. + +.. code-block:: python + + if sys.version_info >= (3, 7): + from datetime import datetime + else: + import datetime diff --git a/_build/html/v0.0.11/_sources/citations.rst.txt b/_build/html/v0.0.11/_sources/citations.rst.txt new file mode 100644 index 000000000..51ef0423d --- /dev/null +++ b/_build/html/v0.0.11/_sources/citations.rst.txt @@ -0,0 +1,42 @@ +.. _citations: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Citing EDA Toolkit +=================== + +Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.11). Zenodo. https://doi.org/10.5281/zenodo.13163208 + +.. code:: bash + + @software{shpaner_2024_13162633, + author = {Shpaner, Leonid and + Gil, Oscar}, + title = {EDA Toolkit}, + month = aug, + year = 2024, + publisher = {Zenodo}, + version = {0.0.11}, + doi = {10.5281/zenodo.13162633}, + url = {https://doi.org/10.5281/zenodo.13162633} + } + diff --git a/_build/html/v0.0.11/_sources/contributors.rst.txt b/_build/html/v0.0.11/_sources/contributors.rst.txt new file mode 100644 index 000000000..4da2fa18b --- /dev/null +++ b/_build/html/v0.0.11/_sources/contributors.rst.txt @@ -0,0 +1,59 @@ +.. _contributors: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Contributors/Maintainers +========================= + +.. raw:: html + +
+ +.. image:: https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + :align: left + :width: 150 + :height: 150 + +.. raw:: html + +
+ +`Leonid Shpaner `_ is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego's M.S. Applied Artificial Intelligence program. + +.. raw:: html + +


+ +.. raw:: html + +
+ +.. image:: https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + :align: left + :width: 150 + :height: 150 + +.. raw:: html + +
+ +`Oscar Gil `_ is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego. diff --git a/_build/html/v0.0.11/_sources/data_management.rst.txt b/_build/html/v0.0.11/_sources/data_management.rst.txt new file mode 100644 index 000000000..056ce061c --- /dev/null +++ b/_build/html/v0.0.11/_sources/data_management.rst.txt @@ -0,0 +1,1409 @@ +.. _data_management: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Data Management Overview +=========================== + +In any data-driven project, effective management of data is crucial. This +section provides essential techniques for handling and preparing data to ensure +consistency, accuracy, and ease of analysis. From directory setup and data +cleaning to advanced data processing, these methods form the backbone of reliable +data management. Dive into the following topics to enhance your data handling +capabilities and streamline your workflow. + +Data Management Techniques +=============================== + +Path directories +---------------- + +**Ensure that the directory exists. If not, create it.** + +.. function:: ensure_directory(path) + + :param path: The path to the directory that needs to be ensured. + :type path: str + + :returns: None + + +The ``ensure_directory`` function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``ensure_directory`` function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them. + +First, we define the base path as the parent directory of the current directory. +The ``os.pardir`` constant, equivalent to ``"..""``, is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory. + + +Next, we set paths for the PNG and SVG image directories, located within an +``images`` folder in the parent directory. Using the ``ensure_directory`` +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them. + +.. code-block:: python + + from eda_toolkit import ensure_directory + + import os # import operating system for dir + + + base_path = os.path.join(os.pardir) + + # Go up one level from 'notebooks' to parent directory, + # then into the 'data' folder + data_path = os.path.join(os.pardir, "data") + data_output = os.path.join(os.pardir, "data_output") + + # create image paths + image_path_png = os.path.join(base_path, "images", "png_images") + image_path_svg = os.path.join(base_path, "images", "svg_images") + + # Use the function to ensure'data' directory exists + ensure_directory(data_path) + ensure_directory(data_output) + ensure_directory(image_path_png) + ensure_directory(image_path_svg) + +**Output** + +.. code-block:: python + + Created directory: ../data + Created directory: ../data_output + Created directory: ../images/png_images + Created directory: ../images/svg_images + + +Adding Unique Identifiers +-------------------------- + +**Add a column of unique IDs with a specified number of digits to the dataframe.** + +.. function:: add_ids(df, id_colname="ID", num_digits=9, seed=None, set_as_index=True) + + :param df: The dataframe to add IDs to. + :type df: pd.DataFrame + :param id_colname: The name of the new column for the IDs. Defaults to ``"ID"``. + :type id_colname: str, optional + :param num_digits: The number of digits for the unique IDs. Defaults to ``9``. + :type num_digits: int, optional + :param seed: The seed for the random number generator. Defaults to ``None``. + :type seed: int, optional + :param set_as_index: Whether to set the new ID column as the index. Defaults to ``False``. + :type set_as_index: bool, optional + + :returns: The updated dataframe with the new ID column. + :rtype: pd.DataFrame + +.. note:: + - If the dataframe index is not unique, a warning is printed. + - The function does not check if the number of rows exceeds the number of + unique IDs that can be generated with the specified number of digits. + - The first digit of the generated IDs is ensured to be non-zero. + +The ``add_ids`` function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe. + +**Example Usage** + +In the example below, we demonstrate how to use the ``add_ids`` function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the ``add_ids`` function to generate +and append a column of unique IDs with a specified number of digits to the dataframe. + +First, we import the pandas library and the ``add_ids`` function from the ``eda_toolkit``. +Then, we create a sample dataframe with some data. We call the ``add_ids`` function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe. + +.. code-block:: python + + from eda_toolkit import add_ids + + # Add a column of unique IDs with 9 digits and call it "census_id" + df = add_ids( + df=df, + id_colname="census_id", + num_digits=9, + seed=111, + set_as_index=True, + ) + +**Output** + +`First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: bash + + DataFrame index is unique. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+
+ + +\ + + +Trailing Period Removal +----------------------- + +**Strip the trailing period from floats in a specified column of a DataFrame, if present.** + +.. function:: strip_trailing_period(df, column_name) + + :param df: The DataFrame containing the column to be processed. + :type df: pd.DataFrame + :param column_name: The name of the column containing floats with potential trailing periods. + :type column_name: str + + :returns: The updated DataFrame with the trailing periods removed from the specified column. + :rtype: pd.DataFrame + + + The ``strip_trailing_period`` function is designed to remove trailing periods + from float values in a specified column of a DataFrame. This can be particularly + useful when dealing with data that has been inconsistently formatted, ensuring + that all float values are correctly represented. + +**Example Usage** + +In the example below, we demonstrate how to use the ``strip_trailing_period`` function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the ``strip_trailing_period`` function to remove any trailing periods from the specified column. + +.. code-block:: python + + from eda_toolkit import strip_trailing_period + + # Create a sample dataframe with trailing periods in some values + data = { + "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.], + } + df = pd.DataFrame(data) + + # Remove trailing periods from the 'values' column + df = strip_trailing_period(df=df, column_name="values") + + +**Output** + +`First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)` + +.. raw:: html + + + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +
+ + +\ + +`Note:` The last row shows 6 as an `int` with a trailing period with its conversion to `float`. + + +\ + +Standardized Dates +------------------- + +**Parse and standardize date strings based on the provided rule.** + +.. function:: parse_date_with_rule(date_str) + + This function takes a date string and standardizes it to the ``ISO 8601`` format + (``YYYY-MM-DD``). It assumes dates are provided in either `day/month/year` or + `month/day/year` format. The function first checks if the first part of the + date string (day or month) is greater than 12, which unambiguously indicates + a `day/month/year` format. If the first part is 12 or less, the function + attempts to parse the date as `month/day/year`, falling back to `day/month/year` + if the former raises a ``ValueError`` due to an impossible date (e.g., month + being greater than 12). + + :param date_str: A date string to be standardized. + :type date_str: str + + :returns: A standardized date string in the format ``YYYY-MM-DD``. + :rtype: str + + :raises ValueError: If ``date_str`` is in an unrecognized format or if the function + cannot parse the date. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``parse_date_with_rule`` +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the ``parse_date_with_rule`` +function to parse and standardize each date string to the ``ISO 8601`` format. + +.. code-block:: python + + from eda_toolkit import parse_date_with_rule + + # Sample date strings + date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"] + + # Standardize the date strings + standardized_dates = [parse_date_with_rule(date) for date in date_strings] + + print(standardized_dates) + +**Output** + +.. code-block:: python + + ['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12'] + + + +.. important:: + + In the next example, we demonstrate how to apply the ``parse_date_with_rule`` + function to a DataFrame column containing date strings using the ``.apply()`` method. + This is particularly useful when you need to standardize date formats across an + entire column in a DataFrame. + +.. code-block:: python + + # Creating the DataFrame + data = { + "date_column": [ + "31/12/2021", + "01/01/2022", + "12/31/2021", + "13/02/2022", + "07/04/2022", + ], + "name": ["Alice", "Bob", "Charlie", "David", "Eve"], + "amount": [100.0, 150.5, 200.75, 250.25, 300.0], + } + + df = pd.DataFrame(data) + + # Apply the function to the DataFrame column + df["standardized_date"] = df["date_column"].apply(parse_date_with_rule) + + print(df) + +**Output** + +.. code-block:: python + + date_column name amount standardized_date + 0 31/12/2021 Alice 100.00 2021-12-31 + 1 01/01/2022 Bob 150.50 2022-01-01 + 2 12/31/2021 Charlie 200.75 2021-12-31 + 3 13/02/2022 David 250.25 2022-02-13 + 4 07/04/2022 Eve 300.00 2022-04-07 + + +DataFrame Analysis +------------------- + +**Analyze DataFrame columns, including dtype, null values, and unique value counts.** + +.. function:: dataframe_columns(df, background_color=None, return_df=False) + + Analyze DataFrame columns to provide summary statistics such as data type, + null counts, unique values, and most frequent values. + + This function analyzes the columns of a DataFrame, providing details about the data type, + the number and percentage of ``null`` values, the total number of unique values, and the most + frequent unique value along with its count and percentage. It handles special cases such as + converting date columns and replacing empty strings with Pandas ``NA`` values. + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param background_color: Hex color code or color name for background styling in the output + DataFrame. Defaults to ``None``. + :type background_color: str, optional + :param return_df: If ``True``, returns the plain DataFrame with the summary statistics. If + ``False``, returns a styled DataFrame for visual presentation. Defaults to ``False``. + :type return_df: bool, optional + + :returns: If ``return_df`` is ``True``, returns the plain DataFrame containing column summary + statistics. If ``return_df`` is ``False``, returns a styled DataFrame with optional + background color for specific columns. + :rtype: pandas.DataFrame + + +Census Income Example +"""""""""""""""""""""""""""""" + +In the example below, we demonstrate how to use the ``dataframe_columns`` +function to analyze a DataFrame's columns. + +.. code-block:: python + + from eda_toolkit import dataframe_columns + + dataframe_columns(df=df) + + +**Output** + +`Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: python + + Shape: (48842, 16) + + Total seconds of processing time: 0.861555 + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+
+ + + +\ + +DataFrame Column Names +"""""""""""""""""""""""""""""" + +``unique_values_total`` + This column indicates the total number of unique values present in each column of the DataFrame. It measures the distinct values that a column holds. For example, in the ``age`` column, there are 74 unique values, meaning the ages vary across 74 distinct entries. + +``max_unique_value`` + This column shows the most frequently occurring value in each column. For example, in the ``workclass`` column, the most common value is ``Private``, indicating that this employment type is the most represented in the dataset. For numeric columns like ``capital-gain`` and ``capital-loss``, the most common value is ``0``, which suggests that the majority of individuals have no capital gain or loss. + +``max_unique_value_total`` + This represents the count of the most frequently occurring value in each column. For instance, in the ``native-country`` column, the value ``United-States`` appears ``43,832`` times, indicating that the majority of individuals in the dataset are from the United States. + +``max_unique_value_pct`` + This column shows the percentage that the most frequent value constitutes of the total number of rows. For example, in the ``race`` column, the value ``White`` makes up ``85.5%`` of the data, suggesting a significant majority of the dataset belongs to this racial group. + +Calculation Details +"""""""""""""""""""""""""""""" +- ``unique_values_total`` is calculated using the ``nunique()`` function, which counts the number of unique values in a column. +- ``max_unique_value`` is determined by finding the value with the highest frequency using ``value_counts()``. For string columns, any missing values (if present) are replaced with the string ``"null"`` before computing the frequency. +- ``max_unique_value_total`` is the frequency count of the ``max_unique_value``. +- ``max_unique_value_pct`` is the percentage of ``max_unique_value_total`` divided by the total number of rows in the DataFrame, providing an idea of how dominant the most frequent value is. + +This analysis helps in identifying columns with a high proportion of dominant values, like ``<=50K`` in the ``income`` column, which appears ``24,720`` times, making up ``50.61%`` of the entries. This insight can be useful for understanding data distributions, identifying potential data imbalances, or even spotting opportunities for feature engineering in further data processing steps. + +Generating Summary Tables for Variable Combinations +----------------------------------------------------- + +**This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.** + + +.. function:: summarize_all_combinations(df, variables, data_path, data_name, min_length=2) + + :param df: The pandas DataFrame containing the data. + :type df: pandas.DataFrame + :param variables: List of column names from the DataFrame to generate combinations. + :type variables: list of str + :param data_path: Path where the output Excel file will be saved. + :type data_path: str + :param data_name: Name of the output Excel file. + :type data_name: str + :param min_length: Minimum size of the combinations to generate. Defaults to ``2``. + :type min_length: int, optional + + :returns: A tuple containing a dictionary of summary tables and a list of all generated combinations. + :rtype: tuple(dict, list) + +.. note:: + - The function will create an Excel file with a sheet for each combination + of the specified variables, as well as a "Table of Contents" sheet with + hyperlinks to each summary table. + - The sheet names are limited to 31 characters due to Excel's constraints. + +The function returns two outputs: + +1. ``summary_tables``: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values. + +2. ``all_combinations``: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables. + +**Example Usage** + +Below, we use the ``summarize_all_combinations`` function to generate summary tables for the specified +variables from a DataFrame containing the census data [1]_. + +.. code-block:: python + + from eda_toolkit import summarize_all_combinations + + # Define unique variables for the analysis + unique_vars = [ + "age_group", + "workclass", + "education", + "occupation", + "race", + "sex", + "income", + ] + + # Generate summary tables for all combinations of the specified variables + summary_tables, all_combinations = summarize_all_combinations( + df=df, + data_path=data_output, + variables=unique_vars, + data_name="census_summary_tables.xlsx", + ) + + # Print all combinations of variables + print(all_combinations) + +**Output** + +.. code-blocK:: python + + [('age_group', 'workclass'), + ('age_group', 'education'), + ('age_group', 'occupation'), + ('age_group', 'race'), + ('age_group', 'sex'), + ('age_group', 'income'), + ('workclass', 'education'), + ('workclass', 'occupation'), + ('workclass', 'race'), + ('workclass', 'sex'), + ('workclass', 'income'), + ('education', 'occupation'), + ('education', 'race'), + ('education', 'sex'), + ('education', 'income'), + ('occupation', 'race'), + ('occupation', 'sex'), + ('occupation', 'income'), + ('race', 'sex'), + ('race', 'income'), + ('sex', 'income'), + ('age_group', 'workclass', 'education'), + ('age_group', 'workclass', 'occupation'), + ('age_group', 'workclass', 'race'), + ('age_group', 'workclass', 'sex'), + ('age_group', 'workclass', 'income'), + ('age_group', 'education', 'occupation'), + ('age_group', 'education', 'race'), + ('age_group', 'education', 'sex'), + ('age_group', 'education', 'income'), + ('age_group', 'occupation', 'race'), + ('age_group', 'occupation', 'sex'), + ('age_group', 'occupation', 'income'), + ('age_group', 'race', 'sex'), + ('age_group', 'race', 'income'), + ('age_group', 'sex', 'income'), + ('workclass', 'education', 'occupation'), + ('workclass', 'education', 'race'), + ('workclass', 'education', 'sex'), + ('workclass', 'education', 'income'), + ('workclass', 'occupation', 'race'), + ('workclass', 'occupation', 'sex'), + ('workclass', 'occupation', 'income'), + ('workclass', 'race', 'sex'), + ('workclass', 'race', 'income'), + ('workclass', 'sex', 'income'), + ('education', 'occupation', 'race'), + ('education', 'occupation', 'sex'), + ('education', 'occupation', 'income'), + ('education', 'race', 'sex'), + ('education', 'race', 'income'), + ('education', 'sex', 'income'), + ('occupation', 'race', 'sex'), + ('occupation', 'race', 'income'), + ('occupation', 'sex', 'income'), + ('race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation'), + ('age_group', 'workclass', 'education', 'race'), + ('age_group', 'workclass', 'education', 'sex'), + ('age_group', 'workclass', 'education', 'income'), + ('age_group', 'workclass', 'occupation', 'race'), + ('age_group', 'workclass', 'occupation', 'sex'), + ('age_group', 'workclass', 'occupation', 'income'), + ('age_group', 'workclass', 'race', 'sex'), + ('age_group', 'workclass', 'race', 'income'), + ('age_group', 'workclass', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race'), + ('age_group', 'education', 'occupation', 'sex'), + ('age_group', 'education', 'occupation', 'income'), + ('age_group', 'education', 'race', 'sex'), + ('age_group', 'education', 'race', 'income'), + ('age_group', 'education', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex'), + ('age_group', 'occupation', 'race', 'income'), + ('age_group', 'occupation', 'sex', 'income'), + ('age_group', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race'), + ('workclass', 'education', 'occupation', 'sex'), + ('workclass', 'education', 'occupation', 'income'), + ('workclass', 'education', 'race', 'sex'), + ('workclass', 'education', 'race', 'income'), + ('workclass', 'education', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex'), + ('workclass', 'occupation', 'race', 'income'), + ('workclass', 'occupation', 'sex', 'income'), + ('workclass', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex'), + ('education', 'occupation', 'race', 'income'), + ('education', 'occupation', 'sex', 'income'), + ('education', 'race', 'sex', 'income'), + ('occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race'), + ('age_group', 'workclass', 'education', 'occupation', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'race', 'income'), + ('age_group', 'workclass', 'education', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'education', 'occupation', 'race', 'income'), + ('age_group', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'education', 'race', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex'), + ('workclass', 'education', 'occupation', 'race', 'income'), + ('workclass', 'education', 'occupation', 'sex', 'income'), + ('workclass', 'education', 'race', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex', 'income'), + ('age_group', + 'workclass', + 'education', + 'occupation', + 'race', + 'sex', + 'income')] + + +When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table. + +.. raw:: html + +
+ +.. image:: ../assets/summarize_combos.gif + :alt: EDA Toolkit Logo + :align: left + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Saving DataFrames to Excel with Customized Formatting +------------------------------------------------------- +**Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.** + + +This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the ``save_dataframes_to_excel`` function. + + +.. function:: save_dataframes_to_excel(file_path, df_dict, decimal_places=0) + + :param file_path: Full path to the output Excel file. + :type file_path: str + :param df_dict: Dictionary where keys are sheet names and values are DataFrames to save. + :type df_dict: dict + :param decimal_places: Number of decimal places to round numeric columns. Default is 0. + :type decimal_places: int + +.. note:: + - The function will autofit columns and left-align text. + - Numeric columns will be formatted with the specified number of decimal places. + - Headers will be bold and left-aligned without borders. + +The function performs the following tasks: + +- Writes each DataFrame to its respective sheet in the Excel file. +- Rounds numeric columns to the specified number of decimal places. +- Applies customized formatting to headers and cells. +- Autofits columns based on the content length. + +**Example Usage** + +Below, we use the ``save_dataframes_to_excel`` function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between `18` and `40`. + +.. code-block:: python + + from eda_toolkit import save_dataframes_to_excel + + # Example usage + file_name = "df_census.xlsx" # Name of the output Excel file + file_path = os.path.join(data_path, file_name) + + # filter DataFrame to Ages 18-40 + filtered_df = df[(df["age"] > 18) & (df["age"] < 40)] + + df_dict = { + "original_df": df, + "ages_18_to_40": filtered_df, + } + + save_dataframes_to_excel( + file_path=file_path, + df_dict=df_dict, + decimal_places=0, + ) + + +**Output** + +The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between `18` and `40`, each on separate sheets with customized formatting. + + +Creating Contingency Tables +---------------------------- + +**Create a contingency table from one or more columns in a DataFrame, with sorting options.** + +This section explains how to create contingency tables from one or more columns in a DataFrame, with options to sort the results using the ``contingency_table`` function. + +.. function:: contingency_table(df, cols=None, sort_by=0) + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param cols: Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column. + :type cols: str or list of str, optional + :param sort_by: Enter ``0`` to sort results by column groups; enter ``1`` to sort results by totals in descending order. Defaults to ``0``. + :type sort_by: int, optional + :raises ValueError: If no columns are specified or if ``sort_by`` is not ``0`` or ``1``. + :returns: A DataFrame containing the contingency table with the specified columns, a ``'Total'`` column representing the count of occurrences, and a ``'Percentage'`` column representing the percentage of the total count. + :rtype: pandas.DataFrame + +**Example Usage** + +Below, we use the ``contingency_table`` function to create a contingency table +from the specified columns in a DataFrame containing census data [1]_ + +.. code-block:: python + + from eda_toolkit import contingency_table + + # Example usage + contingency_table( + df=df, + cols=[ + "age_group", + "workclass", + "race", + "sex", + ], + sort_by=1, + ) + +**Output** + +The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the ``'Total'`` column in descending order because ``sort_by`` +is set to ``1``. + + +.. code-block:: python + + + age_group workclass race sex Total Percentage + 0 30-39 Private White Male 5856 11.99 + 1 18-29 Private White Male 5623 11.51 + 2 40-49 Private White Male 4267 8.74 + 3 18-29 Private White Female 3680 7.53 + 4 50-59 Private White Male 2565 5.25 + .. ... ... ... ... ... ... + 467 50-59 Federal-gov Other Male 1 0.00 + 468 50-59 Local-gov Asian-Pac-Islander Female 1 0.00 + 469 70-79 Self-emp-inc Black Male 1 0.00 + 470 80-89 Local-gov Asian-Pac-Islander Male 1 0.00 + 471 48842 100.00 + + [472 rows x 6 columns] + + +\ + +Highlighting Specific Columns in a DataFrame +--------------------------------------------- + +This section explains how to highlight specific columns in a DataFrame using the ``highlight_columns`` function. + +**Highlight specific columns in a DataFrame with a specified background color.** + +.. function:: highlight_columns(df, columns, color="yellow") + + :param df: The DataFrame to be styled. + :type df: pandas.DataFrame + :param columns: List of column names to be highlighted. + :type columns: list of str + :param color: The background color to be applied for highlighting (default is `"yellow"`). + :type color: str, optional + + :returns: A Styler object with the specified columns highlighted. + :rtype: pandas.io.formats.style.Styler + +**Example Usage** + +Below, we use the ``highlight_columns`` function to highlight the ``age`` and ``education`` +columns in the first 5 rows of the census [1]_ DataFrame with a pink background color. + +.. code-block:: python + + from eda_toolkit import highlight_columns + + # Applying the highlight function + highlighted_df = highlight_columns( + df=df, + columns=["age", "education"], + color="#F8C5C8", + ) + + highlighted_df + +**Output** + +The output will be a DataFrame with the specified columns highlighted in the given background color. +The ``age`` and ``education`` columns will be highlighted in pink. + +The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the ``.render()`` method of the Styler object. + + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+ +\ + +Binning Numerical Columns +--------------------------- + +Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or "bins." This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or "bins," and +then assigning each value to one of these intervals. + +.. note:: + + The code snippets below create age bins and assign a corresponding age group + label to each age in the DataFrame. The ``pd.cut`` function from pandas is used to + categorize the ages and assign them to a new column, ``age_group``. Adjust the bins + and labels as needed for your specific data. + + +Below, we use the ``age`` column of the census data [1]_ from the UCI Machine Learning Repository as an example: + +1. **Bins Definition**: + The bins are defined by specifying the boundaries of each interval. For example, + in the code snippet below, the ``bin_ages`` list specifies the boundaries for age groups: + + .. code-block:: python + + bin_ages = [ + 0, + 18, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + float("inf"), + ] + + + Each pair of consecutive elements in ``bin_ages`` defines a bin. For example: + + - The first bin is ``[0, 18)``, + - The second bin is ``[18, 30)``, + - and so on. + +\ + +2. **Labels for Bins**: + The `label_ages` list provides labels corresponding to each bin: + + .. code-block:: python + + label_ages = [ + "< 18", + "18-29", + "30-39", + "40-49", + "50-59", + "60-69", + "70-79", + "80-89", + "90-99", + "100 +", + ] + + These labels are used to categorize the numerical values into meaningful groups. + +3. **Applying the Binning**: + The `pd.cut `_ function + from Pandas is used to apply the binning process. For each value in the ``age`` + column of the DataFrame, it assigns a corresponding label based on which bin the + value falls into. Here, ``right=False`` indicates that each bin includes the + left endpoint but excludes the right endpoint. For example, if ``bin_ages = + [0, 10, 20, 30]``, then a value of ``10`` will fall into the bin ``[10, 20)`` and + be labeled accordingly. + + .. code-block:: python + + df["age_group"] = pd.cut( + df["age"], + bins=bin_ages, + labels=label_ages, + right=False, + ) + + **Mathematically**, for a given value `x` in the ``age`` column: + + .. math:: + + \text{age_group} = + \begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 + \end{cases} + + The parameter ``right=False`` in ``pd.cut`` means that the bins are left-inclusive + and right-exclusive, except for the last bin, which is always right-inclusive + when the upper bound is infinity (``float("inf")``). + + +.. [1] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + diff --git a/_build/html/v0.0.11/_sources/eda_plots.rst.txt b/_build/html/v0.0.11/_sources/eda_plots.rst.txt new file mode 100644 index 000000000..a4741f127 --- /dev/null +++ b/_build/html/v0.0.11/_sources/eda_plots.rst.txt @@ -0,0 +1,2665 @@ +.. _eda_plots: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Plotting and Theoretical Overview +======================================= + +Gaussian Assumption for Normality +---------------------------------- + +The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF): + +.. math:: + + f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) + +where: + +- :math:`\mu` is the mean +- :math:`\sigma^2` is the variance + +In a normally distributed dataset: + +- 68% of data falls within :math:`\mu \pm \sigma` +- 95% within :math:`\mu \pm 2\sigma` +- 99.7% within :math:`\mu \pm 3\sigma` + +.. raw:: html + +
+ +.. image:: ../assets/normal_distribution.png + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histograms and Kernel Density Estimation (KDE) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Histograms**: + +- Visualize data distribution by binning values and counting frequencies. +- If data is Gaussian, the histogram approximates a bell curve. + +**KDE**: + +- A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function. +- The KDE for a dataset :math:`X = \{x_1, x_2, \ldots, x_n\}` is given by: + +.. math:: + + \hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right) + +where: + +- :math:`K` is the kernel function (often Gaussian) +- :math:`h` is the bandwidth (smoothing parameter) + +.. raw:: html + + Combined Use of Histograms and KDE + +\ + +- **Histograms** offer a discrete, binned view of the data. +- **KDE** provides a smooth, continuous estimate of the underlying distribution. +- Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality. + + +Pearson Correlation Coefficient +-------------------------------- + +The Pearson correlation coefficient, often denoted as :math:`r`, is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from :math:`-1` to :math:`1`, where: + +- :math:`r = 1` indicates a perfect positive linear relationship. +- :math:`r = -1` indicates a perfect negative linear relationship. +- :math:`r = 0` indicates no linear relationship. + +The Pearson correlation coefficient between two variables :math:`X` and :math:`Y` is defined as: + +.. math:: + + r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} + +where: + +- :math:`\text{Cov}(X, Y)` is the covariance of :math:`X` and :math:`Y`. +- :math:`\sigma_X` is the standard deviation of :math:`X`. +- :math:`\sigma_Y` is the standard deviation of :math:`Y`. + +Covariance measures how much two variables change together. It is defined as: + +.. math:: + + \text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y) + +where: + +- :math:`n` is the number of data points. +- :math:`X_i` and :math:`Y_i` are the individual data points. +- :math:`\mu_X` and :math:`\mu_Y` are the means of :math:`X` and :math:`Y`. + +The standard deviation measures the dispersion or spread of a set of values. For +a variable :math:`X`, the standard deviation :math:`\sigma_X` is: + +.. math:: + + \sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2} + +Substituting the covariance and standard deviation into the Pearson correlation formula: + +.. math:: + + r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}} + +This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between :math:`X` and :math:`Y`. + +- :math:`r > 0`: Positive correlation. As :math:`X` increases, :math:`Y` tends to increase. +- :math:`r < 0`: Negative correlation. As :math:`X` increases, :math:`Y` tends to decrease. +- :math:`r = 0`: No linear correlation. There is no consistent linear relationship between :math:`X` and :math:`Y`. + +The closer the value of :math:`r` is to :math:`\pm 1`, the stronger the linear relationship between the two variables. + + +Partial Dependence Foundations +-------------------------------- + +Let :math:`\mathbf{X}` represent the complete set of input features for a machine +learning model, where :math:`\mathbf{X} = \{X_1, X_2, \dots, X_p\}`. Suppose we're +particularly interested in a subset of these features, denoted by :math:`\mathbf{X}_S`. +The complementary set, :math:`\mathbf{X}_C`, contains all the features in :math:`\mathbf{X}` +that are not in :math:`\mathbf{X}_S`. Mathematically, this relationship is expressed as: + +.. math:: + + \mathbf{X}_C = \mathbf{X} \setminus \mathbf{X}_S + +where :math:`\mathbf{X}_C` is the set of features in :math:`\mathbf{X}` after +removing the features in :math:`\mathbf{X}_S`. + +Partial Dependence Plots (PDPs) are used to illustrate the effect of the features +in :math:`\mathbf{X}_S` on the model's predictions, while averaging out the +influence of the features in :math:`\mathbf{X}_C`. This is mathematically defined as: + +.. math:: + \begin{align*} + \text{PD}_{\mathbf{X}_S}(x_S) &= \mathbb{E}_{\mathbf{X}_C} \left[ f(x_S, \mathbf{X}_C) \right] \\ + &= \int f(x_S, x_C) \, p(x_C) \, dx_C \\ + &= \int \left( \int f(x_S, x_C) \, p(x_C \mid x_S) \, dx_C \right) p(x_S) \, dx_S + \end{align*} + + +where: + +- :math:`\mathbb{E}_{\mathbf{X}_C} \left[ \cdot \right]` indicates that we are taking the expected value over the possible values of the features in the set :math:`\mathbf{X}_C`. +- :math:`p(x_C)` represents the probability density function of the features in :math:`\mathbf{X}_C`. + +This operation effectively summarizes the model's output over all potential values of the complementary features, providing a clear view of how the features in :math:`\mathbf{X}_S` alone impact the model's predictions. + + +**2D Partial Dependence Plots** + +Consider a trained machine learning model `2D Partial Dependence Plots`_ :math:`f(\mathbf{X})`, where :math:`\mathbf{X} = (X_1, X_2, \dots, X_p)` represents the vector of input features. The partial dependence of the predicted response :math:`\hat{y}` on a single feature :math:`X_j` is defined as: + +.. math:: + + \text{PD}(X_j) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, \mathbf{X}_{C_i}) + +where: + +- :math:`X_j` is the feature of interest. +- :math:`\mathbf{X}_{C_i}` represents the complement set of :math:`X_j`, meaning the remaining features in :math:`\mathbf{X}` not included in :math:`X_j` for the :math:`i`-th instance. +- :math:`n` is the number of observations in the dataset. + +For two features, :math:`X_j` and :math:`X_k`, the partial dependence is given by: + +.. math:: + + \text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i}) + +This results in a 2D surface plot (or contour plot) that shows how the predicted outcome changes as the values of :math:`X_j` and :math:`X_k` vary, while the effects of the other features are averaged out. + +- **Single Feature PDP:** When plotting :math:`\text{PD}(X_j)`, the result is a 2D line plot showing the marginal effect of feature :math:`X_j` on the predicted outcome, averaged over all possible values of the other features. +- **Two Features PDP:** When plotting :math:`\text{PD}(X_j, X_k)`, the result is a 3D surface plot (or a contour plot) that shows the combined marginal effect of :math:`X_j` and :math:`X_k` on the predicted outcome. The surface represents the expected value of the prediction as :math:`X_j` and :math:`X_k` vary, while all other features are averaged out. + + +**3D Partial Dependence Plots** + +For a more comprehensive analysis, especially when exploring interactions between two features, `3D Partial Dependence Plots`_ are invaluable. The partial dependence function for two features in a 3D context is: + +.. math:: + + \text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i}) + +Here, the function :math:`f(X_j, X_k, \mathbf{X}_{C_i})` is evaluated across a grid of values for :math:`X_j` and :math:`X_k`. The resulting 3D surface plot represents how the model's prediction changes over the joint range of these two features. + +The 3D plot offers a more intuitive visualization of feature interactions compared to 2D contour plots, allowing for a better understanding of the combined effects of features on the model's predictions. The surface plot is particularly useful when you need to capture complex relationships that might not be apparent in 2D. + +- **Feature Interaction Visualization:** The 3D PDP provides a comprehensive view of the interaction between two features. The resulting surface plot allows for the visualization of how the model’s output changes when the values of two features are varied simultaneously, making it easier to understand complex interactions. +- **Enhanced Interpretation:** 3D PDPs offer enhanced interpretability in scenarios where feature interactions are not linear or where the effect of one feature depends on the value of another. The 3D visualization makes these dependencies more apparent. + + +KDE and Histogram Distribution Plots +======================================= + +.. raw:: html + + + +KDE Distribution Function +----------------------------- + +**Generate KDE or histogram distribution plots for specified columns in a DataFrame.** + +The ``kde_distributions`` function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2]_ for plotting, which is built on top of +matplotlib [3]_ and provides a high-level interface for drawing attractive and informative +statistical graphics. + + +**Key Features and Parameters** + +- **Flexible Plotting**: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively. +- **Leverages Seaborn Library**: The function is built on the `seaborn` library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code. +- **Customization**: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs. +- **Scientific Notation Control**: The function allows disabling scientific notation on the axes, providing better readability for certain types of data. +- **Log Scaling**: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude. +- **Output Options**: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations. + +.. function:: kde_distributions(df, vars_of_interest=None, figsize=(5, 5), grid_figsize=None, hist_color="#0000FF", kde_color="#FF0000", mean_color="#000000", median_color="#000000", hist_edgecolor="#000000", hue=None, fill=True, fill_alpha=1, n_rows=None, n_cols=None, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_filename=None, y_axis_label="Density", plot_type="both", log_scale_vars=None, bins="auto", binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat="density", xlim=None, ylim=None, plot_mean=False, plot_median=False, std_dev_levels=None, std_color="#808080", label_names=None, show_legend=True, **kwargs) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param vars_of_interest: List of column names for which to generate distribution plots. If 'all', plots will be generated for all numeric columns. + :type vars_of_interest: list of str, optional + :param figsize: Size of each individual plot, default is ``(5, 5)``. Used when only one plot is being generated or when saving individual plots. + :type figsize: tuple of int, optional + :param grid_figsize: Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on ``figsize``, ``n_rows``, and ``n_cols``. + :type grid_figsize: tuple of int, optional + :param hist_color: Color of the histogram bars, default is ``'#0000FF'``. + :type hist_color: str, optional + :param kde_color: Color of the KDE plot, default is ``'#FF0000'``. + :type kde_color: str, optional + :param mean_color: Color of the mean line if ``plot_mean`` is True, default is ``'#000000'``. + :type mean_color: str, optional + :param median_color: Color of the median line if ``plot_median`` is True, default is ``'#000000'``. + :type median_color: str, optional + :param hist_edgecolor: Color of the histogram bar edges, default is ``'#000000'``. + :type hist_edgecolor: str, optional + :param hue: Column name to group data by, adding different colors for each group. + :type hue: str, optional + :param fill: Whether to fill the histogram bars with color, default is ``True``. + :type fill: bool, optional + :param fill_alpha: Alpha transparency for the fill color of the histogram bars, where ``0`` is fully transparent and ``1`` is fully opaque. Default is ``1``. + :type fill_alpha: float, optional + :param n_rows: Number of rows in the subplot grid. If not provided, it will be calculated automatically. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid. If not provided, it will be calculated automatically. + :type n_cols: int, optional + :param w_pad: Width padding between subplots, default is ``1.0``. + :type w_pad: float, optional + :param h_pad: Height padding between subplots, default is ``1.0``. + :type h_pad: float, optional + :param image_path_png: Directory path to save the PNG image of the overall distribution plots. + :type image_path_png: str, optional + :param image_path_svg: Directory path to save the SVG image of the overall distribution plots. + :type image_path_svg: str, optional + :param image_filename: Filename to use when saving the overall distribution plots. + :type image_filename: str, optional + :param bbox_inches: Bounding box to use when saving the figure. For example, ``'tight'``. + :type bbox_inches: str, optional + :param single_var_image_filename: Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses ``figsize`` for determining the plot size, ignoring ``grid_figsize``. + :type single_var_image_filename: str, optional + :param y_axis_label: The label to display on the ``y-axis``, default is ``'Density'``. + :type y_axis_label: str, optional + :param plot_type: The type of plot to generate, options are ``'hist'``, ``'kde'``, or ``'both'``. Default is ``'both'``. + :type plot_type: str, optional + :param log_scale_vars: Variable name(s) to apply log scaling. Can be a single string or a list of strings. + :type log_scale_vars: str or list of str, optional + :param bins: Specification of histogram bins, default is ``'auto'``. + :type bins: int or sequence, optional + :param binwidth: Width of each bin, overrides bins but can be used with binrange. + :type binwidth: float, optional + :param label_fontsize: Font size for axis labels, including xlabel, ylabel, and tick marks, default is ``10``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: Maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param disable_sci_notation: Toggle to disable scientific notation on axes, default is ``False``. + :type disable_sci_notation: bool, optional + :param stat: Aggregate statistic to compute in each bin (e.g., ``'count'``, ``'frequency'``, ``'probability'``, ``'percent'``, ``'density'``), default is ``'density'``. + :type stat: str, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (``min``, ``max``). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (``min``, ``max``). + :type ylim: tuple or list, optional + :param plot_mean: Whether to plot the mean as a vertical line, default is ``False``. + :type plot_mean: bool, optional + :param plot_median: Whether to plot the median as a vertical line, default is ``False``. + :type plot_median: bool, optional + :param std_dev_levels: Levels of standard deviation to plot around the mean. + :type std_dev_levels: list of int, optional + :param std_color: Color(s) for the standard deviation lines, default is ``'#808080'``. + :type std_color: str or list of str, optional + :param label_names: Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display. + :type label_names: dict, optional + :param show_legend: Whether to show the legend on the plots, default is ``True``. + :type show_legend: bool, optional + :param kwargs: Additional keyword arguments passed to the Seaborn plotting function. + :type kwargs: additional keyword arguments + + :raises ValueError: + - If ``plot_type`` is not one of ``'hist'``, ``'kde'``, or ``'both'``. + - If ``stat`` is not one of ``'count'``, ``'density'``, ``'frequency'``, ``'probability'``, ``'proportion'``, ``'percent'``. + - If ``log_scale_vars`` contains variables that are not present in the DataFrame. + - If ``fill`` is set to ``False`` and ``hist_edgecolor`` is not the default. + - If ``grid_figsize`` is provided when only one plot is being created. + + :raises UserWarning: + - If both ``bins`` and ``binwidth`` are specified, which may affect performance. + + :returns: ``None`` + + +\ + +.. raw:: html + +
+ + + +KDE and Histograms Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the below example, the ``kde_distributions`` function is used to generate +histograms for several variables of interest: ``"age"``, ``"education-num"``, and +``"hours-per-week"``. These variables represent different demographic and +financial attributes from the dataset. The ``plot_type="both"`` parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data's probability density. + +The visualizations are arranged in a single row of four columns, as specified +by ``n_rows=1`` and ``n_cols=3``, respectively. The overall size of the grid +figure is set to `14 inches` wide and `4 inches tall` (``grid_figsize=(14, 4)``), +while each individual plot is configured to be `4 inches` by `4 inches` +(``single_figsize=(4, 4)``). The ``fill=True`` parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +``w_pad=1`` and ``h_pad=1``, which add `1 inch` of padding both horizontally and +vertically. + +.. note:: + If you do not set ``n_rows`` or ``n_cols`` to any values, the function will + automatically calculate and create a grid based on the number of variables being + plotted, ensuring an optimal arrangement of the plots. + +To handle longer titles, the ``text_wrap=50`` parameter ensures that the title +text wraps to a new line after `50 characters`. The ``bbox_inches="tight"`` setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in ``vars_of_interest`` are +passed directly to the function for visualization. + +Each plot is saved individually with filenames that are prefixed by +``"kde_density_single_distribution"``, followed by the variable name. The ```y-axis``` +for all plots is labeled as "Density" (``y_axis_label="Density"``), reflecting that +the height of the bars or KDE line represents the data's density. The histograms +are divided into `10 bins` (``bins=10``), offering a clear view of the distribution +of each variable. + +Additionally, the font sizes for the axis labels and tick labels +are set to `16 points` (``label_fontsize=16``) and `14 points` (``tick_fontsize=14``), +respectively, ensuring that all text within the plots is legible and well-formatted. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + fill=True, + fill_alpha=0.60, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="both", # Can also just plot KDE by itself by passing "kde" + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + +.. raw:: html + +
+ +.. image:: ../assets/kde_density_distributions.svg + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Density) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is used to generate histograms for +the variables ``"age"``, ``"education-num"``, and ``"hours-per-week"`` but with +``plot_type="hist"``, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (``n_rows=1, n_cols=3``), +with a grid size of `14x4 inches` (``grid_figsize=(14, 4)``). The histograms are +divided into `10 bins` (``bins=10``), and the ``y-axis`` is labeled "Density" (``y_axis_label="Density"``). +Font sizes for the axis labels and tick labels are set to `16` and `14` points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + fill=True, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/hist_density_distributions.svg + :alt: KDE Distributions - Histograms (Density) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Count) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is modified to generate histograms +with a few key changes. The ``hist_color`` is set to `"orange"`, changing the color of the +histogram bars. The ``y-axis`` label is updated to "Count" (``y_axis_label="Count"``), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to ``"Count"`` to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (``n_rows=1, n_cols=3``), +a grid size of `14x4 inches`, and a bin count of `10`. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + text_wrap=50, + hist_color="orange", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Count", + bins=10, + plot_type="hist", + stat="Count", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + +.. raw:: html + +
+ +.. image:: ../assets/count_hist_distributions.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Histogram Example - (Mean and Median) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is customized to generate +histograms that include mean and median lines. The ``mean_color`` is set to ``"blue"`` +and the ``median_color`` is set to ``"black"``, allowing for a clear distinction +between the two statistical measures. The function parameters are adjusted to +ensure that both the mean and median lines are plotted ``(plot_mean=True, plot_median=True)``. +The ``y_axis_label`` remains ``"Density"``, indicating that the histograms +represent the density of observations within each bin. The histogram bars are +colored using ``hist_color="brown"``, with a ``fill_alpha=0.60`` while the s +tatistical overlays enhance the interpretability of the data. The layout is +configured with a single row and multiple columns ``(n_rows=1, n_cols=3)``, and +the grid size is set to `15x5 inches`. This example highlights how to visualize +central tendencies within the data using a histogram that prominently displays +the mean and median. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + text_wrap=50, + hist_color="brown", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + fill_alpha=0.60, + plot_type="hist", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + plot_mean=True, + plot_median=True, + mean_color="blue", + ) + +.. raw:: html + +
+ +.. image:: ../assets/density_hist_dist_mean_median.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Histogram Example - (Mean, Median, and Std. Deviation) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is customized to generate +a histogram that include mean, median, and 3 standard deviation lines. The +``mean_color`` is set to ``"blue"`` and the median_color is set to ``"black"``, +allowing for a clear distinction between these two central tendency measures. +The function parameters are adjusted to ensure that both the mean and median lines +are plotted ``(plot_mean=True, plot_median=True)``. The ``y_axis_label`` remains +``"Density"``, indicating that the histograms represent the density of observations +within each bin. The histogram bars are colored using ``hist_color="brown"``, +with a ``fill_alpha=0.40``, which adjusts the transparency of the fill color. +Additionally, standard deviation bands are plotted using colors ``"purple"``, +``"green"``, and ``"silver"`` for one, two, and three standard deviations, respectively. + +The layout is configured with a single row and multiple columns ``(n_rows=1, n_cols=3)``, +and the grid size is set to `15x5 inches`. This setup is particularly useful for +visualizing the central tendencies within the data while also providing a clear +view of the distribution and spread through the standard deviation bands. The +configuration used in this example showcases how histograms can be enhanced with +statistical overlays to provide deeper insights into the data. + +.. note:: + + You have the freedom to choose whether to plot the mean, median, and + standard deviation lines. You can display one, none, or all of these simultaneously. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + ] + + kde_distributions( + df=df, + figsize=(10, 6), + text_wrap=50, + hist_color="brown", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + fill_alpha=0.40, + plot_type="both", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + plot_mean=True, + plot_median=True, + mean_color="blue", + image_path_svg=image_path_svg, + image_path_png=image_path_png, + std_dev_levels=[ + 1, + 2, + 3, + ], + std_color=[ + "purple", + "green", + "silver", + ], + ) + +.. raw:: html + +
+ +.. image:: ../assets/density_hist_dist_age.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Stacked Crosstab Plots +======================= + +**Generates stacked bar plots and crosstabs for specified columns in a DataFrame.** + +The ``stacked_crosstab_plot`` function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats. + +The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis. + +.. function:: stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind="bar", width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output="both", return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type="both", show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False) + + Generates stacked or regular bar plots and crosstabs for specified columns. + + This function allows users to create stacked bar plots (or regular bar plots + if stacks are removed) and corresponding crosstabs for specific columns + in a DataFrame. It provides options to customize the appearance, including + font sizes for axis labels, tick labels, and title text wrapping, and to + choose between regular or normalized plots. + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param col: The name of the column in the DataFrame to be analyzed. + :type col: str + :param func_col: List of ground truth columns to be analyzed. + :type func_col: list + :param legend_labels_list: List of legend labels for each ground truth column. + :type legend_labels_list: list + :param title: List of titles for the plots. + :type title: list + :param kind: The kind of plot to generate (``'bar'`` or ``'barh'`` for horizontal bars), default is ``'bar'``. + :type kind: str, optional + :param width: The width of the bars in the bar plot, default is ``0.9``. + :type width: float, optional + :param rot: The rotation angle of the ``x-axis`` labels, default is ``0``. + :type rot: int, optional + :param custom_order: Specifies a custom order for the categories in the ``col``. + :type custom_order: list, optional + :param image_path_png: Directory path where generated PNG plot images will be saved. + :type image_path_png: str, optional + :param image_path_svg: Directory path where generated SVG plot images will be saved. + :type image_path_svg: str, optional + :param save_formats: List of file formats to save the plot images in. Valid formats are ``'png'`` and ``'svg'``. If not provided, defaults to an empty list and no images will be saved. + :type save_formats: list, optional + :param color: List of colors to use for the plots. If not provided, a default color scheme is used. + :type color: list, optional + :param output: Specify the output type: ``"plots_only"``, ``"crosstabs_only"``, or ``"both"``. Default is ``"both"``. + :type output: str, optional + :param return_dict: Specify whether to return the crosstabs dictionary, default is ``False``. + :type return_dict: bool, optional + :param x: The width of the figure. + :type x: int, optional + :param y: The height of the figure. + :type y: int, optional + :param p: The padding between the subplots. + :type p: int, optional + :param file_prefix: Prefix for the filename when output includes plots. + :type file_prefix: str, optional + :param logscale: Apply log scale to the ``y-axis``, default is ``False``. + :type logscale: bool, optional + :param plot_type: Specify the type of plot to generate: ``"both"``, ``"regular"``, ``"normalized"``. Default is ``"both"``. + :type plot_type: str, optional + :param show_legend: Specify whether to show the legend, default is ``True``. + :type show_legend: bool, optional + :param label_fontsize: Font size for axis labels, default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param remove_stacks: If ``True``, removes stacks and creates a regular bar plot using only the ``col`` parameter. Only works when ``plot_type`` is set to ``'regular'``. Default is ``False``. + :type remove_stacks: bool, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``output`` is not one of ``"both"``, ``"plots_only"``, or ``"crosstabs_only"``. + - If ``plot_type`` is not one of ``"both"``, ``"regular"``, ``"normalized"``. + - If ``remove_stacks`` is set to True and ``plot_type`` is not ``"regular"``. + - If the lengths of ``title``, ``func_col``, and ``legend_labels_list`` are not equal. + :raises KeyError: If any columns specified in ``col`` or ``func_col`` are missing in the DataFrame. + + :returns: Dictionary of crosstabs DataFrames if ``return_dict`` is ``True``. Otherwise, returns ``None``. + :rtype: ``dict`` or ``None`` + + +Stacked Bar Plots With Crosstabs Example +----------------------------------------- + +The provided code snippet demonstrates how to use the ``stacked_crosstab_plot`` +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here's a detailed breakdown of the code using the census +dataset as an example [1]_. + +First, the ``func_col`` list is defined, specifying the columns ``["sex", "income"]`` +to be analyzed. These columns will be used in the loop to generate separate plots. +The ``legend_labels_list`` is then defined, with each entry corresponding to a +column in ``func_col``. In this case, the labels for the ``sex`` column are +``["Male", "Female"]``, and for the ``income`` column, they are ``["<=50K", ">50K"]``. +These labels will be used to annotate the legends of the plots. + +Next, the ``title`` list is defined, providing titles for each plot corresponding +to the columns in ``func_col``. The titles are set to ``["Sex", "Income"]``, +which will be displayed on top of each respective plot. + +.. note:: + + The ``legend_labels_list`` parameter should be a list of lists, where each + inner list corresponds to the ground truth labels for the respective item in + the ``func_col`` list. Each element in the ``func_col`` list represents a + column in your DataFrame that you wish to analyze, and the corresponding + inner list in ``legend_labels_list`` should contain the labels that will be + used in the legend of your plots. + +For example: + +.. code-block:: python + + # Define the func_col to use in the loop in order of usage + func_col = ["sex", "income"] + + # Define the legend_labels to use in the loop + legend_labels_list = [ + ["Male", "Female"], # Corresponds to "sex" + ["<=50K", ">50K"], # Corresponds to "income" + ] + + # Define titles for the plots + title = [ + "Sex", + "Income", + ] + +.. important:: + + Ensure that the number of elements in ``func_col``, ``legend_labels_list``, + and ``title`` are the same. Each item in ``func_col`` must have a corresponding + list of labels in ``legend_labels_list`` and a title in ``title``. This + consistency is essential for the function to correctly generate the plots + with the appropriate labels and titles. + + +In this example: + +- ``func_col`` contains two elements: ``"sex"`` and ``"income"``. Each corresponds to a specific column in your DataFrame. +- ``legend_labels_list`` is a nested list containing two inner lists: + + - The first inner list, ``["Male", "Female"]``, corresponds to the ``"sex"`` column in ``func_col``. + - The second inner list, ``["<=50K", ">50K"]``, corresponds to the ``"income"`` column in ``func_col``. + +- ``title`` contains two elements: ``"Sex"`` and ``"Income"``, which will be used as the titles for the respective plots. + +.. note:: + + If you assign the function to a variable, the dictionary returned when + ``return_dict=True`` will be suppressed in the output. However, the dictionary + is still available within the assigned variable for further use. + + +.. code-block:: python + + from eda_toolkit import stacked_crosstab_plot + + # Call the stacked_crosstab_plot function + stacked_crosstabs = stacked_crosstab_plot( + df=df, + col="age_group", + func_col=func_col, + legend_labels_list=legend_labels_list, + title=title, + kind="bar", + width=0.8, + rot=0, # axis rotation angle + custom_order=None, + color=["#00BFC4", "#F8766D"], # default color schema + output="both", + return_dict=True, + x=14, + y=8, + p=10, + logscale=False, + plot_type="both", + show_legend=True, + label_fontsize=14, + tick_fontsize=12, + ) + +The above example generates stacked bar plots for ``"sex"`` and ``"income"`` +grouped by ``"education"``. The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export. + +.. important:: + + **Importance of Correctly Aligning Labels** + + It is crucial to properly align the elements in the ``legend_labels_list``, + ``title``, and ``func_col`` parameters when using the ``stacked_crosstab_plot`` + function. Each of these lists must be ordered consistently because the function + relies on their alignment to correctly assign labels and titles to the + corresponding plots and legends. + + **For instance, in the example above:** + + - The first element in ``func_col`` is ``"sex"``, and it is aligned with the first set of labels ``["Male", "Female"]`` in ``legend_labels_list`` and the first title ``"Sex"`` in the ``title`` list. + - Similarly, the second element in ``func_col``, ``"income"``, aligns with the labels ``["<=50K", ">50K"]`` and the title ``"Income"``. + + **Misalignment between these lists would result in incorrect labels or titles being + applied to the plots, potentially leading to confusion or misinterpretation of the data. + Therefore, it's important to ensure that each list is ordered appropriately and + consistently to accurately reflect the data being visualized.** + + **Proper Setup of Lists** + + When setting up the ``legend_labels_list``, ``title``, and ``func_col``, ensure + that each element in the lists corresponds to the correct variable in the DataFrame. + This involves: + + - **Ordering**: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted. + - **Consistency**: Double-checking that each label in ``legend_labels_list`` matches the categories present in the corresponding ``func_col``, and that the ``title`` accurately describes the plot. + + By adhering to these guidelines, you can ensure that the ``stacked_crosstab_plot`` + function produces accurate and meaningful visualizations that are easy to interpret and analyze. + +**Output** + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_sex.svg + :alt: KDE Distributions + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income.svg + :alt: Stacked Bar Plot Age vs. Income + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +.. note:: + + When you set ``return_dict=True``, you are able to see the crosstabs printed out + as shown below. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93
+ +\ + +When you set ``return_dict=True``, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example: + +.. code-block:: python + + crosstab_age_sex = crosstabs_dict["sex"] + crosstab_age_income = crosstabs_dict["income"] + + +Pivoted Stacked Bar Plots Example +----------------------------------- + +Using the census dataset [1]_, to create horizontal stacked bar plots, set the ``kind`` parameter to +``"barh"`` in the ``stacked_crosstab_plot function``. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the ``y-axis``. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_pivoted.svg + :alt: Stacked Bar Plot Age vs. Income (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Non-Normalized Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to create stacked bar plots without the normalized versions, +set the ``plot_type`` parameter to ``"regular"`` in the ``stacked_crosstab_plot`` +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the ``plot_type`` to ``"normalized"`` will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_regular.svg + :alt: Stacked Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Regular Non-Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the ``plot_type`` parameter to ``"regular"`` +in the ``stacked_crosstab_plot`` function and enable ``remove_stacks`` by setting +it to ``True``. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +``plot_type`` to ``"normalized"`` will display only the normalized plots. + +When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories. + +In the example below, the color of the bars has been set to a dark grey (``#333333``), +and the legend has been removed by setting ``show_legend=False``. This illustrates +regular bar plots for income by age, without stacking. + + +.. raw:: html + +
+ +.. image:: ../assets/Bar_Age_regular_income.svg + :alt: Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Box and Violin Plots +=========================== + +**Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.** + +The ``box_violin_plot`` function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories. + +With options to customize the plot type (``boxplot`` or ``violinplot``), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis. + +Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures. + +The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset. + +.. function:: box_violin_plot(df, metrics_list, metrics_comp, n_rows=None, n_cols=None, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type="boxplot", xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None, label_names=None, **kwargs) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param metrics_list: List of metric names (columns in df) to plot. + :type metrics_list: list of str + :param metrics_comp: List of comparison categories (columns in df). + :type metrics_comp: list of str + :param n_rows: Number of rows in the subplot grid. Calculated automatically if not provided. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid. Calculated automatically if not provided. + :type n_cols: int, optional + :param image_path_png: Optional directory path to save ``.png`` images. + :type image_path_png: str, optional + :param image_path_svg: Optional directory path to save ``.svg`` images. + :type image_path_svg: str, optional + :param save_plots: String, ``"all"``, ``"individual"``, or ``"grid"`` to control saving plots. + :type save_plots: str, optional + :param show_legend: Boolean, True if showing the legend in the plots. Default is ``True``. + :type show_legend: bool, optional + :param plot_type: Specify the type of plot, either ``"boxplot"`` or ``"violinplot"``. Default is ``"boxplot"``. + :type plot_type: str, optional + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + :param show_plot: Specify the plot display mode: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + :param rotate_plot: Boolean, True if rotating (pivoting) the plots. Default is ``False``. + :type rotate_plot: bool, optional + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (``min``, ``max``). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (``min``, ``max``). + :type ylim: tuple or list, optional + :param label_names: Dictionary mapping original column names to custom labels. Default is ``None``. + :type label_names: dict, optional + :param kwargs: Additional keyword arguments passed to the Seaborn plotting function. + :type kwargs: additional keyword arguments + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set without specifying ``image_path_png`` or ``image_path_svg``. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` is not a tuple or list of two numbers. + - If ``grid_figsize`` is provided and is not a tuple or list of two numbers. + + :returns: ``None`` + + + +This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels. + +Box Plots Grid Example +----------------------- + +In this example with the US census data [1]_, the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the ``"age_group"`` column in the +DataFrame. The ``metrics_comp`` parameter is set to [``"age_group"``], meaning +that the comparison will be based on different age groups. The ``metrics_list`` is +provided as ``age_boxplot_list``, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid formatThe ``image_path_png`` and +``image_path_svg`` parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to ``"all"``, ensuring that both +individual and grid plots are saved. + +The plots are displayed in a grid format, as indicated by the ``show_plot="grid"`` +parameter. The ``plot_type`` is set to ``"boxplot"``, so the function will generate +boxplots for each metric in the list. Additionally, the ```x-axis``` labels are rotated +by 90 degrees (``xlabel_rot=90``) to ensure that the labels are legible. The legend is +hidden by setting ``show_legend=False``, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication. + + +.. code-block:: python + + age_boxplot_list = df[ + [ + "education-num", + "hours-per-week", + ] + ].columns.to_list() + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_comp, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="boxplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_boxplot.png + :alt: Box Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Violin Plots Grid Example +-------------------------- + +In this example with the US census data [1]_, we keep everything the same as the prior example, but change the +``plot_type`` to ``violinplot``. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings. + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_comp=metrics_comp, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="violinplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot.png + :alt: Violin Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Pivoted Violin Plots Grid Example +------------------------------------ + +In this example with the US census data [1]_, we set ``xlabel_rot=0`` and ``rotate_plot=True`` +to pivot the plot, changing the orientation of the axes while keeping the ``x-axis`` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution. + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_comp, + show_plot="both", + rotate_plot=True, + show_legend=False, + plot_type="violinplot", + xlabel_rot=0, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot_pivoted.png + :alt: Violin Plot Comparisons (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots and Best Fit Lines +================================== + +Scatter Fit Plot +------------------ + +**Create and Save Scatter Plots or a Grid of Scatter Plots** + +This function, ``scatter_fit_plot``, is designed to generate scatter plots for +one or more pairs of variables (``x_vars`` and ``y_vars``) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view. + +**Optional Best Fit Line** + +An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s + +**Customizable Plot Aesthetics** + +The function offers a wide range of customization options to tailor the appearance +of the scatter plots: + +- **Point Color**: You can specify a default color for the scatter points or use a ``hue`` parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data. + +- **Point Size**: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable. + +- **Markers**: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data. + +**Axis and Label Configuration** + +The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges. + +**Plot Display and Saving Options** + +The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations. + +**Correlation Coefficient Display** + +For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship. + +.. function:: scatter_fit_plot(df, x_vars=None, y_vars=None, n_rows=None, n_cols=None, max_cols=4, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color="C0", best_fit_linecolor="red", best_fit_linestyle="-", hue=None, hue_palette=None, size=None, sizes=None, marker="o", show_correlation=True, xlim=None, ylim=None, all_vars=None, label_names=None, **kwargs) + + Create and save scatter plots or a grid of scatter plots for given ``x_vars`` + and ``y_vars``, with an optional best fit line and customizable point color, + size, and markers. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param x_vars: List of variable names to plot on the ``x-axis``. + :type x_vars: list of str, optional + + :param y_vars: List of variable names to plot on the ``y-axis``. + :type y_vars: list of str, optional + + :param n_rows: Number of rows in the subplot grid. Calculated based on the number of plots and ``n_cols`` if not specified. + :type n_rows: int, optional + + :param n_cols: Number of columns in the subplot grid. Calculated based on the number of plots and ``max_cols`` if not specified. + :type n_cols: int, optional + + :param max_cols: Maximum number of columns in the subplot grid. Default is ``4``. + :type max_cols: int, optional + + :param image_path_png: Directory path to save PNG images of the scatter plots. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the scatter plots. + :type image_path_svg: str, optional + + :param save_plots: Controls which plots to save: ``"all"``, ``"individual"``, or ``"grid"``. If None, plots will not be saved. + :type save_plots: str, optional + + :param show_legend: Whether to display the legend on the plots. Default is ``True``. + :type show_legend: bool, optional + + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + + :param show_plot: Controls plot display: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + + :param rotate_plot: Whether to rotate (pivot) the plots. Default is ``False``. + :type rotate_plot: bool, optional + + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + + :param grid_figsize: Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified. + :type grid_figsize: tuple or list, optional + + :param label_fontsize: Font size for axis labels. Default is 12. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is 10. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + + :param add_best_fit_line: Whether to add a best fit line to the scatter plots. Default is ``False``. + :type add_best_fit_line: bool, optional + + :param scatter_color: Color code for the scattered points. Default is ``"C0"``. + :type scatter_color: str, optional + + :param best_fit_linecolor: Color code for the best fit line. Default is ``"red"``. + :type best_fit_linecolor: str, optional + + :param best_fit_linestyle: Linestyle for the best fit line. Default is ``"-"``. + :type best_fit_linestyle: str, optional + + :param hue: Column name for the grouping variable that will produce points with different colors. + :type hue: str, optional + + :param hue_palette: Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the ``hue`` parameter to be set. + :type hue_palette: dict, list, or str, optional + + :param size: Column name for the grouping variable that will produce points with different sizes. + :type size: str, optional + + :param sizes: Dictionary mapping sizes (smallest and largest) to min and max values. + :type sizes: dict, optional + + :param marker: Marker style used for the scatter points. Default is ``"o"``. + :type marker: str, optional + + :param show_correlation: Whether to display the Pearson correlation coefficient in the plot title. Default is ``True``. + :type show_correlation: bool, optional + + :param xlim: Limits for the ``x-axis`` as a tuple or list of (``min``, ``max``). + :type xlim: tuple or list, optional + + :param ylim: Limits for the ``y-axis`` as a tuple or list of (``min``, ``max``). + :type ylim: tuple or list, optional + + :param all_vars: If provided, automatically generates scatter plots for all combinations of variables in this list, overriding `x_vars` and `y_vars`. + :type all_vars: list of str, optional + + :param label_names: A dictionary to rename columns for display in the plot titles and labels. + :type label_names: dict, optional + + :param kwargs: Additional keyword arguments to pass to ``sns.scatterplot``. + :type kwargs: dict, optional + + :raises ValueError: + - If ``all_vars`` is provided and either ``x_vars`` or ``y_vars`` is also provided. + - If neither ``all_vars`` nor both ``x_vars`` and ``y_vars`` are provided. + - If ``hue_palette`` is specified without ``hue``. + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set but no image paths are provided. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` or ``grid_figsize`` are not tuples/lists with two numeric values. + + :returns: ``None``. This function does not return any value but generates and optionally saves scatter plots for the specified ``x_vars`` and ``y_vars``, or for all combinations of variables in ``all_vars`` if it is provided. + + + +Regression-Centric Scatter Plots Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this US census data [1]_ example, the ``scatter_fit_plot`` function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the ``show_correlation=True`` parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the ``add_best_fit_line=True`` parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + show_legend=True, + show_plot="grid", + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid.png + :alt: Scatter Plot Comparisons (with Best Fit Lines) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Scatter Plots Grouped by Category Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of +scatter plots that examine the relationships between ``age`` and ``hours-per-week`` +as well as ``education-num`` and ``hours-per-week``. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots: + +1. **Hue and Hue Palette**: The ``hue`` parameter is set to ``"income"``, meaning that the + data points in the scatter plots are colored according to the values in the ``income`` + column. A custom color mapping is provided via the ``hue_palette`` parameter, where the + income categories ``"<=50K"`` and ``">50K"`` are assigned the colors ``"brown"`` and + ``"green"``, respectively. This change visually distinguishes the data points based on + income levels. + +2. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, which applies + a grey color to the scatter points when no ``hue`` is provided. However, since a ``hue`` + is specified in this example, the ``hue_palette`` takes precedence and overrides this color setting. + +3. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``False``, meaning that + no best fit line is added to the scatter plots. This differs from the previous example where + a best fit line was included. + +4. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``False``, so the + Pearson correlation coefficient will not be displayed in the plot titles. This is another + change from the previous example where the correlation coefficient was included. + +5. **Hue Legend**: The ``show_legend`` parameter remains set to ``True``, ensuring that the + legend displaying the hue categories (``"<=50K"`` and ``">50K"``) appears on the plots, + helping to interpret the color coding of the data points. + +These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths. + + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + hue_dict = {"<=50K": "brown", ">50K": "green"} + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + show_legend=True, + show_plot="grid", + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=False, + scatter_color="#808080", + hue="income", + hue_palette=hue_dict, + show_correlation=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid_grouped.png + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots (All Combinations Example) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of scatter plots that explore the relationships between all numeric variables in the ``df`` DataFrame. The function automatically identifies and plots all possible combinations of these variables. Below are key aspects of this example: + +1. **All Variables Combination**: The ``all_vars`` parameter is used to automatically generate scatter plots for all possible combinations of numerical variables in the DataFrame. This means you don't need to manually specify ``x_vars`` and ``y_vars``, as the function will iterate through each possible pair. + +2. **Grid Display**: The ``show_plot`` parameter is set to ``"grid"``, so the scatter plots are displayed in a grid format. This is useful for comparing multiple relationships simultaneously. + +3. **Font Sizes**: The ``label_fontsize`` and ``tick_fontsize`` parameters are set to ``14`` and ``12``, respectively. This increases the readability of axis labels and tick marks, making the plots more visually accessible. + +4. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``True``, meaning that a best fit line is added to each scatter plot. This helps in visualizing the linear relationship between variables. + +5. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, applying a grey color to the scatter points. This provides a neutral color that does not distract from the data itself. + +6. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``True``, so the Pearson correlation coefficient will be displayed in the plot titles. This helps to quantify the strength of the relationship between the variables. + +These settings allow for the creation of scatter plots that comprehensively explore the relationships between all numeric variables in the DataFrame. The plots are saved in a grid format, with added best fit lines and correlation coefficients for deeper analysis. The resulting images can be stored in the specified directory for future reference. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + all_vars=df.select_dtypes(np.number).columns.to_list(), + show_legend=True, + show_plot="grid", + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_all_grid.png + :alt: Scatter Plot Comparisons (Grouped2) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Correlation Matrices +===================== + +**Generate and Save Customizable Correlation Heatmaps** + +The ``flex_corr_matrix`` function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats. + +**Customizable Plot Appearance** + +The function provides extensive customization options for the heatmap's appearance: + +- **Colormap Selection**: Choose from a variety of colormaps to represent the strength of correlations. The default is ``"coolwarm"``, but this can be adjusted to fit the needs of the analysis. + +- **Annotation**: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance. + +- **Figure Size and Layout**: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards. + +**Triangular vs. Full Correlation Matrix** + + +A key feature of the ``flex_corr_matrix`` function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations. + +**Label and Axis Configuration** + + +The function offers flexibility in configuring axis labels and titles: + +- **Label Rotation**: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names. +- **Font Sizes**: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable. +- **Title Wrapping**: Control the wrapping of long titles to fit within the plot without overlapping other elements. + +**Plot Display and Saving Options** + + +The ``flex_corr_matrix`` function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images. + +.. function:: flex_corr_matrix(df, cols=None, annot=True, cmap="coolwarm", save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title="Cervical Cancer Data: Correlation Matrix", label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment="right", ylabel_alignment="center_baseline", text_wrap=50, vmin=-1, vmax=1, cbar_label="Correlation Index", triangular=True, **kwargs) + + Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param cols: List of column names to include in the correlation matrix. If None, all columns are included. + :type cols: list of str, optional + + :param annot: Whether to annotate the heatmap with correlation coefficients. Default is ``True``. + :type annot: bool, optional + + :param cmap: The colormap to use for the heatmap. Default is ``"coolwarm"``. + :type cmap: str, optional + + :param save_plots: Controls whether to save the plots. Default is ``False``. + :type save_plots: bool, optional + + :param image_path_png: Directory path to save PNG images of the heatmap. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the heatmap. + :type image_path_svg: str, optional + + :param figsize: Width and height of the figure for the heatmap. Default is ``(10, 10)``. + :type figsize: tuple, optional + + :param title: Title of the heatmap. Default is ``"Cervical Cancer Data: Correlation Matrix"``. + :type title: str, optional + + :param label_fontsize: Font size for tick labels and colorbar label. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param xlabel_rot: Rotation angle for x-axis labels. Default is ``45``. + :type xlabel_rot: int, optional + + :param ylabel_rot: Rotation angle for y-axis labels. Default is ``0``. + :type ylabel_rot: int, optional + + :param xlabel_alignment: Horizontal alignment for x-axis labels. Default is ``"right"``. + :type xlabel_alignment: str, optional + + :param ylabel_alignment: Vertical alignment for y-axis labels. Default is ``"center_baseline"``. + :type ylabel_alignment: str, optional + + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + + :param vmin: Minimum value for the heatmap color scale. Default is ``-1``. + :type vmin: float, optional + + :param vmax: Maximum value for the heatmap color scale. Default is ``1``. + :type vmax: float, optional + + :param cbar_label: Label for the colorbar. Default is ``"Correlation Index"``. + :type cbar_label: str, optional + + :param triangular: Whether to show only the upper triangle of the correlation matrix. Default is ``True``. + :type triangular: bool, optional + + :param kwargs: Additional keyword arguments to pass to ``seaborn.heatmap()``. + :type kwargs: dict, optional + + :raises ValueError: + - If ``annot`` is not a boolean. + - If ``cols`` is not a list. + - If ``save_plots`` is not a boolean. + - If ``triangular`` is not a boolean. + - If ``save_plots`` is True but no image paths are provided. + + :returns: ``None`` + This function does not return any value but generates and optionally saves a correlation heatmap. + +Triangular Correlation Matrix Example +-------------------------------------- + +The provided code filters the census [1]_ DataFrame ``df`` to include only numeric columns using +``select_dtypes(np.number)``. It then utilizes the ``flex_corr_matrix()`` function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options. + +.. note:: + + This triangular matrix format is particularly useful for avoiding + redundancy in correlation matrices, as it excludes the lower half, + making it easier to focus on unique pairwise correlations. + +The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations. + +.. code-block:: python + + # Select only numeric data to pass into the function + df_num = df.select_dtypes(np.number) + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="coolwarm", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Full Correlation Matrix Example +---------------------------------- + +In this modified census [1]_ example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting ``cmap="viridis"``, the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting ``triangular=False``, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset. + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="viridis", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix_full.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Partial Dependence Plots +========================= + +**Partial Dependence Plots (PDPs)** are a powerful tool in machine learning +interpretability, providing insights into how features influence the predicted +outcome of a model. PDPs can be generated in both 2D and 3D, depending on +whether you want to analyze the effect of one feature or the interaction between +two features on the model's predictions. + +2D Partial Dependence Plots +----------------------------- + +The ``plot_2d_pdp`` function generates 2D partial dependence plots for individual features or pairs of features. These plots are essential for examining the marginal effect of features on the predicted outcome. + +- **Grid and Individual Plots**: Generate all 2D partial dependence plots in a grid layout or as separate individual plots, offering flexibility in presentation. +- **Customization Options**: Control the figure size, font sizes for labels and ticks, and the wrapping of long titles to ensure the plots are clear and informative. +- **Saving Plots**: The function provides options to save the plots in PNG or SVG formats, and you can specify whether to save all plots, only individual plots, or just the grid plot. + +.. function:: plot_2d_pdp(model, X_train, feature_names, features, title="PDP of house value on CA non-location features", grid_resolution=50, plot_type="grid", grid_figsize=(12, 8), individual_figsize=(6, 4), label_fontsize=12, tick_fontsize=10, text_wrap=50, image_path_png=None, image_path_svg=None, save_plots=None, file_prefix="partial_dependence") + + Generate 2D partial dependence plots for specified features using the given machine learning model. The function allows for plotting in grid or individual layouts, with various customization options for figure size, font sizes, and title wrapping. Additionally, the plots can be saved in PNG or SVG formats with a customizable filename prefix. + + :param model: The trained machine learning model used to generate partial dependence plots. + :type model: estimator object + + :param X_train: The training data used to compute partial dependence. Should correspond to the features used to train the model. + :type X_train: pandas.DataFrame or numpy.ndarray + + :param feature_names: A list of feature names corresponding to the columns in ``X_train``. + :type feature_names: list of str + + :param features: A list of feature indices or tuples of feature indices for which to generate partial dependence plots. + :type features: list of int or tuple of int + + :param title: The title for the entire plot. Default is ``"PDP of house value on CA non-location features"``. + :type title: str, optional + + :param grid_resolution: The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is ``50``. + :type grid_resolution: int, optional + + :param plot_type: The type of plot to generate. Choose ``"grid"`` for a grid layout, ``"individual"`` for separate plots, or ``"both"`` to generate both layouts. Default is ``"grid"``. + :type plot_type: str, optional + + :param grid_figsize: Tuple specifying the width and height of the figure for the grid layout. Default is ``(12, 8)``. + :type grid_figsize: tuple, optional + + :param individual_figsize: Tuple specifying the width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple, optional + + :param label_fontsize: Font size for the axis labels and titles. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for the axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping. Useful for managing long titles. Default is ``50``. + :type text_wrap: int, optional + + :param image_path_png: The directory path where PNG images of the plots will be saved, if saving is enabled. + :type image_path_png: str, optional + + :param image_path_svg: The directory path where SVG images of the plots will be saved, if saving is enabled. + :type image_path_svg: str, optional + + :param save_plots: Controls whether to save the plots. Options include ``"all"``, ``"individual"``, ``"grid"``, or ``None`` (default). If saving is enabled, ensure ``image_path_png`` or ``image_path_svg`` are provided. + :type save_plots: str, optional + + :param file_prefix: Prefix for the filenames of the saved grid plots. Default is ``"partial_dependence"``. + :type file_prefix: str, optional + + :raises ValueError: + - If ``plot_type`` is not one of ``"grid"``, ``"individual"``, or ``"both"``. + - If ``save_plots`` is enabled but neither ``image_path_png`` nor ``image_path_svg`` is provided. + + :returns: ``None`` + This function generates partial dependence plots and displays them. It does not return any values. + + +2D Plots - CA Housing Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Consider a scenario where you have a machine learning model predicting median +house values in California. [4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (``AveOccup``) and the +age of the house (``HouseAge``) jointly influence house values. A 2D partial +dependence plot allows you to visualize this relationship in two ways: either as +individual plots for each feature or as a combined plot showing the interaction +between two features. + +For instance, the 2D partial dependence plot can help you analyze how the age of +the house impacts house values while holding the number of occupants constant, or +vice versa. This is particularly useful for identifying the most influential +features and understanding how changes in these features might affect the +predicted house value. + +If you extend this to two interacting features, such as ``AveOccup`` and ``HouseAge``, +you can explore their combined effect on house prices. The plot can reveal how +different combinations of occupancy levels and house age influence the value, +potentially uncovering non-linear relationships or interactions that might not be +immediately obvious from a simple 1D analysis. + +Here’s how you can generate and visualize these 2D partial dependence plots using +the California housing dataset: + +**Fetch The CA Housing Dataset and Prepare The DataFrame** + +.. code-block:: python + + from sklearn.datasets import fetch_california_housing + from sklearn.model_selection import train_test_split + from sklearn.ensemble import GradientBoostingRegressor + import pandas as pd + + # Load the dataset + data = fetch_california_housing() + df = pd.DataFrame(data.data, columns=data.feature_names) + +**Split The Data Into Training and Testing Sets** + +.. code-block:: python + + X_train, X_test, y_train, y_test = train_test_split( + df, data.target, test_size=0.2, random_state=42 + ) + +**Train a GradientBoostingRegressor Model** + +.. code-block:: python + + model = GradientBoostingRegressor( + n_estimators=100, + max_depth=4, + learning_rate=0.1, + loss="huber", + random_state=42, + ) + model.fit(X_train, y_train) + + +**Create 2D Partial Dependence Plot Grid** + +.. code-block:: python + + # import the plot_2d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_2d_pdp + + # Feature names + names = data.feature_names + + # Generate 2D partial dependence plots + plot_2d_pdp( + model=model, + X_train=X_train, + feature_names=names, + features=[ + "MedInc", + "AveOccup", + "HouseAge", + "AveRooms", + "Population", + ("AveOccup", "HouseAge"), + ], + title="PDP of house value on CA non-location features", + grid_figsize=(14, 10), + individual_figsize=(12, 4), + label_fontsize=14, + tick_fontsize=12, + text_wrap=120, + plot_type="grid", + image_path_png="path/to/save/png", + save_plots="all", + ) + +.. raw:: html + +
+ +.. image:: ../assets/2d_pdp_grid.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +3D Partial Dependence Plots +----------------------------- + +The ``plot_3d_pdp`` function extends the concept of partial dependence to three dimensions, allowing you to visualize the interaction between two features and their combined effect on the model’s predictions. + +- **Interactive and Static 3D Plots**: Generate static 3D plots using Matplotlib or interactive 3D plots using Plotly. The function also allows for generating both types simultaneously. +- **Colormap and Layout Customization**: Customize the colormaps for both Matplotlib and Plotly plots. Adjust figure size, camera angles, and zoom levels to create plots that fit perfectly within your presentation or report. +- **Axis and Title Configuration**: Customize axis labels for both Matplotlib and Plotly plots. Adjust font sizes and control the wrapping of long titles to maintain readability. + +.. function:: plot_3d_pdp(model, dataframe, feature_names_list, x_label=None, y_label=None, z_label=None, title, html_file_path=None, html_file_name=None, image_filename=None, plot_type="both", matplotlib_colormap=None, plotly_colormap="Viridis", zoom_out_factor=None, wireframe_color=None, view_angle=(22, 70), figsize=(7, 4.5), text_wrap=50, horizontal=-1.25, depth=1.25, vertical=1.25, cbar_x=1.05, cbar_thickness=25, title_x=0.5, title_y=0.95, top_margin=100, image_path_png=None, image_path_svg=None, show_cbar=True, grid_resolution=20, left_margin=20, right_margin=65, label_fontsize=8, tick_fontsize=6, enable_zoom=True, show_modebar=True) + + Generate 3D partial dependence plots for two features of a machine learning model. + + This function supports both static (Matplotlib) and interactive (Plotly) visualizations, allowing for flexible and comprehensive analysis of the relationship between two features and the target variable in a model. + + :param model: The trained machine learning model used to generate partial dependence plots. + :type model: estimator object + + :param dataframe: The dataset on which the model was trained or a representative sample. If a DataFrame is provided, ``feature_names_list`` should correspond to the column names. If a NumPy array is provided, ``feature_names_list`` should correspond to the indices of the columns. + :type dataframe: pandas.DataFrame or numpy.ndarray + + :param feature_names_list: A list of two feature names or indices corresponding to the features for which partial dependence plots are generated. + :type feature_names_list: list of str + + :param x_label: Label for the x-axis in the plots. Default is ``None``. + :type x_label: str, optional + + :param y_label: Label for the y-axis in the plots. Default is ``None``. + :type y_label: str, optional + + :param z_label: Label for the z-axis in the plots. Default is ``None``. + :type z_label: str, optional + + :param title: The title for the plots. + :type title: str + + :param html_file_path: Path to save the interactive Plotly HTML file. Required if ``plot_type`` is ``"interactive"`` or ``"both"``. Default is ``None``. + :type html_file_path: str, optional + + :param html_file_name: Name of the HTML file to save the interactive Plotly plot. Required if ``plot_type`` is ``"interactive"`` or ``"both"``. Default is ``None``. + :type html_file_name: str, optional + + :param image_filename: Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is ``None``. + :type image_filename: str, optional + + :param plot_type: The type of plots to generate. Options are: + - ``"static"``: Generate only static Matplotlib plots. + - ``"interactive"``: Generate only interactive Plotly plots. + - ``"both"``: Generate both static and interactive plots. Default is ``"both"``. + :type plot_type: str, optional + + :param matplotlib_colormap: Custom colormap for the Matplotlib plot. If not provided, a default colormap is used. + :type matplotlib_colormap: matplotlib.colors.Colormap, optional + + :param plotly_colormap: Colormap for the Plotly plot. Default is ``"Viridis"``. + :type plotly_colormap: str, optional + + :param zoom_out_factor: Factor to adjust the zoom level of the Plotly plot. Default is ``None``. + :type zoom_out_factor: float, optional + + :param wireframe_color: Color for the wireframe in the Matplotlib plot. If ``None``, no wireframe is plotted. Default is ``None``. + :type wireframe_color: str, optional + + :param view_angle: Elevation and azimuthal angles for the Matplotlib plot view. Default is ``(22, 70)``. + :type view_angle: tuple, optional + + :param figsize: Figure size for the Matplotlib plot. Default is ``(7, 4.5)``. + :type figsize: tuple, optional + + :param text_wrap: Maximum width of the title text before wrapping. Useful for managing long titles. Default is ``50``. + :type text_wrap: int, optional + + :param horizontal: Horizontal camera position for the Plotly plot. Default is ``-1.25``. + :type horizontal: float, optional + + :param depth: Depth camera position for the Plotly plot. Default is ``1.25``. + :type depth: float, optional + + :param vertical: Vertical camera position for the Plotly plot. Default is ``1.25``. + :type vertical: float, optional + + :param cbar_x: Position of the color bar along the x-axis in the Plotly plot. Default is ``1.05``. + :type cbar_x: float, optional + + :param cbar_thickness: Thickness of the color bar in the Plotly plot. Default is ``25``. + :type cbar_thickness: int, optional + + :param title_x: Horizontal position of the title in the Plotly plot. Default is ``0.5``. + :type title_x: float, optional + + :param title_y: Vertical position of the title in the Plotly plot. Default is ``0.95``. + :type title_y: float, optional + + :param top_margin: Top margin for the Plotly plot layout. Default is ``100``. + :type top_margin: int, optional + + :param image_path_png: Directory path to save the PNG file of the Matplotlib plot. Default is None. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save the SVG file of the Matplotlib plot. Default is None. + :type image_path_svg: str, optional + + :param show_cbar: Whether to display the color bar in the Matplotlib plot. Default is ``True``. + :type show_cbar: bool, optional + + :param grid_resolution: The resolution of the grid for computing partial dependence. Default is ``20``. + :type grid_resolution: int, optional + + :param left_margin: Left margin for the Plotly plot layout. Default is ``20``. + :type left_margin: int, optional + + :param right_margin: Right margin for the Plotly plot layout. Default is ``65``. + :type right_margin: int, optional + + :param label_fontsize: Font size for axis labels in the Matplotlib plot. Default is ``8``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for tick labels in the Matplotlib plot. Default is ``6``. + :type tick_fontsize: int, optional + + :param enable_zoom: Whether to enable zooming in the Plotly plot. Default is ``True``. + :type enable_zoom: bool, optional + + :param show_modebar: Whether to display the mode bar in the Plotly plot. Default is ``True``. + :type show_modebar: bool, optional + + :raises ValueError: + - If `plot_type` is not one of ``"static"``, ``"interactive"``, or ``"both"``. + - If `plot_type` is ``"interactive"`` or ``"both"`` and ``html_file_path`` or ``html_file_name`` are not provided. + + :returns: ``None`` + This function generates 3D partial dependence plots and displays or saves them. It does not return any values. + + :notes: + - This function handles warnings related to scikit-learn's ``partial_dependence`` function, specifically a ``FutureWarning`` related to non-tuple sequences for multidimensional indexing. This warning is suppressed as it stems from the internal workings of scikit-learn in Python versions like 3.7.4. + - To maintain compatibility with different versions of scikit-learn, the function attempts to use ``"values"`` for grid extraction in newer versions and falls back to ``"grid_values"`` for older versions. + + +3D Plots - CA Housing Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Consider a scenario where you have a machine learning model predicting median +house values in California.[4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (``AveOccup``) and the +age of the house (``HouseAge``) jointly influence house values. A 3D partial +dependence plot allows you to visualize this relationship in a more comprehensive +manner, providing a detailed view of how these two features interact to affect +the predicted house value. + +For instance, the 3D partial dependence plot can help you explore how different +combinations of house age and occupancy levels influence house values. By +visualizing the interaction between AveOccup and HouseAge in a 3D space, you can +uncover complex, non-linear relationships that might not be immediately apparent +in 2D plots. + +This type of plot is particularly useful when you need to understand the joint +effect of two features on the target variable, as it provides a more intuitive +and detailed view of how changes in both features impact predictions simultaneously. + +Here’s how you can generate and visualize these 3D partial dependence plots +using the California housing dataset: + +Static Plot +^^^^^^^^^^^^^^^^^ + +**Fetch The CA Housing Dataset and Prepare The DataFrame** + +.. code-block:: python + + from sklearn.ensemble import GradientBoostingRegressor + from sklearn.datasets import fetch_california_housing + from sklearn.model_selection import train_test_split + import pandas as pd + + # Load the dataset + data = fetch_california_housing() + df = pd.DataFrame(data.data, columns=data.feature_names) + +**Split The Data Into Training and Testing Sets** + +.. code-block:: python + + X_train, X_test, y_train, y_test = train_test_split( + df, data.target, test_size=0.2, random_state=42 + ) + +**Train a GradientBoostingRegressor Model** + +.. code-block:: python + + model = GradientBoostingRegressor( + n_estimators=100, + max_depth=4, + learning_rate=0.1, + loss="huber", + random_state=1, + ) + model.fit(X_train, y_train) + +**Create Static 3D Partial Dependence Plot** + +.. code-block:: python + + # import the plot_3d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_3d_pdp + + # Call the function to generate the plot + plot_3d_pdp( + model=model, + dataframe=X_test, # Use the test dataset + feature_names_list=["HouseAge", "AveOccup"], + x_label="House Age", + y_label="Average Occupancy", + z_label="Partial Dependence", + title="3D Partial Dependence Plot of House Age vs. Average Occupancy", + image_filename="3d_pdp", + plot_type="static", + figsize=[8, 5], + text_wrap=40, + wireframe_color="black", + image_path_png=image_path_png, + grid_resolution=30, + ) + +.. raw:: html + +
+ +.. image:: ../assets/3d_pdp.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Interactive Plot +^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # import the plot_3d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_3d_pdp + + # Call the function to generate the plot + plot_3d_pdp( + model=model, + dataframe=X_test, # Use the test dataset + feature_names_list=["HouseAge", "AveOccup"], + x_label="House Age", + y_label="Average Occupancy", + z_label="Partial Dependence", + title="3D Partial Dependence Plot of House Age vs. Average Occupancy", + html_file_path=image_path_png, + image_filename="3d_pdp", + html_file_name="3d_pdp.html", + plot_type="interactive", + text_wrap=40, + zoom_out_factor=0.5, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + grid_resolution=30, + label_fontsize=8, + tick_fontsize=6, + title_x=0.38, + top_margin=10, + right_margin=250, + cbar_x=0.9, + cbar_thickness=25, + show_modebar=False, + enable_zoom=True, + ) + +.. warning:: + + **Scrolling Notice:** + + While interacting with the interactive Plotly plot below, scrolling down the + page using the mouse wheel may be blocked when the mouse pointer is hovering + over the plot. To continue scrolling, either move the mouse pointer outside + the plot area or use the keyboard arrow keys to navigate down the page. + + +.. raw:: html + + + +
+ + +This interactive plot was generated using Plotly, which allows for rich, +interactive visualizations directly in the browser. The plot above is an example +of an interactive 3D Partial Dependence Plot. Here's how it differs from +generating a static plot using Matplotlib. + +**Key Differences** + +**Plot Type**: + +- The ``plot_type`` is set to ``"interactive"`` for the Plotly plot and ``"static"`` for the Matplotlib plot. + +**Interactive-Specific Parameters**: + +- **HTML File Path and Name**: The ``html_file_path`` and ``html_file_name`` parameters are required to save the interactive Plotly plot as an HTML file. These parameters are not needed for static plots. + +- **Zoom and Positioning**: The interactive plot includes parameters like ``zoom_out_factor``, ``title_x``, ``cbar_x``, and ``cbar_thickness`` to control the zoom level, title position, and color bar position in the Plotly plot. These parameters do not affect the static plot. + +- **Mode Bar and Zoom**: The ``show_modebar`` and ``enable_zoom`` parameters are specific to the interactive Plotly plot, allowing you to toggle the visibility of the mode bar and enable or disable zoom functionality. + +**Static-Specific Parameters**: + +- **Figure Size and Wireframe Color**: The static plot uses parameters like ``figsize`` to control the size of the Matplotlib plot and ``wireframe_color`` to define the color of the wireframe in the plot. These parameters are not applicable to the interactive Plotly plot. + +By adjusting these parameters, you can customize the behavior and appearance of your 3D Partial Dependence Plots according to your needs, whether for static or interactive visualization. + + + + +.. [1] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +.. [2] Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +.. [3] Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +.. [4] Pace, R. K., & Barry, R. (1997). *Sparse Spatial Autoregressions*. *Statistics & Probability Letters*, 33(3), 291-297. `https://doi.org/10.1016/S0167-7152(96)00140-X `_. + diff --git a/_build/html/v0.0.11/_sources/getting_started.rst.txt b/_build/html/v0.0.11/_sources/getting_started.rst.txt new file mode 100644 index 000000000..bf69e01b4 --- /dev/null +++ b/_build/html/v0.0.11/_sources/getting_started.rst.txt @@ -0,0 +1,136 @@ +.. _getting_started: + +.. KFRE Python Library Documentation documentation master file, created by + sphinx-quickstart on Thu May 2 15:44:56 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Welcome to the EDA Toolkit Python Library Documentation! +======================================================== +.. note:: + This documentation is for ``eda_toolkit`` version ``0.0.11``. + + +The ``eda_toolkit`` is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data. + +Project Links +--------------- + +1. `PyPI Page `_ + +2. `GitHub Repository `_ + + +What is EDA? +------------- + +Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data. + + +Purpose of EDA Toolkit +----------------------- +The ``eda_toolkit`` library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including: + +- **Data Management:** Tools for managing directories, generating unique IDs, + standardizing dates, and handling common DataFrame manipulations. +- **Data Cleaning:** Functions to address missing values, remove outliers, and + correct formatting issues, ensuring data is ready for analysis. +- **Data Visualization:** A variety of plotting functions, including KDE + distribution plots, stacked bar plots, scatter plots with optional best fit + lines, and box/violin plots, to visually explore data distributions, + relationships, and trends. +- **Descriptive and Summary Statistics:** Methods to generate comprehensive + reports on data types, summary statistics (mean, median, standard deviation, + etc.), and to summarize all possible combinations of specified variables. +- **Reporting and Export:** Features to save DataFrames to Excel with + customizable formatting, create contingency tables, and export generated + plots in multiple formats. + + + +Key Features +------------- + +- **Ease of Use:** The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions. +- **Customizable:** Users can customize various aspects of the toolkit to fit their specific needs. +- **Integration:** Seamlessly integrates with popular data science libraries such as ``Pandas``, ``NumPy``, ``Matplotlib``, and ``Seaborn``. +- **Documentation and Examples:** Comprehensive documentation and examples to help users get started quickly and effectively. + +.. _prerequisites: + +Prerequisites +------------- +Before you install ``eda_toolkit``, ensure your system meets the following requirements: + +- **Python**: version ``3.7.4`` or higher is required to run ``eda_toolkit``. + +Additionally, ``eda_toolkit`` depends on the following packages, which will be automatically installed when you install ``eda_toolkit``: + +- ``jinja2``: version ``3.1.4`` or higher +- ``matplotlib``: version ``3.5.3`` or higher +- ``nbformat``: version ``4.2.0`` or higher +- ``numpy``: version ``1.21.6`` or higher +- ``pandas``: version ``1.3.5`` or higher +- ``plotly``: version ``5.18.0`` or higher +- ``scikit-learn``: version ``1.0.2`` or higher +- ``seaborn``: version ``0.12.2`` or higher +- ``xlsxwriter``: version ``3.2.0`` or higher + +.. _installation: + +Installation +------------- + +You can install ``eda_toolkit`` directly from PyPI: + +.. code-block:: bash + + pip install eda_toolkit + + +Description +=============== + +This guide provides detailed instructions and examples for using the functions +provided in the ``eda_toolkit`` library and how to use them effectively in your projects. + +For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [#]_. This dataset provides a rich source of +information for demonstrating the functionalities of the ``eda_toolkit``. + +.. [#] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + diff --git a/_build/html/v0.0.11/_sources/index.rst.txt b/_build/html/v0.0.11/_sources/index.rst.txt new file mode 100644 index 000000000..5f0dc6c56 --- /dev/null +++ b/_build/html/v0.0.11/_sources/index.rst.txt @@ -0,0 +1,57 @@ +.. EDA Toolkit documentation master file, created by + sphinx-quickstart on Mon Jul 29 08:15:33 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Table of Contents +=================== + +.. toctree:: + :maxdepth: 4 + :caption: Getting Started + + getting_started + + +.. toctree:: + :maxdepth: 4 + :caption: Data Management + + data_management + +.. toctree:: + :maxdepth: 4 + :caption: Plotting Heuristics + + eda_plots + +.. toctree:: + :maxdepth: 4 + :caption: About EDA Toolkit + + acknowledgements + contributors + citations + changelog + references + + \ No newline at end of file diff --git a/_build/html/v0.0.11/_sources/references.rst.txt b/_build/html/v0.0.11/_sources/references.rst.txt new file mode 100644 index 000000000..335337c3a --- /dev/null +++ b/_build/html/v0.0.11/_sources/references.rst.txt @@ -0,0 +1,33 @@ +.. _references: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +References +=========== + +1. Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +2. Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +3. Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +4. Pace, R. K., & Barry, R. (1997). *Sparse Spatial Autoregressions*. *Statistics & Probability Letters*, 33(3), 291-297. `https://doi.org/10.1016/S0167-7152(96)00140-X `_. diff --git a/_build/html/v0.0.11/_static/_sphinx_javascript_frameworks_compat.js b/_build/html/v0.0.11/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/_build/html/v0.0.11/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * 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/_build/html/v0.0.11/_static/basic.css b/_build/html/v0.0.11/_static/basic.css new file mode 100644 index 000000000..7ebbd6d07 --- /dev/null +++ b/_build/html/v0.0.11/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- 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: 230px; + 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-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +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; +} + +a:visited { + color: #551A8B; +} + +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; +} + +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; +} + +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 > 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; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +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; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- 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/_build/html/v0.0.11/_static/check-solid.svg b/_build/html/v0.0.11/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_build/html/v0.0.11/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_build/html/v0.0.11/_static/clipboard.min.js b/_build/html/v0.0.11/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_build/html/v0.0.11/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * 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/_build/html/v0.0.11/_static/copybutton.css b/_build/html/v0.0.11/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_build/html/v0.0.11/_static/copybutton.css @@ -0,0 +1,94 @@ +/* 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/_build/html/v0.0.11/_static/copybutton.js b/_build/html/v0.0.11/_static/copybutton.js new file mode 100644 index 000000000..0ea5f6c60 --- /dev/null +++ b/_build/html/v0.0.11/_static/copybutton.js @@ -0,0 +1,248 @@ +// 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, '>|\\$ ', true, 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/_build/html/v0.0.11/_static/copybutton_funcs.js b/_build/html/v0.0.11/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_build/html/v0.0.11/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +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/_build/html/v0.0.11/_static/css/badge_only.css b/_build/html/v0.0.11/_static/css/badge_only.css new file mode 100644 index 000000000..88ba55b96 --- /dev/null +++ b/_build/html/v0.0.11/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Bold.woff b/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Regular.woff b/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.eot b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.svg b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.ttf b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.woff b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.woff2 b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_build/html/v0.0.11/_static/css/fonts/lato-bold-italic.woff b/_build/html/v0.0.11/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_build/html/v0.0.11/_static/css/fonts/lato-bold-italic.woff2 b/_build/html/v0.0.11/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_build/html/v0.0.11/_static/css/fonts/lato-bold.woff b/_build/html/v0.0.11/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/lato-bold.woff differ diff --git a/_build/html/v0.0.11/_static/css/fonts/lato-bold.woff2 b/_build/html/v0.0.11/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/lato-bold.woff2 differ diff --git a/_build/html/v0.0.11/_static/css/fonts/lato-normal-italic.woff b/_build/html/v0.0.11/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_build/html/v0.0.11/_static/css/fonts/lato-normal-italic.woff2 b/_build/html/v0.0.11/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_build/html/v0.0.11/_static/css/fonts/lato-normal.woff b/_build/html/v0.0.11/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/lato-normal.woff differ diff --git a/_build/html/v0.0.11/_static/css/fonts/lato-normal.woff2 b/_build/html/v0.0.11/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.11/_static/css/fonts/lato-normal.woff2 differ diff --git a/_build/html/v0.0.11/_static/css/theme.css b/_build/html/v0.0.11/_static/css/theme.css new file mode 100644 index 000000000..0f14f1064 --- /dev/null +++ b/_build/html/v0.0.11/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_build/html/v0.0.11/_static/doctools.js b/_build/html/v0.0.11/_static/doctools.js new file mode 100644 index 000000000..0398ebb9f --- /dev/null +++ b/_build/html/v0.0.11/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + 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; + }, + + /** + * 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; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + 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; + } + } + + // 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/_build/html/v0.0.11/_static/documentation_options.js b/_build/html/v0.0.11/_static/documentation_options.js new file mode 100644 index 000000000..3ba1e305a --- /dev/null +++ b/_build/html/v0.0.11/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.0.11', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_build/html/v0.0.11/_static/file.png b/_build/html/v0.0.11/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_build/html/v0.0.11/_static/file.png differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.eot b/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.eot differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.ttf b/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.ttf differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.woff b/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.woff differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.woff2 b/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.eot b/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.ttf b/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff b/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff2 b/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.eot b/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.eot differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.ttf b/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.ttf differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.woff b/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.woff differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.woff2 b/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.eot b/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.eot differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.ttf b/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.ttf differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.woff b/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.woff differ diff --git a/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.woff2 b/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/_build/html/v0.0.11/_static/jquery.js b/_build/html/v0.0.11/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/_build/html/v0.0.11/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/_build/html/v0.0.11/_static/language_data.js b/_build/html/v0.0.11/_static/language_data.js new file mode 100644 index 000000000..c7fe6c6fa --- /dev/null +++ b/_build/html/v0.0.11/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_build/html/v0.0.11/_static/minus.png b/_build/html/v0.0.11/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/_build/html/v0.0.11/_static/minus.png differ diff --git a/_build/html/v0.0.11/_static/plus.png b/_build/html/v0.0.11/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/_build/html/v0.0.11/_static/plus.png differ diff --git a/_build/html/v0.0.11/_static/pygments.css b/_build/html/v0.0.11/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/_build/html/v0.0.11/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_build/html/v0.0.11/_static/searchtools.js b/_build/html/v0.0.11/_static/searchtools.js new file mode 100644 index 000000000..2c774d17a --- /dev/null +++ b/_build/html/v0.0.11/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_build/html/v0.0.11/_static/sphinx_highlight.js b/_build/html/v0.0.11/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/_build/html/v0.0.11/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * 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))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + 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 SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + 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")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_build/html/v0.0.11/acknowledgements.html b/_build/html/v0.0.11/acknowledgements.html new file mode 100644 index 000000000..d2b9e4107 --- /dev/null +++ b/_build/html/v0.0.11/acknowledgements.html @@ -0,0 +1,144 @@ + + + + + + + + + Acknowledgements — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Acknowledgements

+

We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists.

+

We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/changelog.html b/_build/html/v0.0.11/changelog.html new file mode 100644 index 000000000..0644dd380 --- /dev/null +++ b/_build/html/v0.0.11/changelog.html @@ -0,0 +1,754 @@ + + + + + + + + + Changelog — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Changelog

+
+

Version 0.0.11

+

Description

+

Fixes a TypeError in the stacked_crosstab_plot function when save_formats is None. The update ensures that save_formats defaults to an empty list, preventing iteration over a NoneType object.

+

Changes

+
    +
  • Initializes save_formats as an empty list if not provided.

  • +
  • Adds handling for string and tuple input types for save_formats.

  • +
+

Issue Fixed

+
    +
  • Resolves TypeError when save_formats is None.

  • +
+
+
+

Version 0.0.10

+

Legend Handling

+
    +
  • The legend is now displayed only if there are valid legend handles (len(handles) > 0) and if show_legend is set to True.

  • +
  • The check ax.get_legend().remove() ensures that unnecessary legends are removed if they are empty or if show_legend is set to False.

  • +
+

Error Handling +- Error handling in the except block has been enhanced to ensure that any exceptions related to legends or labels are managed properly. The legend handling logic still respects the show_legend flag even in cases where exceptions occur.

+

This update prevents empty legend squares from appearing and maintains the intended default behavior of showing legends only when they contain relevant content.

+
+
+

Version 0.0.9

+

Bug Fixes and Minor Improvements

+

Improved error messages and validation checks across multiple functions to prevent common pitfalls and ensure smoother user experience.

+

Visualization Enhancements

+

DataFrame Columns: Added a background_color variable to dataframe_columns`, +allowing the user to enter a string representing a color name, or hex value. +Try/Except on the output, in case the end user has a deprecated version of Pandas, +where the styler would use hide() instead of hide_index(). The highlighted +columns allow for easier null versus unique value analysis.

+

The docstring now clearly describes the purpose of the function—analyzing +DataFrame columns to provide summary statistics.

+

Args:

+
    +
  • The df argument is specified as a pandas.DataFrame.

  • +
  • The background_color argument is marked as optional, with a brief description of its role.

  • +
  • The return_df argument is also marked as optional, explaining what it controls.

  • +
+

Returns: The return type is specified as pandas.DataFrame, with a clear explanation of the difference based on the return_df flag.

+

KDE Distribution Plots: Improved kde_distributions() with enhanced options for log scaling, mean/median plotting, custom standard deviation lines, and better handling of legends and scientific notation.

+

Scatter Plots: Enhanced scatter_fit_plot() with support for hue-based coloring, best fit lines, correlation display, and flexible grid plotting options.

+
+
+

Version 0.0.8

+

stacked_crosstab_plot

+
    +
  • Flexible `save_formats` Input: +- save_formats now accepts a string, tuple, or list for specifying formats (e.g., “png”, (“png”, “svg”), or [“png”, “svg”]). +- Single strings or tuples are automatically converted to lists for consistent processing.

  • +
  • Dynamic Error Handling: +- Added checks to ensure a valid path is provided for each format in save_formats. +- Raises a ValueError if a format is specified without a corresponding path, with a clear, dynamic error message.

  • +
  • Improved Plot Saving Logic: +- Updated logic allows saving plots in one format (e.g., only “png” or “svg”) without requiring the other. +- Simplified and more intuitive path handling for saving plots.

  • +
+

plot_3d_pdp

+

This update introduces several key changes to the plot_3d_pdp function, simplifying the function’s interface and improving usability, while maintaining the flexibility needed for diverse visualization needs.

+

1. Parameter Changes

+
    +
  • Removed Parameters:

    +
      +
    • The parameters x_label_plotly, y_label_plotly, and z_label_plotly have been removed. These parameters previously allowed custom axis labels specifically for the Plotly plot, defaulting to the general x_label, y_label, and z_label. Removing these parameters simplifies the function signature while maintaining flexibility.

    • +
    +
  • +
  • Default Values for Labels:

    +
      +
    • The parameters x_label, y_label, and z_label are now optional, with None as the default. If not provided, these labels will automatically default to the names of the features in the feature_names_list. This change makes the function more user-friendly, particularly for cases where default labels are sufficient.

    • +
    +
  • +
  • Changes in Default Values for View Angles:

    +
      +
    • The default values for camera positioning parameters have been updated: horizontal is now -1.25, depth is now 1.25, and vertical is now 1.25. These adjustments refine the default 3D view perspective for the Plotly plot, providing a more intuitive starting view.

    • +
    +
  • +
+

2. Plot Generation Logic

+
    +
  • Conditionally Checking Labels:

    +
      +
    • The function now checks whether x_label, y_label, and z_label are provided. If these are None, the function will automatically assign default labels based on the feature_names_list. This enhancement reduces the need for users to manually specify labels, making the function more adaptive.

    • +
    +
  • +
  • Camera Position Adjustments:

    +
      +
    • The camera positions for the Plotly plot are now adjusted by multiplying horizontal, depth, and vertical by zoom_out_factor. This change allows for more granular control over the 3D view, enhancing the interactivity and flexibility of the Plotly visualizations.

    • +
    +
  • +
  • Surface Plot Coordinates Adjustments:

    +
      +
    • The order of the coordinates for the Plotly plot’s surface has been changed from ZZ, XX, YY[::-1] to ZZ, XX, YY. This adjustment ensures the proper alignment of axes and grids, resulting in more accurate visual representations.

    • +
    +
  • +
+

3. Code Simplifications

+
    +
  • Removed Complexity:

    +
      +
    • By removing the x_label_plotly, y_label_plotly, and z_label_plotly parameters, the code is now simpler and easier to maintain. This change reduces potential confusion and streamlines the function for users who do not need distinct labels for Matplotlib and Plotly plots.

    • +
    +
  • +
  • Fallback Mechanism for Grid Values:

    +
      +
    • The function continues to implement a fallback mechanism when extracting grid values, ensuring compatibility with various versions of scikit-learn. This makes the function robust across different environments.

    • +
    +
  • +
+

4. Style Adjustments

+
    +
  • Label Formatting:

    +
      +
    • The new version consistently uses y_label, x_label, and z_label for axis labels in the Matplotlib plot, aligning the formatting across different plot types.

    • +
    +
  • +
  • Color Bar Adjustments:

    +
      +
    • The color bar configuration in the Matplotlib plot has been slightly adjusted with a shrink value of 0.6 and a pad value of 0.02. These adjustments result in a more refined visual appearance, particularly in cases where space is limited.

    • +
    +
  • +
+

5. Potential Use Case Differences

+
    +
  • Simplified Interface:

    +
      +
    • The updated function is more streamlined for users who prefer a simplified interface without the need for separate label customizations for Plotly and Matplotlib plots. This makes it easier to use in common scenarios.

    • +
    +
  • +
  • Less Granular Control:

    +
      +
    • Users who need more granular control, particularly for presentations or specific formatting, may find the older version more suitable. The removal of the *_plotly label parameters means that all plots now use the same labels across Matplotlib and Plotly.

    • +
    +
  • +
+

6. Matplotlib Plot Adjustments

+
    +
  • Wireframe and Surface Plot Enhancements:

    +
      +
    • The logic for plotting wireframes and surface plots in Matplotlib remains consistent with previous versions, with subtle enhancements to color and layout management to improve overall aesthetics.

    • +
    +
  • +
+

Summary

+
    +
  • Version 0.0.8d of the plot_3d_pdp function introduces simplifications that reduce the number of parameters and streamline the plotting process. While some customizability has been removed, the function remains flexible enough for most use cases and is easier to use.

  • +
  • Key updates include adjusted default camera views for 3D plots, removal of Plotly-specific label parameters, and improved automatic labeling and plotting logic.

  • +
+

Decision Point

+
    +
  • This update may be especially useful for users who prefer a cleaner and more straightforward interface. However, those requiring detailed customizations may want to continue using the older version, depending on their specific needs.

  • +
+
+
+

Version 0.0.8c

+

Version 0.0.8c is a follow-up release to version 0.0.8b. This update includes minor enhancements and refinements based on feedback and additional testing. It serves as an incremental step towards improving the stability and functionality of the toolkit.

+

Key Updates in 0.0.8c:

+
    +
  • Bug Fixes: Addressed minor issues identified in version 0.0.8b to ensure smoother performance and better user experience.

  • +
  • Additional Testing: Incorporated further tests to validate the changes introduced in previous versions and to prepare for future stable releases.

  • +
  • Refinements: Made small enhancements to existing features based on user feedback and internal testing results.

  • +
+

Summary of Changes

+
    +
  1. New Features & Enhancements

  2. +
+
    +
  • plot_3d_pdp Function:

    +
      +
    • Added show_modebar Parameter: Introduced a new boolean parameter, show_modebar, to allow users to toggle the visibility of the mode bar in Plotly interactive plots.

    • +
    • Custom Margins and Layout Adjustments:

      +
        +
      • Added parameters for left_margin, right_margin, and top_margin to provide users with more control over the plot layout in Plotly.

      • +
      • Adjusted default values and added options for better customization of the Plotly color bar (cbar_x, cbar_thickness) and title positioning (title_x, title_y).

      • +
      +
    • +
    • Plotly Configuration:

      +
        +
      • Enhanced the configuration options to allow users to enable or disable zoom functionality (enable_zoom) in the interactive Plotly plots.

      • +
      • Updated the code to reflect these new parameters, allowing for greater flexibility in the appearance and interaction with the Plotly plots.

      • +
      +
    • +
    • Error Handling:

      +
        +
      • Added input validation for html_file_path and html_file_name to ensure these are provided when necessary based on the selected plot_type.

      • +
      +
    • +
    +
  • +
  • plot_2d_pdp Function:

    +
      +
    • Introduced file_prefix Parameter:

      +
        +
      • Added a new file_prefix parameter to allow users to specify a prefix for filenames when saving grid plots. This change streamlines the naming process for saved plots and improves file organization.

      • +
      +
    • +
    • Enhanced Plot Type Flexibility:

      +
        +
      • The plot_type parameter now includes an option to generate both grid and individual plots (both). This feature allows users to create a combination of both layout styles in one function call.

      • +
      • Updated input validation and logic to handle this new option effectively.

      • +
      +
    • +
    • Added save_plots Parameter:

      +
        +
      • Introduced a new parameter, save_plots, to control the saving of plots. Users can specify whether to save all plots, only individual plots, only grid plots, or none.

      • +
      +
    • +
    • Custom Margins and Layout Adjustments:

      +
        +
      • Included the save_plots parameter in the validation process to ensure paths are provided when needed for saving the plots.

      • +
      +
    • +
    +
  • +
+
    +
  1. Documentation Updates

  2. +
+
    +
  • Docstrings:

    +
      +
    • Updated docstrings for both functions to reflect the new parameters and enhancements, providing clearer and more comprehensive guidance for users.

    • +
    • Detailed the use of new parameters such as show_modebar, file_prefix, save_plots, and others, ensuring that the function documentation is up-to-date with the latest changes.

    • +
    +
  • +
+
    +
  1. Refactoring & Code Cleanup

  2. +
+
    +
  • Code Structure:

    +
      +
    • Improved the code structure to maintain clarity and readability, particularly around the new functionality.

    • +
    • Consolidated the layout configuration settings for the Plotly plots into a more flexible and user-friendly format, making it easier for users to customize their plots.

    • +
    +
  • +
+
+
+

Version 0.0.8b

+

Version 0.0.8b is an exact replica of version 0.0.8a. The purpose of this +beta release was to test whether releasing it as the latest version would update +its status on PyPI to reflect it as the latest release. However, it continues to +be identified as a pre-release on PyPI.

+
+
+

Version 0.0.8a

+

Version 0.0.8a introduces significant enhancements and new features to improve +the usability and functionality of the EDA Toolkit.

+

New Features:

+
    +
  1. Optional file_prefix in stacked_crosstab_plot Function

    +
      +
    • The stacked_crosstab_plot function has been updated to make the file_prefix argument optional. If the user does not provide a file_prefix, the function will now automatically generate a default prefix based on the col and func_col parameters. This change streamlines the process of generating plots by reducing the number of required arguments.

    • +
    • Key Improvement:

      +
        +
      • Users can now omit the file_prefix argument, and the function will still produce appropriately named plot files, enhancing ease of use.

      • +
      • Backward compatibility is maintained, allowing users who prefer to specify a custom file_prefix to continue doing so without any issues.

      • +
      +
    • +
    +
  2. +
  3. Introduction of 3D and 2D Partial Dependence Plot Functions

    +
      +
    • Two new functions, plot_3d_pdp and plot_2d_pdp, have been added to the toolkit, expanding the visualization capabilities for machine learning models.

      +
        +
      • plot_3d_pdp: Generates 3D partial dependence plots for two features, supporting both static visualizations (using Matplotlib) and interactive plots (using Plotly). The function offers extensive customization options, including labels, color maps, and saving formats.

      • +
      • plot_2d_pdp: Creates 2D partial dependence plots for specified features with flexible layout options (grid or individual plots) and customization of figure size, font size, and saving formats.

      • +
      +
    • +
    • Key Features:

      +
        +
      • Compatibility: Both functions are compatible with various versions of scikit-learn, ensuring broad usability.

      • +
      • Customization: Extensive options for customizing visual elements, including figure size, font size, and color maps.

      • +
      • Interactive 3D Plots: The plot_3d_pdp function supports interactive visualizations, providing an enhanced user experience for exploring model predictions in 3D space.

      • +
      +
    • +
    +
  4. +
+

Impact:

+
    +
  • These updates improve the user experience by reducing the complexity of function calls and introducing powerful new tools for model interpretation.

  • +
  • The optional file_prefix enhancement simplifies plot generation while maintaining the flexibility to define custom filenames.

  • +
  • The new partial dependence plot functions offer robust visualization options, making it easier to analyze and interpret the influence of specific features in machine learning models.

  • +
+
+
+

Version 0.0.7

+

Added Function for Customizable Correlation Matrix Visualization

+

This release introduces a new function, flex_corr_matrix, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to seaborn.heatmap().

+

Summary of Changes

+
    +
  • New Function: flex_corr_matrix.

    +
      +
    • Functionality: +- Generates a correlation heatmap for a given DataFrame. +- Supports both full and upper triangular correlation matrices based on the triangular parameter. +- Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. +- Accepts additional keyword arguments via **kwargs to pass directly to seaborn.heatmap(). +- Includes validation to ensure the triangular, annot, and save_plots parameters are boolean values. +- Raises an exception if save_plots=True but neither image_path_png nor image_path_svg is specified.

    • +
    +
  • +
+

Usage

+
# Full correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True)
+
+# Upper triangular correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True)
+
+
+

Contingency table df to object type

+

Convert all columns in the DataFrame to object type to prevent issues with numerical columns.

+
df = df.astype(str).fillna("")
+
+
+
+
+

Version 0.0.6

+

Added validation for Plot Type Parameter in KDE Distributions Function

+

This release adds a validation step for the plot_type parameter in the kde_distributions function. The allowed values for plot_type are "hist", "kde", and "both". If an invalid value is provided, the function will now raise a ValueError with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values.

+
# Validate plot_type parameter
+valid_plot_types = ["hist", "kde", "both"]
+if plot_type.lower() not in valid_plot_types:
+    raise ValueError(
+        f"Invalid plot_type value. Expected one of {valid_plot_types}, "
+        f"got '{plot_type}' instead."
+    )
+
+
+
+
+

Version 0.0.5

+

Ensure Consistent Font Size and Text Wrapping Across Plot Elements

+

This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the stacked_crosstab_plot function. The following updates have been implemented to ensure uniformity and improve the readability of plots:

+
    +
  1. Title Font Size and Text Wrapping: +- Added a text_wrap parameter to control the wrapping of plot titles. +- Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ax.set_title() after plot generation.

  2. +
  3. Legend Font Size Consistency: +- Incorporated label_fontsize into the legend font size by directly setting the font size of the legend text using plt.setp(legend.get_texts(), fontsize=label_fontsize). +- This ensures that the legend labels are consistent with the title and axis labels.

  4. +
+

Testing

+
    +
  • Verified that titles now wrap correctly and match the specified label_fontsize.

  • +
  • Confirmed that legend text scales according to label_fontsize, ensuring consistent font sizes across all plot elements.

  • +
+
+
+

Version 0.0.4

+
    +
  • Stable release

    +
      +
    • No new updates to the codebase.

    • +
    • Updated the project description variable in setup.py to re-emphasize key elements of the library.

    • +
    • Minor README cleanup:

      +
        +
      • Added icons for sections that did not have them.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.3

+
    +
  • Stable release

    +
      +
    • Updated logo size, fixed citation title, and made minor README cleanup:

      +
        +
      • Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.2

+
    +
  • +
    First stable release
      +
    • No new updates to the codebase; minimal documentation updates to README and setup.py files.

    • +
    • Added logo, badges, and Zenodo-certified citation to README.

    • +
    +
    +
    +
  • +
+
+
+

Version 0.0.1rc0

+
    +
  • No new updates to the codebase; minimal documentation updates to README and setup.py files.

  • +
+
+
+

Version 0.0.1b0

+

New Scatter Fit Plot and Additional Updates

+
    +
  • Added new scatter_fit_plot(), removed unused data_types(), and added comment section headers.

  • +
+

Added xlim and ylim Inputs to KDE Distribution

+
    +
  • kde_distribution():

    +
    +
      +
    • Added xlim and ylim inputs to allow users to customize axes limits in kde_distribution().

    • +
    +
    +
  • +
+

Added xlim and ylim Params to Stacked Crosstab Plot

+
    +
  • stacked_crosstab_plot():

    +
    +
      +
    • Added xlim and ylim input parameters to stacked_crosstab_plot() to give users more flexibility in controlling axes limits.

    • +
    +
    +
  • +
+

Added x and y Limits to Box and Violin Plots

+
    +
  • box_violin_plot():

    +
    +
      +
    • Changed function name from metrics_box_violin() to box_violin_plot().

    • +
    • Added xlim and ylim inputs to control x and y-axis limits of box_violin_plot() (formerly metrics_box_violin).

    • +
    +
    +
  • +
+

Added Ability to Remove Stacks from Plots, Plot All or One at a Time

+

Key Changes

+
    +
  1. Plot Type Parameter +- plot_type: This parameter allows the user to choose between "regular", "normalized", or "both" plot types.

  2. +
  3. Remove Stacks Parameter +- remove_stacks: This parameter, when set to True, generates a regular bar plot using only the col parameter instead of a stacked bar plot. It only works when plot_type is set to “regular”. If remove_stacks is set to True while plot_type is anything other than “regular”, the function will raise an exception.

  4. +
+

Explanation of Changes

+
    +
  • Plot Type Parameter

    +
      +
    • Provides flexibility to the user, allowing specification of the type of plot to generate:

      +
        +
      • "regular": Standard bar plot.

      • +
      • "normalized": Normalized bar plot.

      • +
      • "both": Both regular and normalized bar plots.

      • +
      +
    • +
    +
  • +
  • Remove Stacks Parameter +- remove_stacks: Generates a regular bar plot using only the col parameter, removing the stacking of the bars. Applicable only when plot_type is set to “regular”. An exception is raised if used with any other plot_type.

  • +
+

These changes enhance the flexibility and functionality of the stacked_crosstab_plot function, allowing for more customizable and specific plot generation based on user requirements.

+
+
+

Version 0.0.1b0

+

Refined KDE Distributions

+

Key Changes

+
    +
  1. Alpha Transparency for Histogram Fill +- Added a fill_alpha parameter to control the transparency of the histogram bars’ fill color. +- Default value is 0.6. An exception is raised if fill=False and fill_alpha is specified.

  2. +
  3. Custom Font Sizes +- Introduced label_fontsize and tick_fontsize parameters to control font size of axis labels and tick marks independently.

  4. +
  5. Scientific Notation Toggle +- Added a disable_sci_notation parameter to enable or disable scientific notation on axes.

  6. +
  7. Improved Error Handling +- Added validation for the stat parameter to ensure valid options are accepted. +- Added checks for proper usage of fill_alpha and hist_edgecolor when fill is set to False.

  8. +
  9. General Enhancements +- Updated the function’s docstring to reflect new parameters and provide comprehensive guidance on usage.

  10. +
+
+
+

Version 0.0.1b0

+

Enhanced KDE Distributions Function

+

Added Parameters

+
    +
  1. Grid Figsize and Single Figsize +- Control the size of the overall grid figure and individual figures separately.

  2. +
  3. Hist Color and KDE Color` +- Allow customization of histogram and KDE plot colors.

  4. +
  5. Edge Color +- Allows customization of histogram bar edges.

  6. +
  7. Hue +- Allows grouping data by a column.

  8. +
  9. Fill +- Controls whether to fill histogram bars with color.

  10. +
  11. Y-axis Label` +- Customizable y-axis label.

  12. +
  13. Log-Scaling +- Specifies which variables to apply log scale.

  14. +
  15. Bins and Bin Width +- Control the number and width of bins.

  16. +
  17. ``stat``: +- Allows different statistics for the histogram (count, density, frequency, probability, proportion, percent).

  18. +
+

Improvements

+
    +
  1. Validation and Error Handling +- Checks for invalid log_scale_vars and throws a ValueError if any are found. +- Throws a ValueError if edgecolor is changed while fill is set to False. +- Issues a PerformanceWarning if both bins and binwidth are specified, warning of potential performance impacts.

  2. +
  3. Customizable Y-Axis Label +- Allows users to specify custom y-axis labels.

  4. +
  5. Warning for KDE with Count +- Issues a warning if KDE is used with stat='count', as it may produce misleading plots.

  6. +
+

Updated Function to Ensure Unique IDs and Index Check

+
    +
  • Ensured that each generated ID in add_ids starts with a non-zero digit.

  • +
  • Added a check to verify that the DataFrame index is unique.

  • +
  • Printed a warning message if duplicate index entries are found.

  • +
+

These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique.

+

Check for Unique Indices +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries.

+

Generate Non-Zero Starting IDs

+
    +
  • The ID generation process is updated to ensure that the first digit of each ID is always non-zero.

  • +
+

Ensure Unique IDs

+
    +
  • A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame.

  • +
+

Fix Int Conversion for Numeric Columns, Reset Decimal Places

+
    +
  • Fixed integer conversion issue for numeric columns when decimal_places=0 in the save_dataframes_to_excel function.

  • +
  • Reset decimal_places default value to 0.

  • +
+

These changes ensure correct formatting and avoid errors during conversion.

+

Contingency Table Updates

+
    +
  1. Error Handling for Columns +- Added a check to ensure at least one column is specified. +- Updated the function to accept a single column as a string or multiple columns as a list. +- Raised a ValueError if no columns are provided or if cols is not correctly specified.

  2. +
  3. Function Parameters +- Changed parameters from col1 and col2 to a single parameter cols which can be either a string or a list.

  4. +
  5. Error Handling +- Renamed SortBy to sort_by to standardize nomenclature. +- Added a check to ensure sort_by is either 0 or 1. +- Raised a ValueError if sort_by is not 0 or 1.

  6. +
+
    +
  1. Sorting Logic +- Updated the sorting logic to handle the new cols parameter structure.

  2. +
  3. Handling Categorical Data +- Modified code to convert categorical columns to strings to avoid issues with fillna("").

  4. +
  5. Handling Missing Values +- Added df = df.fillna('') to fill NA values within the function to account for missing data.

  6. +
  7. Improved Function Documentation +- Updated function documentation to reflect new parameters and error handling.

  8. +
+
+
+

Version 0.0.1b0

+

Contingency Table Updates

+
    +
  • fillna('') added to output so that null values come through, removed 'All' column name from output, sort options 0 and 1, updated docstring documentation. Tested successfully on Python 3.7.3.

  • +
+

Compatibility Enhancement

+
    +
  1. Added a version check for Python 3.7 and above.

    +
      +
    • Conditional import of datetime to handle different Python versions.

    • +
    +
  2. +
+
if sys.version_info >= (3, 7):
+    from datetime import datetime
+else:
+    import datetime
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/citations.html b/_build/html/v0.0.11/citations.html new file mode 100644 index 000000000..38b11e61a --- /dev/null +++ b/_build/html/v0.0.11/citations.html @@ -0,0 +1,156 @@ + + + + + + + + + Citing EDA Toolkit — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Citing EDA Toolkit

+

Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.11). Zenodo. https://doi.org/10.5281/zenodo.13163208

+
@software{shpaner_2024_13162633,
+author       = {Shpaner, Leonid and
+                Gil, Oscar},
+title        = {EDA Toolkit},
+month        = aug,
+year         = 2024,
+publisher    = {Zenodo},
+version      = {0.0.11},
+doi          = {10.5281/zenodo.13162633},
+url          = {https://doi.org/10.5281/zenodo.13162633}
+}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/contributors.html b/_build/html/v0.0.11/contributors.html new file mode 100644 index 000000000..807c5ffd3 --- /dev/null +++ b/_build/html/v0.0.11/contributors.html @@ -0,0 +1,148 @@ + + + + + + + + + Contributors/Maintainers — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Contributors/Maintainers

+
https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + +

Leonid Shpaner is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego’s M.S. Applied Artificial Intelligence program.

+


https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + +

Oscar Gil is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/data_management.html b/_build/html/v0.0.11/data_management.html new file mode 100644 index 000000000..9e43ba344 --- /dev/null +++ b/_build/html/v0.0.11/data_management.html @@ -0,0 +1,1502 @@ + + + + + + + + + Data Management Overview — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Data Management Overview

+

In any data-driven project, effective management of data is crucial. This +section provides essential techniques for handling and preparing data to ensure +consistency, accuracy, and ease of analysis. From directory setup and data +cleaning to advanced data processing, these methods form the backbone of reliable +data management. Dive into the following topics to enhance your data handling +capabilities and streamline your workflow.

+
+
+

Data Management Techniques

+
+

Path directories

+

Ensure that the directory exists. If not, create it.

+
+
+ensure_directory(path)
+
+
Parameters:
+

path (str) – The path to the directory that needs to be ensured.

+
+
Returns:
+

None

+
+
+
+ +

The ensure_directory function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories.

+

Example Usage

+

In the example below, we demonstrate how to use the ensure_directory function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them.

+

First, we define the base path as the parent directory of the current directory. +The os.pardir constant, equivalent to ".."", is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory.

+

Next, we set paths for the PNG and SVG image directories, located within an +images folder in the parent directory. Using the ensure_directory +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them.

+
from eda_toolkit import ensure_directory
+
+import os # import operating system for dir
+
+
+base_path = os.path.join(os.pardir)
+
+# Go up one level from 'notebooks' to parent directory,
+# then into the 'data' folder
+data_path = os.path.join(os.pardir, "data")
+data_output = os.path.join(os.pardir, "data_output")
+
+# create image paths
+image_path_png = os.path.join(base_path, "images", "png_images")
+image_path_svg = os.path.join(base_path, "images", "svg_images")
+
+# Use the function to ensure'data' directory exists
+ensure_directory(data_path)
+ensure_directory(data_output)
+ensure_directory(image_path_png)
+ensure_directory(image_path_svg)
+
+
+

Output

+
Created directory: ../data
+Created directory: ../data_output
+Created directory: ../images/png_images
+Created directory: ../images/svg_images
+
+
+
+
+

Adding Unique Identifiers

+

Add a column of unique IDs with a specified number of digits to the dataframe.

+
+
+add_ids(df, id_colname='ID', num_digits=9, seed=None, set_as_index=True)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The dataframe to add IDs to.

  • +
  • id_colname (str, optional) – The name of the new column for the IDs. Defaults to "ID".

  • +
  • num_digits (int, optional) – The number of digits for the unique IDs. Defaults to 9.

  • +
  • seed (int, optional) – The seed for the random number generator. Defaults to None.

  • +
  • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

  • +
+
+
Returns:
+

The updated dataframe with the new ID column.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+

Note

+
    +
  • If the dataframe index is not unique, a warning is printed.

  • +
  • +
    The function does not check if the number of rows exceeds the number of

    unique IDs that can be generated with the specified number of digits.

    +
    +
    +
  • +
  • The first digit of the generated IDs is ensured to be non-zero.

  • +
+
+

The add_ids function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe.

+

Example Usage

+

In the example below, we demonstrate how to use the add_ids function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the add_ids function to generate +and append a column of unique IDs with a specified number of digits to the dataframe.

+

First, we import the pandas library and the add_ids function from the eda_toolkit. +Then, we create a sample dataframe with some data. We call the add_ids function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe.

+
from eda_toolkit import add_ids
+
+# Add a column of unique IDs with 9 digits and call it "census_id"
+df = add_ids(
+    df=df,
+    id_colname="census_id",
+    num_digits=9,
+    seed=111,
+    set_as_index=True,
+)
+
+
+

Output

+

First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
DataFrame index is unique.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+

+
+
+

Trailing Period Removal

+

Strip the trailing period from floats in a specified column of a DataFrame, if present.

+
+
+strip_trailing_period(df, column_name)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The DataFrame containing the column to be processed.

  • +
  • column_name (str) – The name of the column containing floats with potential trailing periods.

  • +
+
+
Returns:
+

The updated DataFrame with the trailing periods removed from the specified column.

+
+
Return type:
+

pd.DataFrame

+
+
+

The strip_trailing_period function is designed to remove trailing periods +from float values in a specified column of a DataFrame. This can be particularly +useful when dealing with data that has been inconsistently formatted, ensuring +that all float values are correctly represented.

+
+ +

Example Usage

+

In the example below, we demonstrate how to use the strip_trailing_period function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the strip_trailing_period function to remove any trailing periods from the specified column.

+
from eda_toolkit import strip_trailing_period
+
+# Create a sample dataframe with trailing periods in some values
+data = {
+    "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.],
+}
+df = pd.DataFrame(data)
+
+# Remove trailing periods from the 'values' column
+df = strip_trailing_period(df=df, column_name="values")
+
+
+

Output

+

First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)

+ + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +

+

Note: The last row shows 6 as an int with a trailing period with its conversion to float.

+

+
+
+

Standardized Dates

+

Parse and standardize date strings based on the provided rule.

+
+
+parse_date_with_rule(date_str)
+

This function takes a date string and standardizes it to the ISO 8601 format +(YYYY-MM-DD). It assumes dates are provided in either day/month/year or +month/day/year format. The function first checks if the first part of the +date string (day or month) is greater than 12, which unambiguously indicates +a day/month/year format. If the first part is 12 or less, the function +attempts to parse the date as month/day/year, falling back to day/month/year +if the former raises a ValueError due to an impossible date (e.g., month +being greater than 12).

+
+
Parameters:
+

date_str (str) – A date string to be standardized.

+
+
Returns:
+

A standardized date string in the format YYYY-MM-DD.

+
+
Return type:
+

str

+
+
Raises:
+

ValueError – If date_str is in an unrecognized format or if the function +cannot parse the date.

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the parse_date_with_rule +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the parse_date_with_rule +function to parse and standardize each date string to the ISO 8601 format.

+
from eda_toolkit import parse_date_with_rule
+
+# Sample date strings
+date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"]
+
+# Standardize the date strings
+standardized_dates = [parse_date_with_rule(date) for date in date_strings]
+
+print(standardized_dates)
+
+
+

Output

+
['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12']
+
+
+
+

Important

+

In the next example, we demonstrate how to apply the parse_date_with_rule +function to a DataFrame column containing date strings using the .apply() method. +This is particularly useful when you need to standardize date formats across an +entire column in a DataFrame.

+
+
# Creating the DataFrame
+data = {
+    "date_column": [
+        "31/12/2021",
+        "01/01/2022",
+        "12/31/2021",
+        "13/02/2022",
+        "07/04/2022",
+    ],
+    "name": ["Alice", "Bob", "Charlie", "David", "Eve"],
+    "amount": [100.0, 150.5, 200.75, 250.25, 300.0],
+}
+
+df = pd.DataFrame(data)
+
+# Apply the function to the DataFrame column
+df["standardized_date"] = df["date_column"].apply(parse_date_with_rule)
+
+print(df)
+
+
+

Output

+
   date_column     name  amount standardized_date
+0   31/12/2021    Alice  100.00        2021-12-31
+1   01/01/2022      Bob  150.50        2022-01-01
+2   12/31/2021  Charlie  200.75        2021-12-31
+3   13/02/2022    David  250.25        2022-02-13
+4   07/04/2022      Eve  300.00        2022-04-07
+
+
+
+
+

DataFrame Analysis

+

Analyze DataFrame columns, including dtype, null values, and unique value counts.

+
+
+dataframe_columns(df, background_color=None, return_df=False)
+

Analyze DataFrame columns to provide summary statistics such as data type, +null counts, unique values, and most frequent values.

+

This function analyzes the columns of a DataFrame, providing details about the data type, +the number and percentage of null values, the total number of unique values, and the most +frequent unique value along with its count and percentage. It handles special cases such as +converting date columns and replacing empty strings with Pandas NA values.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • background_color (str, optional) – Hex color code or color name for background styling in the output +DataFrame. Defaults to None.

  • +
  • return_df (bool, optional) – If True, returns the plain DataFrame with the summary statistics. If +False, returns a styled DataFrame for visual presentation. Defaults to False.

  • +
+
+
Returns:
+

If return_df is True, returns the plain DataFrame containing column summary +statistics. If return_df is False, returns a styled DataFrame with optional +background color for specific columns.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +
+

Census Income Example

+

In the example below, we demonstrate how to use the dataframe_columns +function to analyze a DataFrame’s columns.

+
from eda_toolkit import dataframe_columns
+
+dataframe_columns(df=df)
+
+
+

Output

+

Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
Shape:  (48842, 16)
+
+Total seconds of processing time: 0.861555
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+

+
+
+

DataFrame Column Names

+
+
unique_values_total

This column indicates the total number of unique values present in each column of the DataFrame. It measures the distinct values that a column holds. For example, in the age column, there are 74 unique values, meaning the ages vary across 74 distinct entries.

+
+
max_unique_value

This column shows the most frequently occurring value in each column. For example, in the workclass column, the most common value is Private, indicating that this employment type is the most represented in the dataset. For numeric columns like capital-gain and capital-loss, the most common value is 0, which suggests that the majority of individuals have no capital gain or loss.

+
+
max_unique_value_total

This represents the count of the most frequently occurring value in each column. For instance, in the native-country column, the value United-States appears 43,832 times, indicating that the majority of individuals in the dataset are from the United States.

+
+
max_unique_value_pct

This column shows the percentage that the most frequent value constitutes of the total number of rows. For example, in the race column, the value White makes up 85.5% of the data, suggesting a significant majority of the dataset belongs to this racial group.

+
+
+
+
+

Calculation Details

+
    +
  • unique_values_total is calculated using the nunique() function, which counts the number of unique values in a column.

  • +
  • max_unique_value is determined by finding the value with the highest frequency using value_counts(). For string columns, any missing values (if present) are replaced with the string "null" before computing the frequency.

  • +
  • max_unique_value_total is the frequency count of the max_unique_value.

  • +
  • max_unique_value_pct is the percentage of max_unique_value_total divided by the total number of rows in the DataFrame, providing an idea of how dominant the most frequent value is.

  • +
+

This analysis helps in identifying columns with a high proportion of dominant values, like <=50K in the income column, which appears 24,720 times, making up 50.61% of the entries. This insight can be useful for understanding data distributions, identifying potential data imbalances, or even spotting opportunities for feature engineering in further data processing steps.

+
+
+
+

Generating Summary Tables for Variable Combinations

+

This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.

+
+
+summarize_all_combinations(df, variables, data_path, data_name, min_length=2)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The pandas DataFrame containing the data.

  • +
  • variables (list of str) – List of column names from the DataFrame to generate combinations.

  • +
  • data_path (str) – Path where the output Excel file will be saved.

  • +
  • data_name (str) – Name of the output Excel file.

  • +
  • min_length (int, optional) – Minimum size of the combinations to generate. Defaults to 2.

  • +
+
+
Returns:
+

A tuple containing a dictionary of summary tables and a list of all generated combinations.

+
+
Return type:
+

tuple(dict, list)

+
+
+
+ +
+

Note

+
    +
  • +
    The function will create an Excel file with a sheet for each combination

    of the specified variables, as well as a “Table of Contents” sheet with +hyperlinks to each summary table.

    +
    +
    +
  • +
  • The sheet names are limited to 31 characters due to Excel’s constraints.

  • +
+
+

The function returns two outputs:

+

1. summary_tables: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values.

+

2. all_combinations: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables.

+

Example Usage

+

Below, we use the summarize_all_combinations function to generate summary tables for the specified +variables from a DataFrame containing the census data [1].

+
from eda_toolkit import summarize_all_combinations
+
+# Define unique variables for the analysis
+unique_vars = [
+    "age_group",
+    "workclass",
+    "education",
+    "occupation",
+    "race",
+    "sex",
+    "income",
+]
+
+# Generate summary tables for all combinations of the specified variables
+summary_tables, all_combinations = summarize_all_combinations(
+    df=df,
+    data_path=data_output,
+    variables=unique_vars,
+    data_name="census_summary_tables.xlsx",
+)
+
+# Print all combinations of variables
+print(all_combinations)
+
+
+

Output

+
[('age_group', 'workclass'),
+('age_group', 'education'),
+('age_group', 'occupation'),
+('age_group', 'race'),
+('age_group', 'sex'),
+('age_group', 'income'),
+('workclass', 'education'),
+('workclass', 'occupation'),
+('workclass', 'race'),
+('workclass', 'sex'),
+('workclass', 'income'),
+('education', 'occupation'),
+('education', 'race'),
+('education', 'sex'),
+('education', 'income'),
+('occupation', 'race'),
+('occupation', 'sex'),
+('occupation', 'income'),
+('race', 'sex'),
+('race', 'income'),
+('sex', 'income'),
+('age_group', 'workclass', 'education'),
+('age_group', 'workclass', 'occupation'),
+('age_group', 'workclass', 'race'),
+('age_group', 'workclass', 'sex'),
+('age_group', 'workclass', 'income'),
+('age_group', 'education', 'occupation'),
+('age_group', 'education', 'race'),
+('age_group', 'education', 'sex'),
+('age_group', 'education', 'income'),
+('age_group', 'occupation', 'race'),
+('age_group', 'occupation', 'sex'),
+('age_group', 'occupation', 'income'),
+('age_group', 'race', 'sex'),
+('age_group', 'race', 'income'),
+('age_group', 'sex', 'income'),
+('workclass', 'education', 'occupation'),
+('workclass', 'education', 'race'),
+('workclass', 'education', 'sex'),
+('workclass', 'education', 'income'),
+('workclass', 'occupation', 'race'),
+('workclass', 'occupation', 'sex'),
+('workclass', 'occupation', 'income'),
+('workclass', 'race', 'sex'),
+('workclass', 'race', 'income'),
+('workclass', 'sex', 'income'),
+('education', 'occupation', 'race'),
+('education', 'occupation', 'sex'),
+('education', 'occupation', 'income'),
+('education', 'race', 'sex'),
+('education', 'race', 'income'),
+('education', 'sex', 'income'),
+('occupation', 'race', 'sex'),
+('occupation', 'race', 'income'),
+('occupation', 'sex', 'income'),
+('race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation'),
+('age_group', 'workclass', 'education', 'race'),
+('age_group', 'workclass', 'education', 'sex'),
+('age_group', 'workclass', 'education', 'income'),
+('age_group', 'workclass', 'occupation', 'race'),
+('age_group', 'workclass', 'occupation', 'sex'),
+('age_group', 'workclass', 'occupation', 'income'),
+('age_group', 'workclass', 'race', 'sex'),
+('age_group', 'workclass', 'race', 'income'),
+('age_group', 'workclass', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race'),
+('age_group', 'education', 'occupation', 'sex'),
+('age_group', 'education', 'occupation', 'income'),
+('age_group', 'education', 'race', 'sex'),
+('age_group', 'education', 'race', 'income'),
+('age_group', 'education', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex'),
+('age_group', 'occupation', 'race', 'income'),
+('age_group', 'occupation', 'sex', 'income'),
+('age_group', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race'),
+('workclass', 'education', 'occupation', 'sex'),
+('workclass', 'education', 'occupation', 'income'),
+('workclass', 'education', 'race', 'sex'),
+('workclass', 'education', 'race', 'income'),
+('workclass', 'education', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex'),
+('workclass', 'occupation', 'race', 'income'),
+('workclass', 'occupation', 'sex', 'income'),
+('workclass', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex'),
+('education', 'occupation', 'race', 'income'),
+('education', 'occupation', 'sex', 'income'),
+('education', 'race', 'sex', 'income'),
+('occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race'),
+('age_group', 'workclass', 'education', 'occupation', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'race', 'income'),
+('age_group', 'workclass', 'education', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'education', 'occupation', 'race', 'income'),
+('age_group', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'education', 'race', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex'),
+('workclass', 'education', 'occupation', 'race', 'income'),
+('workclass', 'education', 'occupation', 'sex', 'income'),
+('workclass', 'education', 'race', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex', 'income'),
+('age_group',
+'workclass',
+'education',
+'occupation',
+'race',
+'sex',
+'income')]
+
+
+

When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table.

+
EDA Toolkit Logo + +
+
+

Saving DataFrames to Excel with Customized Formatting

+

Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.

+

This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the save_dataframes_to_excel function.

+
+
+save_dataframes_to_excel(file_path, df_dict, decimal_places=0)
+
+
Parameters:
+
    +
  • file_path (str) – Full path to the output Excel file.

  • +
  • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

  • +
  • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

  • +
+
+
+
+ +
+

Note

+
    +
  • The function will autofit columns and left-align text.

  • +
  • Numeric columns will be formatted with the specified number of decimal places.

  • +
  • Headers will be bold and left-aligned without borders.

  • +
+
+

The function performs the following tasks:

+
    +
  • Writes each DataFrame to its respective sheet in the Excel file.

  • +
  • Rounds numeric columns to the specified number of decimal places.

  • +
  • Applies customized formatting to headers and cells.

  • +
  • Autofits columns based on the content length.

  • +
+

Example Usage

+

Below, we use the save_dataframes_to_excel function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between 18 and 40.

+
from eda_toolkit import save_dataframes_to_excel
+
+# Example usage
+file_name = "df_census.xlsx"  # Name of the output Excel file
+file_path = os.path.join(data_path, file_name)
+
+# filter DataFrame to Ages 18-40
+filtered_df = df[(df["age"] > 18) & (df["age"] < 40)]
+
+df_dict = {
+    "original_df": df,
+    "ages_18_to_40": filtered_df,
+}
+
+save_dataframes_to_excel(
+    file_path=file_path,
+    df_dict=df_dict,
+    decimal_places=0,
+)
+
+
+

Output

+

The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between 18 and 40, each on separate sheets with customized formatting.

+
+
+

Creating Contingency Tables

+

Create a contingency table from one or more columns in a DataFrame, with sorting options.

+

This section explains how to create contingency tables from one or more columns in a DataFrame, with options to sort the results using the contingency_table function.

+
+
+contingency_table(df, cols=None, sort_by=0)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • cols (str or list of str, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

  • +
  • sort_by (int, optional) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order. Defaults to 0.

  • +
+
+
Raises:
+

ValueError – If no columns are specified or if sort_by is not 0 or 1.

+
+
Returns:
+

A DataFrame containing the contingency table with the specified columns, a 'Total' column representing the count of occurrences, and a 'Percentage' column representing the percentage of the total count.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

Below, we use the contingency_table function to create a contingency table +from the specified columns in a DataFrame containing census data [1]

+
from eda_toolkit import contingency_table
+
+# Example usage
+contingency_table(
+    df=df,
+    cols=[
+        "age_group",
+        "workclass",
+        "race",
+        "sex",
+    ],
+    sort_by=1,
+)
+
+
+

Output

+

The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the 'Total' column in descending order because sort_by +is set to 1.

+
    age_group     workclass                race     sex  Total  Percentage
+0       30-39       Private               White    Male   5856       11.99
+1       18-29       Private               White    Male   5623       11.51
+2       40-49       Private               White    Male   4267        8.74
+3       18-29       Private               White  Female   3680        7.53
+4       50-59       Private               White    Male   2565        5.25
+..        ...           ...                 ...     ...    ...         ...
+467     50-59   Federal-gov               Other    Male      1        0.00
+468     50-59     Local-gov  Asian-Pac-Islander  Female      1        0.00
+469     70-79  Self-emp-inc               Black    Male      1        0.00
+470     80-89     Local-gov  Asian-Pac-Islander    Male      1        0.00
+471                                                      48842      100.00
+
+[472 rows x 6 columns]
+
+
+

+
+
+

Highlighting Specific Columns in a DataFrame

+

This section explains how to highlight specific columns in a DataFrame using the highlight_columns function.

+

Highlight specific columns in a DataFrame with a specified background color.

+
+
+highlight_columns(df, columns, color='yellow')
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to be styled.

  • +
  • columns (list of str) – List of column names to be highlighted.

  • +
  • color (str, optional) – The background color to be applied for highlighting (default is “yellow”).

  • +
+
+
Returns:
+

A Styler object with the specified columns highlighted.

+
+
Return type:
+

pandas.io.formats.style.Styler

+
+
+
+ +

Example Usage

+

Below, we use the highlight_columns function to highlight the age and education +columns in the first 5 rows of the census [1] DataFrame with a pink background color.

+
from eda_toolkit import highlight_columns
+
+# Applying the highlight function
+highlighted_df = highlight_columns(
+    df=df,
+    columns=["age", "education"],
+    color="#F8C5C8",
+)
+
+highlighted_df
+
+
+

Output

+

The output will be a DataFrame with the specified columns highlighted in the given background color. +The age and education columns will be highlighted in pink.

+

The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the .render() method of the Styler object.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife

+
+
+

Binning Numerical Columns

+

Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or “bins.” This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or “bins,” and +then assigning each value to one of these intervals.

+
+

Note

+

The code snippets below create age bins and assign a corresponding age group +label to each age in the DataFrame. The pd.cut function from pandas is used to +categorize the ages and assign them to a new column, age_group. Adjust the bins +and labels as needed for your specific data.

+
+

Below, we use the age column of the census data [1] from the UCI Machine Learning Repository as an example:

+
    +
  1. Bins Definition: +The bins are defined by specifying the boundaries of each interval. For example, +in the code snippet below, the bin_ages list specifies the boundaries for age groups:

    +
    bin_ages = [
    +    0,
    +    18,
    +    30,
    +    40,
    +    50,
    +    60,
    +    70,
    +    80,
    +    90,
    +    100,
    +    float("inf"),
    +]
    +
    +
    +

    Each pair of consecutive elements in bin_ages defines a bin. For example:

    +
      +
    • The first bin is [0, 18),

    • +
    • The second bin is [18, 30),

    • +
    • and so on.

    • +
    +
  2. +
+

+
    +
  1. Labels for Bins: +The label_ages list provides labels corresponding to each bin:

    +
    label_ages = [
    +    "< 18",
    +    "18-29",
    +    "30-39",
    +    "40-49",
    +    "50-59",
    +    "60-69",
    +    "70-79",
    +    "80-89",
    +    "90-99",
    +    "100 +",
    +]
    +
    +
    +

    These labels are used to categorize the numerical values into meaningful groups.

    +
  2. +
  3. Applying the Binning: +The pd.cut function +from Pandas is used to apply the binning process. For each value in the age +column of the DataFrame, it assigns a corresponding label based on which bin the +value falls into. Here, right=False indicates that each bin includes the +left endpoint but excludes the right endpoint. For example, if bin_ages = +[0, 10, 20, 30], then a value of 10 will fall into the bin [10, 20) and +be labeled accordingly.

    +
    df["age_group"] = pd.cut(
    +    df["age"],
    +    bins=bin_ages,
    +    labels=label_ages,
    +    right=False,
    +)
    +
    +
    +

    Mathematically, for a given value x in the age column:

    +
    +\[\begin{split}\text{age_group} = +\begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 +\end{cases}\end{split}\]
    +

    The parameter right=False in pd.cut means that the bins are left-inclusive +and right-exclusive, except for the last bin, which is always right-inclusive +when the upper bound is infinity (float("inf")).

    +
  4. +
+ +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/eda_plots.html b/_build/html/v0.0.11/eda_plots.html new file mode 100644 index 000000000..e20001aed --- /dev/null +++ b/_build/html/v0.0.11/eda_plots.html @@ -0,0 +1,2084 @@ + + + + + + + + + Plotting and Theoretical Overview — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Plotting and Theoretical Overview

+
+

Gaussian Assumption for Normality

+

The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF):

+
+\[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)\]
+

where:

+
    +
  • \(\mu\) is the mean

  • +
  • \(\sigma^2\) is the variance

  • +
+

In a normally distributed dataset:

+
    +
  • 68% of data falls within \(\mu \pm \sigma\)

  • +
  • 95% within \(\mu \pm 2\sigma\)

  • +
  • 99.7% within \(\mu \pm 3\sigma\)

  • +
+
KDE Distributions - KDE (+) Histograms (Density) + +
+

Histograms and Kernel Density Estimation (KDE)

+

Histograms:

+
    +
  • Visualize data distribution by binning values and counting frequencies.

  • +
  • If data is Gaussian, the histogram approximates a bell curve.

  • +
+

KDE:

+
    +
  • A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function.

  • +
  • The KDE for a dataset \(X = \{x_1, x_2, \ldots, x_n\}\) is given by:

  • +
+
+\[\hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right)\]
+

where:

+
    +
  • \(K\) is the kernel function (often Gaussian)

  • +
  • \(h\) is the bandwidth (smoothing parameter)

  • +
+Combined Use of Histograms and KDE

+
    +
  • Histograms offer a discrete, binned view of the data.

  • +
  • KDE provides a smooth, continuous estimate of the underlying distribution.

  • +
  • Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality.

  • +
+
+
+
+

Pearson Correlation Coefficient

+

The Pearson correlation coefficient, often denoted as \(r\), is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from \(-1\) to \(1\), where:

+
    +
  • \(r = 1\) indicates a perfect positive linear relationship.

  • +
  • \(r = -1\) indicates a perfect negative linear relationship.

  • +
  • \(r = 0\) indicates no linear relationship.

  • +
+

The Pearson correlation coefficient between two variables \(X\) and \(Y\) is defined as:

+
+\[r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y}\]
+

where:

+
    +
  • \(\text{Cov}(X, Y)\) is the covariance of \(X\) and \(Y\).

  • +
  • \(\sigma_X\) is the standard deviation of \(X\).

  • +
  • \(\sigma_Y\) is the standard deviation of \(Y\).

  • +
+

Covariance measures how much two variables change together. It is defined as:

+
+\[\text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)\]
+

where:

+
    +
  • \(n\) is the number of data points.

  • +
  • \(X_i\) and \(Y_i\) are the individual data points.

  • +
  • \(\mu_X\) and \(\mu_Y\) are the means of \(X\) and \(Y\).

  • +
+

The standard deviation measures the dispersion or spread of a set of values. For +a variable \(X\), the standard deviation \(\sigma_X\) is:

+
+\[\sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2}\]
+

Substituting the covariance and standard deviation into the Pearson correlation formula:

+
+\[r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}}\]
+

This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between \(X\) and \(Y\).

+
    +
  • \(r > 0\): Positive correlation. As \(X\) increases, \(Y\) tends to increase.

  • +
  • \(r < 0\): Negative correlation. As \(X\) increases, \(Y\) tends to decrease.

  • +
  • \(r = 0\): No linear correlation. There is no consistent linear relationship between \(X\) and \(Y\).

  • +
+

The closer the value of \(r\) is to \(\pm 1\), the stronger the linear relationship between the two variables.

+
+
+

Partial Dependence Foundations

+

Let \(\mathbf{X}\) represent the complete set of input features for a machine +learning model, where \(\mathbf{X} = \{X_1, X_2, \dots, X_p\}\). Suppose we’re +particularly interested in a subset of these features, denoted by \(\mathbf{X}_S\). +The complementary set, \(\mathbf{X}_C\), contains all the features in \(\mathbf{X}\) +that are not in \(\mathbf{X}_S\). Mathematically, this relationship is expressed as:

+
+\[\mathbf{X}_C = \mathbf{X} \setminus \mathbf{X}_S\]
+

where \(\mathbf{X}_C\) is the set of features in \(\mathbf{X}\) after +removing the features in \(\mathbf{X}_S\).

+

Partial Dependence Plots (PDPs) are used to illustrate the effect of the features +in \(\mathbf{X}_S\) on the model’s predictions, while averaging out the +influence of the features in \(\mathbf{X}_C\). This is mathematically defined as:

+
+\[\begin{split}\begin{align*} +\text{PD}_{\mathbf{X}_S}(x_S) &= \mathbb{E}_{\mathbf{X}_C} \left[ f(x_S, \mathbf{X}_C) \right] \\ +&= \int f(x_S, x_C) \, p(x_C) \, dx_C \\ +&= \int \left( \int f(x_S, x_C) \, p(x_C \mid x_S) \, dx_C \right) p(x_S) \, dx_S +\end{align*}\end{split}\]
+

where:

+
    +
  • \(\mathbb{E}_{\mathbf{X}_C} \left[ \cdot \right]\) indicates that we are taking the expected value over the possible values of the features in the set \(\mathbf{X}_C\).

  • +
  • \(p(x_C)\) represents the probability density function of the features in \(\mathbf{X}_C\).

  • +
+

This operation effectively summarizes the model’s output over all potential values of the complementary features, providing a clear view of how the features in \(\mathbf{X}_S\) alone impact the model’s predictions.

+

2D Partial Dependence Plots

+

Consider a trained machine learning model 2D Partial Dependence Plots \(f(\mathbf{X})\), where \(\mathbf{X} = (X_1, X_2, \dots, X_p)\) represents the vector of input features. The partial dependence of the predicted response \(\hat{y}\) on a single feature \(X_j\) is defined as:

+
+\[\text{PD}(X_j) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, \mathbf{X}_{C_i})\]
+

where:

+
    +
  • \(X_j\) is the feature of interest.

  • +
  • \(\mathbf{X}_{C_i}\) represents the complement set of \(X_j\), meaning the remaining features in \(\mathbf{X}\) not included in \(X_j\) for the \(i\)-th instance.

  • +
  • \(n\) is the number of observations in the dataset.

  • +
+

For two features, \(X_j\) and \(X_k\), the partial dependence is given by:

+
+\[\text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i})\]
+

This results in a 2D surface plot (or contour plot) that shows how the predicted outcome changes as the values of \(X_j\) and \(X_k\) vary, while the effects of the other features are averaged out.

+
    +
  • Single Feature PDP: When plotting \(\text{PD}(X_j)\), the result is a 2D line plot showing the marginal effect of feature \(X_j\) on the predicted outcome, averaged over all possible values of the other features.

  • +
  • Two Features PDP: When plotting \(\text{PD}(X_j, X_k)\), the result is a 3D surface plot (or a contour plot) that shows the combined marginal effect of \(X_j\) and \(X_k\) on the predicted outcome. The surface represents the expected value of the prediction as \(X_j\) and \(X_k\) vary, while all other features are averaged out.

  • +
+

3D Partial Dependence Plots

+

For a more comprehensive analysis, especially when exploring interactions between two features, 3D Partial Dependence Plots are invaluable. The partial dependence function for two features in a 3D context is:

+
+\[\text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i})\]
+

Here, the function \(f(X_j, X_k, \mathbf{X}_{C_i})\) is evaluated across a grid of values for \(X_j\) and \(X_k\). The resulting 3D surface plot represents how the model’s prediction changes over the joint range of these two features.

+

The 3D plot offers a more intuitive visualization of feature interactions compared to 2D contour plots, allowing for a better understanding of the combined effects of features on the model’s predictions. The surface plot is particularly useful when you need to capture complex relationships that might not be apparent in 2D.

+
    +
  • Feature Interaction Visualization: The 3D PDP provides a comprehensive view of the interaction between two features. The resulting surface plot allows for the visualization of how the model’s output changes when the values of two features are varied simultaneously, making it easier to understand complex interactions.

  • +
  • Enhanced Interpretation: 3D PDPs offer enhanced interpretability in scenarios where feature interactions are not linear or where the effect of one feature depends on the value of another. The 3D visualization makes these dependencies more apparent.

  • +
+
+
+
+

KDE and Histogram Distribution Plots

+
+

KDE Distribution Function

+

Generate KDE or histogram distribution plots for specified columns in a DataFrame.

+

The kde_distributions function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2] for plotting, which is built on top of +matplotlib [3] and provides a high-level interface for drawing attractive and informative +statistical graphics.

+

Key Features and Parameters

+
    +
  • Flexible Plotting: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively.

  • +
  • Leverages Seaborn Library: The function is built on the seaborn library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code.

  • +
  • Customization: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs.

  • +
  • Scientific Notation Control: The function allows disabling scientific notation on the axes, providing better readability for certain types of data.

  • +
  • Log Scaling: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude.

  • +
  • Output Options: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations.

  • +
+
+
+kde_distributions(df, vars_of_interest=None, figsize=(5, 5), grid_figsize=None, hist_color='#0000FF', kde_color='#FF0000', mean_color='#000000', median_color='#000000', hist_edgecolor='#000000', hue=None, fill=True, fill_alpha=1, n_rows=None, n_cols=None, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_filename=None, y_axis_label='Density', plot_type='both', log_scale_vars=None, bins='auto', binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat='density', xlim=None, ylim=None, plot_mean=False, plot_median=False, std_dev_levels=None, std_color='#808080', label_names=None, show_legend=True, **kwargs)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots. If ‘all’, plots will be generated for all numeric columns.

  • +
  • figsize (tuple of int, optional) – Size of each individual plot, default is (5, 5). Used when only one plot is being generated or when saving individual plots.

  • +
  • grid_figsize (tuple of int, optional) – Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on figsize, n_rows, and n_cols.

  • +
  • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

  • +
  • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

  • +
  • mean_color (str, optional) – Color of the mean line if plot_mean is True, default is '#000000'.

  • +
  • median_color (str, optional) – Color of the median line if plot_median is True, default is '#000000'.

  • +
  • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

  • +
  • hue (str, optional) – Column name to group data by, adding different colors for each group.

  • +
  • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

  • +
  • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid. If not provided, it will be calculated automatically.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid. If not provided, it will be calculated automatically.

  • +
  • w_pad (float, optional) – Width padding between subplots, default is 1.0.

  • +
  • h_pad (float, optional) – Height padding between subplots, default is 1.0.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

  • +
  • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

  • +
  • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

  • +
  • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses figsize for determining the plot size, ignoring grid_figsize.

  • +
  • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

  • +
  • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

  • +
  • log_scale_vars (str or list of str, optional) – Variable name(s) to apply log scaling. Can be a single string or a list of strings.

  • +
  • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

  • +
  • binwidth (float, optional) – Width of each bin, overrides bins but can be used with binrange.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

  • +
  • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

  • +
  • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
  • plot_mean (bool, optional) – Whether to plot the mean as a vertical line, default is False.

  • +
  • plot_median (bool, optional) – Whether to plot the median as a vertical line, default is False.

  • +
  • std_dev_levels (list of int, optional) – Levels of standard deviation to plot around the mean.

  • +
  • std_color (str or list of str, optional) – Color(s) for the standard deviation lines, default is '#808080'.

  • +
  • label_names (dict, optional) – Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display.

  • +
  • show_legend (bool, optional) – Whether to show the legend on the plots, default is True.

  • +
  • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If plot_type is not one of 'hist', 'kde', or 'both'.

    • +
    • If stat is not one of 'count', 'density', 'frequency', 'probability', 'proportion', 'percent'.

    • +
    • If log_scale_vars contains variables that are not present in the DataFrame.

    • +
    • If fill is set to False and hist_edgecolor is not the default.

    • +
    • If grid_figsize is provided when only one plot is being created.

    • +
    +

  • +
  • UserWarning

      +
    • If both bins and binwidth are specified, which may affect performance.

    • +
    +

  • +
+
+
Returns:
+

None

+
+
+
+ +

+
+

KDE and Histograms Example

+

In the below example, the kde_distributions function is used to generate +histograms for several variables of interest: "age", "education-num", and +"hours-per-week". These variables represent different demographic and +financial attributes from the dataset. The plot_type="both" parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data’s probability density.

+

The visualizations are arranged in a single row of four columns, as specified +by n_rows=1 and n_cols=3, respectively. The overall size of the grid +figure is set to 14 inches wide and 4 inches tall (grid_figsize=(14, 4)), +while each individual plot is configured to be 4 inches by 4 inches +(single_figsize=(4, 4)). The fill=True parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +w_pad=1 and h_pad=1, which add 1 inch of padding both horizontally and +vertically.

+
+

Note

+

If you do not set n_rows or n_cols to any values, the function will +automatically calculate and create a grid based on the number of variables being +plotted, ensuring an optimal arrangement of the plots.

+
+

To handle longer titles, the text_wrap=50 parameter ensures that the title +text wraps to a new line after 50 characters. The bbox_inches="tight" setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in vars_of_interest are +passed directly to the function for visualization.

+

Each plot is saved individually with filenames that are prefixed by +"kde_density_single_distribution", followed by the variable name. The `y-axis` +for all plots is labeled as “Density” (y_axis_label="Density"), reflecting that +the height of the bars or KDE line represents the data’s density. The histograms +are divided into 10 bins (bins=10), offering a clear view of the distribution +of each variable.

+

Additionally, the font sizes for the axis labels and tick labels +are set to 16 points (label_fontsize=16) and 14 points (tick_fontsize=14), +respectively, ensuring that all text within the plots is legible and well-formatted.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    fill=True,
+    fill_alpha=0.60,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="both", # Can also just plot KDE by itself by passing "kde"
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - KDE (+) Histograms (Density) + +
+
+

Histogram Example (Density)

+

In this example, the kde_distributions() function is used to generate histograms for +the variables "age", "education-num", and "hours-per-week" but with +plot_type="hist", meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (n_rows=1, n_cols=3), +with a grid size of 14x4 inches (grid_figsize=(14, 4)). The histograms are +divided into 10 bins (bins=10), and the y-axis is labeled “Density” (y_axis_label="Density"). +Font sizes for the axis labels and tick labels are set to 16 and 14 points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    fill=True,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Density) + +
+
+

Histogram Example (Count)

+

In this example, the kde_distributions() function is modified to generate histograms +with a few key changes. The hist_color is set to “orange”, changing the color of the +histogram bars. The y-axis label is updated to “Count” (y_axis_label="Count"), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to "Count" to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (n_rows=1, n_cols=3), +a grid size of 14x4 inches, and a bin count of 10. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    text_wrap=50,
+    hist_color="orange",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Count",
+    bins=10,
+    plot_type="hist",
+    stat="Count",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+

Histogram Example - (Mean and Median)

+

In this example, the kde_distributions() function is customized to generate +histograms that include mean and median lines. The mean_color is set to "blue" +and the median_color is set to "black", allowing for a clear distinction +between the two statistical measures. The function parameters are adjusted to +ensure that both the mean and median lines are plotted (plot_mean=True, plot_median=True). +The y_axis_label remains "Density", indicating that the histograms +represent the density of observations within each bin. The histogram bars are +colored using hist_color="brown", with a fill_alpha=0.60 while the s +tatistical overlays enhance the interpretability of the data. The layout is +configured with a single row and multiple columns (n_rows=1, n_cols=3), and +the grid size is set to 15x5 inches. This example highlights how to visualize +central tendencies within the data using a histogram that prominently displays +the mean and median.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    text_wrap=50,
+    hist_color="brown",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    fill_alpha=0.60,
+    plot_type="hist",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+    plot_mean=True,
+    plot_median=True,
+    mean_color="blue",
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+

Histogram Example - (Mean, Median, and Std. Deviation)

+

In this example, the kde_distributions() function is customized to generate +a histogram that include mean, median, and 3 standard deviation lines. The +mean_color is set to "blue" and the median_color is set to "black", +allowing for a clear distinction between these two central tendency measures. +The function parameters are adjusted to ensure that both the mean and median lines +are plotted (plot_mean=True, plot_median=True). The y_axis_label remains +"Density", indicating that the histograms represent the density of observations +within each bin. The histogram bars are colored using hist_color="brown", +with a fill_alpha=0.40, which adjusts the transparency of the fill color. +Additionally, standard deviation bands are plotted using colors "purple", +"green", and "silver" for one, two, and three standard deviations, respectively.

+

The layout is configured with a single row and multiple columns (n_rows=1, n_cols=3), +and the grid size is set to 15x5 inches. This setup is particularly useful for +visualizing the central tendencies within the data while also providing a clear +view of the distribution and spread through the standard deviation bands. The +configuration used in this example showcases how histograms can be enhanced with +statistical overlays to provide deeper insights into the data.

+
+

Note

+

You have the freedom to choose whether to plot the mean, median, and +standard deviation lines. You can display one, none, or all of these simultaneously.

+
+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+]
+
+kde_distributions(
+    df=df,
+    figsize=(10, 6),
+    text_wrap=50,
+    hist_color="brown",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    fill_alpha=0.40,
+    plot_type="both",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+    plot_mean=True,
+    plot_median=True,
+    mean_color="blue",
+    image_path_svg=image_path_svg,
+    image_path_png=image_path_png,
+    std_dev_levels=[
+        1,
+        2,
+        3,
+    ],
+    std_color=[
+        "purple",
+        "green",
+        "silver",
+    ],
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+
+
+

Stacked Crosstab Plots

+

Generates stacked bar plots and crosstabs for specified columns in a DataFrame.

+

The stacked_crosstab_plot function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats.

+

The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis.

+
+
+stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind='bar', width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output='both', return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type='both', show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False)
+

Generates stacked or regular bar plots and crosstabs for specified columns.

+

This function allows users to create stacked bar plots (or regular bar plots +if stacks are removed) and corresponding crosstabs for specific columns +in a DataFrame. It provides options to customize the appearance, including +font sizes for axis labels, tick labels, and title text wrapping, and to +choose between regular or normalized plots.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • col (str) – The name of the column in the DataFrame to be analyzed.

  • +
  • func_col (list) – List of ground truth columns to be analyzed.

  • +
  • legend_labels_list (list) – List of legend labels for each ground truth column.

  • +
  • title (list) – List of titles for the plots.

  • +
  • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

  • +
  • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

  • +
  • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

  • +
  • custom_order (list, optional) – Specifies a custom order for the categories in the col.

  • +
  • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

  • +
  • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

  • +
  • save_formats (list, optional) – List of file formats to save the plot images in. Valid formats are 'png' and 'svg'. If not provided, defaults to an empty list and no images will be saved.

  • +
  • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

  • +
  • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

  • +
  • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

  • +
  • x (int, optional) – The width of the figure.

  • +
  • y (int, optional) – The height of the figure.

  • +
  • p (int, optional) – The padding between the subplots.

  • +
  • file_prefix (str, optional) – Prefix for the filename when output includes plots.

  • +
  • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

  • +
  • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

  • +
  • show_legend (bool, optional) – Specify whether to show the legend, default is True.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If output is not one of "both", "plots_only", or "crosstabs_only".

    • +
    • If plot_type is not one of "both", "regular", "normalized".

    • +
    • If remove_stacks is set to True and plot_type is not "regular".

    • +
    • If the lengths of title, func_col, and legend_labels_list are not equal.

    • +
    +

  • +
  • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

  • +
+
+
Returns:
+

Dictionary of crosstabs DataFrames if return_dict is True. Otherwise, returns None.

+
+
Return type:
+

dict or None

+
+
+
+ +
+

Stacked Bar Plots With Crosstabs Example

+

The provided code snippet demonstrates how to use the stacked_crosstab_plot +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here’s a detailed breakdown of the code using the census +dataset as an example [1].

+

First, the func_col list is defined, specifying the columns ["sex", "income"] +to be analyzed. These columns will be used in the loop to generate separate plots. +The legend_labels_list is then defined, with each entry corresponding to a +column in func_col. In this case, the labels for the sex column are +["Male", "Female"], and for the income column, they are ["<=50K", ">50K"]. +These labels will be used to annotate the legends of the plots.

+

Next, the title list is defined, providing titles for each plot corresponding +to the columns in func_col. The titles are set to ["Sex", "Income"], +which will be displayed on top of each respective plot.

+
+

Note

+

The legend_labels_list parameter should be a list of lists, where each +inner list corresponds to the ground truth labels for the respective item in +the func_col list. Each element in the func_col list represents a +column in your DataFrame that you wish to analyze, and the corresponding +inner list in legend_labels_list should contain the labels that will be +used in the legend of your plots.

+
+

For example:

+
# Define the func_col to use in the loop in order of usage
+func_col = ["sex", "income"]
+
+# Define the legend_labels to use in the loop
+legend_labels_list = [
+    ["Male", "Female"],  # Corresponds to "sex"
+    ["<=50K", ">50K"],   # Corresponds to "income"
+]
+
+# Define titles for the plots
+title = [
+    "Sex",
+    "Income",
+]
+
+
+
+

Important

+

Ensure that the number of elements in func_col, legend_labels_list, +and title are the same. Each item in func_col must have a corresponding +list of labels in legend_labels_list and a title in title. This +consistency is essential for the function to correctly generate the plots +with the appropriate labels and titles.

+
+

In this example:

+
    +
  • func_col contains two elements: "sex" and "income". Each corresponds to a specific column in your DataFrame.

  • +
  • legend_labels_list is a nested list containing two inner lists:

    +
    +
      +
    • The first inner list, ["Male", "Female"], corresponds to the "sex" column in func_col.

    • +
    • The second inner list, ["<=50K", ">50K"], corresponds to the "income" column in func_col.

    • +
    +
    +
  • +
  • title contains two elements: "Sex" and "Income", which will be used as the titles for the respective plots.

  • +
+
+

Note

+

If you assign the function to a variable, the dictionary returned when +return_dict=True will be suppressed in the output. However, the dictionary +is still available within the assigned variable for further use.

+
+
from eda_toolkit import stacked_crosstab_plot
+
+# Call the stacked_crosstab_plot function
+stacked_crosstabs = stacked_crosstab_plot(
+    df=df,
+    col="age_group",
+    func_col=func_col,
+    legend_labels_list=legend_labels_list,
+    title=title,
+    kind="bar",
+    width=0.8,
+    rot=0, # axis rotation angle
+    custom_order=None,
+    color=["#00BFC4", "#F8766D"], # default color schema
+    output="both",
+    return_dict=True,
+    x=14,
+    y=8,
+    p=10,
+    logscale=False,
+    plot_type="both",
+    show_legend=True,
+    label_fontsize=14,
+    tick_fontsize=12,
+)
+
+
+

The above example generates stacked bar plots for "sex" and "income" +grouped by "education". The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export.

+
+

Important

+

Importance of Correctly Aligning Labels

+

It is crucial to properly align the elements in the legend_labels_list, +title, and func_col parameters when using the stacked_crosstab_plot +function. Each of these lists must be ordered consistently because the function +relies on their alignment to correctly assign labels and titles to the +corresponding plots and legends.

+

For instance, in the example above:

+
    +
  • The first element in func_col is "sex", and it is aligned with the first set of labels ["Male", "Female"] in legend_labels_list and the first title "Sex" in the title list.

  • +
  • Similarly, the second element in func_col, "income", aligns with the labels ["<=50K", ">50K"] and the title "Income".

  • +
+

Misalignment between these lists would result in incorrect labels or titles being +applied to the plots, potentially leading to confusion or misinterpretation of the data. +Therefore, it’s important to ensure that each list is ordered appropriately and +consistently to accurately reflect the data being visualized.

+

Proper Setup of Lists

+

When setting up the legend_labels_list, title, and func_col, ensure +that each element in the lists corresponds to the correct variable in the DataFrame. +This involves:

+
    +
  • Ordering: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted.

  • +
  • Consistency: Double-checking that each label in legend_labels_list matches the categories present in the corresponding func_col, and that the title accurately describes the plot.

  • +
+

By adhering to these guidelines, you can ensure that the stacked_crosstab_plot +function produces accurate and meaningful visualizations that are easy to interpret and analyze.

+
+

Output

+
KDE Distributions + +
Stacked Bar Plot Age vs. Income + +
+

Note

+

When you set return_dict=True, you are able to see the crosstabs printed out +as shown below.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93

+

When you set return_dict=True, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example:

+
crosstab_age_sex = crosstabs_dict["sex"]
+crosstab_age_income = crosstabs_dict["income"]
+
+
+
+
+

Pivoted Stacked Bar Plots Example

+

Using the census dataset [1], to create horizontal stacked bar plots, set the kind parameter to +"barh" in the stacked_crosstab_plot function. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the y-axis.

+
Stacked Bar Plot Age vs. Income (Pivoted) + +
+
+

Non-Normalized Stacked Bar Plots Example

+

In the census data [1], to create stacked bar plots without the normalized versions, +set the plot_type parameter to "regular" in the stacked_crosstab_plot +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the plot_type to "normalized" will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age.

+
Stacked Bar Plot Age vs. Income (Regular) + +
+
+

Regular Non-Stacked Bar Plots Example

+

In the census data [1], to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the plot_type parameter to "regular" +in the stacked_crosstab_plot function and enable remove_stacks by setting +it to True. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +plot_type to "normalized" will display only the normalized plots.

+

When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories.

+

In the example below, the color of the bars has been set to a dark grey (#333333), +and the legend has been removed by setting show_legend=False. This illustrates +regular bar plots for income by age, without stacking.

+
Bar Plot Age vs. Income (Regular) + +
+
+
+

Box and Violin Plots

+

Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.

+

The box_violin_plot function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories.

+

With options to customize the plot type (boxplot or violinplot), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis.

+

Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures.

+

The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset.

+
+
+box_violin_plot(df, metrics_list, metrics_comp, n_rows=None, n_cols=None, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type='boxplot', xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None, label_names=None, **kwargs)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • metrics_list (list of str) – List of metric names (columns in df) to plot.

  • +
  • metrics_comp (list of str) – List of comparison categories (columns in df).

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid. Calculated automatically if not provided.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid. Calculated automatically if not provided.

  • +
  • image_path_png (str, optional) – Optional directory path to save .png images.

  • +
  • image_path_svg (str, optional) – Optional directory path to save .svg images.

  • +
  • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

  • +
  • show_legend (bool, optional) – Boolean, True if showing the legend in the plots. Default is True.

  • +
  • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
  • label_names (dict, optional) – Dictionary mapping original column names to custom labels. Default is None.

  • +
  • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set without specifying image_path_png or image_path_svg.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize is not a tuple or list of two numbers.

  • +
  • If grid_figsize is provided and is not a tuple or list of two numbers.

  • +
+

+
+
Returns:
+

None

+
+
+
+ +

This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels.

+
+

Box Plots Grid Example

+

In this example with the US census data [1], the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the "age_group" column in the +DataFrame. The metrics_comp parameter is set to ["age_group"], meaning +that the comparison will be based on different age groups. The metrics_list is +provided as age_boxplot_list, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid formatThe image_path_png and +image_path_svg parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to "all", ensuring that both +individual and grid plots are saved.

+

The plots are displayed in a grid format, as indicated by the show_plot="grid" +parameter. The plot_type is set to "boxplot", so the function will generate +boxplots for each metric in the list. Additionally, the `x-axis` labels are rotated +by 90 degrees (xlabel_rot=90) to ensure that the labels are legible. The legend is +hidden by setting show_legend=False, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication.

+
age_boxplot_list = df[
+    [
+        "education-num",
+        "hours-per-week",
+    ]
+].columns.to_list()
+
+
+
from eda_toolkit import box_violin_plot
+
+metrics_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_comp,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="boxplot",
+    xlabel_rot=90,
+)
+
+
+
Box Plot Comparisons + +
+
+

Violin Plots Grid Example

+

In this example with the US census data [1], we keep everything the same as the prior example, but change the +plot_type to violinplot. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings.

+
from eda_toolkit import box_violin_plot
+
+metrics_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_comp=metrics_comp,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=90,
+)
+
+
+
Violin Plot Comparisons + +
+
+

Pivoted Violin Plots Grid Example

+

In this example with the US census data [1], we set xlabel_rot=0 and rotate_plot=True +to pivot the plot, changing the orientation of the axes while keeping the x-axis labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution.

+
from eda_toolkit import box_violin_plot
+
+metrics_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_comp,
+    show_plot="both",
+    rotate_plot=True,
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=0,
+)
+
+
+
Violin Plot Comparisons (Pivoted) + +
+
+
+

Scatter Plots and Best Fit Lines

+
+

Scatter Fit Plot

+

Create and Save Scatter Plots or a Grid of Scatter Plots

+

This function, scatter_fit_plot, is designed to generate scatter plots for +one or more pairs of variables (x_vars and y_vars) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view.

+

Optional Best Fit Line

+

An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s

+

Customizable Plot Aesthetics

+

The function offers a wide range of customization options to tailor the appearance +of the scatter plots:

+
    +
  • Point Color: You can specify a default color for the scatter points or use a hue parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data.

  • +
  • Point Size: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable.

  • +
  • Markers: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data.

  • +
+

Axis and Label Configuration

+

The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges.

+

Plot Display and Saving Options

+

The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations.

+

Correlation Coefficient Display

+

For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship.

+
+
+scatter_fit_plot(df, x_vars=None, y_vars=None, n_rows=None, n_cols=None, max_cols=4, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color='C0', best_fit_linecolor='red', best_fit_linestyle='-', hue=None, hue_palette=None, size=None, sizes=None, marker='o', show_correlation=True, xlim=None, ylim=None, all_vars=None, label_names=None, **kwargs)
+

Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • x_vars (list of str, optional) – List of variable names to plot on the x-axis.

  • +
  • y_vars (list of str, optional) – List of variable names to plot on the y-axis.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid. Calculated based on the number of plots and n_cols if not specified.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid. Calculated based on the number of plots and max_cols if not specified.

  • +
  • max_cols (int, optional) – Maximum number of columns in the subplot grid. Default is 4.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

  • +
  • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid". If None, plots will not be saved.

  • +
  • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

  • +
  • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

  • +
  • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

  • +
  • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

  • +
  • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

  • +
  • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the hue parameter to be set.

  • +
  • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

  • +
  • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

  • +
  • marker (str, optional) – Marker style used for the scatter points. Default is "o".

  • +
  • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
  • all_vars (list of str, optional) – If provided, automatically generates scatter plots for all combinations of variables in this list, overriding x_vars and y_vars.

  • +
  • label_names (dict, optional) – A dictionary to rename columns for display in the plot titles and labels.

  • +
  • kwargs (dict, optional) – Additional keyword arguments to pass to sns.scatterplot.

  • +
+
+
Raises:
+

ValueError

    +
  • If all_vars is provided and either x_vars or y_vars is also provided.

  • +
  • If neither all_vars nor both x_vars and y_vars are provided.

  • +
  • If hue_palette is specified without hue.

  • +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set but no image paths are provided.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize or grid_figsize are not tuples/lists with two numeric values.

  • +
+

+
+
Returns:
+

None. This function does not return any value but generates and optionally saves scatter plots for the specified x_vars and y_vars, or for all combinations of variables in all_vars if it is provided.

+
+
+
+ +
+

Regression-Centric Scatter Plots Example

+

In this US census data [1] example, the scatter_fit_plot function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the show_correlation=True parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the add_best_fit_line=True parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    show_legend=True,
+    show_plot="grid",
+    grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (with Best Fit Lines) + +
+
+

Scatter Plots Grouped by Category Example

+

In this example, the scatter_fit_plot function is used to generate a grid of +scatter plots that examine the relationships between age and hours-per-week +as well as education-num and hours-per-week. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots:

+
    +
  1. Hue and Hue Palette: The hue parameter is set to "income", meaning that the +data points in the scatter plots are colored according to the values in the income +column. A custom color mapping is provided via the hue_palette parameter, where the +income categories "<=50K" and ">50K" are assigned the colors "brown" and +"green", respectively. This change visually distinguishes the data points based on +income levels.

  2. +
  3. Scatter Color: The scatter_color parameter is set to "#808080", which applies +a grey color to the scatter points when no hue is provided. However, since a hue +is specified in this example, the hue_palette takes precedence and overrides this color setting.

  4. +
  5. Best Fit Line: The add_best_fit_line parameter is set to False, meaning that +no best fit line is added to the scatter plots. This differs from the previous example where +a best fit line was included.

  6. +
  7. Correlation Coefficient: The show_correlation parameter is set to False, so the +Pearson correlation coefficient will not be displayed in the plot titles. This is another +change from the previous example where the correlation coefficient was included.

  8. +
  9. Hue Legend: The show_legend parameter remains set to True, ensuring that the +legend displaying the hue categories ("<=50K" and ">50K") appears on the plots, +helping to interpret the color coding of the data points.

  10. +
+

These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths.

+
from eda_toolkit import scatter_fit_plot
+
+hue_dict = {"<=50K": "brown", ">50K": "green"}
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    show_legend=True,
+    show_plot="grid",
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=False,
+    scatter_color="#808080",
+    hue="income",
+    hue_palette=hue_dict,
+    show_correlation=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Scatter Plots (All Combinations Example)

+

In this example, the scatter_fit_plot function is used to generate a grid of scatter plots that explore the relationships between all numeric variables in the df DataFrame. The function automatically identifies and plots all possible combinations of these variables. Below are key aspects of this example:

+
    +
  1. All Variables Combination: The all_vars parameter is used to automatically generate scatter plots for all possible combinations of numerical variables in the DataFrame. This means you don’t need to manually specify x_vars and y_vars, as the function will iterate through each possible pair.

  2. +
  3. Grid Display: The show_plot parameter is set to "grid", so the scatter plots are displayed in a grid format. This is useful for comparing multiple relationships simultaneously.

  4. +
  5. Font Sizes: The label_fontsize and tick_fontsize parameters are set to 14 and 12, respectively. This increases the readability of axis labels and tick marks, making the plots more visually accessible.

  6. +
  7. Best Fit Line: The add_best_fit_line parameter is set to True, meaning that a best fit line is added to each scatter plot. This helps in visualizing the linear relationship between variables.

  8. +
  9. Scatter Color: The scatter_color parameter is set to "#808080", applying a grey color to the scatter points. This provides a neutral color that does not distract from the data itself.

  10. +
  11. Correlation Coefficient: The show_correlation parameter is set to True, so the Pearson correlation coefficient will be displayed in the plot titles. This helps to quantify the strength of the relationship between the variables.

  12. +
+

These settings allow for the creation of scatter plots that comprehensively explore the relationships between all numeric variables in the DataFrame. The plots are saved in a grid format, with added best fit lines and correlation coefficients for deeper analysis. The resulting images can be stored in the specified directory for future reference.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    all_vars=df.select_dtypes(np.number).columns.to_list(),
+    show_legend=True,
+    show_plot="grid",
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (Grouped2) + +
+
+
+
+

Correlation Matrices

+

Generate and Save Customizable Correlation Heatmaps

+

The flex_corr_matrix function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats.

+

Customizable Plot Appearance

+

The function provides extensive customization options for the heatmap’s appearance:

+
    +
  • Colormap Selection: Choose from a variety of colormaps to represent the strength of correlations. The default is "coolwarm", but this can be adjusted to fit the needs of the analysis.

  • +
  • Annotation: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance.

  • +
  • Figure Size and Layout: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards.

  • +
+

Triangular vs. Full Correlation Matrix

+

A key feature of the flex_corr_matrix function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations.

+

Label and Axis Configuration

+

The function offers flexibility in configuring axis labels and titles:

+
    +
  • Label Rotation: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names.

  • +
  • Font Sizes: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable.

  • +
  • Title Wrapping: Control the wrapping of long titles to fit within the plot without overlapping other elements.

  • +
+

Plot Display and Saving Options

+

The flex_corr_matrix function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images.

+
+
+flex_corr_matrix(df, cols=None, annot=True, cmap='coolwarm', save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title='Cervical Cancer Data: Correlation Matrix', label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment='right', ylabel_alignment='center_baseline', text_wrap=50, vmin=-1, vmax=1, cbar_label='Correlation Index', triangular=True, **kwargs)
+

Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

  • +
  • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

  • +
  • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

  • +
  • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

  • +
  • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

  • +
  • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

  • +
  • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

  • +
  • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

  • +
  • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

  • +
  • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

  • +
  • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

  • +
  • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

  • +
  • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

  • +
  • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

  • +
+
+
Raises:
+

ValueError

    +
  • If annot is not a boolean.

  • +
  • If cols is not a list.

  • +
  • If save_plots is not a boolean.

  • +
  • If triangular is not a boolean.

  • +
  • If save_plots is True but no image paths are provided.

  • +
+

+
+
Returns:
+

None +This function does not return any value but generates and optionally saves a correlation heatmap.

+
+
+
+ +
+

Triangular Correlation Matrix Example

+

The provided code filters the census [1] DataFrame df to include only numeric columns using +select_dtypes(np.number). It then utilizes the flex_corr_matrix() function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options.

+
+

Note

+

This triangular matrix format is particularly useful for avoiding +redundancy in correlation matrices, as it excludes the lower half, +making it easier to focus on unique pairwise correlations.

+
+

The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations.

+
# Select only numeric data to pass into the function
+df_num = df.select_dtypes(np.number)
+
+
+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="coolwarm",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=True,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Full Correlation Matrix Example

+

In this modified census [1] example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting cmap="viridis", the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting triangular=False, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset.

+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="viridis",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+

Partial Dependence Plots

+

Partial Dependence Plots (PDPs) are a powerful tool in machine learning +interpretability, providing insights into how features influence the predicted +outcome of a model. PDPs can be generated in both 2D and 3D, depending on +whether you want to analyze the effect of one feature or the interaction between +two features on the model’s predictions.

+
+

2D Partial Dependence Plots

+

The plot_2d_pdp function generates 2D partial dependence plots for individual features or pairs of features. These plots are essential for examining the marginal effect of features on the predicted outcome.

+
    +
  • Grid and Individual Plots: Generate all 2D partial dependence plots in a grid layout or as separate individual plots, offering flexibility in presentation.

  • +
  • Customization Options: Control the figure size, font sizes for labels and ticks, and the wrapping of long titles to ensure the plots are clear and informative.

  • +
  • Saving Plots: The function provides options to save the plots in PNG or SVG formats, and you can specify whether to save all plots, only individual plots, or just the grid plot.

  • +
+
+
+plot_2d_pdp(model, X_train, feature_names, features, title='PDP of house value on CA non-location features', grid_resolution=50, plot_type='grid', grid_figsize=(12, 8), individual_figsize=(6, 4), label_fontsize=12, tick_fontsize=10, text_wrap=50, image_path_png=None, image_path_svg=None, save_plots=None, file_prefix='partial_dependence')
+

Generate 2D partial dependence plots for specified features using the given machine learning model. The function allows for plotting in grid or individual layouts, with various customization options for figure size, font sizes, and title wrapping. Additionally, the plots can be saved in PNG or SVG formats with a customizable filename prefix.

+
+
Parameters:
+
    +
  • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

  • +
  • X_train (pandas.DataFrame or numpy.ndarray) – The training data used to compute partial dependence. Should correspond to the features used to train the model.

  • +
  • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

  • +
  • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

  • +
  • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

  • +
  • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

  • +
  • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

  • +
  • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

  • +
  • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

  • +
  • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

  • +
  • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

  • +
  • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

  • +
  • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

  • +
  • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

  • +
+
+
Raises:
+

ValueError

    +
  • If plot_type is not one of "grid", "individual", or "both".

  • +
  • If save_plots is enabled but neither image_path_png nor image_path_svg is provided.

  • +
+

+
+
Returns:
+

None +This function generates partial dependence plots and displays them. It does not return any values.

+
+
+
+ +
+

2D Plots - CA Housing Example

+

Consider a scenario where you have a machine learning model predicting median +house values in California. [4] Suppose you want to understand how non-location +features like the average number of occupants per household (AveOccup) and the +age of the house (HouseAge) jointly influence house values. A 2D partial +dependence plot allows you to visualize this relationship in two ways: either as +individual plots for each feature or as a combined plot showing the interaction +between two features.

+

For instance, the 2D partial dependence plot can help you analyze how the age of +the house impacts house values while holding the number of occupants constant, or +vice versa. This is particularly useful for identifying the most influential +features and understanding how changes in these features might affect the +predicted house value.

+

If you extend this to two interacting features, such as AveOccup and HouseAge, +you can explore their combined effect on house prices. The plot can reveal how +different combinations of occupancy levels and house age influence the value, +potentially uncovering non-linear relationships or interactions that might not be +immediately obvious from a simple 1D analysis.

+

Here’s how you can generate and visualize these 2D partial dependence plots using +the California housing dataset:

+

Fetch The CA Housing Dataset and Prepare The DataFrame

+
from sklearn.datasets import fetch_california_housing
+from sklearn.model_selection import train_test_split
+from sklearn.ensemble import GradientBoostingRegressor
+import pandas as pd
+
+# Load the dataset
+data = fetch_california_housing()
+df = pd.DataFrame(data.data, columns=data.feature_names)
+
+
+

Split The Data Into Training and Testing Sets

+
X_train, X_test, y_train, y_test = train_test_split(
+    df, data.target, test_size=0.2, random_state=42
+)
+
+
+

Train a GradientBoostingRegressor Model

+
model = GradientBoostingRegressor(
+    n_estimators=100,
+    max_depth=4,
+    learning_rate=0.1,
+    loss="huber",
+    random_state=42,
+)
+model.fit(X_train, y_train)
+
+
+

Create 2D Partial Dependence Plot Grid

+
# import the plot_2d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_2d_pdp
+
+# Feature names
+names = data.feature_names
+
+# Generate 2D partial dependence plots
+plot_2d_pdp(
+    model=model,
+    X_train=X_train,
+    feature_names=names,
+    features=[
+        "MedInc",
+        "AveOccup",
+        "HouseAge",
+        "AveRooms",
+        "Population",
+        ("AveOccup", "HouseAge"),
+    ],
+    title="PDP of house value on CA non-location features",
+    grid_figsize=(14, 10),
+    individual_figsize=(12, 4),
+    label_fontsize=14,
+    tick_fontsize=12,
+    text_wrap=120,
+    plot_type="grid",
+    image_path_png="path/to/save/png",
+    save_plots="all",
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+

3D Partial Dependence Plots

+

The plot_3d_pdp function extends the concept of partial dependence to three dimensions, allowing you to visualize the interaction between two features and their combined effect on the model’s predictions.

+
    +
  • Interactive and Static 3D Plots: Generate static 3D plots using Matplotlib or interactive 3D plots using Plotly. The function also allows for generating both types simultaneously.

  • +
  • Colormap and Layout Customization: Customize the colormaps for both Matplotlib and Plotly plots. Adjust figure size, camera angles, and zoom levels to create plots that fit perfectly within your presentation or report.

  • +
  • Axis and Title Configuration: Customize axis labels for both Matplotlib and Plotly plots. Adjust font sizes and control the wrapping of long titles to maintain readability.

  • +
+
+
+plot_3d_pdp(model, dataframe, feature_names_list, x_label=None, y_label=None, z_label=None, title, html_file_path=None, html_file_name=None, image_filename=None, plot_type="both", matplotlib_colormap=None, plotly_colormap="Viridis", zoom_out_factor=None, wireframe_color=None, view_angle=(22, 70), figsize=(7, 4.5), text_wrap=50, horizontal=-1.25, depth=1.25, vertical=1.25, cbar_x=1.05, cbar_thickness=25, title_x=0.5, title_y=0.95, top_margin=100, image_path_png=None, image_path_svg=None, show_cbar=True, grid_resolution=20, left_margin=20, right_margin=65, label_fontsize=8, tick_fontsize=6, enable_zoom=True, show_modebar=True)
+

Generate 3D partial dependence plots for two features of a machine learning model.

+

This function supports both static (Matplotlib) and interactive (Plotly) visualizations, allowing for flexible and comprehensive analysis of the relationship between two features and the target variable in a model.

+
+
Parameters:
+
    +
  • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

  • +
  • dataframe (pandas.DataFrame or numpy.ndarray) – The dataset on which the model was trained or a representative sample. If a DataFrame is provided, feature_names_list should correspond to the column names. If a NumPy array is provided, feature_names_list should correspond to the indices of the columns.

  • +
  • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

  • +
  • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

  • +
  • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

  • +
  • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

  • +
  • title (str) – The title for the plots.

  • +
  • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

  • +
  • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

  • +
  • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

  • +
  • plot_type (str, optional) – The type of plots to generate. Options are: +- "static": Generate only static Matplotlib plots. +- "interactive": Generate only interactive Plotly plots. +- "both": Generate both static and interactive plots. Default is "both".

  • +
  • matplotlib_colormap (matplotlib.colors.Colormap, optional) – Custom colormap for the Matplotlib plot. If not provided, a default colormap is used.

  • +
  • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

  • +
  • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

  • +
  • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

  • +
  • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

  • +
  • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

  • +
  • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

  • +
  • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

  • +
  • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

  • +
  • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

  • +
  • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

  • +
  • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

  • +
  • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

  • +
  • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

  • +
  • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

  • +
  • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

  • +
  • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

  • +
  • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

  • +
  • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

  • +
  • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

  • +
  • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

  • +
+
+
Raises:
+

ValueError

    +
  • If plot_type is not one of "static", "interactive", or "both".

  • +
  • If plot_type is "interactive" or "both" and html_file_path or html_file_name are not provided.

  • +
+

+
+
Returns:
+

None +This function generates 3D partial dependence plots and displays or saves them. It does not return any values.

+
+
Notes:
+
    +
  • This function handles warnings related to scikit-learn’s partial_dependence function, specifically a FutureWarning related to non-tuple sequences for multidimensional indexing. This warning is suppressed as it stems from the internal workings of scikit-learn in Python versions like 3.7.4.

  • +
  • To maintain compatibility with different versions of scikit-learn, the function attempts to use "values" for grid extraction in newer versions and falls back to "grid_values" for older versions.

  • +
+
+
+
+ +
+

3D Plots - CA Housing Example

+

Consider a scenario where you have a machine learning model predicting median +house values in California.[4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (AveOccup) and the +age of the house (HouseAge) jointly influence house values. A 3D partial +dependence plot allows you to visualize this relationship in a more comprehensive +manner, providing a detailed view of how these two features interact to affect +the predicted house value.

+

For instance, the 3D partial dependence plot can help you explore how different +combinations of house age and occupancy levels influence house values. By +visualizing the interaction between AveOccup and HouseAge in a 3D space, you can +uncover complex, non-linear relationships that might not be immediately apparent +in 2D plots.

+

This type of plot is particularly useful when you need to understand the joint +effect of two features on the target variable, as it provides a more intuitive +and detailed view of how changes in both features impact predictions simultaneously.

+

Here’s how you can generate and visualize these 3D partial dependence plots +using the California housing dataset:

+
+
+

Static Plot

+

Fetch The CA Housing Dataset and Prepare The DataFrame

+
from sklearn.ensemble import GradientBoostingRegressor
+from sklearn.datasets import fetch_california_housing
+from sklearn.model_selection import train_test_split
+import pandas as pd
+
+# Load the dataset
+data = fetch_california_housing()
+df = pd.DataFrame(data.data, columns=data.feature_names)
+
+
+

Split The Data Into Training and Testing Sets

+
X_train, X_test, y_train, y_test = train_test_split(
+    df, data.target, test_size=0.2, random_state=42
+)
+
+
+

Train a GradientBoostingRegressor Model

+
model = GradientBoostingRegressor(
+    n_estimators=100,
+    max_depth=4,
+    learning_rate=0.1,
+    loss="huber",
+    random_state=1,
+)
+model.fit(X_train, y_train)
+
+
+

Create Static 3D Partial Dependence Plot

+
# import the plot_3d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_3d_pdp
+
+# Call the function to generate the plot
+plot_3d_pdp(
+    model=model,
+    dataframe=X_test,  # Use the test dataset
+    feature_names_list=["HouseAge", "AveOccup"],
+    x_label="House Age",
+    y_label="Average Occupancy",
+    z_label="Partial Dependence",
+    title="3D Partial Dependence Plot of House Age vs. Average Occupancy",
+    image_filename="3d_pdp",
+    plot_type="static",
+    figsize=[8, 5],
+    text_wrap=40,
+    wireframe_color="black",
+    image_path_png=image_path_png,
+    grid_resolution=30,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Interactive Plot

+
# import the plot_3d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_3d_pdp
+
+# Call the function to generate the plot
+plot_3d_pdp(
+    model=model,
+    dataframe=X_test,  # Use the test dataset
+    feature_names_list=["HouseAge", "AveOccup"],
+    x_label="House Age",
+    y_label="Average Occupancy",
+    z_label="Partial Dependence",
+    title="3D Partial Dependence Plot of House Age vs. Average Occupancy",
+    html_file_path=image_path_png,
+    image_filename="3d_pdp",
+    html_file_name="3d_pdp.html",
+    plot_type="interactive",
+    text_wrap=40,
+    zoom_out_factor=0.5,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    grid_resolution=30,
+    label_fontsize=8,
+    tick_fontsize=6,
+    title_x=0.38,
+    top_margin=10,
+    right_margin=250,
+    cbar_x=0.9,
+    cbar_thickness=25,
+    show_modebar=False,
+    enable_zoom=True,
+)
+
+
+
+

Warning

+

Scrolling Notice:

+

While interacting with the interactive Plotly plot below, scrolling down the +page using the mouse wheel may be blocked when the mouse pointer is hovering +over the plot. To continue scrolling, either move the mouse pointer outside +the plot area or use the keyboard arrow keys to navigate down the page.

+
+ + +

This interactive plot was generated using Plotly, which allows for rich, +interactive visualizations directly in the browser. The plot above is an example +of an interactive 3D Partial Dependence Plot. Here’s how it differs from +generating a static plot using Matplotlib.

+

Key Differences

+

Plot Type:

+
    +
  • The plot_type is set to "interactive" for the Plotly plot and "static" for the Matplotlib plot.

  • +
+

Interactive-Specific Parameters:

+
    +
  • HTML File Path and Name: The html_file_path and html_file_name parameters are required to save the interactive Plotly plot as an HTML file. These parameters are not needed for static plots.

  • +
  • Zoom and Positioning: The interactive plot includes parameters like zoom_out_factor, title_x, cbar_x, and cbar_thickness to control the zoom level, title position, and color bar position in the Plotly plot. These parameters do not affect the static plot.

  • +
  • Mode Bar and Zoom: The show_modebar and enable_zoom parameters are specific to the interactive Plotly plot, allowing you to toggle the visibility of the mode bar and enable or disable zoom functionality.

  • +
+

Static-Specific Parameters:

+
    +
  • Figure Size and Wireframe Color: The static plot uses parameters like figsize to control the size of the Matplotlib plot and wireframe_color to define the color of the wireframe in the plot. These parameters are not applicable to the interactive Plotly plot.

  • +
+

By adjusting these parameters, you can customize the behavior and appearance of your 3D Partial Dependence Plots according to your needs, whether for static or interactive visualization.

+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/genindex.html b/_build/html/v0.0.11/genindex.html new file mode 100644 index 000000000..66031b85a --- /dev/null +++ b/_build/html/v0.0.11/genindex.html @@ -0,0 +1,359 @@ + + + + + + + + Index — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | H + | K + | P + | S + +
+

A

+ + +
+ +

B

+ + +
+ +

C

+ + +
+ +

D

+ + +
+ +

E

+ + +
+ +

F

+ + +
+ +

H

+ + +
+ +

K

+ + +
+ +

P

+ + + +
+ +

S

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/getting_started.html b/_build/html/v0.0.11/getting_started.html new file mode 100644 index 000000000..3e5c96c6e --- /dev/null +++ b/_build/html/v0.0.11/getting_started.html @@ -0,0 +1,247 @@ + + + + + + + + + Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Welcome to the EDA Toolkit Python Library Documentation!

+
+

Note

+

This documentation is for eda_toolkit version 0.0.11.

+
+

The eda_toolkit is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data.

+ +
+

What is EDA?

+

Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data.

+
+
+

Purpose of EDA Toolkit

+

The eda_toolkit library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including:

+
    +
  • Data Management: Tools for managing directories, generating unique IDs, +standardizing dates, and handling common DataFrame manipulations.

  • +
  • Data Cleaning: Functions to address missing values, remove outliers, and +correct formatting issues, ensuring data is ready for analysis.

  • +
  • Data Visualization: A variety of plotting functions, including KDE +distribution plots, stacked bar plots, scatter plots with optional best fit +lines, and box/violin plots, to visually explore data distributions, +relationships, and trends.

  • +
  • Descriptive and Summary Statistics: Methods to generate comprehensive +reports on data types, summary statistics (mean, median, standard deviation, +etc.), and to summarize all possible combinations of specified variables.

  • +
  • Reporting and Export: Features to save DataFrames to Excel with +customizable formatting, create contingency tables, and export generated +plots in multiple formats.

  • +
+
+
+

Key Features

+
    +
  • Ease of Use: The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions.

  • +
  • Customizable: Users can customize various aspects of the toolkit to fit their specific needs.

  • +
  • Integration: Seamlessly integrates with popular data science libraries such as Pandas, NumPy, Matplotlib, and Seaborn.

  • +
  • Documentation and Examples: Comprehensive documentation and examples to help users get started quickly and effectively.

  • +
+
+
+

Prerequisites

+

Before you install eda_toolkit, ensure your system meets the following requirements:

+
    +
  • Python: version 3.7.4 or higher is required to run eda_toolkit.

  • +
+

Additionally, eda_toolkit depends on the following packages, which will be automatically installed when you install eda_toolkit:

+
    +
  • jinja2: version 3.1.4 or higher

  • +
  • matplotlib: version 3.5.3 or higher

  • +
  • nbformat: version 4.2.0 or higher

  • +
  • numpy: version 1.21.6 or higher

  • +
  • pandas: version 1.3.5 or higher

  • +
  • plotly: version 5.18.0 or higher

  • +
  • scikit-learn: version 1.0.2 or higher

  • +
  • seaborn: version 0.12.2 or higher

  • +
  • xlsxwriter: version 3.2.0 or higher

  • +
+
+
+

Installation

+

You can install eda_toolkit directly from PyPI:

+
pip install eda_toolkit
+
+
+
+
+
+

Description

+

This guide provides detailed instructions and examples for using the functions +provided in the eda_toolkit library and how to use them effectively in your projects.

+

For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [1]. This dataset provides a rich source of +information for demonstrating the functionalities of the eda_toolkit.

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/index.html b/_build/html/v0.0.11/index.html new file mode 100644 index 000000000..a06bc0748 --- /dev/null +++ b/_build/html/v0.0.11/index.html @@ -0,0 +1,306 @@ + + + + + + + + + Table of Contents — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Table of Contents

+ + + + +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/objects.inv b/_build/html/v0.0.11/objects.inv new file mode 100644 index 000000000..b0208d461 Binary files /dev/null and b/_build/html/v0.0.11/objects.inv differ diff --git a/_build/html/v0.0.11/references.html b/_build/html/v0.0.11/references.html new file mode 100644 index 000000000..8e666f3b4 --- /dev/null +++ b/_build/html/v0.0.11/references.html @@ -0,0 +1,146 @@ + + + + + + + + + References — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

References

+
    +
  1. Hunter, J. D. (2007). Matplotlib: A 2D Graphics Environment. Computing in Science & Engineering, 9(3), 90-95. https://doi.org/10.1109/MCSE.2007.55.

  2. +
  3. Kohavi, R. (1996). Census Income. UCI Machine Learning Repository. https://doi.org/10.24432/C5GP7S.

  4. +
  5. Waskom, M. (2021). Seaborn: Statistical Data Visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021.

  6. +
  7. Pace, R. K., & Barry, R. (1997). Sparse Spatial Autoregressions. Statistics & Probability Letters, 33(3), 291-297. https://doi.org/10.1016/S0167-7152(96)00140-X.

  8. +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/search.html b/_build/html/v0.0.11/search.html new file mode 100644 index 000000000..1ebce5aae --- /dev/null +++ b/_build/html/v0.0.11/search.html @@ -0,0 +1,151 @@ + + + + + + + + Search — EDA Toolkit 0.0.11 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/_build/html/v0.0.11/searchindex.js b/_build/html/v0.0.11/searchindex.js new file mode 100644 index 000000000..43025590a --- /dev/null +++ b/_build/html/v0.0.11/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[5, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[5, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[5, "id14"]], "3D Plots - CA Housing Example": [[5, "id15"]], "About EDA Toolkit": [[7, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[4, "adding-unique-identifiers"]], "Binning Numerical Columns": [[4, "binning-numerical-columns"]], "Box Plots Grid Example": [[5, "box-plots-grid-example"]], "Box and Violin Plots": [[5, "box-and-violin-plots"]], "Calculation Details": [[4, "calculation-details"]], "Census Income Example": [[4, "census-income-example"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[5, "correlation-matrices"]], "Creating Contingency Tables": [[4, "creating-contingency-tables"]], "Data Management": [[7, null]], "Data Management Overview": [[4, null]], "Data Management Techniques": [[4, "data-management-techniques"]], "DataFrame Analysis": [[4, "dataframe-analysis"]], "DataFrame Column Names": [[4, "dataframe-column-names"]], "Description": [[6, "description"]], "Full Correlation Matrix Example": [[5, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[5, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[4, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[7, null]], "Highlighting Specific Columns in a DataFrame": [[4, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[5, "histogram-example-count"]], "Histogram Example (Density)": [[5, "histogram-example-density"]], "Histogram Example - (Mean and Median)": [[5, "histogram-example-mean-and-median"]], "Histogram Example - (Mean, Median, and Std. Deviation)": [[5, "histogram-example-mean-median-and-std-deviation"]], "Histograms and Kernel Density Estimation (KDE)": [[5, "histograms-and-kernel-density-estimation-kde"]], "Installation": [[6, "installation"]], "Interactive Plot": [[5, "interactive-plot"]], "KDE Distribution Function": [[5, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[5, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[5, "kde-and-histograms-example"]], "Key Features": [[6, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[5, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Foundations": [[5, "partial-dependence-foundations"]], "Partial Dependence Plots": [[5, "partial-dependence-plots"]], "Path directories": [[4, "path-directories"]], "Pearson Correlation Coefficient": [[5, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[5, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[5, "pivoted-violin-plots-grid-example"]], "Plotting Heuristics": [[7, null]], "Plotting and Theoretical Overview": [[5, null]], "Prerequisites": [[6, "prerequisites"]], "Project Links": [[6, "project-links"]], "Purpose of EDA Toolkit": [[6, "purpose-of-eda-toolkit"]], "References": [[8, null]], "Regression-Centric Scatter Plots Example": [[5, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[5, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[4, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[5, "scatter-fit-plot"]], "Scatter Plots (All Combinations Example)": [[5, "scatter-plots-all-combinations-example"]], "Scatter Plots Grouped by Category Example": [[5, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[5, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[5, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[5, "stacked-crosstab-plots"]], "Standardized Dates": [[4, "standardized-dates"]], "Static Plot": [[5, "static-plot"]], "Table of Contents": [[7, null]], "Trailing Period Removal": [[4, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[5, "triangular-correlation-matrix-example"]], "Version 0.0.10": [[1, "version-0-0-10"]], "Version 0.0.11": [[1, "version-0-0-11"]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id9"], [1, "id10"], [1, "id11"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Version 0.0.9": [[1, "version-0-0-9"]], "Violin Plots Grid Example": [[5, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[6, null]], "What is EDA?": [[6, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "data_management", "eda_plots", "getting_started", "index", "references"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "data_management.rst", "eda_plots.rst", "getting_started.rst", "index.rst", "references.rst"], "indexentries": {"add_ids()": [[4, "add_ids", false]], "box_violin_plot()": [[5, "box_violin_plot", false]], "built-in function": [[4, "add_ids", false], [4, "contingency_table", false], [4, "dataframe_columns", false], [4, "ensure_directory", false], [4, "highlight_columns", false], [4, "parse_date_with_rule", false], [4, "save_dataframes_to_excel", false], [4, "strip_trailing_period", false], [4, "summarize_all_combinations", false], [5, "box_violin_plot", false], [5, "flex_corr_matrix", false], [5, "kde_distributions", false], [5, "plot_2d_pdp", false], [5, "plot_3d_pdp", false], [5, "scatter_fit_plot", false], [5, "stacked_crosstab_plot", false]], "contingency_table()": [[4, "contingency_table", false]], "dataframe_columns()": [[4, "dataframe_columns", false]], "ensure_directory()": [[4, "ensure_directory", false]], "flex_corr_matrix()": [[5, "flex_corr_matrix", false]], "highlight_columns()": [[4, "highlight_columns", false]], "kde_distributions()": [[5, "kde_distributions", false]], "parse_date_with_rule()": [[4, "parse_date_with_rule", false]], "plot_2d_pdp()": [[5, "plot_2d_pdp", false]], "plot_3d_pdp()": [[5, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[4, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[5, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[5, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[4, "strip_trailing_period", false]], "summarize_all_combinations()": [[4, "summarize_all_combinations", false]]}, "objects": {"": [[4, 0, 1, "", "add_ids"], [5, 0, 1, "", "box_violin_plot"], [4, 0, 1, "", "contingency_table"], [4, 0, 1, "", "dataframe_columns"], [4, 0, 1, "", "ensure_directory"], [5, 0, 1, "", "flex_corr_matrix"], [4, 0, 1, "", "highlight_columns"], [5, 0, 1, "", "kde_distributions"], [4, 0, 1, "", "parse_date_with_rule"], [5, 0, 1, "", "plot_2d_pdp"], [5, 0, 1, "", "plot_3d_pdp"], [4, 0, 1, "", "save_dataframes_to_excel"], [5, 0, 1, "", "scatter_fit_plot"], [5, 0, 1, "", "stacked_crosstab_plot"], [4, 0, 1, "", "strip_trailing_period"], [4, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 4, 5], "0": [2, 4, 5, 6, 7], "00": 4, "000000": 5, "0000ff": 5, "00140": [5, 8], "00bfc4": 5, "01": 4, "02": [1, 4], "03021": [5, 8], "04": [4, 5], "05": 5, "07": [4, 5], "09": 5, "1": [1, 4, 5, 6], "10": [2, 4, 5, 6, 7, 8], "100": [4, 5], "1016": [5, 8], "10724": 5, "11": [2, 4, 6, 7], "1109": [5, 8], "111": 4, "115": 5, "11687": 5, "11th": 4, "12": [4, 5, 6], "120": 5, "12202842": 4, "123": 4, "12929": 5, "13": [4, 5], "131": 5, "13162633": 2, "13163208": 2, "13174": 5, "1348": 4, "13920": [4, 5], "14": [4, 5], "147": 5, "14x4": 5, "15": [4, 5], "150": 4, "15784": 4, "15x5": 5, "16": [4, 5], "16192": 5, "17": 5, "18": [4, 5, 6], "1873": 5, "19716": 4, "1994": 6, "1996": [4, 5, 6, 8], "1997": [5, 8], "1b0": 7, "1d": 5, "1rc0": 7, "2": [4, 5, 6, 7], "20": [4, 5], "200": 4, "2007": [5, 8], "2020": 4, "2021": [4, 5, 8], "2022": 4, "2024": 2, "203488": 4, "21": [4, 5, 6], "21105": [5, 8], "2115": 5, "215646": 4, "22": 5, "22379": 4, "2245": 5, "22803": 4, "23": 5, "234721": 4, "24": 4, "24432": [4, 5, 6, 8], "24720": 4, "25": [1, 4, 5], "250": [4, 5], "2509": 5, "2565": 4, "26": 5, "27": 5, "274": 4, "28": [4, 5], "280": 5, "28523": 4, "29": [4, 5], "291": [5, 8], "295": 5, "297": [5, 8], "2d": [1, 7, 8], "3": [4, 5, 6, 7, 8], "30": [4, 5], "300": [4, 5], "3021": [5, 8], "3054": 5, "31": 4, "3188": 5, "32": 4, "32650": [4, 5], "33": [4, 5, 8], "333333": 5, "338409": 4, "33906": 4, "34": 5, "3461": 5, "35130194": 4, "36": [4, 5], "3680": 4, "37": [4, 5], "37155": 5, "38": [4, 5], "3853": 5, "39": [4, 5], "3986": 5, "3d": [1, 7], "3d_pdp": 5, "4": [4, 5, 6, 7], "40": [4, 5], "41": 5, "4110": 5, "41762": 4, "42": [4, 5], "42643227": 4, "4267": 4, "43": 4, "43832": 4, "44807": 4, "45": [4, 5], "46": 4, "46560": 4, "467": 4, "468": 4, "469": 4, "47": 5, "470": 4, "471": 4, "472": 4, "4746": 5, "48842": [4, 5], "49": [4, 5], "5": [4, 5, 6, 7], "50": [4, 5], "50k": [4, 5], "50k_": 5, "51": [4, 5], "5281": 2, "53": [4, 5], "535": 5, "55": [5, 8], "56": 4, "5623": 4, "5707": 5, "58": 5, "5856": 4, "59": [4, 5], "595": 5, "6": [4, 5, 6, 7, 8], "60": [4, 5, 8], "61": 4, "6172": 4, "62": 5, "64": [4, 5], "65": 5, "66": [4, 5], "6619": 5, "668": 5, "6738": 5, "68": 5, "69": [4, 5], "7": [4, 5, 6, 7], "70": [4, 5], "71": 5, "7152": [5, 8], "720": 4, "73": 5, "74": 4, "74130842": 4, "746": 5, "75": [4, 5], "7536": 5, "76": [4, 5], "77": 5, "77516": 4, "79": [4, 5], "8": [4, 5, 7], "80": [4, 5], "808080": 5, "809": 5, "81": 5, "815": 5, "82": 4, "8213": 5, "82943611": 4, "83": 5, "832": 4, "83311": 4, "85": [4, 5], "8601": 4, "861555": 4, "87": 5, "87104229": 4, "89": [4, 5], "8a": 7, "8b": 7, "8c": 7, "8d": 1, "9": [4, 5, 7, 8], "90": [4, 5, 8], "90069867": 4, "9076": 5, "91": [4, 5], "93": 5, "93837254": 4, "939": 5, "94": 5, "9468": 5, "95": [4, 5, 8], "96": [4, 5, 8], "96078789": 4, "963": 4, "966": 4, "97": 4, "97751875": 4, "98": 4, "99": [4, 5], "A": [1, 4, 5, 6, 8], "As": 5, "By": [1, 5], "For": [4, 5, 6], "If": [1, 4, 5], "In": [4, 5], "Into": 5, "It": [1, 4, 5, 6], "No": [1, 5], "Not": 4, "One": 1, "The": [1, 4, 5, 6], "Then": 4, "There": 5, "These": [1, 4, 5], "To": 5, "With": [3, 7], "_": 5, "_c": 5, "_plotli": 1, "abil": [1, 5], "abl": 5, "about": 4, "abov": [1, 5], "academ": 0, "accept": 1, "access": 5, "accord": [1, 5], "accordingli": 4, "account": 1, "accur": [1, 5], "accuraci": 4, "acknowledg": [1, 7], "across": [1, 4, 5], "actual": 5, "ad": [1, 5, 7], "adapt": [1, 4, 5], "add": [1, 4, 5], "add_best_fit_lin": 5, "add_id": [1, 4, 7], "addit": [1, 5], "addition": [4, 5, 6], "address": [1, 6], "adher": 5, "adjust": [1, 4, 5], "adm": 4, "advanc": 4, "aesthet": [1, 5], "affect": 5, "after": [1, 4, 5], "ag": [4, 5], "against": 5, "age_boxplot_list": 5, "age_group": [4, 5], "ages_18_to_40": 4, "aggreg": 5, "alic": 4, "align": [1, 4, 5], "all": [1, 4, 6, 7], "all_combin": 4, "all_var": 5, "allow": [1, 4, 5], "alon": 5, "along": [1, 4, 5], "alpha": [1, 5], "alreadi": 4, "also": [0, 1, 5], "altern": 5, "alwai": [1, 4], "amount": 4, "an": [0, 1, 3, 4, 5], "analysi": [1, 5, 6, 7], "analyst": 6, "analyt": 3, "analyz": [1, 4, 5], "angl": [1, 5], "ani": [1, 4, 5, 6], "annot": [1, 5], "anomali": 6, "anoth": 5, "anyth": 1, "appar": 5, "appear": [1, 4, 5], "append": [4, 5], "appli": [0, 1, 3, 4, 5, 6], "applic": [1, 5], "approach": 5, "appropri": [1, 5], "approxim": 5, "ar": [1, 4, 5], "area": 5, "arg": 1, "argument": [1, 5], "around": [1, 5], "arrai": 5, "arrang": 5, "arrow": 5, "artifact": 4, "artifici": 3, "asian": 4, "aspect": [1, 5, 6], "assess": 5, "assign": [1, 4, 5], "associ": [5, 6], "assum": 4, "assumpt": 7, "astyp": 1, "attempt": [4, 5], "attent": 5, "attract": 5, "attribut": 5, "aug": 2, "author": [2, 3], "auto": 5, "autofit": 4, "autom": [3, 6], "automat": [1, 5, 6], "autoregress": [5, 8], "avail": 5, "aveoccup": 5, "averag": 5, "averoom": 5, "avoid": [1, 5], "ax": [1, 5], "axi": [1, 5], "azimuth": 5, "bachelor": 4, "back": [4, 5], "backbon": 4, "background": 4, "background_color": [1, 4], "backward": 1, "badg": 1, "band": 5, "bandwidth": 5, "bar": [1, 6, 7], "barh": 5, "barri": [5, 8], "base": [1, 4, 5], "base_path": 4, "bbox_inch": 5, "becaus": [4, 5], "been": [1, 4, 5], "befor": [1, 4, 5, 6], "begin": [4, 5], "behavior": [1, 5], "being": [4, 5], "bell": 5, "belong": 4, "below": [4, 5], "beneath": 5, "benefici": 5, "best": [1, 6, 7], "best_fit_linecolor": 5, "best_fit_linestyl": 5, "beta": 1, "better": [1, 5, 6], "between": [1, 4, 5], "bin": [1, 5, 7], "bin_ag": 4, "binrang": 5, "binwidth": [1, 5], "black": [4, 5], "block": [1, 5], "blue": 5, "bob": 4, "bold": 4, "bool": [4, 5], "boolean": [1, 5], "border": 4, "both": [1, 4, 5], "bound": [4, 5], "boundari": 4, "box": [1, 6, 7], "box_violin_plot": [1, 5, 7], "boxplot": 5, "breakdown": 5, "brief": 1, "bring": 3, "broad": [1, 6], "brown": 5, "browser": 5, "bug": 1, "built": 5, "c0": 5, "c5gp7": [4, 5, 6, 8], "c_i": 5, "ca": 7, "calcul": [5, 7], "california": [3, 5], "call": [1, 4, 5], "camera": [1, 5], "can": [1, 4, 5, 6], "cancer": 5, "cannot": 4, "capabl": [1, 4], "capit": 4, "captur": 5, "career": 0, "case": [1, 4, 5], "categor": [1, 4, 5], "categori": [4, 7], "cbar_label": 5, "cbar_thick": [1, 5], "cbar_x": [1, 5], "cdot": 5, "cell": 4, "censu": [5, 6, 7, 8], "census_id": 4, "census_summary_t": 4, "center_baselin": 5, "central": 5, "centric": 7, "certain": 5, "certifi": 1, "cervic": 5, "chang": [1, 5], "changelog": 7, "charact": [4, 5], "characterist": 6, "charli": 4, "check": [1, 4, 5], "choos": [1, 4, 5], "circl": 5, "citat": 1, "cite": 7, "civ": 4, "clariti": [1, 5], "clean": [1, 4, 5, 6], "cleaner": [1, 4], "cleanup": 1, "clear": [1, 5], "clearer": 1, "clearli": 1, "cleric": 4, "closer": 5, "clutter": 5, "cmap": [1, 5], "code": [1, 4, 5], "codebas": 1, "coeffici": 7, "cohes": 5, "col": [1, 4, 5], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 4, 5], "colorbar": 5, "colormap": [1, 5], "column": [1, 5, 7], "column_nam": 4, "combin": [1, 6, 7], "come": 1, "comment": 1, "common": [1, 4, 6], "compar": 5, "comparison": 5, "compat": [1, 5], "complement": 5, "complementari": 5, "complet": 5, "complex": [1, 5], "comprehens": [1, 5, 6], "comput": [4, 5, 8], "concept": 5, "condit": 1, "condition": 1, "configur": [1, 5], "confirm": 1, "confus": [1, 5], "consecut": 4, "consid": 5, "consist": [1, 4, 5], "consolid": 1, "constant": [4, 5], "constitut": 4, "constraint": 4, "contain": [1, 4, 5], "content": [1, 4], "context": 5, "conting": [1, 5, 6, 7], "contingency_t": [4, 7], "continu": [1, 4, 5], "contour": 5, "contrast": 5, "contributor": 7, "control": [1, 5], "convers": [1, 4], "convert": [1, 4], "coolwarm": [1, 5], "coordin": 1, "cornel": 3, "correct": [1, 5, 6], "correctli": [1, 4, 5], "correl": [1, 7], "correspond": [1, 4, 5], "count": [1, 4, 7], "countri": 4, "cours": 3, "cov": 5, "covari": 5, "creat": [1, 5, 6, 7], "creation": 5, "crop": 5, "crosstab": [1, 7], "crosstab_age_incom": 5, "crosstab_age_sex": 5, "crosstabs_dict": 5, "crosstabs_onli": 5, "crucial": [4, 5, 6], "current": 4, "curv": 5, "custom": [1, 5, 6, 7], "custom_ord": 5, "customiz": [1, 5, 6], "cut": 4, "d": [5, 8], "dai": 4, "dark": 5, "dashboard": 5, "data": [0, 1, 3, 5, 6, 8], "data_nam": 4, "data_output": 4, "data_path": 4, "data_typ": 1, "datafram": [1, 5, 6, 7], "dataframe_column": [1, 4, 7], "dataset": [4, 5, 6], "date": [1, 6, 7], "date_column": 4, "date_str": 4, "datetim": 1, "david": 4, "dd": 4, "deal": [4, 5], "decad": 3, "decim": [1, 4], "decimal_plac": [1, 4], "decis": [1, 5], "decreas": 5, "dedic": 0, "deeper": 5, "deepest": 0, "default": [1, 4, 5], "defin": [1, 4, 5], "definit": 4, "degre": [1, 5], "demograph": 5, "demonstr": [4, 5, 6], "denot": 5, "densiti": [1, 7], "depend": [1, 4, 6, 7], "deprec": 1, "depth": [1, 5], "descend": [4, 5], "describ": [1, 5], "descript": [1, 7], "design": [4, 5, 6], "detail": [1, 5, 6, 7], "determin": [4, 5], "develop": 3, "deviat": [1, 6, 7], "df": [1, 4, 5], "df_censu": 4, "df_dict": 4, "df_num": 5, "dict": [4, 5], "dictionari": [4, 5], "did": 1, "diego": [0, 3], "differ": [1, 5], "digit": [1, 4], "dimens": 5, "dimensionless": 5, "dir": 4, "direct": 5, "directli": [1, 5, 6], "directori": [5, 6, 7], "disabl": [1, 5], "disable_sci_not": [1, 5], "discov": 6, "discret": [4, 5], "dispers": 5, "displai": [1, 4, 5], "distinct": [1, 4, 5], "distinguish": 5, "distract": 5, "distribut": [1, 4, 6, 7], "dive": 4, "divers": 1, "divid": [4, 5], "divorc": 4, "do": [1, 4, 5], "docstr": 1, "document": [1, 7], "doe": [1, 4, 5], "doi": [2, 4, 5, 6, 8], "domin": 4, "don": 5, "dot": 5, "doubl": 5, "down": 5, "dr": 0, "draw": 5, "driven": 4, "dtype": 4, "due": [1, 4], "duplic": 1, "dure": [0, 1], "dx_": 5, "dx_c": 5, "dynam": 1, "e": [1, 4, 5], "each": [1, 4, 5], "eas": [1, 4, 6], "easi": [5, 6], "easier": [1, 5], "easili": 5, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 5, 6], "edg": [1, 5], "edgecolor": 1, "educ": [0, 3, 4, 5], "effect": [1, 3, 4, 5, 6], "either": [1, 4, 5], "element": [1, 4, 5], "elev": 5, "els": 1, "emp": 4, "emphas": 1, "emploi": 5, "employ": 4, "empti": [1, 4, 5], "enabl": [1, 5, 6], "enable_zoom": [1, 5], "end": [1, 4, 5], "endeavor": 0, "endpoint": 4, "engin": [0, 4, 5, 8], "enhanc": [1, 4, 5, 6], "enough": 1, "ensembl": 5, "ensu": 6, "ensur": [1, 4, 5, 6], "ensure_directori": [4, 7], "enter": [1, 4], "entir": [4, 5], "entri": [1, 4, 5], "environ": [0, 1, 5, 8], "equal": 5, "equat": 5, "equival": 4, "error": [1, 4], "especi": [1, 4, 5], "essenti": [4, 5, 6], "estim": 7, "etc": 6, "ev": 4, "evalu": 5, "even": [1, 4, 5], "everyth": 5, "exact": 1, "examin": 5, "exampl": [1, 6, 7], "exce": 4, "excel": [3, 6, 7], "except": [0, 1, 4], "excess": 5, "exclud": [4, 5], "exclus": 4, "exec": 4, "execut": 5, "exist": [1, 4], "exp": 5, "expand": 1, "expect": [1, 5], "experi": [1, 3], "explain": [1, 4], "explan": 1, "explicitli": 1, "explor": [1, 5, 6], "exploratori": 6, "export": [5, 6], "express": [0, 5], "extend": [0, 5], "extens": [1, 5], "extract": [1, 5], "f": [1, 5], "f8766d": 5, "f8c5c8": 4, "facilit": [3, 4, 6], "factor": 5, "fall": [4, 5], "fallback": 1, "fals": [1, 4, 5], "famili": 4, "fashion": 5, "featur": [1, 4, 5, 7], "feature_nam": 5, "feature_names_list": [1, 5], "feder": 4, "feedback": 1, "femal": [4, 5], "female_": 5, "fetch": 5, "fetch_california_h": 5, "few": 5, "ff0000": 5, "figsiz": [1, 5], "figur": [1, 5], "file": [1, 4, 5], "file_nam": 4, "file_path": 4, "file_prefix": [1, 5], "filenam": [1, 5], "fill": [1, 5], "fill_alpha": [1, 5], "fillna": 1, "filter": [4, 5], "filtered_df": 4, "financi": [3, 5], "find": [1, 4], "first": [1, 4, 5], "fit": [1, 6, 7], "fix": 1, "flag": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 5], "flip": 5, "float": [4, 5], "fnlwgt": 4, "focu": 5, "focus": 5, "folder": 4, "follow": [1, 4, 5, 6], "font": [1, 5], "fontsiz": 1, "form": [4, 6], "format": [1, 5, 6, 7], "formatth": 5, "former": 4, "formerli": 1, "formula": 5, "found": 1, "foundat": 7, "four": 5, "frac": 5, "freedom": 5, "frequenc": [1, 4, 5], "frequent": 4, "friendli": 1, "from": [0, 1, 3, 4, 5, 6], "full": [1, 4, 7], "fulli": 5, "func_col": [1, 5], "function": [1, 4, 6, 7], "further": [1, 4, 5], "futur": [1, 5], "futurewarn": 5, "g": [1, 4, 5], "gain": [4, 6], "gaussian": 7, "gener": [1, 5, 6, 7], "geq": 4, "get": 6, "get_legend": 1, "get_text": 1, "gil": [2, 3], "github": 6, "give": 1, "given": [1, 4, 5], "glanc": 5, "go": 4, "got": 1, "gov": 4, "grad": 4, "gradientboostingregressor": 5, "graduat": 0, "granular": 1, "graphic": [5, 8], "gratitud": 0, "greater": [1, 4], "green": 5, "grei": 5, "grid": [1, 7], "grid_figs": 5, "grid_resolut": 5, "grid_valu": 5, "ground": 5, "group": [1, 4, 7], "gt": 5, "guid": [0, 6], "guidanc": 1, "guidelin": 5, "h": [4, 5], "h_pad": 5, "ha": [1, 3, 4, 5], "half": 5, "halv": 5, "handl": [1, 4, 5, 6], "handler": 4, "hat": 5, "have": [1, 4, 5], "he": 3, "header": [1, 4], "health": 3, "healthcar": 3, "heatmap": [1, 5], "height": 5, "help": [1, 4, 5, 6], "here": [4, 5], "hex": [1, 4], "hi": 0, "hidden": 5, "hide": [1, 5], "hide_index": 1, "high": [1, 4, 5], "higher": [5, 6], "highest": 4, "highli": 5, "highlight": [1, 5, 7], "highlight_column": [4, 7], "highlighted_df": 4, "hist": [1, 5], "hist_color": 5, "hist_edgecolor": [1, 5], "histogram": [1, 7], "hold": [3, 4, 5], "horizont": [1, 5], "hour": [4, 5], "hous": 7, "houseag": 5, "household": 5, "hover": 5, "how": [4, 5, 6], "howev": [1, 5], "html": [4, 5], "html_file_nam": [1, 5], "html_file_path": [1, 5], "http": [2, 4, 5, 6, 8], "huber": 5, "hue": [1, 5], "hue_dict": 5, "hue_palett": 5, "hunter": [5, 8], "husband": 4, "hyperlink": 4, "hypothes": 6, "i": [1, 3, 4, 5, 7], "icon": 1, "id": [1, 4, 6], "id_colnam": 4, "idea": 4, "identifi": [1, 5, 6, 7], "ignor": 5, "illustr": 5, "imag": [4, 5], "image_filenam": 5, "image_path_png": [1, 4, 5], "image_path_svg": [1, 4, 5], "imbal": 4, "immedi": 5, "impact": [1, 5], "implement": 1, "import": [1, 4, 5], "imposs": 4, "improv": 1, "inc": 4, "inch": 5, "includ": [1, 4, 5, 6], "inclus": 4, "incom": [5, 6, 7, 8], "inconsist": [1, 4], "incorpor": 1, "incorrect": [1, 5], "increas": 5, "increment": 1, "independ": 1, "index": [1, 4, 5], "indic": [1, 4, 5], "individu": [1, 4, 5], "individual_figs": 5, "industri": 3, "inf": 4, "infin": 4, "influenc": [1, 5], "influenti": 5, "inform": [5, 6], "initi": [1, 6], "inner": 5, "input": [1, 5], "insight": [4, 5, 6], "instal": 7, "instanc": [4, 5], "instead": [1, 5], "instruct": 6, "int": [1, 4, 5], "int64": 4, "integ": 1, "integr": [5, 6], "intellig": 3, "intend": 1, "interact": [1, 7], "interest": 5, "interfac": [1, 5], "intern": [1, 5], "interpret": [1, 5], "interv": 4, "introduc": 1, "introduct": 1, "intuit": [1, 5, 6], "invalid": 1, "invalu": 5, "investig": 6, "involv": [4, 5, 6], "io": 4, "island": 4, "iso": 4, "issu": [1, 6], "item": 5, "iter": [1, 5], "its": [1, 4], "itself": 5, "j": [5, 8], "jinja2": 6, "join": 4, "joint": 5, "jointli": 5, "joss": [5, 8], "journal": [5, 8], "journei": 0, "jupyt": 4, "just": 5, "k": [5, 8], "kde": [1, 6, 7], "kde_color": 5, "kde_density_single_distribut": 5, "kde_distribut": [1, 5, 7], "keep": 5, "kei": [1, 4, 5, 7], "kernel": 7, "keyboard": 5, "keyerror": 5, "keyword": [1, 5], "kind": 5, "kohavi": [4, 5, 6, 8], "kwarg": [1, 5], "l": 2, "label": [1, 4, 5], "label_ag": 4, "label_fonts": [1, 5], "label_nam": 5, "larg": 5, "largest": 5, "last": 4, "latest": 1, "layout": [1, 5], "ldot": 5, "lead": 5, "learn": [0, 1, 3, 4, 5, 6, 8], "learning_r": 5, "least": [1, 4], "lectur": 3, "left": [4, 5], "left_margin": [1, 5], "legend": [1, 5], "legend_label": 5, "legend_labels_list": 5, "legibl": 5, "len": 1, "length": [4, 5], "leonid": [2, 3], "leq": 4, "less": [1, 4], "let": 5, "letter": [5, 8], "level": [4, 5], "leverag": [5, 6], "librari": [1, 4, 5, 7], "licens": 1, "like": [0, 4, 5], "limit": [1, 4, 5], "line": [1, 6, 7], "linear": 5, "linestyl": 5, "link": 7, "list": [1, 4, 5], "load": [4, 5], "local": 4, "locat": [4, 5], "log": [1, 5], "log_scale_var": [1, 5], "logarithm": 5, "logic": 1, "logo": 1, "logscal": 5, "long": 5, "longer": 5, "loop": 5, "loss": [4, 5], "lower": [1, 5], "lt": [4, 5], "m": [0, 3, 5, 8], "machin": [1, 3, 4, 5, 6, 8], "made": 1, "magnitud": 5, "mai": [1, 5], "main": 6, "maintain": [1, 5, 7], "major": 4, "make": [1, 4, 5], "male": [4, 5], "male_": 5, "manag": [1, 3, 5, 6], "manageri": 4, "mani": [5, 6], "manipul": 6, "manner": 5, "manual": [1, 5], "map": [1, 5], "marco": 0, "margin": [1, 5], "marit": 4, "mark": [1, 5], "marker": 5, "marri": 4, "master": 3, "match": [1, 5], "mathbb": 5, "mathbf": 5, "mathemat": [4, 5], "matplotlib": [1, 5, 6, 8], "matplotlib_colormap": 5, "matric": [1, 7], "matrix": [1, 7], "max": 5, "max_col": 5, "max_depth": 5, "max_unique_valu": 4, "max_unique_value_pct": 4, "max_unique_value_tot": 4, "maximum": 5, "mcse": [5, 8], "mean": [1, 4, 6, 7], "mean_color": 5, "meaning": [4, 5], "measur": [4, 5], "mechan": 1, "median": [1, 6, 7], "median_color": 5, "medinc": 5, "meet": 6, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 5, 6], "metric": 5, "metrics_box_violin": 1, "metrics_boxplot_comp": 5, "metrics_comp": 5, "metrics_list": 5, "mid": 5, "might": 5, "min": 5, "min_length": 4, "mind": 6, "minim": [1, 5], "minimum": [4, 5], "minor": 1, "misalign": 5, "misinterpret": 5, "mislead": 1, "miss": [1, 4, 5, 6], "mm": 4, "mode": [1, 5], "model": [1, 5, 6], "model_select": 5, "modifi": [1, 5], "month": [2, 4], "more": [1, 4, 5], "most": [1, 4, 5, 6], "mous": 5, "move": [1, 5], "mu": 5, "mu_i": 5, "mu_x": 5, "much": 5, "multidimension": 5, "multipl": [1, 4, 5, 6], "multipli": 1, "must": [4, 5], "my_datafram": 1, "n": 5, "n_col": 5, "n_estim": 5, "n_row": 5, "na": [1, 4], "name": [1, 5, 7], "nativ": 4, "navig": [4, 5], "nbformat": 6, "ndarrai": 5, "necessari": [1, 4], "need": [1, 4, 5, 6], "neg": 5, "neither": [1, 5], "nest": 5, "neutral": 5, "never": 4, "new": [1, 4, 5], "newer": 5, "next": [4, 5], "nh": 5, "nomenclatur": 1, "non": [1, 4, 7], "none": [1, 4, 5], "nonetyp": 1, "nor": [1, 5], "normal": [1, 7], "notat": [1, 5], "note": [4, 5], "notebook": 4, "noth": 4, "notic": 5, "now": 1, "np": 5, "null": [1, 4], "null_pct": 4, "null_tot": 4, "num": [4, 5], "num_digit": 4, "number": [1, 4, 5], "numer": [1, 5, 7], "numpi": [5, 6], "nuniqu": 4, "o": [2, 4, 5], "object": [1, 4, 5], "observ": 5, "obviou": 5, "occup": [4, 5], "occur": [1, 4], "occurr": 4, "offer": [1, 5, 6], "often": [5, 6], "older": [1, 5], "omit": 1, "one": [1, 4, 5], "onli": [1, 5], "opaqu": 5, "open": [5, 8], "oper": [4, 5], "opportun": 4, "optim": 5, "option": [1, 4, 5, 6], "orang": 5, "order": [1, 4, 5], "org": [2, 4, 5, 6, 8], "organ": [1, 5], "orient": 5, "origin": [4, 5], "original_df": 4, "oscar": [2, 3], "other": [1, 4, 5], "otherwis": 5, "our": 0, "out": 5, "outcom": 5, "outlier": 6, "output": [1, 4, 5], "outsid": 5, "over": [1, 3, 5], "overal": [1, 5], "overlai": 5, "overlaid": 5, "overlap": 5, "overrid": 5, "overview": 7, "own": 5, "p": 5, "pac": 4, "pace": [5, 8], "packag": 6, "pad": [1, 5], "page": [5, 6], "pair": [4, 5], "pairwis": 5, "palett": 5, "panda": [1, 4, 5, 6], "param": 1, "paramet": [1, 4, 5], "parametr": 5, "pardir": 4, "parent": 4, "pars": 4, "parse_date_with_rul": [4, 7], "part": 4, "partial": [1, 7], "partial_depend": 5, "particular": 5, "particularli": [1, 4, 5], "pass": [1, 5], "path": [1, 5, 7], "patient": 4, "pattern": [5, 6], "pd": [4, 5], "pdf": 5, "pdp": 5, "pearson": 7, "per": [4, 5], "percent": [1, 5], "percentag": 4, "perfect": 5, "perfectli": 5, "perform": [1, 4, 5], "performancewarn": 1, "period": 7, "person": 3, "perspect": [1, 5], "pi": 5, "pink": 4, "pip": 6, "pitfal": 1, "pivot": [0, 7], "place": [1, 4], "plai": 0, "plain": 4, "plot": [1, 6], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_mean": 5, "plot_median": 5, "plot_typ": [1, 5], "plotli": [1, 5, 6], "plotly_colormap": 5, "plots_onli": 5, "plt": 1, "pm": 5, "png": [1, 4, 5], "png_imag": 4, "point": [1, 5], "pointer": 5, "popul": 5, "popular": 6, "posit": [1, 5], "possibl": [4, 5, 6], "potenti": [1, 4, 5], "power": [1, 5], "pr": 1, "pre": 1, "preced": 5, "predict": [1, 5], "prefer": [1, 5], "prefix": [1, 5], "prepar": [1, 4, 5], "prerequisit": 7, "present": [1, 4, 5], "preval": 5, "prevent": [1, 4, 5], "previou": [1, 5], "previous": 1, "price": 5, "print": [1, 4, 5], "prior": 5, "privat": 4, "probabl": [1, 5, 8], "process": [1, 4, 6], "produc": [1, 5], "product": 5, "prof": 4, "profession": 3, "program": [0, 3], "project": [1, 3, 4, 7], "promin": 5, "proper": [1, 5], "properli": [1, 5], "proport": [1, 4, 5], "provid": [0, 1, 4, 5, 6], "public": 5, "publish": 2, "purpl": 5, "purpos": [1, 7], "pursu": 0, "py": 1, "pypi": [1, 6], "python": [1, 3, 5, 7], "qualiti": [5, 6], "quantifi": 5, "quantit": 5, "quick": 5, "quickli": [5, 6], "r": [3, 4, 5, 6, 8], "r_": 5, "race": 4, "racial": 4, "rais": [1, 4, 5], "random": 4, "random_st": 5, "rang": [4, 5, 6], "raw": 5, "re": [1, 5], "read": 4, "readabl": [1, 5], "readi": 6, "readm": 1, "record": 4, "red": 5, "reduc": [1, 5], "redund": 5, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 5], "regress": 7, "regular": [1, 7], "relat": [1, 4, 5], "relationship": [4, 5, 6], "releas": 1, "relev": [1, 6], "reli": 5, "reliabl": 4, "remain": [1, 5], "remov": [1, 5, 6, 7], "remove_stack": [1, 5], "renam": [1, 5], "render": 4, "replac": 4, "replica": 1, "report": [3, 5, 6], "repositori": [4, 5, 6, 8], "repres": [1, 4, 5], "represent": [1, 5], "reproduc": 4, "requir": [1, 5, 6], "research": 6, "reset": 1, "resolut": 5, "resolv": 1, "respect": [1, 4, 5], "respons": 5, "rest": 5, "result": [1, 4, 5], "return": [1, 4, 5], "return_df": [1, 4], "return_dict": 5, "reveal": 5, "rich": [5, 6], "right": [4, 5], "right_margin": [1, 5], "riversid": 3, "robust": 1, "role": [0, 1], "rot": 5, "rotat": [1, 5], "rotate_plot": 5, "round": 4, "row": [4, 5], "rule": 4, "run": 6, "s0167": [5, 8], "same": [1, 5], "sampl": [4, 5], "san": [0, 3], "save": [1, 5, 6, 7], "save_dataframes_to_excel": [1, 4, 7], "save_format": [1, 5], "save_plot": [1, 5], "scale": [1, 5], "scatter": [1, 6, 7], "scatter_color": 5, "scatter_fit_plot": [1, 5, 7], "scatterplot": 5, "scenario": [1, 5], "schema": 5, "scheme": 5, "school": 0, "scienc": [0, 3, 4, 5, 6, 8], "scientif": [1, 5], "scientist": [0, 3, 6], "scikit": [1, 5, 6], "scroll": 5, "seaborn": [1, 5, 6, 8], "seamlessli": 6, "second": [4, 5], "section": [1, 4], "see": 5, "seed": 4, "select": [1, 5], "select_dtyp": 5, "self": 4, "separ": [1, 4, 5], "sequenc": 5, "seri": 4, "serv": [1, 3], "servic": 3, "set": [1, 4, 5], "set_as_index": 4, "set_titl": 1, "setminu": 5, "setp": 1, "setup": [1, 4, 5], "sever": [1, 5], "sex": [4, 5], "shape": [4, 5], "sheet": 4, "shilei": 0, "should": 5, "show": [1, 4, 5], "show_cbar": 5, "show_correl": 5, "show_legend": [1, 5], "show_modebar": [1, 5], "show_plot": 5, "showcas": 5, "shown": 5, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 5, "sigma_i": 5, "sigma_x": 5, "signatur": 1, "signific": [1, 4], "silver": 5, "similarli": 5, "simpl": 5, "simpler": 1, "simplic": 6, "simplif": 1, "simplifi": [1, 4], "simultan": 5, "sinc": 5, "singl": [1, 4, 5], "single_figs": 5, "single_var_image_filenam": 5, "size": [1, 4, 5], "sklearn": 5, "slightli": 1, "small": 1, "smallest": 5, "smooth": 5, "smoother": [1, 5], "sn": 5, "snippet": [4, 5], "so": [1, 4, 5], "softwar": [2, 5, 8], "some": [1, 4], "sort": [1, 4], "sort_bi": [1, 4], "sortbi": 1, "sourc": [5, 6, 8], "space": [1, 5], "span": 5, "spars": [5, 8], "spatial": [5, 8], "special": 4, "specialti": 4, "specif": [1, 5, 6, 7], "specifi": [1, 4, 5, 6], "split": 5, "spot": 4, "spous": 4, "spread": 5, "sql": 3, "sqrt": 5, "squar": [1, 5], "stabil": 1, "stabl": 1, "stack": [1, 6, 7], "stacked_crosstab": 5, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 5, 6, 7], "standardized_d": 4, "start": [1, 4, 6], "stat": [1, 5], "state": 4, "static": [1, 7], "statist": [1, 3, 4, 5, 6, 8], "statu": [1, 4], "std": 7, "std_color": 5, "std_dev_level": 5, "stem": 5, "step": [1, 4, 6], "still": [1, 5], "store": [1, 5], "str": [1, 4, 5], "straightforward": 1, "streamlin": [1, 4, 6], "strength": 5, "string": [1, 4, 5], "strip": 4, "strip_trailing_period": [4, 7], "stronger": 5, "structur": [1, 6], "style": [1, 4, 5], "styler": [1, 4], "subplot": 5, "subset": 5, "substitut": 5, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suggest": 4, "suit": 6, "suitabl": 1, "sum_": 5, "summar": [5, 6], "summari": [1, 6, 7], "summarize_all_combin": [4, 7], "summary_t": 4, "support": [0, 1, 5], "suppos": 5, "suppress": 5, "sure": 4, "surfac": [1, 5], "svg": [1, 4, 5], "svg_imag": 4, "sy": 1, "system": [4, 6], "t": 5, "tab": 4, "tabl": [1, 5, 6], "tailor": 5, "take": [4, 5], "tall": 5, "target": 5, "tarshizi": 0, "task": [4, 6], "tatist": 5, "teach": 3, "techniqu": [6, 7], "ten": 3, "tend": 5, "tendenc": 5, "test": [1, 5], "test_siz": 5, "text": [1, 4, 5], "text_wrap": [1, 5], "th": 5, "than": [1, 4], "thank": 0, "thei": [1, 4, 5], "them": [1, 4, 5, 6], "theoret": 7, "therefor": 5, "thi": [1, 4, 5, 6], "thick": 5, "those": 1, "three": 5, "through": [1, 5], "throw": 1, "thu": 4, "tick": [1, 5], "tick_fonts": [1, 5], "tight": 5, "time": [0, 1, 4, 5], "titl": [1, 2, 5], "title_i": [1, 5], "title_x": [1, 5], "to_list": 5, "togeth": 5, "toggl": [1, 5], "tool": [1, 5, 6], "toolkit": 1, "top": 5, "top_margin": [1, 5], "topic": 4, "total": [4, 5], "toward": 1, "trail": 7, "train": 5, "train_test_split": 5, "transpar": [1, 5], "trend": [5, 6], "triangl": 5, "triangular": [1, 7], "true": [1, 4, 5], "truth": 5, "try": 1, "tupl": [1, 4, 5], "two": [1, 4, 5], "type": [1, 4, 5, 6], "typeerror": 1, "u": [0, 4, 5], "uci": [4, 5, 6, 8], "ucla": 3, "unambigu": 4, "uncov": [5, 6], "underli": [5, 6], "understand": [4, 5, 6], "uniform": 1, "uniqu": [1, 5, 6, 7], "unique_values_tot": 4, "unique_var": 4, "unit": 4, "univers": [0, 3], "unnecessari": 1, "unrecogn": 4, "unstack": 5, "unus": 1, "unwav": 0, "up": [1, 4, 5], "updat": [1, 4, 5], "upper": [1, 4, 5], "upright": 5, "url": 2, "us": [1, 4, 5, 6], "usabl": 1, "usag": [1, 4, 5], "user": [1, 5, 6], "userwarn": 5, "util": [4, 5, 6], "v": 5, "valid": [1, 5], "valid_plot_typ": 1, "valu": [1, 4, 5, 6], "value_count": 4, "valueerror": [1, 4, 5], "vari": [4, 5], "variabl": [1, 5, 6, 7], "varianc": 5, "varieti": [3, 5, 6], "variou": [1, 5, 6], "vars_of_interest": 5, "vdot": 4, "vector": 5, "verbiag": 1, "verifi": [1, 4], "versa": 5, "versatil": 5, "version": [2, 5, 6, 7], "version_info": 1, "versu": 1, "vertic": [1, 5], "via": [1, 5], "vice": 5, "view": [1, 5], "view_angl": 5, "violin": [1, 6, 7], "violinplot": 5, "viridi": 5, "visibl": [1, 5], "visual": [1, 4, 5, 6, 8], "vmax": 5, "vmin": 5, "vriabl": 5, "w_pad": 5, "wa": [1, 5], "wai": 5, "want": [1, 5], "wareh": 3, "warn": [1, 4, 5], "waskom": [5, 8], "we": [0, 4, 5, 6], "week": [4, 5], "welcom": 7, "well": [4, 5], "were": 4, "what": [1, 7], "wheel": 5, "when": [1, 4, 5, 6], "where": [1, 4, 5], "whether": [1, 4, 5], "which": [1, 4, 5, 6], "while": [1, 5], "white": 4, "whitespac": 5, "who": 1, "wide": [3, 5], "width": [1, 5], "wife": 4, "wirefram": [1, 5], "wireframe_color": 5, "wish": 5, "within": [1, 3, 4, 5], "without": [1, 4, 5], "work": [1, 4, 5], "workclass": 4, "workflow": [4, 6], "would": [0, 1, 5], "wrangl": 3, "wrap": [1, 5], "write": 4, "x": [1, 4, 5, 8], "x_": 5, "x_1": 5, "x_2": 5, "x_c": 5, "x_i": 5, "x_j": 5, "x_k": 5, "x_label": [1, 5], "x_label_plotli": 1, "x_n": 5, "x_p": 5, "x_test": 5, "x_train": 5, "x_var": 5, "xlabel": 5, "xlabel_align": 5, "xlabel_rot": 5, "xlim": [1, 5], "xlsx": 4, "xlsxwriter": 6, "xx": 1, "xy": 5, "y": [1, 5], "y_axis_label": 5, "y_i": 5, "y_label": [1, 5], "y_label_plotli": 1, "y_test": 5, "y_train": 5, "y_var": 5, "year": [2, 3, 4], "yellow": 4, "ylabel": 5, "ylabel_align": 5, "ylabel_rot": 5, "ylim": [1, 5], "you": [4, 5, 6], "your": [4, 5, 6], "yy": 1, "yyyi": 4, "z": 5, "z_label": [1, 5], "z_label_plotli": 1, "zenodo": [1, 2], "zero": [1, 4], "zoom": [1, 5], "zoom_out_factor": [1, 5], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Data Management Overview", "Plotting and Theoretical Overview", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References"], "titleterms": {"0": 1, "10": 1, "11": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 5, "3": 1, "3d": 5, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "9": 1, "With": 5, "about": 7, "acknowledg": 0, "ad": 4, "all": 5, "analysi": 4, "assumpt": 5, "bar": 5, "best": 5, "bin": 4, "box": 5, "ca": 5, "calcul": 4, "categori": 5, "censu": 4, "centric": 5, "changelog": 1, "cite": 2, "coeffici": 5, "column": 4, "combin": [4, 5], "content": 7, "conting": 4, "contributor": 3, "correl": 5, "count": 5, "creat": 4, "crosstab": 5, "custom": 4, "data": [4, 7], "datafram": 4, "date": 4, "densiti": 5, "depend": 5, "descript": 6, "detail": 4, "deviat": 5, "directori": 4, "distribut": 5, "document": 6, "eda": [2, 6, 7], "estim": 5, "exampl": [4, 5], "excel": 4, "featur": 6, "fit": 5, "format": 4, "foundat": 5, "full": 5, "function": 5, "gaussian": 5, "gener": 4, "get": 7, "grid": 5, "group": 5, "heurist": 7, "highlight": 4, "histogram": 5, "hous": 5, "i": 6, "identifi": 4, "incom": 4, "instal": 6, "interact": 5, "kde": 5, "kei": 6, "kernel": 5, "librari": 6, "line": 5, "link": 6, "maintain": 3, "manag": [4, 7], "matric": 5, "matrix": 5, "mean": 5, "median": 5, "name": 4, "non": 5, "normal": 5, "numer": 4, "overview": [4, 5], "partial": 5, "path": 4, "pearson": 5, "period": 4, "pivot": 5, "plot": [5, 7], "prerequisit": 6, "project": 6, "purpos": 6, "python": 6, "refer": 8, "regress": 5, "regular": 5, "remov": 4, "save": 4, "scatter": 5, "specif": 4, "stack": 5, "standard": 4, "start": 7, "static": 5, "std": 5, "summari": 4, "tabl": [4, 7], "techniqu": 4, "theoret": 5, "toolkit": [2, 6, 7], "trail": 4, "triangular": 5, "uniqu": 4, "variabl": 4, "version": 1, "violin": 5, "welcom": 6, "what": 6}}) \ No newline at end of file diff --git a/_build/html/v0.0.5/.buildinfo b/_build/html/v0.0.5/.buildinfo new file mode 100644 index 000000000..2359851c9 --- /dev/null +++ b/_build/html/v0.0.5/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 902c232d439151692343aed3c8044f91 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/v0.0.5/.doctrees/acknowledgements.doctree b/_build/html/v0.0.5/.doctrees/acknowledgements.doctree new file mode 100644 index 000000000..39d9d7ac3 Binary files /dev/null and b/_build/html/v0.0.5/.doctrees/acknowledgements.doctree differ diff --git a/_build/html/v0.0.5/.doctrees/changelog.doctree b/_build/html/v0.0.5/.doctrees/changelog.doctree new file mode 100644 index 000000000..00e0d8aae Binary files /dev/null and b/_build/html/v0.0.5/.doctrees/changelog.doctree differ diff --git a/_build/html/v0.0.5/.doctrees/citations.doctree b/_build/html/v0.0.5/.doctrees/citations.doctree new file mode 100644 index 000000000..3883710ed Binary files /dev/null and b/_build/html/v0.0.5/.doctrees/citations.doctree differ diff --git a/_build/html/v0.0.5/.doctrees/environment.pickle b/_build/html/v0.0.5/.doctrees/environment.pickle new file mode 100644 index 000000000..afd06e875 Binary files /dev/null and b/_build/html/v0.0.5/.doctrees/environment.pickle differ diff --git a/_build/html/v0.0.5/.doctrees/getting_started.doctree b/_build/html/v0.0.5/.doctrees/getting_started.doctree new file mode 100644 index 000000000..bed45468a Binary files /dev/null and b/_build/html/v0.0.5/.doctrees/getting_started.doctree differ diff --git a/_build/html/v0.0.5/.doctrees/index.doctree b/_build/html/v0.0.5/.doctrees/index.doctree new file mode 100644 index 000000000..b552ca58a Binary files /dev/null and b/_build/html/v0.0.5/.doctrees/index.doctree differ diff --git a/_build/html/v0.0.5/.doctrees/references.doctree b/_build/html/v0.0.5/.doctrees/references.doctree new file mode 100644 index 000000000..086ba3586 Binary files /dev/null and b/_build/html/v0.0.5/.doctrees/references.doctree differ diff --git a/_build/html/v0.0.5/.doctrees/usage_guide.doctree b/_build/html/v0.0.5/.doctrees/usage_guide.doctree new file mode 100644 index 000000000..60da33820 Binary files /dev/null and b/_build/html/v0.0.5/.doctrees/usage_guide.doctree differ diff --git a/_build/html/v0.0.5/_images/Bar_Age_regular_income.svg b/_build/html/v0.0.5/_images/Bar_Age_regular_income.svg new file mode 100644 index 000000000..6f8aa40d4 --- /dev/null +++ b/_build/html/v0.0.5/_images/Bar_Age_regular_income.svg @@ -0,0 +1,1201 @@ + + + + + + + + 2024-08-04T12:01:07.319833 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/Stacked_Bar_Age_income.svg b/_build/html/v0.0.5/_images/Stacked_Bar_Age_income.svg new file mode 100644 index 000000000..d5510308b --- /dev/null +++ b/_build/html/v0.0.5/_images/Stacked_Bar_Age_income.svg @@ -0,0 +1,1943 @@ + + + + + + + + 2024-08-04T11:47:19.816889 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/Stacked_Bar_Age_income_pivoted.svg b/_build/html/v0.0.5/_images/Stacked_Bar_Age_income_pivoted.svg new file mode 100644 index 000000000..2147fce1a --- /dev/null +++ b/_build/html/v0.0.5/_images/Stacked_Bar_Age_income_pivoted.svg @@ -0,0 +1,2043 @@ + + + + + + + + 2024-08-04T11:56:38.571027 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/Stacked_Bar_Age_income_regular.svg b/_build/html/v0.0.5/_images/Stacked_Bar_Age_income_regular.svg new file mode 100644 index 000000000..04478581f --- /dev/null +++ b/_build/html/v0.0.5/_images/Stacked_Bar_Age_income_regular.svg @@ -0,0 +1,1347 @@ + + + + + + + + 2024-08-04T11:54:36.826244 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/Stacked_Bar_Age_sex.svg b/_build/html/v0.0.5/_images/Stacked_Bar_Age_sex.svg new file mode 100644 index 000000000..7b2bcb137 --- /dev/null +++ b/_build/html/v0.0.5/_images/Stacked_Bar_Age_sex.svg @@ -0,0 +1,1970 @@ + + + + + + + + 2024-08-04T11:55:12.796551 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/all_plots_comparisons_boxplot.svg b/_build/html/v0.0.5/_images/all_plots_comparisons_boxplot.svg new file mode 100644 index 000000000..6f3173cff --- /dev/null +++ b/_build/html/v0.0.5/_images/all_plots_comparisons_boxplot.svg @@ -0,0 +1,11585 @@ + + + + + + + + 2024-08-04T12:03:21.278906 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/all_plots_comparisons_violinplot.svg b/_build/html/v0.0.5/_images/all_plots_comparisons_violinplot.svg new file mode 100644 index 000000000..571a084b8 --- /dev/null +++ b/_build/html/v0.0.5/_images/all_plots_comparisons_violinplot.svg @@ -0,0 +1,5868 @@ + + + + + + + + 2024-08-04T12:11:16.318430 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/all_plots_comparisons_violinplot_pivoted.svg b/_build/html/v0.0.5/_images/all_plots_comparisons_violinplot_pivoted.svg new file mode 100644 index 000000000..0e317ba63 --- /dev/null +++ b/_build/html/v0.0.5/_images/all_plots_comparisons_violinplot_pivoted.svg @@ -0,0 +1,5764 @@ + + + + + + + + 2024-08-04T12:12:23.860397 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/count_hist_distributions.svg b/_build/html/v0.0.5/_images/count_hist_distributions.svg new file mode 100644 index 000000000..521cd5a95 --- /dev/null +++ b/_build/html/v0.0.5/_images/count_hist_distributions.svg @@ -0,0 +1,1719 @@ + + + + + + + + 2024-07-31T18:14:40.266523 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/eda_toolkit_logo.svg b/_build/html/v0.0.5/_images/eda_toolkit_logo.svg new file mode 100644 index 000000000..d039d6f79 --- /dev/null +++ b/_build/html/v0.0.5/_images/eda_toolkit_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_build/html/v0.0.5/_images/hist_density_distributions.svg b/_build/html/v0.0.5/_images/hist_density_distributions.svg new file mode 100644 index 000000000..8bf1787a6 --- /dev/null +++ b/_build/html/v0.0.5/_images/hist_density_distributions.svg @@ -0,0 +1,1744 @@ + + + + + + + + 2024-07-31T18:12:26.650100 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/kde_density_distributions.svg b/_build/html/v0.0.5/_images/kde_density_distributions.svg new file mode 100644 index 000000000..7564724e1 --- /dev/null +++ b/_build/html/v0.0.5/_images/kde_density_distributions.svg @@ -0,0 +1,2571 @@ + + + + + + + + 2024-07-31T18:08:35.979182 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_images/scatter_plots_grid.png b/_build/html/v0.0.5/_images/scatter_plots_grid.png new file mode 100644 index 000000000..5a51facd8 Binary files /dev/null and b/_build/html/v0.0.5/_images/scatter_plots_grid.png differ diff --git a/_build/html/v0.0.5/_images/scatter_plots_grid_grouped.png b/_build/html/v0.0.5/_images/scatter_plots_grid_grouped.png new file mode 100644 index 000000000..02a3b3916 Binary files /dev/null and b/_build/html/v0.0.5/_images/scatter_plots_grid_grouped.png differ diff --git a/_build/html/v0.0.5/_images/summarize_combos.gif b/_build/html/v0.0.5/_images/summarize_combos.gif new file mode 100644 index 000000000..402ee1efc Binary files /dev/null and b/_build/html/v0.0.5/_images/summarize_combos.gif differ diff --git a/_build/html/v0.0.5/_sources/acknowledgements.rst.txt b/_build/html/v0.0.5/_sources/acknowledgements.rst.txt new file mode 100644 index 000000000..e62da5a10 --- /dev/null +++ b/_build/html/v0.0.5/_sources/acknowledgements.rst.txt @@ -0,0 +1,30 @@ +.. _acknowledgements: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Acknowledgements +================= + +We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists. + +We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors. diff --git a/_build/html/v0.0.5/_sources/changelog.rst.txt b/_build/html/v0.0.5/_sources/changelog.rst.txt new file mode 100644 index 000000000..f1ab527bc --- /dev/null +++ b/_build/html/v0.0.5/_sources/changelog.rst.txt @@ -0,0 +1,279 @@ +.. _changelog: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Changelog +========= + +Version 0.0.5 +--------------------------- + +**Ensure Consistent Font Size and Text Wrapping Across Plot Elements** + +This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the ``stacked_crosstab_plot`` function. The following updates have been implemented to ensure uniformity and improve the readability of plots: + +1. **Title Font Size and Text Wrapping:** + - Added a ``text_wrap`` parameter to control the wrapping of plot titles. + - Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ``ax.set_title()`` after plot generation. + +2. **Legend Font Size Consistency:** + - Incorporated ``label_fontsize`` into the legend font size by directly setting the font size of the legend text using ``plt.setp(legend.get_texts(), fontsize=label_fontsize)``. + - This ensures that the legend labels are consistent with the title and axis labels. + +**Testing** + +- Verified that titles now wrap correctly and match the specified ``label_fontsize``. +- Confirmed that legend text scales according to ``label_fontsize``, ensuring consistent font sizes across all plot elements. + + +Version 0.0.4 +--------------------------- + +- **Stable release** + + - No new updates to the codebase. + + - Updated the project ``description`` variable in ``setup.py`` to re-emphasize key elements of the library. + + - Minor README cleanup: + + - Added icons for sections that did not have them. + + +Version 0.0.3 +--------------------------- + +- **Stable release** + + - Updated logo size, fixed citation title, and made minor README cleanup: + + - Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support. + +Version 0.0.2 +--------------------------- + +- **First stable release** + - No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + - Added logo, badges, and Zenodo-certified citation to README. + +Version 0.0.1rc0 +------------------------------- + +- No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + +Version 0.0.1b0 +----------------------------- + +**New Scatter Fit Plot and Additional Updates** + +- Added new ``scatter_fit_plot()``, removed unused ``data_types()``, and added comment section headers. + +**Added xlim and ylim Inputs to KDE Distribution** + +- ``kde_distribution()``: + + - Added ``xlim`` and ``ylim`` inputs to allow users to customize axes limits in ``kde_distribution()``. + +**Added xlim and ylim Params to Stacked Crosstab Plot** + +- ``stacked_crosstab_plot()``: + + - Added ``xlim`` and ``ylim`` input parameters to ``stacked_crosstab_plot()`` to give users more flexibility in controlling axes limits. + +**Added x and y Limits to Box and Violin Plots** + +- ``box_violin_plot()``: + + - Changed function name from ``metrics_box_violin()`` to ``box_violin_plot()``. + - Added ``xlim`` and ``ylim`` inputs to control x and y-axis limits of ``box_violin_plot()`` (formerly ``metrics_box_violin``). + +**Added Ability to Remove Stacks from Plots, Plot All or One at a Time** + +**Key Changes** + +1. **Plot Type Parameter** + - ``plot_type``: This parameter allows the user to choose between ``"regular"``, ``"normalized"``, or ``"both"`` plot types. + +2. **Remove Stacks Parameter** + - ``remove_stacks``: This parameter, when set to ``True``, generates a regular bar plot using only the ``col`` parameter instead of a stacked bar plot. It only works when ``plot_type`` is set to "regular". If ``remove_stacks`` is set to ``True`` while ``plot_type`` is anything other than "regular", the function will raise an exception. + +**Explanation of Changes** + +- **Plot Type Parameter** + + - Provides flexibility to the user, allowing specification of the type of plot to generate: + + - ``"regular"``: Standard bar plot. + + - ``"normalized"``: Normalized bar plot. + + - ``"both"``: Both regular and normalized bar plots. + +- **Remove Stacks Parameter** + - ``remove_stacks``: Generates a regular bar plot using only the ``col`` parameter, removing the stacking of the bars. Applicable only when ``plot_type`` is set to "regular". An exception is raised if used with any other ``plot_type``. + +These changes enhance the flexibility and functionality of the ``stacked_crosstab_plot`` function, allowing for more customizable and specific plot generation based on user requirements. + +Version 0.0.1b0 +----------------------------- + +**Refined KDE Distributions** + +**Key Changes** + +1. **Alpha Transparency for Histogram Fill** + - Added a ``fill_alpha`` parameter to control the transparency of the histogram bars' fill color. + - Default value is ``0.6``. An exception is raised if ``fill=False`` and ``fill_alpha`` is specified. + +2. **Custom Font Sizes** + - Introduced ``label_fontsize`` and ``tick_fontsize`` parameters to control font size of axis labels and tick marks independently. + +3. **Scientific Notation Toggle** + - Added a ``disable_sci_notation`` parameter to enable or disable scientific notation on axes. + +4. **Improved Error Handling** + - Added validation for the ``stat`` parameter to ensure valid options are accepted. + - Added checks for proper usage of ``fill_alpha`` and ``hist_edgecolor`` when ``fill`` is set to ``False``. + +5. **General Enhancements** + - Updated the function's docstring to reflect new parameters and provide comprehensive guidance on usage. + +Version 0.0.1b0 +----------------------------- + +**Enhanced KDE Distributions Function** + +**Added Parameters** + +1. **Grid Figsize and Single Figsize** + - Control the size of the overall grid figure and individual figures separately. + +2. **Hist Color and KDE Color`** + - Allow customization of histogram and KDE plot colors. + +3. **Edge Color** + - Allows customization of histogram bar edges. + +4. **Hue** + - Allows grouping data by a column. + +5. **Fill** + - Controls whether to fill histogram bars with color. + +6. **Y-axis Label`** + - Customizable y-axis label. + +7. **Log-Scaling** + - Specifies which variables to apply log scale. + +8. **Bins and Bin Width** + - Control the number and width of bins. + +9. **``stat``:** + - Allows different statistics for the histogram (``count``, ``density``, ``frequency``, ``probability``, ``proportion``, ``percent``). + +**Improvements** + +1. **Validation and Error Handling** + - Checks for invalid ``log_scale_vars`` and throws a ``ValueError`` if any are found. + - Throws a ``ValueError`` if ``edgecolor`` is changed while ``fill`` is set to ``False``. + - Issues a ``PerformanceWarning`` if both ``bins`` and ``binwidth`` are specified, warning of potential performance impacts. + +2. **Customizable Y-Axis Label** + - Allows users to specify custom y-axis labels. + +3. **Warning for KDE with Count** + - Issues a warning if KDE is used with ``stat='count'``, as it may produce misleading plots. + +**Updated Function to Ensure Unique IDs and Index Check** + +- Ensured that each generated ID in ``add_ids`` starts with a non-zero digit. +- Added a check to verify that the DataFrame index is unique. +- Printed a warning message if duplicate index entries are found. + +These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique. + +**Check for Unique Indices** +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries. + +**Generate Non-Zero Starting IDs** + +- The ID generation process is updated to ensure that the first digit of each ID is always non-zero. + +**Ensure Unique IDs** + +- A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame. + +**Fix Int Conversion for Numeric Columns, Reset Decimal Places** + +- Fixed integer conversion issue for numeric columns when ``decimal_places=0`` in the ``save_dataframes_to_excel`` function. +- Reset ``decimal_places`` default value to ``0``. + +These changes ensure correct formatting and avoid errors during conversion. + +**Contingency Table Updates** + +1. **Error Handling for Columns** + - Added a check to ensure at least one column is specified. + - Updated the function to accept a single column as a string or multiple columns as a list. + - Raised a ``ValueError`` if no columns are provided or if ``cols`` is not correctly specified. + +2. **Function Parameters** + - Changed parameters from ``col1`` and ``col2`` to a single parameter ``cols`` which can be either a string or a list. + +3. **Error Handling** + - Renamed ``SortBy`` to ``sort_by`` to standardize nomenclature. + - Added a check to ensure ``sort_by`` is either 0 or 1. + - Raised a ``ValueError`` if ``sort_by`` is not 0 or 1. + +5. **Sorting Logic** + - Updated the sorting logic to handle the new ``cols`` parameter structure. + +6. **Handling Categorical Data** + - Modified code to convert categorical columns to strings to avoid issues with ``fillna("")``. + +7. **Handling Missing Values** + - Added ``df = df.fillna('')`` to fill NA values within the function to account for missing data. + +8. **Improved Function Documentation** + - Updated function documentation to reflect new parameters and error handling. + +Version 0.0.1b0 +----------------------------- + +**Contingency Table Updates** + +- ``fillna('')`` added to output so that null values come through, removed ``'All'`` column name from output, sort options ``0`` and ``1``, updated docstring documentation. Tested successfully on ``Python 3.7.3``. + +**Compatibility Enhancement** + +1. Added a version check for ``Python 3.7`` and above. + + - Conditional import of ``datetime`` to handle different Python versions. + +.. code-block:: python + + if sys.version_info >= (3, 7): + from datetime import datetime + else: + import datetime diff --git a/_build/html/v0.0.5/_sources/citations.rst.txt b/_build/html/v0.0.5/_sources/citations.rst.txt new file mode 100644 index 000000000..47f562314 --- /dev/null +++ b/_build/html/v0.0.5/_sources/citations.rst.txt @@ -0,0 +1,42 @@ +.. _citations: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Citing EDA Toolkit +=================== + +Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.4). Zenodo. https://doi.org/10.5281/zenodo.13163208 + +.. code:: bash + + @software{shpaner_2024_13162633, + author = {Shpaner, Leonid and + Gil, Oscar}, + title = {EDA Toolkit}, + month = aug, + year = 2024, + publisher = {Zenodo}, + version = {0.0.4},W + doi = {10.5281/zenodo.13162633}, + url = {https://doi.org/10.5281/zenodo.13162633} + } + diff --git a/_build/html/v0.0.5/_sources/getting_started.rst.txt b/_build/html/v0.0.5/_sources/getting_started.rst.txt new file mode 100644 index 000000000..0026890c9 --- /dev/null +++ b/_build/html/v0.0.5/_sources/getting_started.rst.txt @@ -0,0 +1,121 @@ +.. _getting_started: + +.. KFRE Python Library Documentation documentation master file, created by + sphinx-quickstart on Thu May 2 15:44:56 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Welcome to the EDA Toolkit Python Library Documentation! +======================================================== +.. note:: + This documentation is for ``eda_toolkit`` version ``0.0.5``. + + +The ``eda_toolkit`` is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data. + +Project Links +--------------- + +1. `PyPI Page `_ + +2. `GitHub Repository `_ + + +What is EDA? +------------- + +Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data. + + +Purpose of EDA Toolkit +----------------------- +The ``eda_toolkit`` library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including: + +- **Data Management:** Tools for managing directories, generating unique IDs, + standardizing dates, and handling common DataFrame manipulations. +- **Data Cleaning:** Functions to address missing values, remove outliers, and + correct formatting issues, ensuring data is ready for analysis. +- **Data Visualization:** A variety of plotting functions, including KDE + distribution plots, stacked bar plots, scatter plots with optional best fit + lines, and box/violin plots, to visually explore data distributions, + relationships, and trends. +- **Descriptive and Summary Statistics:** Methods to generate comprehensive + reports on data types, summary statistics (mean, median, standard deviation, + etc.), and to summarize all possible combinations of specified variables. +- **Reporting and Export:** Features to save DataFrames to Excel with + customizable formatting, create contingency tables, and export generated + plots in multiple formats. + + + +Key Features +------------- + +- **Ease of Use:** The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions. +- **Customizable:** Users can customize various aspects of the toolkit to fit their specific needs. +- **Integration:** Seamlessly integrates with popular data science libraries such as ``Pandas``, ``NumPy``, ``Matplotlib``, and ``Seaborn``. +- **Documentation and Examples:** Comprehensive documentation and examples to help users get started quickly and effectively. + +.. _prerequisites: + +Prerequisites +------------- +Before you install ``eda_toolkit``, ensure your system meets the following requirements: + +- **Python**: version ``3.7.4`` or higher is required to run ``eda_toolkit``. + +Additionally, ``eda_toolkit`` depends on the following packages, which will be automatically installed when you install ``eda_toolkit``: + +- ``numpy``: version ``1.21.6`` or higher +- ``pandas``: version ``1.3.5`` or higher +- ``matplotlib``: version ``3.5.3`` or higher +- ``seaborn``: version ``0.12.2`` or higher +- ``jinja2``: version ``3.1.4`` or higher +- ``xlsxwriter``: version ``3.2.0`` or higher + +.. _installation: + +Installation +------------- + +You can install ``eda_toolkit`` directly from PyPI: + +.. code-block:: bash + + pip install eda_toolkit + + diff --git a/_build/html/v0.0.5/_sources/index.rst.txt b/_build/html/v0.0.5/_sources/index.rst.txt new file mode 100644 index 000000000..2a42e87c4 --- /dev/null +++ b/_build/html/v0.0.5/_sources/index.rst.txt @@ -0,0 +1,50 @@ +.. EDA Toolkit documentation master file, created by + sphinx-quickstart on Mon Jul 29 08:15:33 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Table of Contents +=================== + +.. toctree:: + :maxdepth: 3 + :caption: Getting Started + + getting_started + + +.. toctree:: + :maxdepth: 3 + :caption: Usage Guide + + usage_guide + +.. toctree:: + :maxdepth: 3 + :caption: About EDA Toolkit + + acknowledgements + citations + changelog + references + + \ No newline at end of file diff --git a/_build/html/v0.0.5/_sources/references.rst.txt b/_build/html/v0.0.5/_sources/references.rst.txt new file mode 100644 index 000000000..7254cfba5 --- /dev/null +++ b/_build/html/v0.0.5/_sources/references.rst.txt @@ -0,0 +1,36 @@ +.. _references: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +The ``eda_toolkit`` library + +References +========== + +1. Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +2. Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +3. Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + + diff --git a/_build/html/v0.0.5/_sources/usage_guide.rst.txt b/_build/html/v0.0.5/_sources/usage_guide.rst.txt new file mode 100644 index 000000000..f60bdb193 --- /dev/null +++ b/_build/html/v0.0.5/_sources/usage_guide.rst.txt @@ -0,0 +1,2755 @@ +.. _usage_guide: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Description +=========== + +This guide provides detailed instructions and examples for using the functions +provided in the ``eda_toolkit`` library and how to use them effectively in your projects. + +For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [#]_. This dataset provides a rich source of +information for demonstrating the functionalities of the ``eda_toolkit``. + + +Data Preparation and Management +=============================== + +Path directories +---------------- + +**Ensure that the directory exists. If not, create it.** + +.. function:: ensure_directory(path) + + :param path: The path to the directory that needs to be ensured. + :type path: str + + :returns: None + + +The ``ensure_directory`` function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``ensure_directory`` function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them. + +First, we define the base path as the parent directory of the current directory. +The ``os.pardir`` constant, equivalent to ``"..""``, is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory. + + +Next, we set paths for the PNG and SVG image directories, located within an +``images`` folder in the parent directory. Using the ``ensure_directory`` +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them. + +.. code-block:: python + + from eda_toolkit import ensure_directory + + import os # import operating system for dir + + + base_path = os.path.join(os.pardir) + + # Go up one level from 'notebooks' to parent directory, + # then into the 'data' folder + data_path = os.path.join(os.pardir, "data") + data_output = os.path.join(os.pardir, "data_output") + + # create image paths + image_path_png = os.path.join(base_path, "images", "png_images") + image_path_svg = os.path.join(base_path, "images", "svg_images") + + # Use the function to ensure'data' directory exists + ensure_directory(data_path) + ensure_directory(data_output) + ensure_directory(image_path_png) + ensure_directory(image_path_svg) + +**Output** + +.. code-block:: python + + Created directory: ../data + Created directory: ../data_output + Created directory: ../images/png_images + Created directory: ../images/svg_images + + +Adding Unique Identifiers +-------------------------- + +**Add a column of unique IDs with a specified number of digits to the dataframe.** + +.. function:: add_ids(df, id_colname="ID", num_digits=9, seed=None, set_as_index=True) + + :param df: The dataframe to add IDs to. + :type df: pd.DataFrame + :param id_colname: The name of the new column for the IDs. + :type id_colname: str + :param num_digits: The number of digits for the unique IDs. + :type num_digits: int + :param seed: The seed for the random number generator. Defaults to ``None``. + :type seed: int, optional + :param set_as_index: Whether to set the new ID column as the index. Defaults to ``False``. + :type set_as_index: bool, optional + + :returns: The updated dataframe with the new ID column. + :rtype: pd.DataFrame + +The ``add_ids`` function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe. + +**Example Usage** + +In the example below, we demonstrate how to use the ``add_ids`` function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the ``add_ids`` function to generate +and append a column of unique IDs with a specified number of digits to the dataframe. + +First, we import the pandas library and the ``add_ids`` function from the ``eda_toolkit``. +Then, we create a sample dataframe with some data. We call the ``add_ids`` function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe. + +.. code-block:: python + + from eda_toolkit import add_ids + + # Add a column of unique IDs with 9 digits and call it "census_id" + df = add_ids( + df=df, + id_colname="census_id", + num_digits=9, + seed=111, + set_as_index=True, + ) + +**Output** + +`First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: bash + + DataFrame index is unique. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+
+ + +\ + + +Trailing Period Removal +----------------------- + +**Strip the trailing period from floats in a specified column of a DataFrame, if present.** + +.. function:: strip_trailing_period(df, column_name) + + :param df: The DataFrame containing the column to be processed. + :type df: pd.DataFrame + :param column_name: The name of the column containing floats with potential trailing periods. + :type column_name: str + + :returns: The updated DataFrame with the trailing periods removed from the specified column. + :rtype: pd.DataFrame + + The ``strip_trailing_period`` function is designed to remove trailing periods + from float values in a specified column of a DataFrame. This can be particularly + useful when dealing with data that has been inconsistently formatted, ensuring + that all float values are correctly represented. + +**Example Usage** + +In the example below, we demonstrate how to use the ``strip_trailing_period`` function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the ``strip_trailing_period`` function to remove any trailing periods from the specified column. + +.. code-block:: python + + from eda_toolkit import strip_trailing_period + + # Create a sample dataframe with trailing periods in some values + data = { + "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.], + } + df = pd.DataFrame(data) + + # Remove trailing periods from the 'values' column + df = strip_trailing_period(df=df, column_name="values") + + +**Output** + +`First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)` + +.. raw:: html + + + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +
+ + +\ + +`Note:` The last row shows 6 as an `int` with a trailing period with its conversion to `float`. + + +\ + +Standardized Dates +------------------- + +**Parse and standardize date strings based on the provided rule.** + +.. function:: parse_date_with_rule(date_str) + + This function takes a date string and standardizes it to the ``ISO 8601`` format + (``YYYY-MM-DD``). It assumes dates are provided in either day/month/year or + month/day/year format. The function first checks if the first part of the + date string (day or month) is greater than 12, which unambiguously indicates + a day/month/year format. If the first part is 12 or less, the function + attempts to parse the date as month/day/year, falling back to day/month/year + if the former raises a ``ValueError`` due to an impossible date (e.g., month + being greater than 12). + + :param date_str: A date string to be standardized. + :type date_str: str + + :returns: A standardized date string in the format ``YYYY-MM-DD``. + :rtype: str + + :raises ValueError: If ``date_str`` is in an unrecognized format or if the function + cannot parse the date. + +**Example Usage** + +In the example below, we demonstrate how to use the ``parse_date_with_rule`` +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the ``parse_date_with_rule`` +function to parse and standardize each date string to the ``ISO 8601`` format. + +.. code-block:: python + + from eda_toolkit import parse_date_with_rule + + # Sample date strings + date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"] + + # Standardize the date strings + standardized_dates = [parse_date_with_rule(date) for date in date_strings] + + print(standardized_dates) + +**Output** + +.. code-block:: python + + ['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12'] + + + +.. important:: + + In the next example, we demonstrate how to apply the ``parse_date_with_rule`` + function to a DataFrame column containing date strings using the ``.apply()`` method. + This is particularly useful when you need to standardize date formats across an + entire column in a DataFrame. + +.. code-block:: python + + # Creating the DataFrame + data = { + "date_column": [ + "31/12/2021", + "01/01/2022", + "12/31/2021", + "13/02/2022", + "07/04/2022", + ], + "name": ["Alice", "Bob", "Charlie", "David", "Eve"], + "amount": [100.0, 150.5, 200.75, 250.25, 300.0], + } + + df = pd.DataFrame(data) + + # Apply the function to the DataFrame column + df["standardized_date"] = df["date_column"].apply(parse_date_with_rule) + + print(df) + +**Output** + +.. code-block:: python + + date_column name amount standardized_date + 0 31/12/2021 Alice 100.00 2021-12-31 + 1 01/01/2022 Bob 150.50 2022-01-01 + 2 12/31/2021 Charlie 200.75 2021-12-31 + 3 13/02/2022 David 250.25 2022-02-13 + 4 07/04/2022 Eve 300.00 2022-04-07 + + +DataFrame Analysis +------------------- + +**Analyze DataFrame columns, including dtype, null values, and unique value counts.** + +.. function:: dataframe_columns(df) + + This function analyzes the columns of a DataFrame, providing details about the data type, + the number and percentage of ``null`` values, the total number of unique values, and the most + frequent unique value along with its count and percentage. It handles special cases such as + converting date columns and replacing empty strings with Pandas ``NA`` values. + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + + :returns: A DataFrame with the analysis results for each column. + :rtype: pandas.DataFrame + +**Example Usage** + +In the example below, we demonstrate how to use the ``dataframe_columns`` +function to analyze a DataFrame's columns. + +.. code-block:: python + + from eda_toolkit import dataframe_columns + + dataframe_columns(df=df) + + +**Output** + +`Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: python + + Shape: (48842, 16) + + Total seconds of processing time: 0.861555 + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+
+ + + +\ + +Generating Summary Tables for Variable Combinations +----------------------------------------------------- + +**This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.** + + +.. function:: summarize_all_combinations(df, variables, data_path, data_name, min_length=2) + + :param df: The pandas DataFrame containing the data. + :type df: pandas.DataFrame + :param variables: List of unique variables to generate combinations. + :type variables: list + :param data_path: Path where the output Excel file will be saved. + :type data_path: str + :param data_name: Name of the output Excel file. + :type data_name: str + :param min_length: Minimum length of combinations to generate. Defaults to ``2``. + :type min_length: int + + :returns: A dictionary of summary tables and a list of all generated combinations. + :rtype: tuple(dict, list) + +The function returns two outputs: + +1. ``summary_tables``: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values. + +2. ``all_combinations``: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables. + +**Example Usage** + +Below, we use the ``summarize_all_combinations`` function to generate summary tables for the specified +variables from a DataFrame containing the census data [1]_. + +.. code-block:: python + + from eda_toolkit import summarize_all_combinations + + # Define unique variables for the analysis + unique_vars = [ + "age_group", + "workclass", + "education", + "occupation", + "race", + "sex", + "income", + ] + + # Generate summary tables for all combinations of the specified variables + summary_tables, all_combinations = summarize_all_combinations( + df=df, + data_path=data_output, + variables=unique_vars, + data_name="census_summary_tables.xlsx", + ) + + # Print all combinations of variables + print(all_combinations) + +**Output** + +.. code-blocK:: python + + [('age_group', 'workclass'), + ('age_group', 'education'), + ('age_group', 'occupation'), + ('age_group', 'race'), + ('age_group', 'sex'), + ('age_group', 'income'), + ('workclass', 'education'), + ('workclass', 'occupation'), + ('workclass', 'race'), + ('workclass', 'sex'), + ('workclass', 'income'), + ('education', 'occupation'), + ('education', 'race'), + ('education', 'sex'), + ('education', 'income'), + ('occupation', 'race'), + ('occupation', 'sex'), + ('occupation', 'income'), + ('race', 'sex'), + ('race', 'income'), + ('sex', 'income'), + ('age_group', 'workclass', 'education'), + ('age_group', 'workclass', 'occupation'), + ('age_group', 'workclass', 'race'), + ('age_group', 'workclass', 'sex'), + ('age_group', 'workclass', 'income'), + ('age_group', 'education', 'occupation'), + ('age_group', 'education', 'race'), + ('age_group', 'education', 'sex'), + ('age_group', 'education', 'income'), + ('age_group', 'occupation', 'race'), + ('age_group', 'occupation', 'sex'), + ('age_group', 'occupation', 'income'), + ('age_group', 'race', 'sex'), + ('age_group', 'race', 'income'), + ('age_group', 'sex', 'income'), + ('workclass', 'education', 'occupation'), + ('workclass', 'education', 'race'), + ('workclass', 'education', 'sex'), + ('workclass', 'education', 'income'), + ('workclass', 'occupation', 'race'), + ('workclass', 'occupation', 'sex'), + ('workclass', 'occupation', 'income'), + ('workclass', 'race', 'sex'), + ('workclass', 'race', 'income'), + ('workclass', 'sex', 'income'), + ('education', 'occupation', 'race'), + ('education', 'occupation', 'sex'), + ('education', 'occupation', 'income'), + ('education', 'race', 'sex'), + ('education', 'race', 'income'), + ('education', 'sex', 'income'), + ('occupation', 'race', 'sex'), + ('occupation', 'race', 'income'), + ('occupation', 'sex', 'income'), + ('race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation'), + ('age_group', 'workclass', 'education', 'race'), + ('age_group', 'workclass', 'education', 'sex'), + ('age_group', 'workclass', 'education', 'income'), + ('age_group', 'workclass', 'occupation', 'race'), + ('age_group', 'workclass', 'occupation', 'sex'), + ('age_group', 'workclass', 'occupation', 'income'), + ('age_group', 'workclass', 'race', 'sex'), + ('age_group', 'workclass', 'race', 'income'), + ('age_group', 'workclass', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race'), + ('age_group', 'education', 'occupation', 'sex'), + ('age_group', 'education', 'occupation', 'income'), + ('age_group', 'education', 'race', 'sex'), + ('age_group', 'education', 'race', 'income'), + ('age_group', 'education', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex'), + ('age_group', 'occupation', 'race', 'income'), + ('age_group', 'occupation', 'sex', 'income'), + ('age_group', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race'), + ('workclass', 'education', 'occupation', 'sex'), + ('workclass', 'education', 'occupation', 'income'), + ('workclass', 'education', 'race', 'sex'), + ('workclass', 'education', 'race', 'income'), + ('workclass', 'education', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex'), + ('workclass', 'occupation', 'race', 'income'), + ('workclass', 'occupation', 'sex', 'income'), + ('workclass', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex'), + ('education', 'occupation', 'race', 'income'), + ('education', 'occupation', 'sex', 'income'), + ('education', 'race', 'sex', 'income'), + ('occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race'), + ('age_group', 'workclass', 'education', 'occupation', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'race', 'income'), + ('age_group', 'workclass', 'education', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'education', 'occupation', 'race', 'income'), + ('age_group', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'education', 'race', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex'), + ('workclass', 'education', 'occupation', 'race', 'income'), + ('workclass', 'education', 'occupation', 'sex', 'income'), + ('workclass', 'education', 'race', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex', 'income'), + ('age_group', + 'workclass', + 'education', + 'occupation', + 'race', + 'sex', + 'income')] + + +When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table. + +.. raw:: html + +
+ +.. image:: ../assets/summarize_combos.gif + :alt: EDA Toolkit Logo + :align: left + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Saving DataFrames to Excel with Customized Formatting +------------------------------------------------------- +**Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.** + + +This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the ``save_dataframes_to_excel`` function. + + +.. function:: save_dataframes_to_excel(file_path, df_dict, decimal_places=0) + + :param file_path: Full path to the output Excel file. + :type file_path: str + :param df_dict: Dictionary where keys are sheet names and values are DataFrames to save. + :type df_dict: dict + :param decimal_places: Number of decimal places to round numeric columns. Default is 0. + :type decimal_places: int + + :notes: + - The function will autofit columns and left-align text. + - Numeric columns will be formatted with the specified number of decimal places. + - Headers will be bold and left-aligned without borders. + +The function performs the following tasks: + +- Writes each DataFrame to its respective sheet in the Excel file. +- Rounds numeric columns to the specified number of decimal places. +- Applies customized formatting to headers and cells. +- Autofits columns based on the content length. + +**Example Usage** + +Below, we use the ``save_dataframes_to_excel`` function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between `18` and `40`. + +.. code-block:: python + + from eda_toolkit import save_dataframes_to_excel + + # Example usage + file_name = "df_census.xlsx" # Name of the output Excel file + file_path = os.path.join(data_path, file_name) + + # filter DataFrame to Ages 18-40 + filtered_df = df[(df["age"] > 18) & (df["age"] < 40)] + + df_dict = { + "original_df": df, + "ages_18_to_40": filtered_df, + } + + save_dataframes_to_excel( + file_path=file_path, + df_dict=df_dict, + decimal_places=0, + ) + + +**Output** + +The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between `18` and `40`, each on separate sheets with customized formatting. + + +Creating Contingency Tables +---------------------------- + +**Create a contingency table from one or more columns in a DataFrame, with sorting options.** + +This section explains how to create contingency tables from one or more columns in a DataFrame using the ``contingency_table`` function. + +.. function:: contingency_table(df, cols=None, sort_by=0) + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param cols: Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column. + :type cols: str or list, optional + :param sort_by: Enter ``0`` to sort results by column groups; enter ``1`` to sort results by totals in descending order. + :type sort_by: int + :raises ValueError: If no columns are specified or if sort_by is not ``0`` or ``1``. + :returns: A DataFrame with the specified columns, ``'Total'``, and ``'Percentage'``. + :rtype: pandas.DataFrame + +**Example Usage** + +Below, we use the ``contingency_table`` function to create a contingency table +from the specified columns in a DataFrame containing census data [1]_ + +.. code-block:: python + + from eda_toolkit import contingency_table + + # Example usage + contingency_table( + df=df, + cols=[ + "age_group", + "workclass", + "race", + "sex", + ], + sort_by=1, + ) + +**Output** + +The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the ``'Total'`` column in descending order because ``sort_by`` +is set to ``1``. + + +.. code-block:: python + + + age_group workclass race sex Total Percentage + 0 30-39 Private White Male 5856 11.99 + 1 18-29 Private White Male 5623 11.51 + 2 40-49 Private White Male 4267 8.74 + 3 18-29 Private White Female 3680 7.53 + 4 50-59 Private White Male 2565 5.25 + .. ... ... ... ... ... ... + 467 50-59 Federal-gov Other Male 1 0.00 + 468 50-59 Local-gov Asian-Pac-Islander Female 1 0.00 + 469 70-79 Self-emp-inc Black Male 1 0.00 + 470 80-89 Local-gov Asian-Pac-Islander Male 1 0.00 + 471 48842 100.00 + + [472 rows x 6 columns] + + +\ + +Highlighting Specific Columns in a DataFrame +--------------------------------------------- + +This section explains how to highlight specific columns in a DataFrame using the ``highlight_columns`` function. + +**Highlight specific columns in a DataFrame with a specified background color.** + +.. function:: highlight_columns(df, columns, color="yellow") + + :param df: The DataFrame to be styled. + :type df: pandas.DataFrame + :param columns: List of column names to be highlighted. + :type columns: list of str + :param color: The background color to be applied for highlighting (default is `"yellow"`). + :type color: str, optional + + :returns: A Styler object with the specified columns highlighted. + :rtype: pandas.io.formats.style.Styler + +**Example Usage** + +Below, we use the ``highlight_columns`` function to highlight the ``age`` and ``education`` +columns in the first 5 rows of the census [1]_ DataFrame with a pink background color. + +.. code-block:: python + + from eda_toolkit import highlight_columns + + # Applying the highlight function + highlighted_df = highlight_columns( + df=df, + columns=["age", "education"], + color="#F8C5C8", + ) + + highlighted_df + +**Output** + +The output will be a DataFrame with the specified columns highlighted in the given background color. +The ``age`` and ``education`` columns will be highlighted in pink. + +The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the ``.render()`` method of the Styler object. + + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+ + +\ + +Binning Numerical Columns +--------------------------- + +If your DataFrame (e.g., the census data [1]_) +does not have age or any other numerical column of interest binned, you can +apply the following binning logic to categorize the data. Below, we use the age +column from the UCI Machine Learning Repository as an example: + +.. code-block:: python + + # Create age bins so that the ages can be categorized + bin_ages = [ + 0, + 18, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + float("inf"), + ] + + # Create labels for the bins + label_ages = [ + "< 18", + "18-29", + "30-39", + "40-49", + "50-59", + "60-69", + "70-79", + "80-89", + "90-99", + "100 +", + ] + + # Categorize the ages and assign to a new variable + df["age_group"] = pd.cut( + df["age"], + bins=bin_ages, + labels=label_ages, + right=False, + ) + +`Note:` This code snippet creates age bins and assigns a corresponding age group +label to each age in the DataFrame. The ``pd.cut`` function from pandas is used to +categorize the ages and assign them to a new column, ``age_group``. Adjust the bins +and labels as needed for your specific data. + + +KDE and Histogram Distribution Plots +======================================= + +**Generate KDE or histogram distribution plots for specified columns in a DataFrame.** + +The ``kde_distributions`` function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2]_ for plotting, which is built on top of +matplotlib [3]_ and provides a high-level interface for drawing attractive and informative +statistical graphics. + + +**Key Features and Parameters** + +- **Flexible Plotting**: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively. +- **Leverages Seaborn Library**: The function is built on the `seaborn` library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code. +- **Customization**: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs. +- **Scientific Notation Control**: The function allows disabling scientific notation on the axes, providing better readability for certain types of data. +- **Log Scaling**: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude. +- **Output Options**: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations. + +.. function:: kde_distributions(df, vars_of_interest=None, grid_figsize=(10, 8), single_figsize=(6, 4), kde=True, hist_color="#0000FF", kde_color="#FF0000", hist_edgecolor="#000000", hue=None, fill=True, fill_alpha=1, n_rows=1, n_cols=1, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_path_png=None, single_var_image_path_svg=None, single_var_image_filename=None, y_axis_label="Density", plot_type="both", log_scale_vars=None, bins="auto", binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat="density", xlim=None, ylim=None) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param vars_of_interest: List of column names for which to generate distribution plots. + :type vars_of_interest: list of str, optional + :param grid_figsize: Size of the overall grid figure, default is ``(10, 8)``. + :type grid_figsize: tuple, optional + :param single_figsize: Size of individual figures for each variable, default is ``(6, 4)``. + :type single_figsize: tuple, optional + :param kde: Whether to include KDE plots on the histograms, default is ``True``. + :type kde: bool, optional + :param hist_color: Color of the histogram bars, default is ``'#0000FF'``. + :type hist_color: str, optional + :param kde_color: Color of the KDE plot, default is ``'#FF0000'``. + :type kde_color: str, optional + :param hist_edgecolor: Color of the histogram bar edges, default is ``'#000000'``. + :type hist_edgecolor: str, optional + :param hue: Column name to group data by, adding different colors for each group. + :type hue: str, optional + :param fill: Whether to fill the histogram bars with color, default is ``True``. + :type fill: bool, optional + :param fill_alpha: Alpha transparency for the fill color of the histogram bars, where + ``0`` is fully transparent and ``1`` is fully opaque. Default is ``1``. + :type fill_alpha: float, optional + :param n_rows: Number of rows in the subplot grid, default is ``1``. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid, default is ``1``. + :type n_cols: int, optional + :param w_pad: Width padding between subplots, default is ``1.0``. + :type w_pad: float, optional + :param h_pad: Height padding between subplots, default is ``1.0``. + :type h_pad: float, optional + :param image_path_png: Directory path to save the PNG image of the overall distribution plots. + :type image_path_png: str, optional + :param image_path_svg: Directory path to save the SVG image of the overall distribution plots. + :type image_path_svg: str, optional + :param image_filename: Filename to use when saving the overall distribution plots. + :type image_filename: str, optional + :param bbox_inches: Bounding box to use when saving the figure. For example, ``'tight'``. + :type bbox_inches: str, optional + :param single_var_image_path_png: Directory path to save the PNG images of the separate distribution plots. + :type single_var_image_path_png: str, optional + :param single_var_image_path_svg: Directory path to save the SVG images of the separate distribution plots. + :type single_var_image_path_svg: str, optional + :param single_var_image_filename: Filename to use when saving the separate distribution plots. + The variable name will be appended to this filename. + :type single_var_image_filename: str, optional + :param y_axis_label: The label to display on the ``y-axis``, default is ``'Density'``. + :type y_axis_label: str, optional + :param plot_type: The type of plot to generate, options are ``'hist'``, ``'kde'``, or ``'both'``. Default is ``'both'``. + :type plot_type: str, optional + :param log_scale_vars: List of variable names to apply log scaling. + :type log_scale_vars: list of str, optional + :param bins: Specification of histogram bins, default is ``'auto'``. + :type bins: int or sequence, optional + :param binwidth: Width of each bin, overrides bins but can be used with binrange. + :type binwidth: number or pair of numbers, optional + :param label_fontsize: Font size for axis labels, including xlabel, ylabel, and tick marks, default is ``10``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: Maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param disable_sci_notation: Toggle to disable scientific notation on axes, default is ``False``. + :type disable_sci_notation: bool, optional + :param stat: Aggregate statistic to compute in each bin (e.g., ``'count'``, ``'frequency'``, + ``'probability'``, ``'percent'``, ``'density'``), default is ``'density'``. + :type stat: str, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``plot_type`` is not one of ``'hist'``, ``'kde'``, or ``'both'``. + - If ``stat`` is not one of ``'count'``, ``'density'``, ``'frequency'``, ``'probability'``, ``'proportion'``, ``'percent'``. + - If ``log_scale_vars`` contains variables that are not present in the DataFrame. + - If ``fill`` is set to ``False`` and ``hist_edgecolor`` is not the default. + + :raises UserWarning: + - If ``stat`` is set to 'count' while ``kde`` is ``True``, as it may produce misleading plots. + - If both ``bins`` and ``binwidth`` are specified, which may affect performance. + + :returns: ``None`` + + +\ + +.. raw:: html + +
+ + + +KDE and Histograms Example +--------------------------- + +In the below example, the ``kde_distributions`` function is used to generate +histograms for several variables of interest: ``"age"``, ``"education-num"``, and +``"hours-per-week"``. These variables represent different demographic and +financial attributes from the dataset. The ``kde=True`` parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data's probability density. + +The visualizations are arranged in a single row of four columns, as specified +by ``n_rows=1`` and ``n_cols=3``, respectively. The overall size of the grid +figure is set to `14 inches` wide and `4 inches tall` (``grid_figsize=(14, 4)``), +while each individual plot is configured to be `4 inches` by `4 inches` +(``single_figsize=(4, 4)``). The ``fill=True`` parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +``w_pad=1`` and ``h_pad=1``, which add `1 inch` of padding both horizontally and +vertically. + +To handle longer titles, the ``text_wrap=50`` parameter ensures that the title +text wraps to a new line after `50 characters`. The ``bbox_inches="tight"`` setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in ``vars_of_interest`` are +passed directly to the function for visualization. + +Each plot is saved individually with filenames that are prefixed by +``"kde_density_single_distribution"``, followed by the variable name. The ```y-axis``` +for all plots is labeled as "Density" (``y_axis_label="Density"``), reflecting that +the height of the bars or KDE line represents the data's density. The histograms +are divided into `10 bins` (``bins=10``), offering a clear view of the distribution +of each variable. + +The ``plot_type="hist"`` parameter indicates that only histograms will be generated +for each variable. Additionally, the font sizes for the axis labels and tick labels +are set to `16 points` (``label_fontsize=16``) and `14 points` (``tick_fontsize=14``), +respectively, ensuring that all text within the plots is legible and well-formatted. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=True, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + fill=True, + fill_alpha=0.60, + w_pad=1, + h_pad=1, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + +.. raw:: html + +
+ +.. image:: ../assets/kde_density_distributions.svg + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Density) +---------------------------- + +In this example, the kde_distributions function is used to generate histograms for +the variables ``"age"``, ``"education-num"``, and ``"hours-per-week"`` but with +``kde=False``, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (``n_rows=1, n_cols=3``), +with a grid size of `14x4 inches` (``grid_figsize=(14, 4)``). The histograms are +divided into `10 bins` (``bins=10``), and the ``y-axis`` is labeled "Density" (``y_axis_label="Density"``). +Font sizes for the axis labels and tick labels are set to `16` and `14` points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=False, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + w_pad=1, + h_pad=1, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/hist_density_distributions.svg + :alt: KDE Distributions - Histograms (Density) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Count) +-------------------------- + +In this example, the kde_distributions function is modified to generate histograms +with a few key changes. The ``hist_color`` is set to `"orange"`, changing the color of the +histogram bars. The ```y-axis``` label is updated to "Count" (``y_axis_label="Count"``), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to `"Count"` to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (``n_rows=1, n_cols=4``), +a grid size of `14x4 inches`, and a bin count of `10`. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=False, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + w_pad=1, + h_pad=1, + text_wrap=50, + hist_color="orange", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Count", + bins=10, + plot_type="hist", + stat="Count", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/count_hist_distributions.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Stacked Crosstab Plots +======================= + +**Generates stacked bar plots and crosstabs for specified columns in a DataFrame.** + +The ``stacked_crosstab_plot`` function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats. + +The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis. + +.. function:: stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind="bar", width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output="both", return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type="both", show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False) + + Generates stacked or regular bar plots and crosstabs for specified columns. + + This function allows users to create stacked bar plots (or regular bar plots + if stacks are removed) and corresponding crosstabs for specific columns + in a DataFrame. It provides options to customize the appearance, including + font sizes for axis labels, tick labels, and title text wrapping, and to + choose between regular or normalized plots. + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param col: The name of the column in the DataFrame to be analyzed. + :type col: str + :param func_col: List of ground truth columns to be analyzed. + :type func_col: list + :param legend_labels_list: List of legend labels for each ground truth column. + :type legend_labels_list: list + :param title: List of titles for the plots. + :type title: list + :param kind: The kind of plot to generate (``'bar'`` or ``'barh'`` for horizontal bars), default is ``'bar'``. + :type kind: str, optional + :param width: The width of the bars in the bar plot, default is ``0.9``. + :type width: float, optional + :param rot: The rotation angle of the ``x-axis`` labels, default is ``0``. + :type rot: int, optional + :param custom_order: Specifies a custom order for the categories in the ``col``. + :type custom_order: list, optional + :param image_path_png: Directory path where generated PNG plot images will be saved. + :type image_path_png: str, optional + :param image_path_svg: Directory path where generated SVG plot images will be saved. + :type image_path_svg: str, optional + :param save_formats: List of file formats to save the plot images in. + :type save_formats: list, optional + :param color: List of colors to use for the plots. If not provided, a default color scheme is used. + :type color: list, optional + :param output: Specify the output type: ``"plots_only"``, ``"crosstabs_only"``, or ``"both"``. Default is ``"both"``. + :type output: str, optional + :param return_dict: Specify whether to return the crosstabs dictionary, default is ``False``. + :type return_dict: bool, optional + :param x: The width of the figure. + :type x: int, optional + :param y: The height of the figure. + :type y: int, optional + :param p: The padding between the subplots. + :type p: int, optional + :param file_prefix: Prefix for the filename when output includes plots. + :type file_prefix: str, optional + :param logscale: Apply log scale to the ``y-axis``, default is ``False``. + :type logscale: bool, optional + :param plot_type: Specify the type of plot to generate: ``"both"``, ``"regular"``, ``"normalized"``. Default is ``"both"``. + :type plot_type: str, optional + :param show_legend: Specify whether to show the legend, default is ``True``. + :type show_legend: bool, optional + :param label_fontsize: Font size for axis labels, default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param remove_stacks: If ``True``, removes stacks and creates a regular bar plot using only the ``col`` parameter. Only works when ``plot_type`` is set to ``'regular'``. Default is ``False``. + :type remove_stacks: bool, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``output`` is not one of ``"both"``, ``"plots_only"``, or ``"crosstabs_only"``. + - If ``plot_type`` is not one of ``"both"``, ``"regular"``, ``"normalized"``. + - If ``remove_stacks`` is set to True and ``plot_type`` is not ``"regular"``. + - If the lengths of ``title``, ``func_col``, and ``legend_labels_list`` are not equal. + :raises KeyError: If any columns specified in ``col`` or ``func_col`` are missing in the DataFrame. + + :returns: Dictionary of crosstabs DataFrames if ``return_dict`` is ``True``. Otherwise, returns ``None``. + :rtype: ``dict`` or ``None`` + + + +Stacked Bar Plots With Crosstabs Example +----------------------------------------- + +The provided code snippet demonstrates how to use the ``stacked_crosstab_plot`` +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here's a detailed breakdown of the code using the census +dataset as an example [1]_. + +First, the ``func_col`` list is defined, specifying the columns ``["sex", "income"]`` +to be analyzed. These columns will be used in the loop to generate separate plots. +The ``legend_labels_list`` is then defined, with each entry corresponding to a +column in ``func_col``. In this case, the labels for the ``sex`` column are +``["Male", "Female"]``, and for the ``income`` column, they are ``["<=50K", ">50K"]``. +These labels will be used to annotate the legends of the plots. + +Next, the ``title`` list is defined, providing titles for each plot corresponding +to the columns in ``func_col``. The titles are set to ``["Sex", "Income"]``, +which will be displayed on top of each respective plot. + +.. code-block:: python + + # Define the func_col to use in the loop in order of usage + func_col = ["sex", "income"] + + # Define the legend_labels to use in the loop + legend_labels_list = [ + ["Male", "Female"], + ["<=50K", ">50K"], + ] + + # Define titles for the plots + title = [ + "Sex", + "Income", + ] + +.. note:: + + If you assign the function to a variable, the dictionary returned when + ``return_dict=True`` will be suppressed in the output. However, the dictionary + is still available within the assigned variable for further use. + + +.. code-block:: python + + from eda_toolkit import stacked_crosstab_plot + + # Call the stacked_crosstab_plot function + stacked_crosstabs = stacked_crosstab_plot( + df=df, + col="age_group", + func_col=func_col, + legend_labels_list=legend_labels_list, + title=title, + kind="bar", + width=0.8, + rot=45, # axis rotation angle + custom_order=None, + color=["#00BFC4", "#F8766D"], # default color schema + output="both", + return_dict=True, + x=14, + y=8, + p=10, + logscale=False, + plot_type="both", + show_legend=True, + label_fontsize=14, + tick_fontsize=12, + ) + +The above example generates stacked bar plots for ``"sex"`` and ``"income"`` +grouped by ``"education"``. The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export. + +.. important:: + + **Importance of Correctly Aligning Labels** + + It is crucial to properly align the elements in the ``legend_labels_list``, + ``title``, and ``func_col`` parameters when using the ``stacked_crosstab_plot`` + function. Each of these lists must be ordered consistently because the function + relies on their alignment to correctly assign labels and titles to the + corresponding plots and legends. + + **For instance, in the example above:** + + - The first element in ``func_col`` is ``"sex"``, and it is aligned with the first set of labels ``["Male", "Female"]`` in ``legend_labels_list`` and the first title ``"Sex"`` in the ``title`` list. + - Similarly, the second element in ``func_col``, ``"income"``, aligns with the labels ``["<=50K", ">50K"]`` and the title ``"Income"``. + + **Misalignment between these lists would result in incorrect labels or titles being + applied to the plots, potentially leading to confusion or misinterpretation of the data. + Therefore, it's important to ensure that each list is ordered appropriately and + consistently to accurately reflect the data being visualized.** + + **Proper Setup of Lists** + + When setting up the ``legend_labels_list``, ``title``, and ``func_col``, ensure + that each element in the lists corresponds to the correct variable in the DataFrame. + This involves: + + - **Ordering**: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted. + - **Consistency**: Double-checking that each label in ``legend_labels_list`` matches the categories present in the corresponding ``func_col``, and that the ``title`` accurately describes the plot. + + By adhering to these guidelines, you can ensure that the ``stacked_crosstab_plot`` + function produces accurate and meaningful visualizations that are easy to interpret and analyze. + +**Output** + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_sex.svg + :alt: KDE Distributions + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income.svg + :alt: Stacked Bar Plot Age vs. Income + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +.. note:: + + When you set ``return_dict=True``, you are able to see the crosstabs printed out + as shown below. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93
+ +\ + +When you set ``return_dict=True``, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example: + +.. code-block:: python + + crosstab_age_sex = crosstabs_dict["sex"] + crosstab_age_income = crosstabs_dict["income"] + + +Pivoted Stacked Bar Plots Example +----------------------------------- + +Using the census dataset [1]_, to create horizontal stacked bar plots, set the ``kind`` parameter to +``"barh"`` in the ``stacked_crosstab_plot function``. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the ``y-axis``. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_pivoted.svg + :alt: Stacked Bar Plot Age vs. Income (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Non-Normalized Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to create stacked bar plots without the normalized versions, +set the ``plot_type`` parameter to ``"regular"`` in the ``stacked_crosstab_plot`` +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the ``plot_type`` to ``"normalized"`` will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_regular.svg + :alt: Stacked Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Regular Non-Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the ``plot_type`` parameter to ``"regular"`` +in the ``stacked_crosstab_plot`` function and enable ``remove_stacks`` by setting +it to ``True``. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +``plot_type`` to ``"normalized"`` will display only the normalized plots. + +When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories. + +In the example below, the color of the bars has been set to a dark grey (``#333333``), +and the legend has been removed by setting ``show_legend=False``. This illustrates +regular bar plots for income by age, without stacking. + + +.. raw:: html + +
+ +.. image:: ../assets/Bar_Age_regular_income.svg + :alt: Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Box and Violin Plots +=========================== + +**Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.** + +The ``box_violin_plot`` function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories. + +With options to customize the plot type (``boxplot`` or ``violinplot``), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis. + +Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures. + +The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset. + +.. function:: box_violin_plot(df, metrics_list, metrics_boxplot_comp, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type="boxplot", xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param metrics_list: List of metric names (columns in df) to plot. + :type metrics_list: list of str + :param metrics_boxplot_comp: List of comparison categories (columns in df). + :type metrics_boxplot_comp: list of str + :param n_rows: Number of rows in the subplot grid. + :type n_rows: int + :param n_cols: Number of columns in the subplot grid. + :type n_cols: int + :param image_path_png: Optional directory path to save ``.png`` images. + :type image_path_png: str, optional + :param image_path_svg: Optional directory path to save ``.svg`` images. + :type image_path_svg: str, optional + :param save_plots: String, ``"all"``, ``"individual"``, or ``"grid"`` to control saving plots. + :type save_plots: str, optional + :param show_legend: Boolean, True if showing the legend in the plots. + :type show_legend: bool, optional + :param plot_type: Specify the type of plot, either ``"boxplot"`` or ``"violinplot"``. Default is ``"boxplot"``. + :type plot_type: str, optional + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + :param show_plot: Specify the plot display mode: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + :param rotate_plot: Boolean, True if rotating (pivoting) the plots. + :type rotate_plot: bool, optional + :param individual_figsize: Width and height of the figure for individual plots. Default is (``6, 4``). + :type individual_figsize: tuple or list, optional + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of None, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set without specifying ``image_path_png`` or ``image_path_svg``. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` is not a tuple or list of two numbers. + - If ``grid_figsize`` is specified but is not a tuple or list of two numbers. + + :returns: ``None`` + + + + +This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels. + +Box Plots Grid Example +----------------------- + +In this example with the US census data [1]_, the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the ``"age_group"`` column in the +DataFrame. The ``metrics_boxplot_comp`` parameter is set to [``"age_group"``], meaning +that the comparison will be based on different age groups. The ``metrics_list`` is +provided as ``age_boxplot_list``, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid format with `3` rows and `4` +columns, using the ``n_rows=3`` and ``n_cols=4`` parameters. The ``image_path_png`` and +``image_path_svg`` parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to ``"all"``, ensuring that both +individual and grid plots are saved. + +The plots are displayed in a grid format, as indicated by the ``show_plot="grid"`` +parameter. The ``plot_type`` is set to ``"boxplot"``, so the function will generate +boxplots for each metric in the list. Additionally, the ```x-axis``` labels are rotated +by 90 degrees (``xlabel_rot=90``) to ensure that the labels are legible. The legend is +hidden by setting ``show_legend=False``, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication. + + +.. code-block:: python + + age_boxplot_list = df[ + [ + "education-num", + "hours-per-week", + ] + ].columns.to_list() + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="boxplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_boxplot.svg + :alt: Box Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Violin Plots Grid Example +-------------------------- + +In this example with the US census data [1]_, we keep everything the same as the prior example, but change the +``plot_type`` to ``violinplot``. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings. + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="violinplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot.svg + :alt: Violin Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Pivoted Violin Plots Grid Example +------------------------------------ + +In this example with the US census data [1]_, we set ``xlabel_rot=0`` and ``rotate_plot=True`` +to pivot the plot, changing the orientation of the axes while keeping the ```x-axis``` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution. + +.. code-block:: python + + from eda_toolkit impor box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + rotate_plot=True, + show_legend=False, + plot_type="violinplot", + xlabel_rot=0, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot_pivoted.svg + :alt: Violin Plot Comparisons (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots and Best Fit Lines +================================== + +**Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.** + +**Create and Save Scatter Plots or a Grid of Scatter Plots** + +This function, ``scatter_fit_plot``, is designed to generate scatter plots for +one or more pairs of variables (``x_vars`` and ``y_vars``) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view. + +**Optional Best Fit Line** + +An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s + +**Customizable Plot Aesthetics** + +The function offers a wide range of customization options to tailor the appearance +of the scatter plots: + +- **Point Color**: You can specify a default color for the scatter points or use a ``hue`` parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data. + +- **Point Size**: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable. + +- **Markers**: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data. + +**Axis and Label Configuration** + +The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges. + +**Plot Display and Saving Options** + +The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations. + +**Correlation Coefficient Display** + +For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship. + +.. function:: scatter_fit_plot(df, x_vars, y_vars, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color="C0", best_fit_linecolor="red", best_fit_linestyle="-", hue=None, hue_palette=None, size=None, sizes=None, marker="o", show_correlation=True, xlim=None, ylim=None) + + Create and save scatter plots or a grid of scatter plots for given x_vars + and y_vars, with an optional best fit line and customizable point color, + size, and markers. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param x_vars: List of variable names to plot on the `x-axis`. + :type x_vars: list of str + + :param y_vars: List of variable names to plot on the `y-axis`. + :type y_vars: list of str + + :param n_rows: Number of rows in the subplot grid. + :type n_rows: int + + :param n_cols: Number of columns in the subplot grid. + :type n_cols: int + + :param image_path_png: Directory path to save PNG images of the scatter plots. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the scatter plots. + :type image_path_svg: str, optional + + :param save_plots: Controls which plots to save: ``"all"``, ``"individual"``, or ``"grid"``. + :type save_plots: str, optional + + :param show_legend: Whether to display the legend on the plots. Default is ``True``. + :type show_legend: bool, optional + + :param xlabel_rot: Rotation angle for `x-axis` labels. Default is ``0``. + :type xlabel_rot: int, optional + + :param show_plot: Controls plot display: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + + :param rotate_plot: Whether to rotate (pivot) the plots. Default is ``False``. + :type rotate_plot: bool, optional + + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + + :param add_best_fit_line: Whether to add a best fit line to the scatter plots. Default is ``False``. + :type add_best_fit_line: bool, optional + + :param scatter_color: Color code for the scattered points. Default is ``"C0"``. + :type scatter_color: str, optional + + :param best_fit_linecolor: Color code for the best fit line. Default is ``"red"``. + :type best_fit_linecolor: str, optional + + :param best_fit_linestyle: Linestyle for the best fit line. Default is ``"-"``. + :type best_fit_linestyle: str, optional + + :param hue: Column name for the grouping variable that will produce points with different colors. + :type hue: str, optional + + :param hue_palette: Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. + :type hue_palette: dict, list, or str, optional + + :param size: Column name for the grouping variable that will produce points with different sizes. + :type size: str, optional + + :param sizes: Dictionary mapping sizes (smallest and largest) to min and max values. + :type sizes: dict, optional + + :param marker: Marker style used for the scatter points. Default is ``"o"``. + :type marker: str, optional + + :param show_correlation: Whether to display the Pearson correlation coefficient in the plot title. Default is ``True``. + :type show_correlation: bool, optional + + :param xlim: Limits for the `x-axis` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + + :param ylim: Limits for the `y-axis` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set but no image paths are provided. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` or ``grid_figsize`` are not tuples/lists with two numeric values. + + :returns: ``None`` + This function does not return any value but generates and optionally saves scatter plots for the specified `x_vars` and `y_vars`. + + +Regression-Centric Scatter Plots Example +----------------------------------------- + +In this US census data [1]_ example, the ``scatter_fit_plot`` function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the ``show_correlation=True`` parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the ``add_best_fit_line=True`` parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="grid", + show_legend=True, + xlabel_rot=0, + show_plot="grid", + rotate_plot=False, + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid.png + :alt: Scatter Plot Comparisons (with Best Fit Lines) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Scatter Plots Grouped by Category Example +------------------------------------------- + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of +scatter plots that examine the relationships between ``age`` and ``hours-per-week`` +as well as ``education-num`` and ``hours-per-week``. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots: + +1. **Hue and Hue Palette**: The ``hue`` parameter is set to ``"income"``, meaning that the + data points in the scatter plots are colored according to the values in the ``income`` + column. A custom color mapping is provided via the ``hue_palette`` parameter, where the + income categories ``"<=50K"`` and ``">50K"`` are assigned the colors ``"brown"`` and + ``"green"``, respectively. This change visually distinguishes the data points based on + income levels. + +2. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, which applies + a grey color to the scatter points when no ``hue`` is provided. However, since a ``hue`` + is specified in this example, the ``hue_palette`` takes precedence and overrides this color setting. + +3. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``False``, meaning that + no best fit line is added to the scatter plots. This differs from the previous example where + a best fit line was included. + +4. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``False``, so the + Pearson correlation coefficient will not be displayed in the plot titles. This is another + change from the previous example where the correlation coefficient was included. + +5. **Hue Legend**: The ``show_legend`` parameter remains set to ``True``, ensuring that the + legend displaying the hue categories (``"<=50K"`` and ``">50K"``) appears on the plots, + helping to interpret the color coding of the data points. + +These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths. + + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + hue_dict = {"<=50K": "brown", ">50K": "green"} + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="grid", + show_legend=True, + xlabel_rot=0, + show_plot="grid", + rotate_plot=False, + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=False, + scatter_color="#808080", + hue="income", + hue_palette=hue_dict, + show_correlation=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid_grouped.png + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +.. [#] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +.. [2] Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +.. [3] Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. diff --git a/_build/html/v0.0.5/_static/_sphinx_javascript_frameworks_compat.js b/_build/html/v0.0.5/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/_build/html/v0.0.5/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * 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/_build/html/v0.0.5/_static/basic.css b/_build/html/v0.0.5/_static/basic.css new file mode 100644 index 000000000..7ebbd6d07 --- /dev/null +++ b/_build/html/v0.0.5/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- 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: 230px; + 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-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +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; +} + +a:visited { + color: #551A8B; +} + +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; +} + +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; +} + +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 > 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; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +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; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- 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/_build/html/v0.0.5/_static/check-solid.svg b/_build/html/v0.0.5/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_build/html/v0.0.5/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_build/html/v0.0.5/_static/clipboard.min.js b/_build/html/v0.0.5/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_build/html/v0.0.5/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * 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/_build/html/v0.0.5/_static/copybutton.css b/_build/html/v0.0.5/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_build/html/v0.0.5/_static/copybutton.css @@ -0,0 +1,94 @@ +/* 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/_build/html/v0.0.5/_static/copybutton.js b/_build/html/v0.0.5/_static/copybutton.js new file mode 100644 index 000000000..0ea5f6c60 --- /dev/null +++ b/_build/html/v0.0.5/_static/copybutton.js @@ -0,0 +1,248 @@ +// 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, '>|\\$ ', true, 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/_build/html/v0.0.5/_static/copybutton_funcs.js b/_build/html/v0.0.5/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_build/html/v0.0.5/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +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/_build/html/v0.0.5/_static/css/badge_only.css b/_build/html/v0.0.5/_static/css/badge_only.css new file mode 100644 index 000000000..88ba55b96 --- /dev/null +++ b/_build/html/v0.0.5/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Bold.woff b/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Regular.woff b/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.eot b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.svg b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.ttf b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.woff b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.woff2 b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_build/html/v0.0.5/_static/css/fonts/lato-bold-italic.woff b/_build/html/v0.0.5/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_build/html/v0.0.5/_static/css/fonts/lato-bold-italic.woff2 b/_build/html/v0.0.5/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_build/html/v0.0.5/_static/css/fonts/lato-bold.woff b/_build/html/v0.0.5/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/lato-bold.woff differ diff --git a/_build/html/v0.0.5/_static/css/fonts/lato-bold.woff2 b/_build/html/v0.0.5/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/lato-bold.woff2 differ diff --git a/_build/html/v0.0.5/_static/css/fonts/lato-normal-italic.woff b/_build/html/v0.0.5/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_build/html/v0.0.5/_static/css/fonts/lato-normal-italic.woff2 b/_build/html/v0.0.5/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_build/html/v0.0.5/_static/css/fonts/lato-normal.woff b/_build/html/v0.0.5/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/lato-normal.woff differ diff --git a/_build/html/v0.0.5/_static/css/fonts/lato-normal.woff2 b/_build/html/v0.0.5/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.5/_static/css/fonts/lato-normal.woff2 differ diff --git a/_build/html/v0.0.5/_static/css/theme.css b/_build/html/v0.0.5/_static/css/theme.css new file mode 100644 index 000000000..0f14f1064 --- /dev/null +++ b/_build/html/v0.0.5/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_build/html/v0.0.5/_static/doctools.js b/_build/html/v0.0.5/_static/doctools.js new file mode 100644 index 000000000..0398ebb9f --- /dev/null +++ b/_build/html/v0.0.5/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + 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; + }, + + /** + * 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; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + 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; + } + } + + // 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/_build/html/v0.0.5/_static/documentation_options.js b/_build/html/v0.0.5/_static/documentation_options.js new file mode 100644 index 000000000..9c6d3573f --- /dev/null +++ b/_build/html/v0.0.5/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.0.5', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_build/html/v0.0.5/_static/file.png b/_build/html/v0.0.5/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_build/html/v0.0.5/_static/file.png differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.eot b/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.eot differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.ttf b/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.ttf differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.woff b/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.woff differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.woff2 b/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.eot b/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.ttf b/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff b/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff2 b/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.eot b/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.eot differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.ttf b/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.ttf differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.woff b/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.woff differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.woff2 b/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.eot b/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.eot differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.ttf b/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.ttf differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.woff b/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.woff differ diff --git a/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.woff2 b/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/_build/html/v0.0.5/_static/jquery.js b/_build/html/v0.0.5/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/_build/html/v0.0.5/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/_build/html/v0.0.5/_static/language_data.js b/_build/html/v0.0.5/_static/language_data.js new file mode 100644 index 000000000..c7fe6c6fa --- /dev/null +++ b/_build/html/v0.0.5/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_build/html/v0.0.5/_static/minus.png b/_build/html/v0.0.5/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/_build/html/v0.0.5/_static/minus.png differ diff --git a/_build/html/v0.0.5/_static/plus.png b/_build/html/v0.0.5/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/_build/html/v0.0.5/_static/plus.png differ diff --git a/_build/html/v0.0.5/_static/pygments.css b/_build/html/v0.0.5/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/_build/html/v0.0.5/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_build/html/v0.0.5/_static/searchtools.js b/_build/html/v0.0.5/_static/searchtools.js new file mode 100644 index 000000000..2c774d17a --- /dev/null +++ b/_build/html/v0.0.5/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_build/html/v0.0.5/_static/sphinx_highlight.js b/_build/html/v0.0.5/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/_build/html/v0.0.5/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * 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))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + 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 SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + 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")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_build/html/v0.0.5/acknowledgements.html b/_build/html/v0.0.5/acknowledgements.html new file mode 100644 index 000000000..22eb83adc --- /dev/null +++ b/_build/html/v0.0.5/acknowledgements.html @@ -0,0 +1,136 @@ + + + + + + + + + Acknowledgements — EDA Toolkit 0.0.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Acknowledgements

+

We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists.

+

We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.5/changelog.html b/_build/html/v0.0.5/changelog.html new file mode 100644 index 000000000..959578a44 --- /dev/null +++ b/_build/html/v0.0.5/changelog.html @@ -0,0 +1,398 @@ + + + + + + + + + Changelog — EDA Toolkit 0.0.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Changelog

+
+

Version 0.0.5

+

Ensure Consistent Font Size and Text Wrapping Across Plot Elements

+

This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the stacked_crosstab_plot function. The following updates have been implemented to ensure uniformity and improve the readability of plots:

+
    +
  1. Title Font Size and Text Wrapping: +- Added a text_wrap parameter to control the wrapping of plot titles. +- Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ax.set_title() after plot generation.

  2. +
  3. Legend Font Size Consistency: +- Incorporated label_fontsize into the legend font size by directly setting the font size of the legend text using plt.setp(legend.get_texts(), fontsize=label_fontsize). +- This ensures that the legend labels are consistent with the title and axis labels.

  4. +
+

Testing

+
    +
  • Verified that titles now wrap correctly and match the specified label_fontsize.

  • +
  • Confirmed that legend text scales according to label_fontsize, ensuring consistent font sizes across all plot elements.

  • +
+
+
+

Version 0.0.4

+
    +
  • Stable release

    +
      +
    • No new updates to the codebase.

    • +
    • Updated the project description variable in setup.py to re-emphasize key elements of the library.

    • +
    • Minor README cleanup:

      +
        +
      • Added icons for sections that did not have them.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.3

+
    +
  • Stable release

    +
      +
    • Updated logo size, fixed citation title, and made minor README cleanup:

      +
        +
      • Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.2

+
    +
  • +
    First stable release
      +
    • No new updates to the codebase; minimal documentation updates to README and setup.py files.

    • +
    • Added logo, badges, and Zenodo-certified citation to README.

    • +
    +
    +
    +
  • +
+
+
+

Version 0.0.1rc0

+
    +
  • No new updates to the codebase; minimal documentation updates to README and setup.py files.

  • +
+
+
+

Version 0.0.1b0

+

New Scatter Fit Plot and Additional Updates

+
    +
  • Added new scatter_fit_plot(), removed unused data_types(), and added comment section headers.

  • +
+

Added xlim and ylim Inputs to KDE Distribution

+
    +
  • kde_distribution():

    +
    +
      +
    • Added xlim and ylim inputs to allow users to customize axes limits in kde_distribution().

    • +
    +
    +
  • +
+

Added xlim and ylim Params to Stacked Crosstab Plot

+
    +
  • stacked_crosstab_plot():

    +
    +
      +
    • Added xlim and ylim input parameters to stacked_crosstab_plot() to give users more flexibility in controlling axes limits.

    • +
    +
    +
  • +
+

Added x and y Limits to Box and Violin Plots

+
    +
  • box_violin_plot():

    +
    +
      +
    • Changed function name from metrics_box_violin() to box_violin_plot().

    • +
    • Added xlim and ylim inputs to control x and y-axis limits of box_violin_plot() (formerly metrics_box_violin).

    • +
    +
    +
  • +
+

Added Ability to Remove Stacks from Plots, Plot All or One at a Time

+

Key Changes

+
    +
  1. Plot Type Parameter +- plot_type: This parameter allows the user to choose between "regular", "normalized", or "both" plot types.

  2. +
  3. Remove Stacks Parameter +- remove_stacks: This parameter, when set to True, generates a regular bar plot using only the col parameter instead of a stacked bar plot. It only works when plot_type is set to “regular”. If remove_stacks is set to True while plot_type is anything other than “regular”, the function will raise an exception.

  4. +
+

Explanation of Changes

+
    +
  • Plot Type Parameter

    +
      +
    • Provides flexibility to the user, allowing specification of the type of plot to generate:

      +
        +
      • "regular": Standard bar plot.

      • +
      • "normalized": Normalized bar plot.

      • +
      • "both": Both regular and normalized bar plots.

      • +
      +
    • +
    +
  • +
  • Remove Stacks Parameter +- remove_stacks: Generates a regular bar plot using only the col parameter, removing the stacking of the bars. Applicable only when plot_type is set to “regular”. An exception is raised if used with any other plot_type.

  • +
+

These changes enhance the flexibility and functionality of the stacked_crosstab_plot function, allowing for more customizable and specific plot generation based on user requirements.

+
+
+

Version 0.0.1b0

+

Refined KDE Distributions

+

Key Changes

+
    +
  1. Alpha Transparency for Histogram Fill +- Added a fill_alpha parameter to control the transparency of the histogram bars’ fill color. +- Default value is 0.6. An exception is raised if fill=False and fill_alpha is specified.

  2. +
  3. Custom Font Sizes +- Introduced label_fontsize and tick_fontsize parameters to control font size of axis labels and tick marks independently.

  4. +
  5. Scientific Notation Toggle +- Added a disable_sci_notation parameter to enable or disable scientific notation on axes.

  6. +
  7. Improved Error Handling +- Added validation for the stat parameter to ensure valid options are accepted. +- Added checks for proper usage of fill_alpha and hist_edgecolor when fill is set to False.

  8. +
  9. General Enhancements +- Updated the function’s docstring to reflect new parameters and provide comprehensive guidance on usage.

  10. +
+
+
+

Version 0.0.1b0

+

Enhanced KDE Distributions Function

+

Added Parameters

+
    +
  1. Grid Figsize and Single Figsize +- Control the size of the overall grid figure and individual figures separately.

  2. +
  3. Hist Color and KDE Color` +- Allow customization of histogram and KDE plot colors.

  4. +
  5. Edge Color +- Allows customization of histogram bar edges.

  6. +
  7. Hue +- Allows grouping data by a column.

  8. +
  9. Fill +- Controls whether to fill histogram bars with color.

  10. +
  11. Y-axis Label` +- Customizable y-axis label.

  12. +
  13. Log-Scaling +- Specifies which variables to apply log scale.

  14. +
  15. Bins and Bin Width +- Control the number and width of bins.

  16. +
  17. ``stat``: +- Allows different statistics for the histogram (count, density, frequency, probability, proportion, percent).

  18. +
+

Improvements

+
    +
  1. Validation and Error Handling +- Checks for invalid log_scale_vars and throws a ValueError if any are found. +- Throws a ValueError if edgecolor is changed while fill is set to False. +- Issues a PerformanceWarning if both bins and binwidth are specified, warning of potential performance impacts.

  2. +
  3. Customizable Y-Axis Label +- Allows users to specify custom y-axis labels.

  4. +
  5. Warning for KDE with Count +- Issues a warning if KDE is used with stat='count', as it may produce misleading plots.

  6. +
+

Updated Function to Ensure Unique IDs and Index Check

+
    +
  • Ensured that each generated ID in add_ids starts with a non-zero digit.

  • +
  • Added a check to verify that the DataFrame index is unique.

  • +
  • Printed a warning message if duplicate index entries are found.

  • +
+

These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique.

+

Check for Unique Indices +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries.

+

Generate Non-Zero Starting IDs

+
    +
  • The ID generation process is updated to ensure that the first digit of each ID is always non-zero.

  • +
+

Ensure Unique IDs

+
    +
  • A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame.

  • +
+

Fix Int Conversion for Numeric Columns, Reset Decimal Places

+
    +
  • Fixed integer conversion issue for numeric columns when decimal_places=0 in the save_dataframes_to_excel function.

  • +
  • Reset decimal_places default value to 0.

  • +
+

These changes ensure correct formatting and avoid errors during conversion.

+

Contingency Table Updates

+
    +
  1. Error Handling for Columns +- Added a check to ensure at least one column is specified. +- Updated the function to accept a single column as a string or multiple columns as a list. +- Raised a ValueError if no columns are provided or if cols is not correctly specified.

  2. +
  3. Function Parameters +- Changed parameters from col1 and col2 to a single parameter cols which can be either a string or a list.

  4. +
  5. Error Handling +- Renamed SortBy to sort_by to standardize nomenclature. +- Added a check to ensure sort_by is either 0 or 1. +- Raised a ValueError if sort_by is not 0 or 1.

  6. +
+
    +
  1. Sorting Logic +- Updated the sorting logic to handle the new cols parameter structure.

  2. +
  3. Handling Categorical Data +- Modified code to convert categorical columns to strings to avoid issues with fillna("").

  4. +
  5. Handling Missing Values +- Added df = df.fillna('') to fill NA values within the function to account for missing data.

  6. +
  7. Improved Function Documentation +- Updated function documentation to reflect new parameters and error handling.

  8. +
+
+
+

Version 0.0.1b0

+

Contingency Table Updates

+
    +
  • fillna('') added to output so that null values come through, removed 'All' column name from output, sort options 0 and 1, updated docstring documentation. Tested successfully on Python 3.7.3.

  • +
+

Compatibility Enhancement

+
    +
  1. Added a version check for Python 3.7 and above.

    +
      +
    • Conditional import of datetime to handle different Python versions.

    • +
    +
  2. +
+
if sys.version_info >= (3, 7):
+    from datetime import datetime
+else:
+    import datetime
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.5/citations.html b/_build/html/v0.0.5/citations.html new file mode 100644 index 000000000..ea6ee81c4 --- /dev/null +++ b/_build/html/v0.0.5/citations.html @@ -0,0 +1,148 @@ + + + + + + + + + Citing EDA Toolkit — EDA Toolkit 0.0.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Citing EDA Toolkit

+

Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.4). Zenodo. https://doi.org/10.5281/zenodo.13163208

+
@software{shpaner_2024_13162633,
+author       = {Shpaner, Leonid and
+                Gil, Oscar},
+title        = {EDA Toolkit},
+month        = aug,
+year         = 2024,
+publisher    = {Zenodo},
+version      = {0.0.4},W
+doi          = {10.5281/zenodo.13162633},
+url          = {https://doi.org/10.5281/zenodo.13162633}
+}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.5/genindex.html b/_build/html/v0.0.5/genindex.html new file mode 100644 index 000000000..6bc458aee --- /dev/null +++ b/_build/html/v0.0.5/genindex.html @@ -0,0 +1,315 @@ + + + + + + + + Index — EDA Toolkit 0.0.5 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | H + | K + | P + | S + +
+

A

+ + +
+ +

B

+ + +
+ +

C

+ + +
+ +

D

+ + +
+ +

E

+ + +
+ +

H

+ + +
+ +

K

+ + +
+ +

P

+ + +
+ +

S

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.5/getting_started.html b/_build/html/v0.0.5/getting_started.html new file mode 100644 index 000000000..b93c69d24 --- /dev/null +++ b/_build/html/v0.0.5/getting_started.html @@ -0,0 +1,222 @@ + + + + + + + + + Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Welcome to the EDA Toolkit Python Library Documentation!

+
+

Note

+

This documentation is for eda_toolkit version 0.0.5.

+
+

The eda_toolkit is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data.

+ +
+

What is EDA?

+

Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data.

+
+
+

Purpose of EDA Toolkit

+

The eda_toolkit library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including:

+
    +
  • Data Management: Tools for managing directories, generating unique IDs, +standardizing dates, and handling common DataFrame manipulations.

  • +
  • Data Cleaning: Functions to address missing values, remove outliers, and +correct formatting issues, ensuring data is ready for analysis.

  • +
  • Data Visualization: A variety of plotting functions, including KDE +distribution plots, stacked bar plots, scatter plots with optional best fit +lines, and box/violin plots, to visually explore data distributions, +relationships, and trends.

  • +
  • Descriptive and Summary Statistics: Methods to generate comprehensive +reports on data types, summary statistics (mean, median, standard deviation, +etc.), and to summarize all possible combinations of specified variables.

  • +
  • Reporting and Export: Features to save DataFrames to Excel with +customizable formatting, create contingency tables, and export generated +plots in multiple formats.

  • +
+
+
+

Key Features

+
    +
  • Ease of Use: The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions.

  • +
  • Customizable: Users can customize various aspects of the toolkit to fit their specific needs.

  • +
  • Integration: Seamlessly integrates with popular data science libraries such as Pandas, NumPy, Matplotlib, and Seaborn.

  • +
  • Documentation and Examples: Comprehensive documentation and examples to help users get started quickly and effectively.

  • +
+
+
+

Prerequisites

+

Before you install eda_toolkit, ensure your system meets the following requirements:

+
    +
  • Python: version 3.7.4 or higher is required to run eda_toolkit.

  • +
+

Additionally, eda_toolkit depends on the following packages, which will be automatically installed when you install eda_toolkit:

+
    +
  • numpy: version 1.21.6 or higher

  • +
  • pandas: version 1.3.5 or higher

  • +
  • matplotlib: version 3.5.3 or higher

  • +
  • seaborn: version 0.12.2 or higher

  • +
  • jinja2: version 3.1.4 or higher

  • +
  • xlsxwriter: version 3.2.0 or higher

  • +
+
+
+

Installation

+

You can install eda_toolkit directly from PyPI:

+
pip install eda_toolkit
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.5/index.html b/_build/html/v0.0.5/index.html new file mode 100644 index 000000000..c74202df9 --- /dev/null +++ b/_build/html/v0.0.5/index.html @@ -0,0 +1,239 @@ + + + + + + + + + Table of Contents — EDA Toolkit 0.0.5 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Table of Contents

+ + + +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.5/objects.inv b/_build/html/v0.0.5/objects.inv new file mode 100644 index 000000000..44efb400c Binary files /dev/null and b/_build/html/v0.0.5/objects.inv differ diff --git a/_build/html/v0.0.5/references.html b/_build/html/v0.0.5/references.html new file mode 100644 index 000000000..87fe47fb3 --- /dev/null +++ b/_build/html/v0.0.5/references.html @@ -0,0 +1,138 @@ + + + + + + + + + References — EDA Toolkit 0.0.5 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+

The eda_toolkit library

+
+

References

+
    +
  1. Hunter, J. D. (2007). Matplotlib: A 2D Graphics Environment. Computing in Science & Engineering, 9(3), 90-95. https://doi.org/10.1109/MCSE.2007.55.

  2. +
  3. Kohavi, R. (1996). Census Income. UCI Machine Learning Repository. https://doi.org/10.24432/C5GP7S.

  4. +
  5. Waskom, M. (2021). Seaborn: Statistical Data Visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021.

  6. +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.5/search.html b/_build/html/v0.0.5/search.html new file mode 100644 index 000000000..72164c11a --- /dev/null +++ b/_build/html/v0.0.5/search.html @@ -0,0 +1,143 @@ + + + + + + + + Search — EDA Toolkit 0.0.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/_build/html/v0.0.5/searchindex.js b/_build/html/v0.0.5/searchindex.js new file mode 100644 index 000000000..8dfb4fb54 --- /dev/null +++ b/_build/html/v0.0.5/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"About EDA Toolkit": [[4, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[6, "adding-unique-identifiers"]], "Binning Numerical Columns": [[6, "binning-numerical-columns"]], "Box Plots Grid Example": [[6, "box-plots-grid-example"]], "Box and Violin Plots": [[6, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Creating Contingency Tables": [[6, "creating-contingency-tables"]], "Data Preparation and Management": [[6, "data-preparation-and-management"]], "DataFrame Analysis": [[6, "dataframe-analysis"]], "Description": [[6, null]], "Generating Summary Tables for Variable Combinations": [[6, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[4, null]], "Highlighting Specific Columns in a DataFrame": [[6, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[6, "histogram-example-count"]], "Histogram Example (Density)": [[6, "histogram-example-density"]], "Installation": [[3, "installation"]], "KDE and Histogram Distribution Plots": [[6, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[6, "kde-and-histograms-example"]], "Key Features": [[3, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[6, "non-normalized-stacked-bar-plots-example"]], "Path directories": [[6, "path-directories"]], "Pivoted Stacked Bar Plots Example": [[6, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[6, "pivoted-violin-plots-grid-example"]], "Prerequisites": [[3, "prerequisites"]], "Project Links": [[3, "project-links"]], "Purpose of EDA Toolkit": [[3, "purpose-of-eda-toolkit"]], "References": [[5, null]], "Regression-Centric Scatter Plots Example": [[6, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[6, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[6, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Plots Grouped by Category Example": [[6, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[6, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[6, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[6, "stacked-crosstab-plots"]], "Standardized Dates": [[6, "standardized-dates"]], "Table of Contents": [[4, null]], "Trailing Period Removal": [[6, "trailing-period-removal"]], "Usage Guide": [[4, null]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id2"], [1, "id3"], [1, "id4"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Violin Plots Grid Example": [[6, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[3, null]], "What is EDA?": [[3, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "getting_started", "index", "references", "usage_guide"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "getting_started.rst", "index.rst", "references.rst", "usage_guide.rst"], "indexentries": {"add_ids()": [[6, "add_ids", false]], "box_violin_plot()": [[6, "box_violin_plot", false]], "built-in function": [[6, "add_ids", false], [6, "box_violin_plot", false], [6, "contingency_table", false], [6, "dataframe_columns", false], [6, "ensure_directory", false], [6, "highlight_columns", false], [6, "kde_distributions", false], [6, "parse_date_with_rule", false], [6, "save_dataframes_to_excel", false], [6, "scatter_fit_plot", false], [6, "stacked_crosstab_plot", false], [6, "strip_trailing_period", false], [6, "summarize_all_combinations", false]], "contingency_table()": [[6, "contingency_table", false]], "dataframe_columns()": [[6, "dataframe_columns", false]], "ensure_directory()": [[6, "ensure_directory", false]], "highlight_columns()": [[6, "highlight_columns", false]], "kde_distributions()": [[6, "kde_distributions", false]], "parse_date_with_rule()": [[6, "parse_date_with_rule", false]], "save_dataframes_to_excel()": [[6, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[6, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[6, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[6, "strip_trailing_period", false]], "summarize_all_combinations()": [[6, "summarize_all_combinations", false]]}, "objects": {"": [[6, 0, 1, "", "add_ids"], [6, 0, 1, "", "box_violin_plot"], [6, 0, 1, "", "contingency_table"], [6, 0, 1, "", "dataframe_columns"], [6, 0, 1, "", "ensure_directory"], [6, 0, 1, "", "highlight_columns"], [6, 0, 1, "", "kde_distributions"], [6, 0, 1, "", "parse_date_with_rule"], [6, 0, 1, "", "save_dataframes_to_excel"], [6, 0, 1, "", "scatter_fit_plot"], [6, 0, 1, "", "stacked_crosstab_plot"], [6, 0, 1, "", "strip_trailing_period"], [6, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 6], "0": [2, 3, 4, 6], "00": 6, "000000": 6, "0000ff": 6, "00bfc4": 6, "01": 6, "02": 6, "03021": [5, 6], "04": 6, "07": 6, "09": 6, "1": [1, 3, 6], "10": [2, 5, 6], "100": 6, "10724": 6, "11": 6, "1109": [5, 6], "111": 6, "115": 6, "11687": 6, "11th": 6, "12": [3, 6], "12202842": 6, "123": 6, "12929": 6, "13": 6, "131": 6, "13162633": 2, "13163208": 2, "13174": 6, "1348": 6, "13920": 6, "14": 6, "147": 6, "14x4": 6, "15": 6, "150": 6, "15784": 6, "16": 6, "16192": 6, "17": 6, "18": 6, "1873": 6, "19716": 6, "1994": 6, "1996": [5, 6], "1b0": 4, "1rc0": 4, "2": [3, 4, 6], "200": 6, "2007": [5, 6], "2020": 6, "2021": [5, 6], "2022": 6, "2024": 2, "203488": 6, "21": [3, 6], "21105": [5, 6], "2115": 6, "215646": 6, "22379": 6, "2245": 6, "22803": 6, "23": 6, "234721": 6, "24432": [5, 6], "24720": 6, "25": 6, "250": 6, "2509": 6, "2565": 6, "26": 6, "27": 6, "274": 6, "28": 6, "280": 6, "28523": 6, "29": 6, "295": 6, "2d": [5, 6], "3": [3, 4, 5, 6], "30": 6, "300": 6, "3021": [5, 6], "3054": 6, "31": 6, "3188": 6, "32": 6, "32650": 6, "33": 6, "333333": 6, "338409": 6, "33906": 6, "34": 6, "3461": 6, "35130194": 6, "36": 6, "3680": 6, "37": 6, "37155": 6, "38": 6, "3853": 6, "39": 6, "3986": 6, "4": [2, 3, 4, 6], "40": 6, "41": 6, "4110": 6, "41762": 6, "42": 6, "42643227": 6, "4267": 6, "43832": 6, "44807": 6, "45": 6, "46": 6, "46560": 6, "467": 6, "468": 6, "469": 6, "47": 6, "470": 6, "471": 6, "472": 6, "4746": 6, "48842": 6, "49": 6, "5": [3, 4, 6], "50": 6, "50k": 6, "50k_": 6, "51": 6, "5281": 2, "53": 6, "535": 6, "55": [5, 6], "56": 6, "5623": 6, "5707": 6, "58": 6, "5856": 6, "59": 6, "595": 6, "6": [1, 3, 5, 6], "60": [5, 6], "61": 6, "6172": 6, "62": 6, "64": 6, "65": 6, "66": 6, "6619": 6, "668": 6, "6738": 6, "69": 6, "7": [1, 3, 6], "70": 6, "71": 6, "73": 6, "74": 6, "74130842": 6, "746": 6, "75": 6, "7536": 6, "76": 6, "77": 6, "77516": 6, "79": 6, "8": 6, "80": 6, "808080": 6, "809": 6, "81": 6, "815": 6, "82": 6, "8213": 6, "82943611": 6, "83": 6, "83311": 6, "85": 6, "8601": 6, "861555": 6, "87": 6, "87104229": 6, "89": 6, "9": [5, 6], "90": [5, 6], "90069867": 6, "9076": 6, "91": 6, "93": 6, "93837254": 6, "939": 6, "94": 6, "9468": 6, "95": [5, 6], "96": 6, "96078789": 6, "963": 6, "966": 6, "97": 6, "97751875": 6, "98": 6, "99": 6, "A": [1, 3, 5, 6], "By": 6, "For": 6, "If": [1, 6], "In": 6, "It": [1, 3, 6], "No": 1, "Not": 6, "One": 1, "The": [1, 3, 5, 6], "Then": 6, "These": [1, 6], "To": 6, "With": 4, "abil": [1, 6], "abl": 6, "about": 6, "abov": [1, 6], "academ": 0, "accept": 1, "access": 6, "accord": [1, 6], "account": 1, "accur": 6, "acknowledg": [1, 4], "across": [1, 6], "actual": 6, "ad": [1, 4], "adapt": 6, "add": 6, "add_best_fit_lin": 6, "add_id": [1, 4, 6], "addit": [1, 6], "addition": [3, 6], "address": [1, 3], "adher": 6, "adjust": 6, "adm": 6, "aesthet": 6, "affect": 6, "after": [1, 6], "ag": 6, "against": 6, "age_boxplot_list": 6, "age_group": 6, "ages_18_to_40": 6, "aggreg": 6, "alic": 6, "align": 6, "all": [1, 3, 6], "all_combin": 6, "allow": [1, 6], "along": [1, 6], "alpha": [1, 6], "alreadi": 6, "also": [0, 6], "altern": 6, "alwai": 1, "amount": 6, "an": [0, 1, 6], "analysi": [3, 4], "analyst": 3, "analyz": 6, "angl": 6, "ani": [1, 3, 6], "annot": 6, "anomali": 3, "anoth": 6, "anyth": 1, "appear": 6, "append": 6, "appli": [0, 1, 3, 6], "applic": 1, "appropri": 6, "ar": [1, 6], "around": 6, "arrang": 6, "artifact": 6, "asian": 6, "aspect": 3, "assess": 6, "assign": 6, "associ": 3, "assum": 6, "attempt": 6, "attract": 6, "attribut": 6, "aug": 2, "author": 2, "auto": 6, "autofit": 6, "autom": 3, "automat": [3, 6], "avail": 6, "avoid": 1, "ax": [1, 6], "axi": [1, 6], "bachelor": 6, "back": 6, "background": 6, "badg": 1, "bar": [1, 3, 4], "barh": 6, "base": [1, 6], "base_path": 6, "bbox_inch": 6, "becaus": 6, "been": [1, 6], "befor": [1, 3, 6], "being": 6, "below": 6, "beneath": 6, "best": [3, 4], "best_fit_linecolor": 6, "best_fit_linestyl": 6, "better": [3, 6], "between": [1, 6], "bin": [1, 4], "bin_ag": 6, "binrang": 6, "binwidth": [1, 6], "black": 6, "bob": 6, "bold": 6, "bool": 6, "boolean": 6, "border": 6, "both": [1, 6], "bound": 6, "box": [1, 3, 4], "box_violin_plot": [1, 4, 6], "boxplot": 6, "breakdown": 6, "broad": 3, "brown": 6, "built": 6, "c0": 6, "c5gp7": [5, 6], "calcul": 6, "call": 6, "can": [1, 3, 6], "cannot": 6, "capit": 6, "career": 0, "case": 6, "categor": [1, 6], "categori": 4, "cell": 6, "censu": [5, 6], "census_id": 6, "census_summary_t": 6, "centric": 4, "certain": 6, "certifi": 1, "chang": [1, 6], "changelog": 4, "charact": 6, "characterist": 3, "charli": 6, "check": [1, 6], "choos": [1, 6], "circl": 6, "citat": 1, "cite": 4, "civ": 6, "clariti": 6, "clean": [1, 3, 6], "cleaner": 6, "cleanup": 1, "clear": 6, "cleric": 6, "code": [1, 6], "codebas": 1, "coeffici": 6, "cohes": 6, "col": [1, 6], "col1": 1, "col2": 1, "color": [1, 6], "column": [1, 4], "column_nam": 6, "combin": [3, 4], "come": 1, "comment": 1, "common": [3, 6], "compar": 6, "comparison": 6, "compat": 1, "complex": 6, "comprehens": [1, 3, 6], "comput": [5, 6], "condit": 1, "configur": 6, "confirm": 1, "confus": 6, "consist": [1, 6], "constant": 6, "contain": 6, "content": 6, "conting": [1, 3, 4], "contingency_t": [4, 6], "control": [1, 6], "convers": [1, 6], "convert": [1, 6], "correct": [1, 3, 6], "correctli": [1, 6], "correl": 6, "correspond": 6, "count": [1, 4], "countri": 6, "creat": [3, 4], "creation": 6, "crop": 6, "crosstab": [1, 4], "crosstab_age_incom": 6, "crosstab_age_sex": 6, "crosstabs_dict": 6, "crosstabs_onli": 6, "crucial": [3, 6], "current": 6, "custom": [1, 3, 4], "custom_ord": 6, "customiz": [1, 3, 6], "cut": 6, "d": [5, 6], "dai": 6, "dark": 6, "data": [0, 1, 3, 4, 5], "data_nam": 6, "data_output": 6, "data_path": 6, "data_typ": 1, "datafram": [1, 3, 4], "dataframe_column": [4, 6], "dataset": [3, 6], "date": [3, 4], "date_column": 6, "date_str": 6, "datetim": 1, "david": 6, "dd": 6, "deal": 6, "decim": [1, 6], "decimal_plac": [1, 6], "dedic": 0, "deepest": 0, "default": [1, 6], "defin": 6, "degre": 6, "demograph": 6, "demonstr": 6, "densiti": [1, 4], "depend": [3, 6], "descend": 6, "describ": 6, "descript": [1, 3, 4], "design": [3, 6], "detail": 6, "deviat": 3, "df": [1, 6], "df_censu": 6, "df_dict": 6, "dict": 6, "dictionari": 6, "did": 1, "diego": 0, "differ": [1, 6], "digit": [1, 6], "dir": 6, "direct": 6, "directli": [1, 3, 6], "directori": [3, 4], "disabl": [1, 6], "disable_sci_not": [1, 6], "discov": 3, "displai": 6, "distinguish": 6, "distribut": [1, 3, 4], "divid": 6, "divorc": 6, "do": 6, "docstr": 1, "document": [1, 4], "doe": 6, "doi": [2, 5, 6], "doubl": 6, "dr": 0, "draw": 6, "dtype": 6, "due": 6, "duplic": 1, "dure": [0, 1], "e": 6, "each": [1, 6], "eas": 3, "easi": [3, 6], "easier": 6, "easili": 6, "ebrahim": 0, "eda_toolkit": [3, 5, 6], "edg": [1, 6], "edgecolor": 1, "educ": [0, 6], "effect": [3, 6], "either": [1, 6], "element": [1, 6], "els": 1, "emp": 6, "emphas": 1, "emploi": 6, "empti": 6, "enabl": [1, 3, 6], "endeavor": 0, "engin": [0, 5, 6], "enhanc": [1, 3, 6], "ensu": 6, "ensur": [1, 3, 6], "ensure_directori": [4, 6], "enter": 6, "entir": 6, "entri": [1, 6], "environ": [0, 5, 6], "equal": 6, "equat": 6, "equival": 6, "error": [1, 6], "essenti": 3, "estim": 6, "etc": 3, "ev": 6, "even": 6, "everyth": 6, "examin": 6, "exampl": [3, 4], "excel": [3, 4], "except": [0, 1], "excess": 6, "exec": 6, "execut": 6, "exist": 6, "explain": 6, "explan": 1, "explicitli": 1, "explor": 3, "exploratori": 3, "export": [3, 6], "express": 0, "extend": 0, "extens": 6, "f8766d": 6, "f8c5c8": 6, "facilit": [3, 6], "fall": 6, "fals": [1, 6], "famili": 6, "fashion": 6, "featur": [4, 6], "feder": 6, "feedback": 1, "femal": 6, "female_": 6, "few": 6, "ff0000": 6, "figsiz": 1, "figur": [1, 6], "file": [1, 6], "file_nam": 6, "file_path": 6, "file_prefix": 6, "filenam": 6, "fill": [1, 6], "fill_alpha": [1, 6], "fillna": 1, "filter": 6, "filtered_df": 6, "financi": 6, "first": [1, 6], "fit": [1, 3, 4], "fix": 1, "flexibl": [1, 6], "flip": 6, "float": 6, "fnlwgt": 6, "focu": 6, "focus": 6, "folder": 6, "follow": [1, 3, 6], "font": [1, 6], "fontsiz": 1, "form": 3, "format": [1, 3, 4], "former": 6, "formerli": 1, "found": 1, "four": 6, "frequenc": [1, 6], "frequent": 6, "from": [0, 1, 3, 6], "full": 6, "fulli": 6, "func_col": 6, "function": [1, 3, 6], "further": 6, "futur": 6, "g": 6, "gain": [3, 6], "gener": [1, 3, 4], "get": 3, "get_text": 1, "gil": 2, "github": 3, "give": 1, "given": 6, "go": 6, "gov": 6, "grad": 6, "graduat": 0, "graphic": [5, 6], "gratitud": 0, "greater": 6, "green": 6, "grei": 6, "grid": [1, 4], "grid_figs": 6, "ground": 6, "group": [1, 4], "gt": 6, "guid": [0, 6], "guidanc": 1, "guidelin": 6, "h": 6, "h_pad": 6, "ha": 6, "handl": [1, 3, 6], "handler": 6, "have": [1, 6], "header": [1, 6], "height": 6, "help": [3, 6], "here": 6, "hi": 0, "hidden": 6, "hide": 6, "high": 6, "higher": 3, "highlight": 4, "highlight_column": [4, 6], "highlighted_df": 6, "hist": [1, 6], "hist_color": 6, "hist_edgecolor": [1, 6], "histogram": [1, 4], "horizont": 6, "hour": 6, "how": 6, "howev": 6, "html": 6, "http": [2, 5, 6], "hue": [1, 6], "hue_dict": 6, "hue_palett": 6, "hunter": [5, 6], "husband": 6, "hyperlink": 6, "hypothes": 3, "i": [1, 4, 6], "icon": 1, "id": [1, 3, 6], "id_colnam": 6, "identifi": [3, 4], "illustr": 6, "imag": 6, "image_filenam": 6, "image_path_png": 6, "image_path_svg": 6, "impact": 1, "implement": 1, "impor": 6, "import": [1, 6], "imposs": 6, "improv": 1, "inc": 6, "inch": 6, "includ": [3, 6], "incom": [5, 6], "inconsist": [1, 6], "incorpor": 1, "incorrect": 6, "independ": 1, "index": [1, 6], "indic": [1, 6], "individu": [1, 6], "individual_figs": 6, "inf": 6, "inform": 6, "initi": 3, "input": [1, 6], "insight": [3, 6], "instal": 4, "instanc": 6, "instead": [1, 6], "instruct": 6, "int": [1, 6], "int64": 6, "integ": 1, "integr": [3, 6], "interest": 6, "interfac": 6, "interpret": 6, "introduc": 1, "intuit": 3, "invalid": 1, "investig": 3, "involv": [3, 6], "io": 6, "island": 6, "iso": 6, "issu": [1, 3], "its": 6, "j": [5, 6], "jinja2": 3, "join": 6, "joss": [5, 6], "journal": [5, 6], "journei": 0, "jupyt": 6, "kde": [1, 3, 4], "kde_color": 6, "kde_density_single_distribut": 6, "kde_distribut": [1, 4, 6], "keep": 6, "kei": [1, 4, 6], "kernel": 6, "keyerror": 6, "kind": 6, "kohavi": [5, 6], "l": 2, "label": [1, 6], "label_ag": 6, "label_fonts": [1, 6], "largest": 6, "last": 6, "layout": 6, "lead": 6, "learn": [0, 3, 5, 6], "least": [1, 6], "left": 6, "legend": [1, 6], "legend_label": 6, "legend_labels_list": 6, "legibl": 6, "length": 6, "leonid": 2, "less": 6, "level": 6, "leverag": 6, "librari": [1, 4, 5, 6], "licens": 1, "like": [0, 6], "limit": [1, 6], "line": [3, 4], "linear": 6, "linestyl": 6, "link": 4, "list": [1, 6], "load": 6, "local": 6, "locat": 6, "log": [1, 6], "log_scale_var": [1, 6], "logarithm": 6, "logic": [1, 6], "logo": 1, "logscal": 6, "longer": 6, "loop": 6, "loss": 6, "lt": 6, "m": [0, 5, 6], "machin": [3, 5, 6], "made": 1, "magnitud": 6, "mai": [1, 6], "main": 3, "maintain": 6, "make": 6, "male": 6, "male_": 6, "manag": [3, 4], "manageri": 6, "mani": [3, 6], "manipul": 3, "map": 6, "marco": 0, "marit": 6, "mark": [1, 6], "marker": 6, "marri": 6, "match": [1, 6], "matplotlib": [3, 5, 6], "max": 6, "max_unique_valu": 6, "max_unique_value_pct": 6, "max_unique_value_tot": 6, "maximum": 6, "mcse": [5, 6], "mean": [3, 6], "meaning": 6, "measur": 6, "median": 3, "meet": 3, "mentor": 0, "mentorship": 0, "messag": 1, "method": [3, 6], "metric": 6, "metrics_box_violin": 1, "metrics_boxplot_comp": 6, "metrics_list": 6, "min": 6, "min_length": 6, "mind": 3, "minim": [1, 6], "minimum": 6, "minor": 1, "misalign": 6, "misinterpret": 6, "mislead": [1, 6], "miss": [1, 3, 6], "mm": 6, "mode": 6, "model": [3, 6], "modifi": [1, 6], "month": [2, 6], "more": [1, 6], "most": 6, "move": 1, "multipl": [1, 3, 6], "must": 6, "n_col": 6, "n_row": 6, "na": [1, 6], "name": [1, 6], "nativ": 6, "navig": 6, "necessari": [1, 6], "need": [3, 6], "never": 6, "new": [1, 6], "next": 6, "nomenclatur": 1, "non": [1, 4], "none": 6, "normal": [1, 4], "notat": [1, 6], "note": 6, "notebook": 6, "noth": 6, "now": 1, "null": [1, 6], "null_pct": 6, "null_tot": 6, "num": 6, "num_digit": 6, "number": [1, 6], "numer": [1, 4], "numpi": 3, "o": [2, 6], "object": 6, "observ": 6, "occup": 6, "occurr": 6, "offer": [3, 6], "often": [3, 6], "one": [1, 6], "onli": [1, 6], "opaqu": 6, "open": [5, 6], "oper": 6, "option": [1, 3, 6], "orang": 6, "order": 6, "org": [2, 5, 6], "organ": 6, "orient": 6, "origin": 6, "original_df": 6, "oscar": 2, "other": [1, 6], "otherwis": 6, "our": 0, "out": 6, "outlier": 3, "output": [1, 6], "over": 6, "overal": [1, 6], "overlai": 6, "overlaid": 6, "overrid": 6, "own": 6, "p": 6, "pac": 6, "packag": 3, "pad": 6, "page": 3, "pair": 6, "palett": 6, "panda": [3, 6], "param": 1, "paramet": [1, 6], "pardir": 6, "parent": 6, "pars": 6, "parse_date_with_rul": [4, 6], "part": 6, "particular": 6, "particularli": 6, "pass": 6, "path": 4, "patient": 6, "pattern": [3, 6], "pd": 6, "pearson": 6, "per": 6, "percent": [1, 6], "percentag": 6, "perform": [1, 6], "performancewarn": 1, "period": 4, "perspect": 6, "pink": 6, "pip": 3, "pivot": [0, 4], "place": [1, 6], "plai": 0, "plot": [1, 3, 4], "plot_typ": [1, 6], "plots_onli": 6, "plt": 1, "png": 6, "png_imag": 6, "point": 6, "popular": 3, "possibl": [3, 6], "potenti": [1, 6], "power": 6, "pr": 1, "preced": 6, "prefer": 6, "prefix": 6, "prepar": 4, "prerequisit": 4, "present": 6, "preval": 6, "prevent": 6, "previou": 6, "print": [1, 6], "prior": 6, "privat": 6, "probabl": [1, 6], "process": [1, 3, 6], "produc": [1, 6], "prof": 6, "program": 0, "project": [1, 4, 6], "proper": [1, 6], "properli": 6, "proport": [1, 6], "provid": [0, 1, 3, 6], "public": 6, "publish": 2, "purpos": 4, "pursu": 0, "py": 1, "pypi": 3, "python": [1, 4], "qualiti": [3, 6], "quantit": 6, "quick": 6, "quickli": 3, "r": [5, 6], "race": 6, "rais": [1, 6], "random": 6, "rang": [3, 6], "raw": 6, "re": 1, "read": 6, "readabl": [1, 6], "readi": 3, "readm": 1, "record": 6, "red": 6, "refer": [4, 6], "refin": 1, "reflect": [1, 6], "regress": 4, "regular": [1, 4], "relat": 6, "relationship": [3, 6], "releas": 1, "relev": 3, "reli": 6, "remain": 6, "remov": [1, 3, 4], "remove_stack": [1, 6], "renam": 1, "render": 6, "replac": 6, "report": [3, 6], "repositori": [3, 5, 6], "repres": 6, "represent": 6, "reproduc": 6, "requir": [1, 3, 6], "research": 3, "reset": 1, "respect": 6, "rest": 6, "result": 6, "return": 6, "return_dict": 6, "rich": 6, "right": 6, "robust": 1, "role": 0, "rot": 6, "rotat": 6, "rotate_plot": 6, "round": 6, "row": 6, "rule": 6, "run": 3, "same": 6, "sampl": 6, "san": 0, "save": [3, 4], "save_dataframes_to_excel": [1, 4, 6], "save_format": 6, "save_plot": 6, "scale": [1, 6], "scatter": [1, 3, 4], "scatter_color": 6, "scatter_fit_plot": [1, 4, 6], "scenario": 6, "schema": 6, "scheme": 6, "school": 0, "scienc": [0, 3, 5, 6], "scientif": [1, 6], "scientist": [0, 3], "seaborn": [3, 5, 6], "seamlessli": 3, "second": 6, "section": [1, 6], "see": 6, "seed": 6, "select": 6, "self": 6, "separ": [1, 6], "sequenc": 6, "set": [1, 6], "set_as_index": 6, "set_titl": 1, "setp": 1, "setup": [1, 6], "sever": 6, "sex": 6, "shape": 6, "sheet": 6, "shilei": 0, "show": 6, "show_correl": 6, "show_legend": 6, "show_plot": 6, "shown": 6, "shpaner": 2, "shpaner_2024_13162633": 2, "similarli": 6, "simplic": 3, "sinc": 6, "singl": [1, 6], "single_figs": 6, "single_var_image_filenam": 6, "single_var_image_path_png": 6, "single_var_image_path_svg": 6, "size": [1, 6], "smallest": 6, "smooth": 6, "snippet": 6, "so": [1, 6], "softwar": [2, 5, 6], "some": 6, "sort": [1, 6], "sort_bi": [1, 6], "sortbi": 1, "sourc": [5, 6], "space": 6, "span": 6, "special": 6, "specialti": 6, "specif": [1, 3, 4], "specifi": [1, 3, 6], "spous": 6, "squar": 6, "stabl": 1, "stack": [1, 3, 4], "stacked_crosstab": 6, "stacked_crosstab_plot": [1, 4, 6], "standard": [1, 3, 4], "standardized_d": 6, "start": [1, 3, 6], "stat": [1, 6], "state": 6, "statist": [1, 3, 5, 6], "statu": 6, "step": 3, "still": 6, "store": 1, "str": 6, "streamlin": 3, "strength": 6, "string": [1, 6], "strip": 6, "strip_trailing_period": [4, 6], "structur": [1, 3], "style": 6, "styler": 6, "subplot": 6, "success": 0, "successfulli": [0, 1], "suit": 3, "summar": 3, "summari": [3, 4], "summarize_all_combin": [4, 6], "summary_t": 6, "support": [0, 1, 6], "suppress": 6, "sure": 6, "svg": 6, "svg_imag": 6, "sy": 1, "system": [3, 6], "tab": 6, "tabl": [1, 3], "tailor": 6, "take": 6, "tall": 6, "tarshizi": 0, "task": [3, 6], "techniqu": 3, "test": 1, "text": [1, 6], "text_wrap": [1, 6], "than": [1, 6], "thank": 0, "thei": 6, "them": [1, 6], "therefor": 6, "thi": [1, 3, 6], "three": 6, "through": 1, "throw": 1, "thu": 6, "tick": [1, 6], "tick_fonts": [1, 6], "tight": 6, "time": [0, 1, 6], "titl": [1, 2, 6], "to_list": 6, "toggl": [1, 6], "tool": [3, 6], "top": 6, "total": 6, "trail": 4, "transpar": [1, 6], "trend": [3, 6], "true": [1, 6], "truth": 6, "tupl": 6, "two": 6, "type": [1, 3, 6], "u": [0, 6], "uci": [5, 6], "unambigu": 6, "uncov": 3, "underli": 3, "understand": [3, 6], "uniform": 1, "uniqu": [1, 3, 4], "unique_values_tot": 6, "unique_var": 6, "unit": 6, "univers": 0, "unrecogn": 6, "unstack": 6, "unus": 1, "unwav": 0, "up": [1, 6], "updat": [1, 6], "upright": 6, "url": 2, "us": [1, 3, 6], "usag": [1, 6], "user": [1, 3, 6], "userwarn": 6, "util": [3, 6], "valid": 1, "valu": [1, 3, 6], "valueerror": [1, 6], "vari": 6, "variabl": [1, 3, 4], "varieti": 3, "variou": [1, 3, 6], "vars_of_interest": 6, "verbiag": 1, "verifi": [1, 6], "versatil": 6, "version": [2, 3, 4, 6], "version_info": 1, "vertic": 6, "via": 6, "view": 6, "violin": [1, 3, 4], "violinplot": 6, "visual": [3, 5, 6], "vriabl": 6, "w": 2, "w_pad": 6, "wa": 6, "warn": 1, "waskom": [5, 6], "we": [0, 6], "week": 6, "welcom": 4, "well": 6, "were": 6, "what": 4, "when": [1, 3, 6], "where": 6, "whether": [1, 6], "which": [1, 3, 6], "while": [1, 6], "white": 6, "whitespac": 6, "wide": 6, "width": [1, 6], "wife": 6, "within": [1, 6], "without": 6, "work": [1, 6], "workclass": 6, "workflow": 3, "would": [0, 6], "wrap": [1, 6], "write": 6, "x": [1, 6], "x_var": 6, "xlabel": 6, "xlabel_rot": 6, "xlim": [1, 6], "xlsx": 6, "xlsxwriter": 3, "y": [1, 6], "y_axis_label": 6, "y_var": 6, "year": [2, 6], "yellow": 6, "ylabel": 6, "ylim": [1, 6], "you": [3, 6], "your": [3, 6], "yyyi": 6, "zenodo": [1, 2], "zero": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References", "Description"], "titleterms": {"0": 1, "1b0": 1, "1rc0": 1, "2": 1, "3": 1, "4": 1, "5": 1, "With": 6, "about": 4, "acknowledg": 0, "ad": 6, "analysi": 6, "bar": 6, "best": 6, "bin": 6, "box": 6, "categori": 6, "centric": 6, "changelog": 1, "cite": 2, "column": 6, "combin": 6, "content": 4, "conting": 6, "count": 6, "creat": 6, "crosstab": 6, "custom": 6, "data": 6, "datafram": 6, "date": 6, "densiti": 6, "descript": 6, "directori": 6, "distribut": 6, "document": 3, "eda": [2, 3, 4], "exampl": 6, "excel": 6, "featur": 3, "fit": 6, "format": 6, "gener": 6, "get": 4, "grid": 6, "group": 6, "guid": 4, "highlight": 6, "histogram": 6, "i": 3, "identifi": 6, "instal": 3, "kde": 6, "kei": 3, "librari": 3, "line": 6, "link": 3, "manag": 6, "non": 6, "normal": 6, "numer": 6, "path": 6, "period": 6, "pivot": 6, "plot": 6, "prepar": 6, "prerequisit": 3, "project": 3, "purpos": 3, "python": 3, "refer": 5, "regress": 6, "regular": 6, "remov": 6, "save": 6, "scatter": 6, "specif": 6, "stack": 6, "standard": 6, "start": 4, "summari": 6, "tabl": [4, 6], "toolkit": [2, 3, 4], "trail": 6, "uniqu": 6, "usag": 4, "variabl": 6, "version": 1, "violin": 6, "welcom": 3, "what": 3}}) \ No newline at end of file diff --git a/_build/html/v0.0.5/usage_guide.html b/_build/html/v0.0.5/usage_guide.html new file mode 100644 index 000000000..00e0c780a --- /dev/null +++ b/_build/html/v0.0.5/usage_guide.html @@ -0,0 +1,2465 @@ + + + + + + + + + Description — EDA Toolkit 0.0.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Description

+

This guide provides detailed instructions and examples for using the functions +provided in the eda_toolkit library and how to use them effectively in your projects.

+

For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [1]. This dataset provides a rich source of +information for demonstrating the functionalities of the eda_toolkit.

+
+
+

Data Preparation and Management

+
+

Path directories

+

Ensure that the directory exists. If not, create it.

+
+
+ensure_directory(path)
+
+
Parameters:
+

path (str) – The path to the directory that needs to be ensured.

+
+
Returns:
+

None

+
+
+
+ +

The ensure_directory function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories.

+

Example Usage

+

In the example below, we demonstrate how to use the ensure_directory function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them.

+

First, we define the base path as the parent directory of the current directory. +The os.pardir constant, equivalent to ".."", is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory.

+

Next, we set paths for the PNG and SVG image directories, located within an +images folder in the parent directory. Using the ensure_directory +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them.

+
from eda_toolkit import ensure_directory
+
+import os # import operating system for dir
+
+
+base_path = os.path.join(os.pardir)
+
+# Go up one level from 'notebooks' to parent directory,
+# then into the 'data' folder
+data_path = os.path.join(os.pardir, "data")
+data_output = os.path.join(os.pardir, "data_output")
+
+# create image paths
+image_path_png = os.path.join(base_path, "images", "png_images")
+image_path_svg = os.path.join(base_path, "images", "svg_images")
+
+# Use the function to ensure'data' directory exists
+ensure_directory(data_path)
+ensure_directory(data_output)
+ensure_directory(image_path_png)
+ensure_directory(image_path_svg)
+
+
+

Output

+
Created directory: ../data
+Created directory: ../data_output
+Created directory: ../images/png_images
+Created directory: ../images/svg_images
+
+
+
+
+

Adding Unique Identifiers

+

Add a column of unique IDs with a specified number of digits to the dataframe.

+
+
+add_ids(df, id_colname='ID', num_digits=9, seed=None, set_as_index=True)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The dataframe to add IDs to.

  • +
  • id_colname (str) – The name of the new column for the IDs.

  • +
  • num_digits (int) – The number of digits for the unique IDs.

  • +
  • seed (int, optional) – The seed for the random number generator. Defaults to None.

  • +
  • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

  • +
+
+
Returns:
+

The updated dataframe with the new ID column.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +

The add_ids function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe.

+

Example Usage

+

In the example below, we demonstrate how to use the add_ids function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the add_ids function to generate +and append a column of unique IDs with a specified number of digits to the dataframe.

+

First, we import the pandas library and the add_ids function from the eda_toolkit. +Then, we create a sample dataframe with some data. We call the add_ids function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe.

+
from eda_toolkit import add_ids
+
+# Add a column of unique IDs with 9 digits and call it "census_id"
+df = add_ids(
+    df=df,
+    id_colname="census_id",
+    num_digits=9,
+    seed=111,
+    set_as_index=True,
+)
+
+
+

Output

+

First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
DataFrame index is unique.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+

+
+
+

Trailing Period Removal

+

Strip the trailing period from floats in a specified column of a DataFrame, if present.

+
+
+strip_trailing_period(df, column_name)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The DataFrame containing the column to be processed.

  • +
  • column_name (str) – The name of the column containing floats with potential trailing periods.

  • +
+
+
Returns:
+

The updated DataFrame with the trailing periods removed from the specified column.

+
+
Return type:
+

pd.DataFrame

+
+
+

The strip_trailing_period function is designed to remove trailing periods +from float values in a specified column of a DataFrame. This can be particularly +useful when dealing with data that has been inconsistently formatted, ensuring +that all float values are correctly represented.

+
+ +

Example Usage

+

In the example below, we demonstrate how to use the strip_trailing_period function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the strip_trailing_period function to remove any trailing periods from the specified column.

+
from eda_toolkit import strip_trailing_period
+
+# Create a sample dataframe with trailing periods in some values
+data = {
+    "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.],
+}
+df = pd.DataFrame(data)
+
+# Remove trailing periods from the 'values' column
+df = strip_trailing_period(df=df, column_name="values")
+
+
+

Output

+

First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)

+ + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +

+

Note: The last row shows 6 as an int with a trailing period with its conversion to float.

+

+
+
+

Standardized Dates

+

Parse and standardize date strings based on the provided rule.

+
+
+parse_date_with_rule(date_str)
+

This function takes a date string and standardizes it to the ISO 8601 format +(YYYY-MM-DD). It assumes dates are provided in either day/month/year or +month/day/year format. The function first checks if the first part of the +date string (day or month) is greater than 12, which unambiguously indicates +a day/month/year format. If the first part is 12 or less, the function +attempts to parse the date as month/day/year, falling back to day/month/year +if the former raises a ValueError due to an impossible date (e.g., month +being greater than 12).

+
+
Parameters:
+

date_str (str) – A date string to be standardized.

+
+
Returns:
+

A standardized date string in the format YYYY-MM-DD.

+
+
Return type:
+

str

+
+
Raises:
+

ValueError – If date_str is in an unrecognized format or if the function +cannot parse the date.

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the parse_date_with_rule +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the parse_date_with_rule +function to parse and standardize each date string to the ISO 8601 format.

+
from eda_toolkit import parse_date_with_rule
+
+# Sample date strings
+date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"]
+
+# Standardize the date strings
+standardized_dates = [parse_date_with_rule(date) for date in date_strings]
+
+print(standardized_dates)
+
+
+

Output

+
['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12']
+
+
+
+

Important

+

In the next example, we demonstrate how to apply the parse_date_with_rule +function to a DataFrame column containing date strings using the .apply() method. +This is particularly useful when you need to standardize date formats across an +entire column in a DataFrame.

+
+
# Creating the DataFrame
+data = {
+    "date_column": [
+        "31/12/2021",
+        "01/01/2022",
+        "12/31/2021",
+        "13/02/2022",
+        "07/04/2022",
+    ],
+    "name": ["Alice", "Bob", "Charlie", "David", "Eve"],
+    "amount": [100.0, 150.5, 200.75, 250.25, 300.0],
+}
+
+df = pd.DataFrame(data)
+
+# Apply the function to the DataFrame column
+df["standardized_date"] = df["date_column"].apply(parse_date_with_rule)
+
+print(df)
+
+
+

Output

+
   date_column     name  amount standardized_date
+0   31/12/2021    Alice  100.00        2021-12-31
+1   01/01/2022      Bob  150.50        2022-01-01
+2   12/31/2021  Charlie  200.75        2021-12-31
+3   13/02/2022    David  250.25        2022-02-13
+4   07/04/2022      Eve  300.00        2022-04-07
+
+
+
+
+

DataFrame Analysis

+

Analyze DataFrame columns, including dtype, null values, and unique value counts.

+
+
+dataframe_columns(df)
+

This function analyzes the columns of a DataFrame, providing details about the data type, +the number and percentage of null values, the total number of unique values, and the most +frequent unique value along with its count and percentage. It handles special cases such as +converting date columns and replacing empty strings with Pandas NA values.

+
+
Parameters:
+

df (pandas.DataFrame) – The DataFrame to analyze.

+
+
Returns:
+

A DataFrame with the analysis results for each column.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the dataframe_columns +function to analyze a DataFrame’s columns.

+
from eda_toolkit import dataframe_columns
+
+dataframe_columns(df=df)
+
+
+

Output

+

Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
Shape:  (48842, 16)
+
+Total seconds of processing time: 0.861555
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+

+
+
+

Generating Summary Tables for Variable Combinations

+

This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.

+
+
+summarize_all_combinations(df, variables, data_path, data_name, min_length=2)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The pandas DataFrame containing the data.

  • +
  • variables (list) – List of unique variables to generate combinations.

  • +
  • data_path (str) – Path where the output Excel file will be saved.

  • +
  • data_name (str) – Name of the output Excel file.

  • +
  • min_length (int) – Minimum length of combinations to generate. Defaults to 2.

  • +
+
+
Returns:
+

A dictionary of summary tables and a list of all generated combinations.

+
+
Return type:
+

tuple(dict, list)

+
+
+
+ +

The function returns two outputs:

+

1. summary_tables: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values.

+

2. all_combinations: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables.

+

Example Usage

+

Below, we use the summarize_all_combinations function to generate summary tables for the specified +variables from a DataFrame containing the census data [1].

+
from eda_toolkit import summarize_all_combinations
+
+# Define unique variables for the analysis
+unique_vars = [
+    "age_group",
+    "workclass",
+    "education",
+    "occupation",
+    "race",
+    "sex",
+    "income",
+]
+
+# Generate summary tables for all combinations of the specified variables
+summary_tables, all_combinations = summarize_all_combinations(
+    df=df,
+    data_path=data_output,
+    variables=unique_vars,
+    data_name="census_summary_tables.xlsx",
+)
+
+# Print all combinations of variables
+print(all_combinations)
+
+
+

Output

+
[('age_group', 'workclass'),
+('age_group', 'education'),
+('age_group', 'occupation'),
+('age_group', 'race'),
+('age_group', 'sex'),
+('age_group', 'income'),
+('workclass', 'education'),
+('workclass', 'occupation'),
+('workclass', 'race'),
+('workclass', 'sex'),
+('workclass', 'income'),
+('education', 'occupation'),
+('education', 'race'),
+('education', 'sex'),
+('education', 'income'),
+('occupation', 'race'),
+('occupation', 'sex'),
+('occupation', 'income'),
+('race', 'sex'),
+('race', 'income'),
+('sex', 'income'),
+('age_group', 'workclass', 'education'),
+('age_group', 'workclass', 'occupation'),
+('age_group', 'workclass', 'race'),
+('age_group', 'workclass', 'sex'),
+('age_group', 'workclass', 'income'),
+('age_group', 'education', 'occupation'),
+('age_group', 'education', 'race'),
+('age_group', 'education', 'sex'),
+('age_group', 'education', 'income'),
+('age_group', 'occupation', 'race'),
+('age_group', 'occupation', 'sex'),
+('age_group', 'occupation', 'income'),
+('age_group', 'race', 'sex'),
+('age_group', 'race', 'income'),
+('age_group', 'sex', 'income'),
+('workclass', 'education', 'occupation'),
+('workclass', 'education', 'race'),
+('workclass', 'education', 'sex'),
+('workclass', 'education', 'income'),
+('workclass', 'occupation', 'race'),
+('workclass', 'occupation', 'sex'),
+('workclass', 'occupation', 'income'),
+('workclass', 'race', 'sex'),
+('workclass', 'race', 'income'),
+('workclass', 'sex', 'income'),
+('education', 'occupation', 'race'),
+('education', 'occupation', 'sex'),
+('education', 'occupation', 'income'),
+('education', 'race', 'sex'),
+('education', 'race', 'income'),
+('education', 'sex', 'income'),
+('occupation', 'race', 'sex'),
+('occupation', 'race', 'income'),
+('occupation', 'sex', 'income'),
+('race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation'),
+('age_group', 'workclass', 'education', 'race'),
+('age_group', 'workclass', 'education', 'sex'),
+('age_group', 'workclass', 'education', 'income'),
+('age_group', 'workclass', 'occupation', 'race'),
+('age_group', 'workclass', 'occupation', 'sex'),
+('age_group', 'workclass', 'occupation', 'income'),
+('age_group', 'workclass', 'race', 'sex'),
+('age_group', 'workclass', 'race', 'income'),
+('age_group', 'workclass', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race'),
+('age_group', 'education', 'occupation', 'sex'),
+('age_group', 'education', 'occupation', 'income'),
+('age_group', 'education', 'race', 'sex'),
+('age_group', 'education', 'race', 'income'),
+('age_group', 'education', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex'),
+('age_group', 'occupation', 'race', 'income'),
+('age_group', 'occupation', 'sex', 'income'),
+('age_group', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race'),
+('workclass', 'education', 'occupation', 'sex'),
+('workclass', 'education', 'occupation', 'income'),
+('workclass', 'education', 'race', 'sex'),
+('workclass', 'education', 'race', 'income'),
+('workclass', 'education', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex'),
+('workclass', 'occupation', 'race', 'income'),
+('workclass', 'occupation', 'sex', 'income'),
+('workclass', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex'),
+('education', 'occupation', 'race', 'income'),
+('education', 'occupation', 'sex', 'income'),
+('education', 'race', 'sex', 'income'),
+('occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race'),
+('age_group', 'workclass', 'education', 'occupation', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'race', 'income'),
+('age_group', 'workclass', 'education', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'education', 'occupation', 'race', 'income'),
+('age_group', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'education', 'race', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex'),
+('workclass', 'education', 'occupation', 'race', 'income'),
+('workclass', 'education', 'occupation', 'sex', 'income'),
+('workclass', 'education', 'race', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex', 'income'),
+('age_group',
+'workclass',
+'education',
+'occupation',
+'race',
+'sex',
+'income')]
+
+
+

When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table.

+
EDA Toolkit Logo + +
+
+

Saving DataFrames to Excel with Customized Formatting

+

Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.

+

This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the save_dataframes_to_excel function.

+
+
+save_dataframes_to_excel(file_path, df_dict, decimal_places=0)
+
+
Parameters:
+
    +
  • file_path (str) – Full path to the output Excel file.

  • +
  • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

  • +
  • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

  • +
+
+
Notes:
+
    +
  • The function will autofit columns and left-align text.

  • +
  • Numeric columns will be formatted with the specified number of decimal places.

  • +
  • Headers will be bold and left-aligned without borders.

  • +
+
+
+
+ +

The function performs the following tasks:

+
    +
  • Writes each DataFrame to its respective sheet in the Excel file.

  • +
  • Rounds numeric columns to the specified number of decimal places.

  • +
  • Applies customized formatting to headers and cells.

  • +
  • Autofits columns based on the content length.

  • +
+

Example Usage

+

Below, we use the save_dataframes_to_excel function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between 18 and 40.

+
from eda_toolkit import save_dataframes_to_excel
+
+# Example usage
+file_name = "df_census.xlsx"  # Name of the output Excel file
+file_path = os.path.join(data_path, file_name)
+
+# filter DataFrame to Ages 18-40
+filtered_df = df[(df["age"] > 18) & (df["age"] < 40)]
+
+df_dict = {
+    "original_df": df,
+    "ages_18_to_40": filtered_df,
+}
+
+save_dataframes_to_excel(
+    file_path=file_path,
+    df_dict=df_dict,
+    decimal_places=0,
+)
+
+
+

Output

+

The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between 18 and 40, each on separate sheets with customized formatting.

+
+
+

Creating Contingency Tables

+

Create a contingency table from one or more columns in a DataFrame, with sorting options.

+

This section explains how to create contingency tables from one or more columns in a DataFrame using the contingency_table function.

+
+
+contingency_table(df, cols=None, sort_by=0)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • cols (str or list, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

  • +
  • sort_by (int) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order.

  • +
+
+
Raises:
+

ValueError – If no columns are specified or if sort_by is not 0 or 1.

+
+
Returns:
+

A DataFrame with the specified columns, 'Total', and 'Percentage'.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

Below, we use the contingency_table function to create a contingency table +from the specified columns in a DataFrame containing census data [1]

+
from eda_toolkit import contingency_table
+
+# Example usage
+contingency_table(
+    df=df,
+    cols=[
+        "age_group",
+        "workclass",
+        "race",
+        "sex",
+    ],
+    sort_by=1,
+)
+
+
+

Output

+

The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the 'Total' column in descending order because sort_by +is set to 1.

+
    age_group     workclass                race     sex  Total  Percentage
+0       30-39       Private               White    Male   5856       11.99
+1       18-29       Private               White    Male   5623       11.51
+2       40-49       Private               White    Male   4267        8.74
+3       18-29       Private               White  Female   3680        7.53
+4       50-59       Private               White    Male   2565        5.25
+..        ...           ...                 ...     ...    ...         ...
+467     50-59   Federal-gov               Other    Male      1        0.00
+468     50-59     Local-gov  Asian-Pac-Islander  Female      1        0.00
+469     70-79  Self-emp-inc               Black    Male      1        0.00
+470     80-89     Local-gov  Asian-Pac-Islander    Male      1        0.00
+471                                                      48842      100.00
+
+[472 rows x 6 columns]
+
+
+

+
+
+

Highlighting Specific Columns in a DataFrame

+

This section explains how to highlight specific columns in a DataFrame using the highlight_columns function.

+

Highlight specific columns in a DataFrame with a specified background color.

+
+
+highlight_columns(df, columns, color='yellow')
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to be styled.

  • +
  • columns (list of str) – List of column names to be highlighted.

  • +
  • color (str, optional) – The background color to be applied for highlighting (default is “yellow”).

  • +
+
+
Returns:
+

A Styler object with the specified columns highlighted.

+
+
Return type:
+

pandas.io.formats.style.Styler

+
+
+
+ +

Example Usage

+

Below, we use the highlight_columns function to highlight the age and education +columns in the first 5 rows of the census [1] DataFrame with a pink background color.

+
from eda_toolkit import highlight_columns
+
+# Applying the highlight function
+highlighted_df = highlight_columns(
+    df=df,
+    columns=["age", "education"],
+    color="#F8C5C8",
+)
+
+highlighted_df
+
+
+

Output

+

The output will be a DataFrame with the specified columns highlighted in the given background color. +The age and education columns will be highlighted in pink.

+

The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the .render() method of the Styler object.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife

+
+
+

Binning Numerical Columns

+

If your DataFrame (e.g., the census data [1]) +does not have age or any other numerical column of interest binned, you can +apply the following binning logic to categorize the data. Below, we use the age +column from the UCI Machine Learning Repository as an example:

+
# Create age bins so that the ages can be categorized
+bin_ages = [
+    0,
+    18,
+    30,
+    40,
+    50,
+    60,
+    70,
+    80,
+    90,
+    100,
+    float("inf"),
+]
+
+# Create labels for the bins
+label_ages = [
+    "< 18",
+    "18-29",
+    "30-39",
+    "40-49",
+    "50-59",
+    "60-69",
+    "70-79",
+    "80-89",
+    "90-99",
+    "100 +",
+]
+
+# Categorize the ages and assign to a new variable
+df["age_group"] = pd.cut(
+    df["age"],
+    bins=bin_ages,
+    labels=label_ages,
+    right=False,
+)
+
+
+

Note: This code snippet creates age bins and assigns a corresponding age group +label to each age in the DataFrame. The pd.cut function from pandas is used to +categorize the ages and assign them to a new column, age_group. Adjust the bins +and labels as needed for your specific data.

+
+
+
+

KDE and Histogram Distribution Plots

+

Generate KDE or histogram distribution plots for specified columns in a DataFrame.

+

The kde_distributions function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2] for plotting, which is built on top of +matplotlib [3] and provides a high-level interface for drawing attractive and informative +statistical graphics.

+

Key Features and Parameters

+
    +
  • Flexible Plotting: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively.

  • +
  • Leverages Seaborn Library: The function is built on the seaborn library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code.

  • +
  • Customization: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs.

  • +
  • Scientific Notation Control: The function allows disabling scientific notation on the axes, providing better readability for certain types of data.

  • +
  • Log Scaling: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude.

  • +
  • Output Options: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations.

  • +
+
+
+kde_distributions(df, vars_of_interest=None, grid_figsize=(10, 8), single_figsize=(6, 4), kde=True, hist_color='#0000FF', kde_color='#FF0000', hist_edgecolor='#000000', hue=None, fill=True, fill_alpha=1, n_rows=1, n_cols=1, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_path_png=None, single_var_image_path_svg=None, single_var_image_filename=None, y_axis_label='Density', plot_type='both', log_scale_vars=None, bins='auto', binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat='density', xlim=None, ylim=None)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots.

  • +
  • grid_figsize (tuple, optional) – Size of the overall grid figure, default is (10, 8).

  • +
  • single_figsize (tuple, optional) – Size of individual figures for each variable, default is (6, 4).

  • +
  • kde (bool, optional) – Whether to include KDE plots on the histograms, default is True.

  • +
  • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

  • +
  • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

  • +
  • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

  • +
  • hue (str, optional) – Column name to group data by, adding different colors for each group.

  • +
  • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

  • +
  • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where +0 is fully transparent and 1 is fully opaque. Default is 1.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid, default is 1.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid, default is 1.

  • +
  • w_pad (float, optional) – Width padding between subplots, default is 1.0.

  • +
  • h_pad (float, optional) – Height padding between subplots, default is 1.0.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

  • +
  • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

  • +
  • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

  • +
  • single_var_image_path_png (str, optional) – Directory path to save the PNG images of the separate distribution plots.

  • +
  • single_var_image_path_svg (str, optional) – Directory path to save the SVG images of the separate distribution plots.

  • +
  • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. +The variable name will be appended to this filename.

  • +
  • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

  • +
  • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

  • +
  • log_scale_vars (list of str, optional) – List of variable names to apply log scaling.

  • +
  • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

  • +
  • binwidth (number or pair of numbers, optional) – Width of each bin, overrides bins but can be used with binrange.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels, default is 10.

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

  • +
  • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

  • +
  • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', +'probability', 'percent', 'density'), default is 'density'.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If plot_type is not one of 'hist', 'kde', or 'both'.

    • +
    • If stat is not one of 'count', 'density', 'frequency', 'probability', 'proportion', 'percent'.

    • +
    • If log_scale_vars contains variables that are not present in the DataFrame.

    • +
    • If fill is set to False and hist_edgecolor is not the default.

    • +
    +

  • +
  • UserWarning

      +
    • If stat is set to ‘count’ while kde is True, as it may produce misleading plots.

    • +
    • If both bins and binwidth are specified, which may affect performance.

    • +
    +

  • +
+
+
Returns:
+

None

+
+
+
+ +

+
+

KDE and Histograms Example

+

In the below example, the kde_distributions function is used to generate +histograms for several variables of interest: "age", "education-num", and +"hours-per-week". These variables represent different demographic and +financial attributes from the dataset. The kde=True parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data’s probability density.

+

The visualizations are arranged in a single row of four columns, as specified +by n_rows=1 and n_cols=3, respectively. The overall size of the grid +figure is set to 14 inches wide and 4 inches tall (grid_figsize=(14, 4)), +while each individual plot is configured to be 4 inches by 4 inches +(single_figsize=(4, 4)). The fill=True parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +w_pad=1 and h_pad=1, which add 1 inch of padding both horizontally and +vertically.

+

To handle longer titles, the text_wrap=50 parameter ensures that the title +text wraps to a new line after 50 characters. The bbox_inches="tight" setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in vars_of_interest are +passed directly to the function for visualization.

+

Each plot is saved individually with filenames that are prefixed by +"kde_density_single_distribution", followed by the variable name. The `y-axis` +for all plots is labeled as “Density” (y_axis_label="Density"), reflecting that +the height of the bars or KDE line represents the data’s density. The histograms +are divided into 10 bins (bins=10), offering a clear view of the distribution +of each variable.

+

The plot_type="hist" parameter indicates that only histograms will be generated +for each variable. Additionally, the font sizes for the axis labels and tick labels +are set to 16 points (label_fontsize=16) and 14 points (tick_fontsize=14), +respectively, ensuring that all text within the plots is legible and well-formatted.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=True,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    fill=True,
+    fill_alpha=0.60,
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - KDE (+) Histograms (Density) + +
+
+

Histogram Example (Density)

+

In this example, the kde_distributions function is used to generate histograms for +the variables "age", "education-num", and "hours-per-week" but with +kde=False, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (n_rows=1, n_cols=3), +with a grid size of 14x4 inches (grid_figsize=(14, 4)). The histograms are +divided into 10 bins (bins=10), and the y-axis is labeled “Density” (y_axis_label="Density"). +Font sizes for the axis labels and tick labels are set to 16 and 14 points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=False,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Density) + +
+
+

Histogram Example (Count)

+

In this example, the kde_distributions function is modified to generate histograms +with a few key changes. The hist_color is set to “orange”, changing the color of the +histogram bars. The `y-axis` label is updated to “Count” (y_axis_label="Count"), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to “Count” to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (n_rows=1, n_cols=4), +a grid size of 14x4 inches, and a bin count of 10. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=False,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    hist_color="orange",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Count",
+    bins=10,
+    plot_type="hist",
+    stat="Count",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+
+

Stacked Crosstab Plots

+

Generates stacked bar plots and crosstabs for specified columns in a DataFrame.

+

The stacked_crosstab_plot function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats.

+

The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis.

+
+
+stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind='bar', width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output='both', return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type='both', show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False)
+

Generates stacked or regular bar plots and crosstabs for specified columns.

+

This function allows users to create stacked bar plots (or regular bar plots +if stacks are removed) and corresponding crosstabs for specific columns +in a DataFrame. It provides options to customize the appearance, including +font sizes for axis labels, tick labels, and title text wrapping, and to +choose between regular or normalized plots.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • col (str) – The name of the column in the DataFrame to be analyzed.

  • +
  • func_col (list) – List of ground truth columns to be analyzed.

  • +
  • legend_labels_list (list) – List of legend labels for each ground truth column.

  • +
  • title (list) – List of titles for the plots.

  • +
  • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

  • +
  • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

  • +
  • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

  • +
  • custom_order (list, optional) – Specifies a custom order for the categories in the col.

  • +
  • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

  • +
  • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

  • +
  • save_formats (list, optional) – List of file formats to save the plot images in.

  • +
  • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

  • +
  • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

  • +
  • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

  • +
  • x (int, optional) – The width of the figure.

  • +
  • y (int, optional) – The height of the figure.

  • +
  • p (int, optional) – The padding between the subplots.

  • +
  • file_prefix (str, optional) – Prefix for the filename when output includes plots.

  • +
  • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

  • +
  • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

  • +
  • show_legend (bool, optional) – Specify whether to show the legend, default is True.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If output is not one of "both", "plots_only", or "crosstabs_only".

    • +
    • If plot_type is not one of "both", "regular", "normalized".

    • +
    • If remove_stacks is set to True and plot_type is not "regular".

    • +
    • If the lengths of title, func_col, and legend_labels_list are not equal.

    • +
    +

  • +
  • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

  • +
+
+
Returns:
+

Dictionary of crosstabs DataFrames if return_dict is True. Otherwise, returns None.

+
+
Return type:
+

dict or None

+
+
+
+ +
+

Stacked Bar Plots With Crosstabs Example

+

The provided code snippet demonstrates how to use the stacked_crosstab_plot +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here’s a detailed breakdown of the code using the census +dataset as an example [1].

+

First, the func_col list is defined, specifying the columns ["sex", "income"] +to be analyzed. These columns will be used in the loop to generate separate plots. +The legend_labels_list is then defined, with each entry corresponding to a +column in func_col. In this case, the labels for the sex column are +["Male", "Female"], and for the income column, they are ["<=50K", ">50K"]. +These labels will be used to annotate the legends of the plots.

+

Next, the title list is defined, providing titles for each plot corresponding +to the columns in func_col. The titles are set to ["Sex", "Income"], +which will be displayed on top of each respective plot.

+
# Define the func_col to use in the loop in order of usage
+func_col = ["sex", "income"]
+
+# Define the legend_labels to use in the loop
+legend_labels_list = [
+    ["Male", "Female"],
+    ["<=50K", ">50K"],
+]
+
+# Define titles for the plots
+title = [
+    "Sex",
+    "Income",
+]
+
+
+
+

Note

+

If you assign the function to a variable, the dictionary returned when +return_dict=True will be suppressed in the output. However, the dictionary +is still available within the assigned variable for further use.

+
+
from eda_toolkit import stacked_crosstab_plot
+
+# Call the stacked_crosstab_plot function
+stacked_crosstabs = stacked_crosstab_plot(
+    df=df,
+    col="age_group",
+    func_col=func_col,
+    legend_labels_list=legend_labels_list,
+    title=title,
+    kind="bar",
+    width=0.8,
+    rot=45, # axis rotation angle
+    custom_order=None,
+    color=["#00BFC4", "#F8766D"], # default color schema
+    output="both",
+    return_dict=True,
+    x=14,
+    y=8,
+    p=10,
+    logscale=False,
+    plot_type="both",
+    show_legend=True,
+    label_fontsize=14,
+    tick_fontsize=12,
+)
+
+
+

The above example generates stacked bar plots for "sex" and "income" +grouped by "education". The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export.

+
+

Important

+

Importance of Correctly Aligning Labels

+

It is crucial to properly align the elements in the legend_labels_list, +title, and func_col parameters when using the stacked_crosstab_plot +function. Each of these lists must be ordered consistently because the function +relies on their alignment to correctly assign labels and titles to the +corresponding plots and legends.

+

For instance, in the example above:

+
    +
  • The first element in func_col is "sex", and it is aligned with the first set of labels ["Male", "Female"] in legend_labels_list and the first title "Sex" in the title list.

  • +
  • Similarly, the second element in func_col, "income", aligns with the labels ["<=50K", ">50K"] and the title "Income".

  • +
+

Misalignment between these lists would result in incorrect labels or titles being +applied to the plots, potentially leading to confusion or misinterpretation of the data. +Therefore, it’s important to ensure that each list is ordered appropriately and +consistently to accurately reflect the data being visualized.

+

Proper Setup of Lists

+

When setting up the legend_labels_list, title, and func_col, ensure +that each element in the lists corresponds to the correct variable in the DataFrame. +This involves:

+
    +
  • Ordering: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted.

  • +
  • Consistency: Double-checking that each label in legend_labels_list matches the categories present in the corresponding func_col, and that the title accurately describes the plot.

  • +
+

By adhering to these guidelines, you can ensure that the stacked_crosstab_plot +function produces accurate and meaningful visualizations that are easy to interpret and analyze.

+
+

Output

+
KDE Distributions + +
Stacked Bar Plot Age vs. Income + +
+

Note

+

When you set return_dict=True, you are able to see the crosstabs printed out +as shown below.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93

+

When you set return_dict=True, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example:

+
crosstab_age_sex = crosstabs_dict["sex"]
+crosstab_age_income = crosstabs_dict["income"]
+
+
+
+
+

Pivoted Stacked Bar Plots Example

+

Using the census dataset [1], to create horizontal stacked bar plots, set the kind parameter to +"barh" in the stacked_crosstab_plot function. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the y-axis.

+
Stacked Bar Plot Age vs. Income (Pivoted) + +
+
+

Non-Normalized Stacked Bar Plots Example

+

In the census data [1], to create stacked bar plots without the normalized versions, +set the plot_type parameter to "regular" in the stacked_crosstab_plot +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the plot_type to "normalized" will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age.

+
Stacked Bar Plot Age vs. Income (Regular) + +
+
+

Regular Non-Stacked Bar Plots Example

+

In the census data [1], to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the plot_type parameter to "regular" +in the stacked_crosstab_plot function and enable remove_stacks by setting +it to True. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +plot_type to "normalized" will display only the normalized plots.

+

When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories.

+

In the example below, the color of the bars has been set to a dark grey (#333333), +and the legend has been removed by setting show_legend=False. This illustrates +regular bar plots for income by age, without stacking.

+
Bar Plot Age vs. Income (Regular) + +
+
+
+

Box and Violin Plots

+

Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.

+

The box_violin_plot function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories.

+

With options to customize the plot type (boxplot or violinplot), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis.

+

Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures.

+

The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset.

+
+
+box_violin_plot(df, metrics_list, metrics_boxplot_comp, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type='boxplot', xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • metrics_list (list of str) – List of metric names (columns in df) to plot.

  • +
  • metrics_boxplot_comp (list of str) – List of comparison categories (columns in df).

  • +
  • n_rows (int) – Number of rows in the subplot grid.

  • +
  • n_cols (int) – Number of columns in the subplot grid.

  • +
  • image_path_png (str, optional) – Optional directory path to save .png images.

  • +
  • image_path_svg (str, optional) – Optional directory path to save .svg images.

  • +
  • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

  • +
  • show_legend (bool, optional) – Boolean, True if showing the legend in the plots.

  • +
  • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set without specifying image_path_png or image_path_svg.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize is not a tuple or list of two numbers.

  • +
  • If grid_figsize is specified but is not a tuple or list of two numbers.

  • +
+

+
+
Returns:
+

None

+
+
+
+ +

This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels.

+
+

Box Plots Grid Example

+

In this example with the US census data [1], the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the "age_group" column in the +DataFrame. The metrics_boxplot_comp parameter is set to ["age_group"], meaning +that the comparison will be based on different age groups. The metrics_list is +provided as age_boxplot_list, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid format with 3 rows and 4 +columns, using the n_rows=3 and n_cols=4 parameters. The image_path_png and +image_path_svg parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to "all", ensuring that both +individual and grid plots are saved.

+

The plots are displayed in a grid format, as indicated by the show_plot="grid" +parameter. The plot_type is set to "boxplot", so the function will generate +boxplots for each metric in the list. Additionally, the `x-axis` labels are rotated +by 90 degrees (xlabel_rot=90) to ensure that the labels are legible. The legend is +hidden by setting show_legend=False, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication.

+
age_boxplot_list = df[
+    [
+        "education-num",
+        "hours-per-week",
+    ]
+].columns.to_list()
+
+
+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="boxplot",
+    xlabel_rot=90,
+)
+
+
+
Box Plot Comparisons + +
+
+

Violin Plots Grid Example

+

In this example with the US census data [1], we keep everything the same as the prior example, but change the +plot_type to violinplot. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings.

+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=90,
+)
+
+
+
Violin Plot Comparisons + +
+
+

Pivoted Violin Plots Grid Example

+

In this example with the US census data [1], we set xlabel_rot=0 and rotate_plot=True +to pivot the plot, changing the orientation of the axes while keeping the `x-axis` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution.

+
from eda_toolkit impor box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    rotate_plot=True,
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=0,
+)
+
+
+
Violin Plot Comparisons (Pivoted) + +
+
+
+

Scatter Plots and Best Fit Lines

+

Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.

+

Create and Save Scatter Plots or a Grid of Scatter Plots

+

This function, scatter_fit_plot, is designed to generate scatter plots for +one or more pairs of variables (x_vars and y_vars) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view.

+

Optional Best Fit Line

+

An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s

+

Customizable Plot Aesthetics

+

The function offers a wide range of customization options to tailor the appearance +of the scatter plots:

+
    +
  • Point Color: You can specify a default color for the scatter points or use a hue parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data.

  • +
  • Point Size: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable.

  • +
  • Markers: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data.

  • +
+

Axis and Label Configuration

+

The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges.

+

Plot Display and Saving Options

+

The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations.

+

Correlation Coefficient Display

+

For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship.

+
+
+scatter_fit_plot(df, x_vars, y_vars, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color='C0', best_fit_linecolor='red', best_fit_linestyle='-', hue=None, hue_palette=None, size=None, sizes=None, marker='o', show_correlation=True, xlim=None, ylim=None)
+

Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • x_vars (list of str) – List of variable names to plot on the x-axis.

  • +
  • y_vars (list of str) – List of variable names to plot on the y-axis.

  • +
  • n_rows (int) – Number of rows in the subplot grid.

  • +
  • n_cols (int) – Number of columns in the subplot grid.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

  • +
  • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid".

  • +
  • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

  • +
  • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

  • +
  • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

  • +
  • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

  • +
  • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

  • +
  • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette.

  • +
  • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

  • +
  • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

  • +
  • marker (str, optional) – Marker style used for the scatter points. Default is "o".

  • +
  • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set but no image paths are provided.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize or grid_figsize are not tuples/lists with two numeric values.

  • +
+

+
+
Returns:
+

None +This function does not return any value but generates and optionally saves scatter plots for the specified x_vars and y_vars.

+
+
+
+ +
+

Regression-Centric Scatter Plots Example

+

In this US census data [1] example, the scatter_fit_plot function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the show_correlation=True parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the add_best_fit_line=True parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="grid",
+    show_legend=True,
+    xlabel_rot=0,
+    show_plot="grid",
+    rotate_plot=False,
+     grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (with Best Fit Lines) + +
+
+

Scatter Plots Grouped by Category Example

+

In this example, the scatter_fit_plot function is used to generate a grid of +scatter plots that examine the relationships between age and hours-per-week +as well as education-num and hours-per-week. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots:

+
    +
  1. Hue and Hue Palette: The hue parameter is set to "income", meaning that the +data points in the scatter plots are colored according to the values in the income +column. A custom color mapping is provided via the hue_palette parameter, where the +income categories "<=50K" and ">50K" are assigned the colors "brown" and +"green", respectively. This change visually distinguishes the data points based on +income levels.

  2. +
  3. Scatter Color: The scatter_color parameter is set to "#808080", which applies +a grey color to the scatter points when no hue is provided. However, since a hue +is specified in this example, the hue_palette takes precedence and overrides this color setting.

  4. +
  5. Best Fit Line: The add_best_fit_line parameter is set to False, meaning that +no best fit line is added to the scatter plots. This differs from the previous example where +a best fit line was included.

  6. +
  7. Correlation Coefficient: The show_correlation parameter is set to False, so the +Pearson correlation coefficient will not be displayed in the plot titles. This is another +change from the previous example where the correlation coefficient was included.

  8. +
  9. Hue Legend: The show_legend parameter remains set to True, ensuring that the +legend displaying the hue categories ("<=50K" and ">50K") appears on the plots, +helping to interpret the color coding of the data points.

  10. +
+

These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths.

+
from eda_toolkit import scatter_fit_plot
+
+hue_dict = {"<=50K": "brown", ">50K": "green"}
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="grid",
+    show_legend=True,
+    xlabel_rot=0,
+    show_plot="grid",
+    rotate_plot=False,
+    grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=False,
+    scatter_color="#808080",
+    hue="income",
+    hue_palette=hue_dict,
+    show_correlation=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.6/.buildinfo b/_build/html/v0.0.6/.buildinfo new file mode 100644 index 000000000..7a677d526 --- /dev/null +++ b/_build/html/v0.0.6/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: d2babcebc2afef2ccdc37520664ce5ca +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/v0.0.6/.doctrees/acknowledgements.doctree b/_build/html/v0.0.6/.doctrees/acknowledgements.doctree new file mode 100644 index 000000000..36ce5baff Binary files /dev/null and b/_build/html/v0.0.6/.doctrees/acknowledgements.doctree differ diff --git a/_build/html/v0.0.6/.doctrees/changelog.doctree b/_build/html/v0.0.6/.doctrees/changelog.doctree new file mode 100644 index 000000000..b3e4e1c74 Binary files /dev/null and b/_build/html/v0.0.6/.doctrees/changelog.doctree differ diff --git a/_build/html/v0.0.6/.doctrees/citations.doctree b/_build/html/v0.0.6/.doctrees/citations.doctree new file mode 100644 index 000000000..14098beba Binary files /dev/null and b/_build/html/v0.0.6/.doctrees/citations.doctree differ diff --git a/_build/html/v0.0.6/.doctrees/environment.pickle b/_build/html/v0.0.6/.doctrees/environment.pickle new file mode 100644 index 000000000..d538a55e3 Binary files /dev/null and b/_build/html/v0.0.6/.doctrees/environment.pickle differ diff --git a/_build/html/v0.0.6/.doctrees/getting_started.doctree b/_build/html/v0.0.6/.doctrees/getting_started.doctree new file mode 100644 index 000000000..efbbe8da9 Binary files /dev/null and b/_build/html/v0.0.6/.doctrees/getting_started.doctree differ diff --git a/_build/html/v0.0.6/.doctrees/index.doctree b/_build/html/v0.0.6/.doctrees/index.doctree new file mode 100644 index 000000000..c56862182 Binary files /dev/null and b/_build/html/v0.0.6/.doctrees/index.doctree differ diff --git a/_build/html/v0.0.6/.doctrees/references.doctree b/_build/html/v0.0.6/.doctrees/references.doctree new file mode 100644 index 000000000..f907a7cca Binary files /dev/null and b/_build/html/v0.0.6/.doctrees/references.doctree differ diff --git a/_build/html/v0.0.6/.doctrees/usage_guide.doctree b/_build/html/v0.0.6/.doctrees/usage_guide.doctree new file mode 100644 index 000000000..c9798bbd1 Binary files /dev/null and b/_build/html/v0.0.6/.doctrees/usage_guide.doctree differ diff --git a/_build/html/v0.0.6/_images/Bar_Age_regular_income.svg b/_build/html/v0.0.6/_images/Bar_Age_regular_income.svg new file mode 100644 index 000000000..6f8aa40d4 --- /dev/null +++ b/_build/html/v0.0.6/_images/Bar_Age_regular_income.svg @@ -0,0 +1,1201 @@ + + + + + + + + 2024-08-04T12:01:07.319833 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/Stacked_Bar_Age_income.svg b/_build/html/v0.0.6/_images/Stacked_Bar_Age_income.svg new file mode 100644 index 000000000..d5510308b --- /dev/null +++ b/_build/html/v0.0.6/_images/Stacked_Bar_Age_income.svg @@ -0,0 +1,1943 @@ + + + + + + + + 2024-08-04T11:47:19.816889 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/Stacked_Bar_Age_income_pivoted.svg b/_build/html/v0.0.6/_images/Stacked_Bar_Age_income_pivoted.svg new file mode 100644 index 000000000..2147fce1a --- /dev/null +++ b/_build/html/v0.0.6/_images/Stacked_Bar_Age_income_pivoted.svg @@ -0,0 +1,2043 @@ + + + + + + + + 2024-08-04T11:56:38.571027 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/Stacked_Bar_Age_income_regular.svg b/_build/html/v0.0.6/_images/Stacked_Bar_Age_income_regular.svg new file mode 100644 index 000000000..04478581f --- /dev/null +++ b/_build/html/v0.0.6/_images/Stacked_Bar_Age_income_regular.svg @@ -0,0 +1,1347 @@ + + + + + + + + 2024-08-04T11:54:36.826244 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/Stacked_Bar_Age_sex.svg b/_build/html/v0.0.6/_images/Stacked_Bar_Age_sex.svg new file mode 100644 index 000000000..7b2bcb137 --- /dev/null +++ b/_build/html/v0.0.6/_images/Stacked_Bar_Age_sex.svg @@ -0,0 +1,1970 @@ + + + + + + + + 2024-08-04T11:55:12.796551 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/all_plots_comparisons_boxplot.svg b/_build/html/v0.0.6/_images/all_plots_comparisons_boxplot.svg new file mode 100644 index 000000000..6f3173cff --- /dev/null +++ b/_build/html/v0.0.6/_images/all_plots_comparisons_boxplot.svg @@ -0,0 +1,11585 @@ + + + + + + + + 2024-08-04T12:03:21.278906 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/all_plots_comparisons_violinplot.svg b/_build/html/v0.0.6/_images/all_plots_comparisons_violinplot.svg new file mode 100644 index 000000000..571a084b8 --- /dev/null +++ b/_build/html/v0.0.6/_images/all_plots_comparisons_violinplot.svg @@ -0,0 +1,5868 @@ + + + + + + + + 2024-08-04T12:11:16.318430 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/all_plots_comparisons_violinplot_pivoted.svg b/_build/html/v0.0.6/_images/all_plots_comparisons_violinplot_pivoted.svg new file mode 100644 index 000000000..0e317ba63 --- /dev/null +++ b/_build/html/v0.0.6/_images/all_plots_comparisons_violinplot_pivoted.svg @@ -0,0 +1,5764 @@ + + + + + + + + 2024-08-04T12:12:23.860397 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/count_hist_distributions.svg b/_build/html/v0.0.6/_images/count_hist_distributions.svg new file mode 100644 index 000000000..521cd5a95 --- /dev/null +++ b/_build/html/v0.0.6/_images/count_hist_distributions.svg @@ -0,0 +1,1719 @@ + + + + + + + + 2024-07-31T18:14:40.266523 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/eda_toolkit_logo.svg b/_build/html/v0.0.6/_images/eda_toolkit_logo.svg new file mode 100644 index 000000000..d039d6f79 --- /dev/null +++ b/_build/html/v0.0.6/_images/eda_toolkit_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_build/html/v0.0.6/_images/hist_density_distributions.svg b/_build/html/v0.0.6/_images/hist_density_distributions.svg new file mode 100644 index 000000000..8bf1787a6 --- /dev/null +++ b/_build/html/v0.0.6/_images/hist_density_distributions.svg @@ -0,0 +1,1744 @@ + + + + + + + + 2024-07-31T18:12:26.650100 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/kde_density_distributions.svg b/_build/html/v0.0.6/_images/kde_density_distributions.svg new file mode 100644 index 000000000..7564724e1 --- /dev/null +++ b/_build/html/v0.0.6/_images/kde_density_distributions.svg @@ -0,0 +1,2571 @@ + + + + + + + + 2024-07-31T18:08:35.979182 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_images/scatter_plots_grid.png b/_build/html/v0.0.6/_images/scatter_plots_grid.png new file mode 100644 index 000000000..5a51facd8 Binary files /dev/null and b/_build/html/v0.0.6/_images/scatter_plots_grid.png differ diff --git a/_build/html/v0.0.6/_images/scatter_plots_grid_grouped.png b/_build/html/v0.0.6/_images/scatter_plots_grid_grouped.png new file mode 100644 index 000000000..02a3b3916 Binary files /dev/null and b/_build/html/v0.0.6/_images/scatter_plots_grid_grouped.png differ diff --git a/_build/html/v0.0.6/_images/summarize_combos.gif b/_build/html/v0.0.6/_images/summarize_combos.gif new file mode 100644 index 000000000..402ee1efc Binary files /dev/null and b/_build/html/v0.0.6/_images/summarize_combos.gif differ diff --git a/_build/html/v0.0.6/_sources/acknowledgements.rst.txt b/_build/html/v0.0.6/_sources/acknowledgements.rst.txt new file mode 100644 index 000000000..e62da5a10 --- /dev/null +++ b/_build/html/v0.0.6/_sources/acknowledgements.rst.txt @@ -0,0 +1,30 @@ +.. _acknowledgements: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Acknowledgements +================= + +We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists. + +We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors. diff --git a/_build/html/v0.0.6/_sources/changelog.rst.txt b/_build/html/v0.0.6/_sources/changelog.rst.txt new file mode 100644 index 000000000..d8fa48bef --- /dev/null +++ b/_build/html/v0.0.6/_sources/changelog.rst.txt @@ -0,0 +1,296 @@ +.. _changelog: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Changelog +========= + +Version 0.0.6 +--------------------------- + +**Added validation for Plot Type Parameter in KDE Distributions Function** + +This release adds a validation step for the ``plot_type`` parameter in the ``kde_distributions`` function. The allowed values for ``plot_type`` are ``"hist"``, ``"kde"``, and ``"both"``. If an invalid value is provided, the function will now raise a ``ValueError`` with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values. + +.. code-block:: python + + # Validate plot_type parameter + valid_plot_types = ["hist", "kde", "both"] + if plot_type.lower() not in valid_plot_types: + raise ValueError( + f"Invalid plot_type value. Expected one of {valid_plot_types}, " + f"got '{plot_type}' instead." + ) + +Version 0.0.5 +--------------------------- + +**Ensure Consistent Font Size and Text Wrapping Across Plot Elements** + +This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the ``stacked_crosstab_plot`` function. The following updates have been implemented to ensure uniformity and improve the readability of plots: + +1. **Title Font Size and Text Wrapping:** + - Added a ``text_wrap`` parameter to control the wrapping of plot titles. + - Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ``ax.set_title()`` after plot generation. + +2. **Legend Font Size Consistency:** + - Incorporated ``label_fontsize`` into the legend font size by directly setting the font size of the legend text using ``plt.setp(legend.get_texts(), fontsize=label_fontsize)``. + - This ensures that the legend labels are consistent with the title and axis labels. + +**Testing** + +- Verified that titles now wrap correctly and match the specified ``label_fontsize``. +- Confirmed that legend text scales according to ``label_fontsize``, ensuring consistent font sizes across all plot elements. + + +Version 0.0.4 +--------------------------- + +- **Stable release** + + - No new updates to the codebase. + + - Updated the project ``description`` variable in ``setup.py`` to re-emphasize key elements of the library. + + - Minor README cleanup: + + - Added icons for sections that did not have them. + + +Version 0.0.3 +--------------------------- + +- **Stable release** + + - Updated logo size, fixed citation title, and made minor README cleanup: + + - Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support. + +Version 0.0.2 +--------------------------- + +- **First stable release** + - No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + - Added logo, badges, and Zenodo-certified citation to README. + +Version 0.0.1rc0 +------------------------------- + +- No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + +Version 0.0.1b0 +----------------------------- + +**New Scatter Fit Plot and Additional Updates** + +- Added new ``scatter_fit_plot()``, removed unused ``data_types()``, and added comment section headers. + +**Added xlim and ylim Inputs to KDE Distribution** + +- ``kde_distribution()``: + + - Added ``xlim`` and ``ylim`` inputs to allow users to customize axes limits in ``kde_distribution()``. + +**Added xlim and ylim Params to Stacked Crosstab Plot** + +- ``stacked_crosstab_plot()``: + + - Added ``xlim`` and ``ylim`` input parameters to ``stacked_crosstab_plot()`` to give users more flexibility in controlling axes limits. + +**Added x and y Limits to Box and Violin Plots** + +- ``box_violin_plot()``: + + - Changed function name from ``metrics_box_violin()`` to ``box_violin_plot()``. + - Added ``xlim`` and ``ylim`` inputs to control x and y-axis limits of ``box_violin_plot()`` (formerly ``metrics_box_violin``). + +**Added Ability to Remove Stacks from Plots, Plot All or One at a Time** + +**Key Changes** + +1. **Plot Type Parameter** + - ``plot_type``: This parameter allows the user to choose between ``"regular"``, ``"normalized"``, or ``"both"`` plot types. + +2. **Remove Stacks Parameter** + - ``remove_stacks``: This parameter, when set to ``True``, generates a regular bar plot using only the ``col`` parameter instead of a stacked bar plot. It only works when ``plot_type`` is set to "regular". If ``remove_stacks`` is set to ``True`` while ``plot_type`` is anything other than "regular", the function will raise an exception. + +**Explanation of Changes** + +- **Plot Type Parameter** + + - Provides flexibility to the user, allowing specification of the type of plot to generate: + + - ``"regular"``: Standard bar plot. + + - ``"normalized"``: Normalized bar plot. + + - ``"both"``: Both regular and normalized bar plots. + +- **Remove Stacks Parameter** + - ``remove_stacks``: Generates a regular bar plot using only the ``col`` parameter, removing the stacking of the bars. Applicable only when ``plot_type`` is set to "regular". An exception is raised if used with any other ``plot_type``. + +These changes enhance the flexibility and functionality of the ``stacked_crosstab_plot`` function, allowing for more customizable and specific plot generation based on user requirements. + +Version 0.0.1b0 +----------------------------- + +**Refined KDE Distributions** + +**Key Changes** + +1. **Alpha Transparency for Histogram Fill** + - Added a ``fill_alpha`` parameter to control the transparency of the histogram bars' fill color. + - Default value is ``0.6``. An exception is raised if ``fill=False`` and ``fill_alpha`` is specified. + +2. **Custom Font Sizes** + - Introduced ``label_fontsize`` and ``tick_fontsize`` parameters to control font size of axis labels and tick marks independently. + +3. **Scientific Notation Toggle** + - Added a ``disable_sci_notation`` parameter to enable or disable scientific notation on axes. + +4. **Improved Error Handling** + - Added validation for the ``stat`` parameter to ensure valid options are accepted. + - Added checks for proper usage of ``fill_alpha`` and ``hist_edgecolor`` when ``fill`` is set to ``False``. + +5. **General Enhancements** + - Updated the function's docstring to reflect new parameters and provide comprehensive guidance on usage. + +Version 0.0.1b0 +----------------------------- + +**Enhanced KDE Distributions Function** + +**Added Parameters** + +1. **Grid Figsize and Single Figsize** + - Control the size of the overall grid figure and individual figures separately. + +2. **Hist Color and KDE Color`** + - Allow customization of histogram and KDE plot colors. + +3. **Edge Color** + - Allows customization of histogram bar edges. + +4. **Hue** + - Allows grouping data by a column. + +5. **Fill** + - Controls whether to fill histogram bars with color. + +6. **Y-axis Label`** + - Customizable y-axis label. + +7. **Log-Scaling** + - Specifies which variables to apply log scale. + +8. **Bins and Bin Width** + - Control the number and width of bins. + +9. **``stat``:** + - Allows different statistics for the histogram (``count``, ``density``, ``frequency``, ``probability``, ``proportion``, ``percent``). + +**Improvements** + +1. **Validation and Error Handling** + - Checks for invalid ``log_scale_vars`` and throws a ``ValueError`` if any are found. + - Throws a ``ValueError`` if ``edgecolor`` is changed while ``fill`` is set to ``False``. + - Issues a ``PerformanceWarning`` if both ``bins`` and ``binwidth`` are specified, warning of potential performance impacts. + +2. **Customizable Y-Axis Label** + - Allows users to specify custom y-axis labels. + +3. **Warning for KDE with Count** + - Issues a warning if KDE is used with ``stat='count'``, as it may produce misleading plots. + +**Updated Function to Ensure Unique IDs and Index Check** + +- Ensured that each generated ID in ``add_ids`` starts with a non-zero digit. +- Added a check to verify that the DataFrame index is unique. +- Printed a warning message if duplicate index entries are found. + +These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique. + +**Check for Unique Indices** +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries. + +**Generate Non-Zero Starting IDs** + +- The ID generation process is updated to ensure that the first digit of each ID is always non-zero. + +**Ensure Unique IDs** + +- A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame. + +**Fix Int Conversion for Numeric Columns, Reset Decimal Places** + +- Fixed integer conversion issue for numeric columns when ``decimal_places=0`` in the ``save_dataframes_to_excel`` function. +- Reset ``decimal_places`` default value to ``0``. + +These changes ensure correct formatting and avoid errors during conversion. + +**Contingency Table Updates** + +1. **Error Handling for Columns** + - Added a check to ensure at least one column is specified. + - Updated the function to accept a single column as a string or multiple columns as a list. + - Raised a ``ValueError`` if no columns are provided or if ``cols`` is not correctly specified. + +2. **Function Parameters** + - Changed parameters from ``col1`` and ``col2`` to a single parameter ``cols`` which can be either a string or a list. + +3. **Error Handling** + - Renamed ``SortBy`` to ``sort_by`` to standardize nomenclature. + - Added a check to ensure ``sort_by`` is either 0 or 1. + - Raised a ``ValueError`` if ``sort_by`` is not 0 or 1. + +5. **Sorting Logic** + - Updated the sorting logic to handle the new ``cols`` parameter structure. + +6. **Handling Categorical Data** + - Modified code to convert categorical columns to strings to avoid issues with ``fillna("")``. + +7. **Handling Missing Values** + - Added ``df = df.fillna('')`` to fill NA values within the function to account for missing data. + +8. **Improved Function Documentation** + - Updated function documentation to reflect new parameters and error handling. + +Version 0.0.1b0 +----------------------------- + +**Contingency Table Updates** + +- ``fillna('')`` added to output so that null values come through, removed ``'All'`` column name from output, sort options ``0`` and ``1``, updated docstring documentation. Tested successfully on ``Python 3.7.3``. + +**Compatibility Enhancement** + +1. Added a version check for ``Python 3.7`` and above. + + - Conditional import of ``datetime`` to handle different Python versions. + +.. code-block:: python + + if sys.version_info >= (3, 7): + from datetime import datetime + else: + import datetime diff --git a/_build/html/v0.0.6/_sources/citations.rst.txt b/_build/html/v0.0.6/_sources/citations.rst.txt new file mode 100644 index 000000000..47f562314 --- /dev/null +++ b/_build/html/v0.0.6/_sources/citations.rst.txt @@ -0,0 +1,42 @@ +.. _citations: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Citing EDA Toolkit +=================== + +Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.4). Zenodo. https://doi.org/10.5281/zenodo.13163208 + +.. code:: bash + + @software{shpaner_2024_13162633, + author = {Shpaner, Leonid and + Gil, Oscar}, + title = {EDA Toolkit}, + month = aug, + year = 2024, + publisher = {Zenodo}, + version = {0.0.4},W + doi = {10.5281/zenodo.13162633}, + url = {https://doi.org/10.5281/zenodo.13162633} + } + diff --git a/_build/html/v0.0.6/_sources/getting_started.rst.txt b/_build/html/v0.0.6/_sources/getting_started.rst.txt new file mode 100644 index 000000000..cb0ee3d94 --- /dev/null +++ b/_build/html/v0.0.6/_sources/getting_started.rst.txt @@ -0,0 +1,121 @@ +.. _getting_started: + +.. KFRE Python Library Documentation documentation master file, created by + sphinx-quickstart on Thu May 2 15:44:56 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Welcome to the EDA Toolkit Python Library Documentation! +======================================================== +.. note:: + This documentation is for ``eda_toolkit`` version ``0.0.6``. + + +The ``eda_toolkit`` is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data. + +Project Links +--------------- + +1. `PyPI Page `_ + +2. `GitHub Repository `_ + + +What is EDA? +------------- + +Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data. + + +Purpose of EDA Toolkit +----------------------- +The ``eda_toolkit`` library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including: + +- **Data Management:** Tools for managing directories, generating unique IDs, + standardizing dates, and handling common DataFrame manipulations. +- **Data Cleaning:** Functions to address missing values, remove outliers, and + correct formatting issues, ensuring data is ready for analysis. +- **Data Visualization:** A variety of plotting functions, including KDE + distribution plots, stacked bar plots, scatter plots with optional best fit + lines, and box/violin plots, to visually explore data distributions, + relationships, and trends. +- **Descriptive and Summary Statistics:** Methods to generate comprehensive + reports on data types, summary statistics (mean, median, standard deviation, + etc.), and to summarize all possible combinations of specified variables. +- **Reporting and Export:** Features to save DataFrames to Excel with + customizable formatting, create contingency tables, and export generated + plots in multiple formats. + + + +Key Features +------------- + +- **Ease of Use:** The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions. +- **Customizable:** Users can customize various aspects of the toolkit to fit their specific needs. +- **Integration:** Seamlessly integrates with popular data science libraries such as ``Pandas``, ``NumPy``, ``Matplotlib``, and ``Seaborn``. +- **Documentation and Examples:** Comprehensive documentation and examples to help users get started quickly and effectively. + +.. _prerequisites: + +Prerequisites +------------- +Before you install ``eda_toolkit``, ensure your system meets the following requirements: + +- **Python**: version ``3.7.4`` or higher is required to run ``eda_toolkit``. + +Additionally, ``eda_toolkit`` depends on the following packages, which will be automatically installed when you install ``eda_toolkit``: + +- ``numpy``: version ``1.21.6`` or higher +- ``pandas``: version ``1.3.5`` or higher +- ``matplotlib``: version ``3.5.3`` or higher +- ``seaborn``: version ``0.12.2`` or higher +- ``jinja2``: version ``3.1.4`` or higher +- ``xlsxwriter``: version ``3.2.0`` or higher + +.. _installation: + +Installation +------------- + +You can install ``eda_toolkit`` directly from PyPI: + +.. code-block:: bash + + pip install eda_toolkit + + diff --git a/_build/html/v0.0.6/_sources/index.rst.txt b/_build/html/v0.0.6/_sources/index.rst.txt new file mode 100644 index 000000000..2a42e87c4 --- /dev/null +++ b/_build/html/v0.0.6/_sources/index.rst.txt @@ -0,0 +1,50 @@ +.. EDA Toolkit documentation master file, created by + sphinx-quickstart on Mon Jul 29 08:15:33 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Table of Contents +=================== + +.. toctree:: + :maxdepth: 3 + :caption: Getting Started + + getting_started + + +.. toctree:: + :maxdepth: 3 + :caption: Usage Guide + + usage_guide + +.. toctree:: + :maxdepth: 3 + :caption: About EDA Toolkit + + acknowledgements + citations + changelog + references + + \ No newline at end of file diff --git a/_build/html/v0.0.6/_sources/references.rst.txt b/_build/html/v0.0.6/_sources/references.rst.txt new file mode 100644 index 000000000..7254cfba5 --- /dev/null +++ b/_build/html/v0.0.6/_sources/references.rst.txt @@ -0,0 +1,36 @@ +.. _references: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +The ``eda_toolkit`` library + +References +========== + +1. Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +2. Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +3. Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + + diff --git a/_build/html/v0.0.6/_sources/usage_guide.rst.txt b/_build/html/v0.0.6/_sources/usage_guide.rst.txt new file mode 100644 index 000000000..f60bdb193 --- /dev/null +++ b/_build/html/v0.0.6/_sources/usage_guide.rst.txt @@ -0,0 +1,2755 @@ +.. _usage_guide: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Description +=========== + +This guide provides detailed instructions and examples for using the functions +provided in the ``eda_toolkit`` library and how to use them effectively in your projects. + +For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [#]_. This dataset provides a rich source of +information for demonstrating the functionalities of the ``eda_toolkit``. + + +Data Preparation and Management +=============================== + +Path directories +---------------- + +**Ensure that the directory exists. If not, create it.** + +.. function:: ensure_directory(path) + + :param path: The path to the directory that needs to be ensured. + :type path: str + + :returns: None + + +The ``ensure_directory`` function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``ensure_directory`` function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them. + +First, we define the base path as the parent directory of the current directory. +The ``os.pardir`` constant, equivalent to ``"..""``, is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory. + + +Next, we set paths for the PNG and SVG image directories, located within an +``images`` folder in the parent directory. Using the ``ensure_directory`` +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them. + +.. code-block:: python + + from eda_toolkit import ensure_directory + + import os # import operating system for dir + + + base_path = os.path.join(os.pardir) + + # Go up one level from 'notebooks' to parent directory, + # then into the 'data' folder + data_path = os.path.join(os.pardir, "data") + data_output = os.path.join(os.pardir, "data_output") + + # create image paths + image_path_png = os.path.join(base_path, "images", "png_images") + image_path_svg = os.path.join(base_path, "images", "svg_images") + + # Use the function to ensure'data' directory exists + ensure_directory(data_path) + ensure_directory(data_output) + ensure_directory(image_path_png) + ensure_directory(image_path_svg) + +**Output** + +.. code-block:: python + + Created directory: ../data + Created directory: ../data_output + Created directory: ../images/png_images + Created directory: ../images/svg_images + + +Adding Unique Identifiers +-------------------------- + +**Add a column of unique IDs with a specified number of digits to the dataframe.** + +.. function:: add_ids(df, id_colname="ID", num_digits=9, seed=None, set_as_index=True) + + :param df: The dataframe to add IDs to. + :type df: pd.DataFrame + :param id_colname: The name of the new column for the IDs. + :type id_colname: str + :param num_digits: The number of digits for the unique IDs. + :type num_digits: int + :param seed: The seed for the random number generator. Defaults to ``None``. + :type seed: int, optional + :param set_as_index: Whether to set the new ID column as the index. Defaults to ``False``. + :type set_as_index: bool, optional + + :returns: The updated dataframe with the new ID column. + :rtype: pd.DataFrame + +The ``add_ids`` function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe. + +**Example Usage** + +In the example below, we demonstrate how to use the ``add_ids`` function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the ``add_ids`` function to generate +and append a column of unique IDs with a specified number of digits to the dataframe. + +First, we import the pandas library and the ``add_ids`` function from the ``eda_toolkit``. +Then, we create a sample dataframe with some data. We call the ``add_ids`` function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe. + +.. code-block:: python + + from eda_toolkit import add_ids + + # Add a column of unique IDs with 9 digits and call it "census_id" + df = add_ids( + df=df, + id_colname="census_id", + num_digits=9, + seed=111, + set_as_index=True, + ) + +**Output** + +`First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: bash + + DataFrame index is unique. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+
+ + +\ + + +Trailing Period Removal +----------------------- + +**Strip the trailing period from floats in a specified column of a DataFrame, if present.** + +.. function:: strip_trailing_period(df, column_name) + + :param df: The DataFrame containing the column to be processed. + :type df: pd.DataFrame + :param column_name: The name of the column containing floats with potential trailing periods. + :type column_name: str + + :returns: The updated DataFrame with the trailing periods removed from the specified column. + :rtype: pd.DataFrame + + The ``strip_trailing_period`` function is designed to remove trailing periods + from float values in a specified column of a DataFrame. This can be particularly + useful when dealing with data that has been inconsistently formatted, ensuring + that all float values are correctly represented. + +**Example Usage** + +In the example below, we demonstrate how to use the ``strip_trailing_period`` function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the ``strip_trailing_period`` function to remove any trailing periods from the specified column. + +.. code-block:: python + + from eda_toolkit import strip_trailing_period + + # Create a sample dataframe with trailing periods in some values + data = { + "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.], + } + df = pd.DataFrame(data) + + # Remove trailing periods from the 'values' column + df = strip_trailing_period(df=df, column_name="values") + + +**Output** + +`First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)` + +.. raw:: html + + + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +
+ + +\ + +`Note:` The last row shows 6 as an `int` with a trailing period with its conversion to `float`. + + +\ + +Standardized Dates +------------------- + +**Parse and standardize date strings based on the provided rule.** + +.. function:: parse_date_with_rule(date_str) + + This function takes a date string and standardizes it to the ``ISO 8601`` format + (``YYYY-MM-DD``). It assumes dates are provided in either day/month/year or + month/day/year format. The function first checks if the first part of the + date string (day or month) is greater than 12, which unambiguously indicates + a day/month/year format. If the first part is 12 or less, the function + attempts to parse the date as month/day/year, falling back to day/month/year + if the former raises a ``ValueError`` due to an impossible date (e.g., month + being greater than 12). + + :param date_str: A date string to be standardized. + :type date_str: str + + :returns: A standardized date string in the format ``YYYY-MM-DD``. + :rtype: str + + :raises ValueError: If ``date_str`` is in an unrecognized format or if the function + cannot parse the date. + +**Example Usage** + +In the example below, we demonstrate how to use the ``parse_date_with_rule`` +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the ``parse_date_with_rule`` +function to parse and standardize each date string to the ``ISO 8601`` format. + +.. code-block:: python + + from eda_toolkit import parse_date_with_rule + + # Sample date strings + date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"] + + # Standardize the date strings + standardized_dates = [parse_date_with_rule(date) for date in date_strings] + + print(standardized_dates) + +**Output** + +.. code-block:: python + + ['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12'] + + + +.. important:: + + In the next example, we demonstrate how to apply the ``parse_date_with_rule`` + function to a DataFrame column containing date strings using the ``.apply()`` method. + This is particularly useful when you need to standardize date formats across an + entire column in a DataFrame. + +.. code-block:: python + + # Creating the DataFrame + data = { + "date_column": [ + "31/12/2021", + "01/01/2022", + "12/31/2021", + "13/02/2022", + "07/04/2022", + ], + "name": ["Alice", "Bob", "Charlie", "David", "Eve"], + "amount": [100.0, 150.5, 200.75, 250.25, 300.0], + } + + df = pd.DataFrame(data) + + # Apply the function to the DataFrame column + df["standardized_date"] = df["date_column"].apply(parse_date_with_rule) + + print(df) + +**Output** + +.. code-block:: python + + date_column name amount standardized_date + 0 31/12/2021 Alice 100.00 2021-12-31 + 1 01/01/2022 Bob 150.50 2022-01-01 + 2 12/31/2021 Charlie 200.75 2021-12-31 + 3 13/02/2022 David 250.25 2022-02-13 + 4 07/04/2022 Eve 300.00 2022-04-07 + + +DataFrame Analysis +------------------- + +**Analyze DataFrame columns, including dtype, null values, and unique value counts.** + +.. function:: dataframe_columns(df) + + This function analyzes the columns of a DataFrame, providing details about the data type, + the number and percentage of ``null`` values, the total number of unique values, and the most + frequent unique value along with its count and percentage. It handles special cases such as + converting date columns and replacing empty strings with Pandas ``NA`` values. + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + + :returns: A DataFrame with the analysis results for each column. + :rtype: pandas.DataFrame + +**Example Usage** + +In the example below, we demonstrate how to use the ``dataframe_columns`` +function to analyze a DataFrame's columns. + +.. code-block:: python + + from eda_toolkit import dataframe_columns + + dataframe_columns(df=df) + + +**Output** + +`Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: python + + Shape: (48842, 16) + + Total seconds of processing time: 0.861555 + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+
+ + + +\ + +Generating Summary Tables for Variable Combinations +----------------------------------------------------- + +**This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.** + + +.. function:: summarize_all_combinations(df, variables, data_path, data_name, min_length=2) + + :param df: The pandas DataFrame containing the data. + :type df: pandas.DataFrame + :param variables: List of unique variables to generate combinations. + :type variables: list + :param data_path: Path where the output Excel file will be saved. + :type data_path: str + :param data_name: Name of the output Excel file. + :type data_name: str + :param min_length: Minimum length of combinations to generate. Defaults to ``2``. + :type min_length: int + + :returns: A dictionary of summary tables and a list of all generated combinations. + :rtype: tuple(dict, list) + +The function returns two outputs: + +1. ``summary_tables``: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values. + +2. ``all_combinations``: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables. + +**Example Usage** + +Below, we use the ``summarize_all_combinations`` function to generate summary tables for the specified +variables from a DataFrame containing the census data [1]_. + +.. code-block:: python + + from eda_toolkit import summarize_all_combinations + + # Define unique variables for the analysis + unique_vars = [ + "age_group", + "workclass", + "education", + "occupation", + "race", + "sex", + "income", + ] + + # Generate summary tables for all combinations of the specified variables + summary_tables, all_combinations = summarize_all_combinations( + df=df, + data_path=data_output, + variables=unique_vars, + data_name="census_summary_tables.xlsx", + ) + + # Print all combinations of variables + print(all_combinations) + +**Output** + +.. code-blocK:: python + + [('age_group', 'workclass'), + ('age_group', 'education'), + ('age_group', 'occupation'), + ('age_group', 'race'), + ('age_group', 'sex'), + ('age_group', 'income'), + ('workclass', 'education'), + ('workclass', 'occupation'), + ('workclass', 'race'), + ('workclass', 'sex'), + ('workclass', 'income'), + ('education', 'occupation'), + ('education', 'race'), + ('education', 'sex'), + ('education', 'income'), + ('occupation', 'race'), + ('occupation', 'sex'), + ('occupation', 'income'), + ('race', 'sex'), + ('race', 'income'), + ('sex', 'income'), + ('age_group', 'workclass', 'education'), + ('age_group', 'workclass', 'occupation'), + ('age_group', 'workclass', 'race'), + ('age_group', 'workclass', 'sex'), + ('age_group', 'workclass', 'income'), + ('age_group', 'education', 'occupation'), + ('age_group', 'education', 'race'), + ('age_group', 'education', 'sex'), + ('age_group', 'education', 'income'), + ('age_group', 'occupation', 'race'), + ('age_group', 'occupation', 'sex'), + ('age_group', 'occupation', 'income'), + ('age_group', 'race', 'sex'), + ('age_group', 'race', 'income'), + ('age_group', 'sex', 'income'), + ('workclass', 'education', 'occupation'), + ('workclass', 'education', 'race'), + ('workclass', 'education', 'sex'), + ('workclass', 'education', 'income'), + ('workclass', 'occupation', 'race'), + ('workclass', 'occupation', 'sex'), + ('workclass', 'occupation', 'income'), + ('workclass', 'race', 'sex'), + ('workclass', 'race', 'income'), + ('workclass', 'sex', 'income'), + ('education', 'occupation', 'race'), + ('education', 'occupation', 'sex'), + ('education', 'occupation', 'income'), + ('education', 'race', 'sex'), + ('education', 'race', 'income'), + ('education', 'sex', 'income'), + ('occupation', 'race', 'sex'), + ('occupation', 'race', 'income'), + ('occupation', 'sex', 'income'), + ('race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation'), + ('age_group', 'workclass', 'education', 'race'), + ('age_group', 'workclass', 'education', 'sex'), + ('age_group', 'workclass', 'education', 'income'), + ('age_group', 'workclass', 'occupation', 'race'), + ('age_group', 'workclass', 'occupation', 'sex'), + ('age_group', 'workclass', 'occupation', 'income'), + ('age_group', 'workclass', 'race', 'sex'), + ('age_group', 'workclass', 'race', 'income'), + ('age_group', 'workclass', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race'), + ('age_group', 'education', 'occupation', 'sex'), + ('age_group', 'education', 'occupation', 'income'), + ('age_group', 'education', 'race', 'sex'), + ('age_group', 'education', 'race', 'income'), + ('age_group', 'education', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex'), + ('age_group', 'occupation', 'race', 'income'), + ('age_group', 'occupation', 'sex', 'income'), + ('age_group', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race'), + ('workclass', 'education', 'occupation', 'sex'), + ('workclass', 'education', 'occupation', 'income'), + ('workclass', 'education', 'race', 'sex'), + ('workclass', 'education', 'race', 'income'), + ('workclass', 'education', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex'), + ('workclass', 'occupation', 'race', 'income'), + ('workclass', 'occupation', 'sex', 'income'), + ('workclass', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex'), + ('education', 'occupation', 'race', 'income'), + ('education', 'occupation', 'sex', 'income'), + ('education', 'race', 'sex', 'income'), + ('occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race'), + ('age_group', 'workclass', 'education', 'occupation', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'race', 'income'), + ('age_group', 'workclass', 'education', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'education', 'occupation', 'race', 'income'), + ('age_group', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'education', 'race', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex'), + ('workclass', 'education', 'occupation', 'race', 'income'), + ('workclass', 'education', 'occupation', 'sex', 'income'), + ('workclass', 'education', 'race', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex', 'income'), + ('age_group', + 'workclass', + 'education', + 'occupation', + 'race', + 'sex', + 'income')] + + +When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table. + +.. raw:: html + +
+ +.. image:: ../assets/summarize_combos.gif + :alt: EDA Toolkit Logo + :align: left + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Saving DataFrames to Excel with Customized Formatting +------------------------------------------------------- +**Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.** + + +This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the ``save_dataframes_to_excel`` function. + + +.. function:: save_dataframes_to_excel(file_path, df_dict, decimal_places=0) + + :param file_path: Full path to the output Excel file. + :type file_path: str + :param df_dict: Dictionary where keys are sheet names and values are DataFrames to save. + :type df_dict: dict + :param decimal_places: Number of decimal places to round numeric columns. Default is 0. + :type decimal_places: int + + :notes: + - The function will autofit columns and left-align text. + - Numeric columns will be formatted with the specified number of decimal places. + - Headers will be bold and left-aligned without borders. + +The function performs the following tasks: + +- Writes each DataFrame to its respective sheet in the Excel file. +- Rounds numeric columns to the specified number of decimal places. +- Applies customized formatting to headers and cells. +- Autofits columns based on the content length. + +**Example Usage** + +Below, we use the ``save_dataframes_to_excel`` function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between `18` and `40`. + +.. code-block:: python + + from eda_toolkit import save_dataframes_to_excel + + # Example usage + file_name = "df_census.xlsx" # Name of the output Excel file + file_path = os.path.join(data_path, file_name) + + # filter DataFrame to Ages 18-40 + filtered_df = df[(df["age"] > 18) & (df["age"] < 40)] + + df_dict = { + "original_df": df, + "ages_18_to_40": filtered_df, + } + + save_dataframes_to_excel( + file_path=file_path, + df_dict=df_dict, + decimal_places=0, + ) + + +**Output** + +The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between `18` and `40`, each on separate sheets with customized formatting. + + +Creating Contingency Tables +---------------------------- + +**Create a contingency table from one or more columns in a DataFrame, with sorting options.** + +This section explains how to create contingency tables from one or more columns in a DataFrame using the ``contingency_table`` function. + +.. function:: contingency_table(df, cols=None, sort_by=0) + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param cols: Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column. + :type cols: str or list, optional + :param sort_by: Enter ``0`` to sort results by column groups; enter ``1`` to sort results by totals in descending order. + :type sort_by: int + :raises ValueError: If no columns are specified or if sort_by is not ``0`` or ``1``. + :returns: A DataFrame with the specified columns, ``'Total'``, and ``'Percentage'``. + :rtype: pandas.DataFrame + +**Example Usage** + +Below, we use the ``contingency_table`` function to create a contingency table +from the specified columns in a DataFrame containing census data [1]_ + +.. code-block:: python + + from eda_toolkit import contingency_table + + # Example usage + contingency_table( + df=df, + cols=[ + "age_group", + "workclass", + "race", + "sex", + ], + sort_by=1, + ) + +**Output** + +The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the ``'Total'`` column in descending order because ``sort_by`` +is set to ``1``. + + +.. code-block:: python + + + age_group workclass race sex Total Percentage + 0 30-39 Private White Male 5856 11.99 + 1 18-29 Private White Male 5623 11.51 + 2 40-49 Private White Male 4267 8.74 + 3 18-29 Private White Female 3680 7.53 + 4 50-59 Private White Male 2565 5.25 + .. ... ... ... ... ... ... + 467 50-59 Federal-gov Other Male 1 0.00 + 468 50-59 Local-gov Asian-Pac-Islander Female 1 0.00 + 469 70-79 Self-emp-inc Black Male 1 0.00 + 470 80-89 Local-gov Asian-Pac-Islander Male 1 0.00 + 471 48842 100.00 + + [472 rows x 6 columns] + + +\ + +Highlighting Specific Columns in a DataFrame +--------------------------------------------- + +This section explains how to highlight specific columns in a DataFrame using the ``highlight_columns`` function. + +**Highlight specific columns in a DataFrame with a specified background color.** + +.. function:: highlight_columns(df, columns, color="yellow") + + :param df: The DataFrame to be styled. + :type df: pandas.DataFrame + :param columns: List of column names to be highlighted. + :type columns: list of str + :param color: The background color to be applied for highlighting (default is `"yellow"`). + :type color: str, optional + + :returns: A Styler object with the specified columns highlighted. + :rtype: pandas.io.formats.style.Styler + +**Example Usage** + +Below, we use the ``highlight_columns`` function to highlight the ``age`` and ``education`` +columns in the first 5 rows of the census [1]_ DataFrame with a pink background color. + +.. code-block:: python + + from eda_toolkit import highlight_columns + + # Applying the highlight function + highlighted_df = highlight_columns( + df=df, + columns=["age", "education"], + color="#F8C5C8", + ) + + highlighted_df + +**Output** + +The output will be a DataFrame with the specified columns highlighted in the given background color. +The ``age`` and ``education`` columns will be highlighted in pink. + +The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the ``.render()`` method of the Styler object. + + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+ + +\ + +Binning Numerical Columns +--------------------------- + +If your DataFrame (e.g., the census data [1]_) +does not have age or any other numerical column of interest binned, you can +apply the following binning logic to categorize the data. Below, we use the age +column from the UCI Machine Learning Repository as an example: + +.. code-block:: python + + # Create age bins so that the ages can be categorized + bin_ages = [ + 0, + 18, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + float("inf"), + ] + + # Create labels for the bins + label_ages = [ + "< 18", + "18-29", + "30-39", + "40-49", + "50-59", + "60-69", + "70-79", + "80-89", + "90-99", + "100 +", + ] + + # Categorize the ages and assign to a new variable + df["age_group"] = pd.cut( + df["age"], + bins=bin_ages, + labels=label_ages, + right=False, + ) + +`Note:` This code snippet creates age bins and assigns a corresponding age group +label to each age in the DataFrame. The ``pd.cut`` function from pandas is used to +categorize the ages and assign them to a new column, ``age_group``. Adjust the bins +and labels as needed for your specific data. + + +KDE and Histogram Distribution Plots +======================================= + +**Generate KDE or histogram distribution plots for specified columns in a DataFrame.** + +The ``kde_distributions`` function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2]_ for plotting, which is built on top of +matplotlib [3]_ and provides a high-level interface for drawing attractive and informative +statistical graphics. + + +**Key Features and Parameters** + +- **Flexible Plotting**: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively. +- **Leverages Seaborn Library**: The function is built on the `seaborn` library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code. +- **Customization**: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs. +- **Scientific Notation Control**: The function allows disabling scientific notation on the axes, providing better readability for certain types of data. +- **Log Scaling**: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude. +- **Output Options**: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations. + +.. function:: kde_distributions(df, vars_of_interest=None, grid_figsize=(10, 8), single_figsize=(6, 4), kde=True, hist_color="#0000FF", kde_color="#FF0000", hist_edgecolor="#000000", hue=None, fill=True, fill_alpha=1, n_rows=1, n_cols=1, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_path_png=None, single_var_image_path_svg=None, single_var_image_filename=None, y_axis_label="Density", plot_type="both", log_scale_vars=None, bins="auto", binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat="density", xlim=None, ylim=None) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param vars_of_interest: List of column names for which to generate distribution plots. + :type vars_of_interest: list of str, optional + :param grid_figsize: Size of the overall grid figure, default is ``(10, 8)``. + :type grid_figsize: tuple, optional + :param single_figsize: Size of individual figures for each variable, default is ``(6, 4)``. + :type single_figsize: tuple, optional + :param kde: Whether to include KDE plots on the histograms, default is ``True``. + :type kde: bool, optional + :param hist_color: Color of the histogram bars, default is ``'#0000FF'``. + :type hist_color: str, optional + :param kde_color: Color of the KDE plot, default is ``'#FF0000'``. + :type kde_color: str, optional + :param hist_edgecolor: Color of the histogram bar edges, default is ``'#000000'``. + :type hist_edgecolor: str, optional + :param hue: Column name to group data by, adding different colors for each group. + :type hue: str, optional + :param fill: Whether to fill the histogram bars with color, default is ``True``. + :type fill: bool, optional + :param fill_alpha: Alpha transparency for the fill color of the histogram bars, where + ``0`` is fully transparent and ``1`` is fully opaque. Default is ``1``. + :type fill_alpha: float, optional + :param n_rows: Number of rows in the subplot grid, default is ``1``. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid, default is ``1``. + :type n_cols: int, optional + :param w_pad: Width padding between subplots, default is ``1.0``. + :type w_pad: float, optional + :param h_pad: Height padding between subplots, default is ``1.0``. + :type h_pad: float, optional + :param image_path_png: Directory path to save the PNG image of the overall distribution plots. + :type image_path_png: str, optional + :param image_path_svg: Directory path to save the SVG image of the overall distribution plots. + :type image_path_svg: str, optional + :param image_filename: Filename to use when saving the overall distribution plots. + :type image_filename: str, optional + :param bbox_inches: Bounding box to use when saving the figure. For example, ``'tight'``. + :type bbox_inches: str, optional + :param single_var_image_path_png: Directory path to save the PNG images of the separate distribution plots. + :type single_var_image_path_png: str, optional + :param single_var_image_path_svg: Directory path to save the SVG images of the separate distribution plots. + :type single_var_image_path_svg: str, optional + :param single_var_image_filename: Filename to use when saving the separate distribution plots. + The variable name will be appended to this filename. + :type single_var_image_filename: str, optional + :param y_axis_label: The label to display on the ``y-axis``, default is ``'Density'``. + :type y_axis_label: str, optional + :param plot_type: The type of plot to generate, options are ``'hist'``, ``'kde'``, or ``'both'``. Default is ``'both'``. + :type plot_type: str, optional + :param log_scale_vars: List of variable names to apply log scaling. + :type log_scale_vars: list of str, optional + :param bins: Specification of histogram bins, default is ``'auto'``. + :type bins: int or sequence, optional + :param binwidth: Width of each bin, overrides bins but can be used with binrange. + :type binwidth: number or pair of numbers, optional + :param label_fontsize: Font size for axis labels, including xlabel, ylabel, and tick marks, default is ``10``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: Maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param disable_sci_notation: Toggle to disable scientific notation on axes, default is ``False``. + :type disable_sci_notation: bool, optional + :param stat: Aggregate statistic to compute in each bin (e.g., ``'count'``, ``'frequency'``, + ``'probability'``, ``'percent'``, ``'density'``), default is ``'density'``. + :type stat: str, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``plot_type`` is not one of ``'hist'``, ``'kde'``, or ``'both'``. + - If ``stat`` is not one of ``'count'``, ``'density'``, ``'frequency'``, ``'probability'``, ``'proportion'``, ``'percent'``. + - If ``log_scale_vars`` contains variables that are not present in the DataFrame. + - If ``fill`` is set to ``False`` and ``hist_edgecolor`` is not the default. + + :raises UserWarning: + - If ``stat`` is set to 'count' while ``kde`` is ``True``, as it may produce misleading plots. + - If both ``bins`` and ``binwidth`` are specified, which may affect performance. + + :returns: ``None`` + + +\ + +.. raw:: html + +
+ + + +KDE and Histograms Example +--------------------------- + +In the below example, the ``kde_distributions`` function is used to generate +histograms for several variables of interest: ``"age"``, ``"education-num"``, and +``"hours-per-week"``. These variables represent different demographic and +financial attributes from the dataset. The ``kde=True`` parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data's probability density. + +The visualizations are arranged in a single row of four columns, as specified +by ``n_rows=1`` and ``n_cols=3``, respectively. The overall size of the grid +figure is set to `14 inches` wide and `4 inches tall` (``grid_figsize=(14, 4)``), +while each individual plot is configured to be `4 inches` by `4 inches` +(``single_figsize=(4, 4)``). The ``fill=True`` parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +``w_pad=1`` and ``h_pad=1``, which add `1 inch` of padding both horizontally and +vertically. + +To handle longer titles, the ``text_wrap=50`` parameter ensures that the title +text wraps to a new line after `50 characters`. The ``bbox_inches="tight"`` setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in ``vars_of_interest`` are +passed directly to the function for visualization. + +Each plot is saved individually with filenames that are prefixed by +``"kde_density_single_distribution"``, followed by the variable name. The ```y-axis``` +for all plots is labeled as "Density" (``y_axis_label="Density"``), reflecting that +the height of the bars or KDE line represents the data's density. The histograms +are divided into `10 bins` (``bins=10``), offering a clear view of the distribution +of each variable. + +The ``plot_type="hist"`` parameter indicates that only histograms will be generated +for each variable. Additionally, the font sizes for the axis labels and tick labels +are set to `16 points` (``label_fontsize=16``) and `14 points` (``tick_fontsize=14``), +respectively, ensuring that all text within the plots is legible and well-formatted. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=True, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + fill=True, + fill_alpha=0.60, + w_pad=1, + h_pad=1, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + +.. raw:: html + +
+ +.. image:: ../assets/kde_density_distributions.svg + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Density) +---------------------------- + +In this example, the kde_distributions function is used to generate histograms for +the variables ``"age"``, ``"education-num"``, and ``"hours-per-week"`` but with +``kde=False``, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (``n_rows=1, n_cols=3``), +with a grid size of `14x4 inches` (``grid_figsize=(14, 4)``). The histograms are +divided into `10 bins` (``bins=10``), and the ``y-axis`` is labeled "Density" (``y_axis_label="Density"``). +Font sizes for the axis labels and tick labels are set to `16` and `14` points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=False, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + w_pad=1, + h_pad=1, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/hist_density_distributions.svg + :alt: KDE Distributions - Histograms (Density) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Count) +-------------------------- + +In this example, the kde_distributions function is modified to generate histograms +with a few key changes. The ``hist_color`` is set to `"orange"`, changing the color of the +histogram bars. The ```y-axis``` label is updated to "Count" (``y_axis_label="Count"``), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to `"Count"` to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (``n_rows=1, n_cols=4``), +a grid size of `14x4 inches`, and a bin count of `10`. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=False, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + w_pad=1, + h_pad=1, + text_wrap=50, + hist_color="orange", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Count", + bins=10, + plot_type="hist", + stat="Count", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/count_hist_distributions.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Stacked Crosstab Plots +======================= + +**Generates stacked bar plots and crosstabs for specified columns in a DataFrame.** + +The ``stacked_crosstab_plot`` function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats. + +The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis. + +.. function:: stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind="bar", width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output="both", return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type="both", show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False) + + Generates stacked or regular bar plots and crosstabs for specified columns. + + This function allows users to create stacked bar plots (or regular bar plots + if stacks are removed) and corresponding crosstabs for specific columns + in a DataFrame. It provides options to customize the appearance, including + font sizes for axis labels, tick labels, and title text wrapping, and to + choose between regular or normalized plots. + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param col: The name of the column in the DataFrame to be analyzed. + :type col: str + :param func_col: List of ground truth columns to be analyzed. + :type func_col: list + :param legend_labels_list: List of legend labels for each ground truth column. + :type legend_labels_list: list + :param title: List of titles for the plots. + :type title: list + :param kind: The kind of plot to generate (``'bar'`` or ``'barh'`` for horizontal bars), default is ``'bar'``. + :type kind: str, optional + :param width: The width of the bars in the bar plot, default is ``0.9``. + :type width: float, optional + :param rot: The rotation angle of the ``x-axis`` labels, default is ``0``. + :type rot: int, optional + :param custom_order: Specifies a custom order for the categories in the ``col``. + :type custom_order: list, optional + :param image_path_png: Directory path where generated PNG plot images will be saved. + :type image_path_png: str, optional + :param image_path_svg: Directory path where generated SVG plot images will be saved. + :type image_path_svg: str, optional + :param save_formats: List of file formats to save the plot images in. + :type save_formats: list, optional + :param color: List of colors to use for the plots. If not provided, a default color scheme is used. + :type color: list, optional + :param output: Specify the output type: ``"plots_only"``, ``"crosstabs_only"``, or ``"both"``. Default is ``"both"``. + :type output: str, optional + :param return_dict: Specify whether to return the crosstabs dictionary, default is ``False``. + :type return_dict: bool, optional + :param x: The width of the figure. + :type x: int, optional + :param y: The height of the figure. + :type y: int, optional + :param p: The padding between the subplots. + :type p: int, optional + :param file_prefix: Prefix for the filename when output includes plots. + :type file_prefix: str, optional + :param logscale: Apply log scale to the ``y-axis``, default is ``False``. + :type logscale: bool, optional + :param plot_type: Specify the type of plot to generate: ``"both"``, ``"regular"``, ``"normalized"``. Default is ``"both"``. + :type plot_type: str, optional + :param show_legend: Specify whether to show the legend, default is ``True``. + :type show_legend: bool, optional + :param label_fontsize: Font size for axis labels, default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param remove_stacks: If ``True``, removes stacks and creates a regular bar plot using only the ``col`` parameter. Only works when ``plot_type`` is set to ``'regular'``. Default is ``False``. + :type remove_stacks: bool, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``output`` is not one of ``"both"``, ``"plots_only"``, or ``"crosstabs_only"``. + - If ``plot_type`` is not one of ``"both"``, ``"regular"``, ``"normalized"``. + - If ``remove_stacks`` is set to True and ``plot_type`` is not ``"regular"``. + - If the lengths of ``title``, ``func_col``, and ``legend_labels_list`` are not equal. + :raises KeyError: If any columns specified in ``col`` or ``func_col`` are missing in the DataFrame. + + :returns: Dictionary of crosstabs DataFrames if ``return_dict`` is ``True``. Otherwise, returns ``None``. + :rtype: ``dict`` or ``None`` + + + +Stacked Bar Plots With Crosstabs Example +----------------------------------------- + +The provided code snippet demonstrates how to use the ``stacked_crosstab_plot`` +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here's a detailed breakdown of the code using the census +dataset as an example [1]_. + +First, the ``func_col`` list is defined, specifying the columns ``["sex", "income"]`` +to be analyzed. These columns will be used in the loop to generate separate plots. +The ``legend_labels_list`` is then defined, with each entry corresponding to a +column in ``func_col``. In this case, the labels for the ``sex`` column are +``["Male", "Female"]``, and for the ``income`` column, they are ``["<=50K", ">50K"]``. +These labels will be used to annotate the legends of the plots. + +Next, the ``title`` list is defined, providing titles for each plot corresponding +to the columns in ``func_col``. The titles are set to ``["Sex", "Income"]``, +which will be displayed on top of each respective plot. + +.. code-block:: python + + # Define the func_col to use in the loop in order of usage + func_col = ["sex", "income"] + + # Define the legend_labels to use in the loop + legend_labels_list = [ + ["Male", "Female"], + ["<=50K", ">50K"], + ] + + # Define titles for the plots + title = [ + "Sex", + "Income", + ] + +.. note:: + + If you assign the function to a variable, the dictionary returned when + ``return_dict=True`` will be suppressed in the output. However, the dictionary + is still available within the assigned variable for further use. + + +.. code-block:: python + + from eda_toolkit import stacked_crosstab_plot + + # Call the stacked_crosstab_plot function + stacked_crosstabs = stacked_crosstab_plot( + df=df, + col="age_group", + func_col=func_col, + legend_labels_list=legend_labels_list, + title=title, + kind="bar", + width=0.8, + rot=45, # axis rotation angle + custom_order=None, + color=["#00BFC4", "#F8766D"], # default color schema + output="both", + return_dict=True, + x=14, + y=8, + p=10, + logscale=False, + plot_type="both", + show_legend=True, + label_fontsize=14, + tick_fontsize=12, + ) + +The above example generates stacked bar plots for ``"sex"`` and ``"income"`` +grouped by ``"education"``. The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export. + +.. important:: + + **Importance of Correctly Aligning Labels** + + It is crucial to properly align the elements in the ``legend_labels_list``, + ``title``, and ``func_col`` parameters when using the ``stacked_crosstab_plot`` + function. Each of these lists must be ordered consistently because the function + relies on their alignment to correctly assign labels and titles to the + corresponding plots and legends. + + **For instance, in the example above:** + + - The first element in ``func_col`` is ``"sex"``, and it is aligned with the first set of labels ``["Male", "Female"]`` in ``legend_labels_list`` and the first title ``"Sex"`` in the ``title`` list. + - Similarly, the second element in ``func_col``, ``"income"``, aligns with the labels ``["<=50K", ">50K"]`` and the title ``"Income"``. + + **Misalignment between these lists would result in incorrect labels or titles being + applied to the plots, potentially leading to confusion or misinterpretation of the data. + Therefore, it's important to ensure that each list is ordered appropriately and + consistently to accurately reflect the data being visualized.** + + **Proper Setup of Lists** + + When setting up the ``legend_labels_list``, ``title``, and ``func_col``, ensure + that each element in the lists corresponds to the correct variable in the DataFrame. + This involves: + + - **Ordering**: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted. + - **Consistency**: Double-checking that each label in ``legend_labels_list`` matches the categories present in the corresponding ``func_col``, and that the ``title`` accurately describes the plot. + + By adhering to these guidelines, you can ensure that the ``stacked_crosstab_plot`` + function produces accurate and meaningful visualizations that are easy to interpret and analyze. + +**Output** + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_sex.svg + :alt: KDE Distributions + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income.svg + :alt: Stacked Bar Plot Age vs. Income + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +.. note:: + + When you set ``return_dict=True``, you are able to see the crosstabs printed out + as shown below. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93
+ +\ + +When you set ``return_dict=True``, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example: + +.. code-block:: python + + crosstab_age_sex = crosstabs_dict["sex"] + crosstab_age_income = crosstabs_dict["income"] + + +Pivoted Stacked Bar Plots Example +----------------------------------- + +Using the census dataset [1]_, to create horizontal stacked bar plots, set the ``kind`` parameter to +``"barh"`` in the ``stacked_crosstab_plot function``. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the ``y-axis``. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_pivoted.svg + :alt: Stacked Bar Plot Age vs. Income (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Non-Normalized Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to create stacked bar plots without the normalized versions, +set the ``plot_type`` parameter to ``"regular"`` in the ``stacked_crosstab_plot`` +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the ``plot_type`` to ``"normalized"`` will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_regular.svg + :alt: Stacked Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Regular Non-Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the ``plot_type`` parameter to ``"regular"`` +in the ``stacked_crosstab_plot`` function and enable ``remove_stacks`` by setting +it to ``True``. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +``plot_type`` to ``"normalized"`` will display only the normalized plots. + +When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories. + +In the example below, the color of the bars has been set to a dark grey (``#333333``), +and the legend has been removed by setting ``show_legend=False``. This illustrates +regular bar plots for income by age, without stacking. + + +.. raw:: html + +
+ +.. image:: ../assets/Bar_Age_regular_income.svg + :alt: Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Box and Violin Plots +=========================== + +**Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.** + +The ``box_violin_plot`` function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories. + +With options to customize the plot type (``boxplot`` or ``violinplot``), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis. + +Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures. + +The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset. + +.. function:: box_violin_plot(df, metrics_list, metrics_boxplot_comp, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type="boxplot", xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param metrics_list: List of metric names (columns in df) to plot. + :type metrics_list: list of str + :param metrics_boxplot_comp: List of comparison categories (columns in df). + :type metrics_boxplot_comp: list of str + :param n_rows: Number of rows in the subplot grid. + :type n_rows: int + :param n_cols: Number of columns in the subplot grid. + :type n_cols: int + :param image_path_png: Optional directory path to save ``.png`` images. + :type image_path_png: str, optional + :param image_path_svg: Optional directory path to save ``.svg`` images. + :type image_path_svg: str, optional + :param save_plots: String, ``"all"``, ``"individual"``, or ``"grid"`` to control saving plots. + :type save_plots: str, optional + :param show_legend: Boolean, True if showing the legend in the plots. + :type show_legend: bool, optional + :param plot_type: Specify the type of plot, either ``"boxplot"`` or ``"violinplot"``. Default is ``"boxplot"``. + :type plot_type: str, optional + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + :param show_plot: Specify the plot display mode: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + :param rotate_plot: Boolean, True if rotating (pivoting) the plots. + :type rotate_plot: bool, optional + :param individual_figsize: Width and height of the figure for individual plots. Default is (``6, 4``). + :type individual_figsize: tuple or list, optional + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of None, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set without specifying ``image_path_png`` or ``image_path_svg``. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` is not a tuple or list of two numbers. + - If ``grid_figsize`` is specified but is not a tuple or list of two numbers. + + :returns: ``None`` + + + + +This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels. + +Box Plots Grid Example +----------------------- + +In this example with the US census data [1]_, the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the ``"age_group"`` column in the +DataFrame. The ``metrics_boxplot_comp`` parameter is set to [``"age_group"``], meaning +that the comparison will be based on different age groups. The ``metrics_list`` is +provided as ``age_boxplot_list``, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid format with `3` rows and `4` +columns, using the ``n_rows=3`` and ``n_cols=4`` parameters. The ``image_path_png`` and +``image_path_svg`` parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to ``"all"``, ensuring that both +individual and grid plots are saved. + +The plots are displayed in a grid format, as indicated by the ``show_plot="grid"`` +parameter. The ``plot_type`` is set to ``"boxplot"``, so the function will generate +boxplots for each metric in the list. Additionally, the ```x-axis``` labels are rotated +by 90 degrees (``xlabel_rot=90``) to ensure that the labels are legible. The legend is +hidden by setting ``show_legend=False``, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication. + + +.. code-block:: python + + age_boxplot_list = df[ + [ + "education-num", + "hours-per-week", + ] + ].columns.to_list() + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="boxplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_boxplot.svg + :alt: Box Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Violin Plots Grid Example +-------------------------- + +In this example with the US census data [1]_, we keep everything the same as the prior example, but change the +``plot_type`` to ``violinplot``. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings. + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="violinplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot.svg + :alt: Violin Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Pivoted Violin Plots Grid Example +------------------------------------ + +In this example with the US census data [1]_, we set ``xlabel_rot=0`` and ``rotate_plot=True`` +to pivot the plot, changing the orientation of the axes while keeping the ```x-axis``` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution. + +.. code-block:: python + + from eda_toolkit impor box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + rotate_plot=True, + show_legend=False, + plot_type="violinplot", + xlabel_rot=0, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot_pivoted.svg + :alt: Violin Plot Comparisons (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots and Best Fit Lines +================================== + +**Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.** + +**Create and Save Scatter Plots or a Grid of Scatter Plots** + +This function, ``scatter_fit_plot``, is designed to generate scatter plots for +one or more pairs of variables (``x_vars`` and ``y_vars``) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view. + +**Optional Best Fit Line** + +An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s + +**Customizable Plot Aesthetics** + +The function offers a wide range of customization options to tailor the appearance +of the scatter plots: + +- **Point Color**: You can specify a default color for the scatter points or use a ``hue`` parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data. + +- **Point Size**: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable. + +- **Markers**: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data. + +**Axis and Label Configuration** + +The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges. + +**Plot Display and Saving Options** + +The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations. + +**Correlation Coefficient Display** + +For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship. + +.. function:: scatter_fit_plot(df, x_vars, y_vars, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color="C0", best_fit_linecolor="red", best_fit_linestyle="-", hue=None, hue_palette=None, size=None, sizes=None, marker="o", show_correlation=True, xlim=None, ylim=None) + + Create and save scatter plots or a grid of scatter plots for given x_vars + and y_vars, with an optional best fit line and customizable point color, + size, and markers. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param x_vars: List of variable names to plot on the `x-axis`. + :type x_vars: list of str + + :param y_vars: List of variable names to plot on the `y-axis`. + :type y_vars: list of str + + :param n_rows: Number of rows in the subplot grid. + :type n_rows: int + + :param n_cols: Number of columns in the subplot grid. + :type n_cols: int + + :param image_path_png: Directory path to save PNG images of the scatter plots. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the scatter plots. + :type image_path_svg: str, optional + + :param save_plots: Controls which plots to save: ``"all"``, ``"individual"``, or ``"grid"``. + :type save_plots: str, optional + + :param show_legend: Whether to display the legend on the plots. Default is ``True``. + :type show_legend: bool, optional + + :param xlabel_rot: Rotation angle for `x-axis` labels. Default is ``0``. + :type xlabel_rot: int, optional + + :param show_plot: Controls plot display: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + + :param rotate_plot: Whether to rotate (pivot) the plots. Default is ``False``. + :type rotate_plot: bool, optional + + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + + :param add_best_fit_line: Whether to add a best fit line to the scatter plots. Default is ``False``. + :type add_best_fit_line: bool, optional + + :param scatter_color: Color code for the scattered points. Default is ``"C0"``. + :type scatter_color: str, optional + + :param best_fit_linecolor: Color code for the best fit line. Default is ``"red"``. + :type best_fit_linecolor: str, optional + + :param best_fit_linestyle: Linestyle for the best fit line. Default is ``"-"``. + :type best_fit_linestyle: str, optional + + :param hue: Column name for the grouping variable that will produce points with different colors. + :type hue: str, optional + + :param hue_palette: Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. + :type hue_palette: dict, list, or str, optional + + :param size: Column name for the grouping variable that will produce points with different sizes. + :type size: str, optional + + :param sizes: Dictionary mapping sizes (smallest and largest) to min and max values. + :type sizes: dict, optional + + :param marker: Marker style used for the scatter points. Default is ``"o"``. + :type marker: str, optional + + :param show_correlation: Whether to display the Pearson correlation coefficient in the plot title. Default is ``True``. + :type show_correlation: bool, optional + + :param xlim: Limits for the `x-axis` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + + :param ylim: Limits for the `y-axis` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set but no image paths are provided. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` or ``grid_figsize`` are not tuples/lists with two numeric values. + + :returns: ``None`` + This function does not return any value but generates and optionally saves scatter plots for the specified `x_vars` and `y_vars`. + + +Regression-Centric Scatter Plots Example +----------------------------------------- + +In this US census data [1]_ example, the ``scatter_fit_plot`` function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the ``show_correlation=True`` parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the ``add_best_fit_line=True`` parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="grid", + show_legend=True, + xlabel_rot=0, + show_plot="grid", + rotate_plot=False, + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid.png + :alt: Scatter Plot Comparisons (with Best Fit Lines) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Scatter Plots Grouped by Category Example +------------------------------------------- + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of +scatter plots that examine the relationships between ``age`` and ``hours-per-week`` +as well as ``education-num`` and ``hours-per-week``. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots: + +1. **Hue and Hue Palette**: The ``hue`` parameter is set to ``"income"``, meaning that the + data points in the scatter plots are colored according to the values in the ``income`` + column. A custom color mapping is provided via the ``hue_palette`` parameter, where the + income categories ``"<=50K"`` and ``">50K"`` are assigned the colors ``"brown"`` and + ``"green"``, respectively. This change visually distinguishes the data points based on + income levels. + +2. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, which applies + a grey color to the scatter points when no ``hue`` is provided. However, since a ``hue`` + is specified in this example, the ``hue_palette`` takes precedence and overrides this color setting. + +3. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``False``, meaning that + no best fit line is added to the scatter plots. This differs from the previous example where + a best fit line was included. + +4. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``False``, so the + Pearson correlation coefficient will not be displayed in the plot titles. This is another + change from the previous example where the correlation coefficient was included. + +5. **Hue Legend**: The ``show_legend`` parameter remains set to ``True``, ensuring that the + legend displaying the hue categories (``"<=50K"`` and ``">50K"``) appears on the plots, + helping to interpret the color coding of the data points. + +These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths. + + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + hue_dict = {"<=50K": "brown", ">50K": "green"} + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="grid", + show_legend=True, + xlabel_rot=0, + show_plot="grid", + rotate_plot=False, + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=False, + scatter_color="#808080", + hue="income", + hue_palette=hue_dict, + show_correlation=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid_grouped.png + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +.. [#] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +.. [2] Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +.. [3] Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. diff --git a/_build/html/v0.0.6/_static/_sphinx_javascript_frameworks_compat.js b/_build/html/v0.0.6/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/_build/html/v0.0.6/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * 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/_build/html/v0.0.6/_static/basic.css b/_build/html/v0.0.6/_static/basic.css new file mode 100644 index 000000000..7ebbd6d07 --- /dev/null +++ b/_build/html/v0.0.6/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- 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: 230px; + 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-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +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; +} + +a:visited { + color: #551A8B; +} + +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; +} + +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; +} + +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 > 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; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +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; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- 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/_build/html/v0.0.6/_static/check-solid.svg b/_build/html/v0.0.6/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_build/html/v0.0.6/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_build/html/v0.0.6/_static/clipboard.min.js b/_build/html/v0.0.6/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_build/html/v0.0.6/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * 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/_build/html/v0.0.6/_static/copybutton.css b/_build/html/v0.0.6/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_build/html/v0.0.6/_static/copybutton.css @@ -0,0 +1,94 @@ +/* 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/_build/html/v0.0.6/_static/copybutton.js b/_build/html/v0.0.6/_static/copybutton.js new file mode 100644 index 000000000..0ea5f6c60 --- /dev/null +++ b/_build/html/v0.0.6/_static/copybutton.js @@ -0,0 +1,248 @@ +// 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, '>|\\$ ', true, 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/_build/html/v0.0.6/_static/copybutton_funcs.js b/_build/html/v0.0.6/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_build/html/v0.0.6/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +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/_build/html/v0.0.6/_static/css/badge_only.css b/_build/html/v0.0.6/_static/css/badge_only.css new file mode 100644 index 000000000..88ba55b96 --- /dev/null +++ b/_build/html/v0.0.6/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Bold.woff b/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Regular.woff b/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.eot b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.svg b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.ttf b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.woff b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.woff2 b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_build/html/v0.0.6/_static/css/fonts/lato-bold-italic.woff b/_build/html/v0.0.6/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_build/html/v0.0.6/_static/css/fonts/lato-bold-italic.woff2 b/_build/html/v0.0.6/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_build/html/v0.0.6/_static/css/fonts/lato-bold.woff b/_build/html/v0.0.6/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/lato-bold.woff differ diff --git a/_build/html/v0.0.6/_static/css/fonts/lato-bold.woff2 b/_build/html/v0.0.6/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/lato-bold.woff2 differ diff --git a/_build/html/v0.0.6/_static/css/fonts/lato-normal-italic.woff b/_build/html/v0.0.6/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_build/html/v0.0.6/_static/css/fonts/lato-normal-italic.woff2 b/_build/html/v0.0.6/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_build/html/v0.0.6/_static/css/fonts/lato-normal.woff b/_build/html/v0.0.6/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/lato-normal.woff differ diff --git a/_build/html/v0.0.6/_static/css/fonts/lato-normal.woff2 b/_build/html/v0.0.6/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.6/_static/css/fonts/lato-normal.woff2 differ diff --git a/_build/html/v0.0.6/_static/css/theme.css b/_build/html/v0.0.6/_static/css/theme.css new file mode 100644 index 000000000..0f14f1064 --- /dev/null +++ b/_build/html/v0.0.6/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_build/html/v0.0.6/_static/doctools.js b/_build/html/v0.0.6/_static/doctools.js new file mode 100644 index 000000000..0398ebb9f --- /dev/null +++ b/_build/html/v0.0.6/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + 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; + }, + + /** + * 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; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + 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; + } + } + + // 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/_build/html/v0.0.6/_static/documentation_options.js b/_build/html/v0.0.6/_static/documentation_options.js new file mode 100644 index 000000000..a8a18f581 --- /dev/null +++ b/_build/html/v0.0.6/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.0.6', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_build/html/v0.0.6/_static/file.png b/_build/html/v0.0.6/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_build/html/v0.0.6/_static/file.png differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.eot b/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.eot differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.ttf b/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.ttf differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.woff b/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.woff differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.woff2 b/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.eot b/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.ttf b/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.woff b/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.woff2 b/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.eot b/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.eot differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.ttf b/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.ttf differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.woff b/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.woff differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.woff2 b/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.eot b/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.eot differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.ttf b/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.ttf differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.woff b/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.woff differ diff --git a/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.woff2 b/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.6/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/_build/html/v0.0.6/_static/jquery.js b/_build/html/v0.0.6/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/_build/html/v0.0.6/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/_build/html/v0.0.6/_static/language_data.js b/_build/html/v0.0.6/_static/language_data.js new file mode 100644 index 000000000..c7fe6c6fa --- /dev/null +++ b/_build/html/v0.0.6/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_build/html/v0.0.6/_static/minus.png b/_build/html/v0.0.6/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/_build/html/v0.0.6/_static/minus.png differ diff --git a/_build/html/v0.0.6/_static/plus.png b/_build/html/v0.0.6/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/_build/html/v0.0.6/_static/plus.png differ diff --git a/_build/html/v0.0.6/_static/pygments.css b/_build/html/v0.0.6/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/_build/html/v0.0.6/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_build/html/v0.0.6/_static/searchtools.js b/_build/html/v0.0.6/_static/searchtools.js new file mode 100644 index 000000000..2c774d17a --- /dev/null +++ b/_build/html/v0.0.6/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_build/html/v0.0.6/_static/sphinx_highlight.js b/_build/html/v0.0.6/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/_build/html/v0.0.6/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * 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))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + 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 SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + 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")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_build/html/v0.0.6/acknowledgements.html b/_build/html/v0.0.6/acknowledgements.html new file mode 100644 index 000000000..abd3882d0 --- /dev/null +++ b/_build/html/v0.0.6/acknowledgements.html @@ -0,0 +1,136 @@ + + + + + + + + + Acknowledgements — EDA Toolkit 0.0.6 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Acknowledgements

+

We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists.

+

We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.6/changelog.html b/_build/html/v0.0.6/changelog.html new file mode 100644 index 000000000..826d6ec00 --- /dev/null +++ b/_build/html/v0.0.6/changelog.html @@ -0,0 +1,413 @@ + + + + + + + + + Changelog — EDA Toolkit 0.0.6 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Changelog

+
+

Version 0.0.6

+

Added validation for Plot Type Parameter in KDE Distributions Function

+

This release adds a validation step for the plot_type parameter in the kde_distributions function. The allowed values for plot_type are "hist", "kde", and "both". If an invalid value is provided, the function will now raise a ValueError with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values.

+
# Validate plot_type parameter
+valid_plot_types = ["hist", "kde", "both"]
+if plot_type.lower() not in valid_plot_types:
+    raise ValueError(
+        f"Invalid plot_type value. Expected one of {valid_plot_types}, "
+        f"got '{plot_type}' instead."
+    )
+
+
+
+
+

Version 0.0.5

+

Ensure Consistent Font Size and Text Wrapping Across Plot Elements

+

This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the stacked_crosstab_plot function. The following updates have been implemented to ensure uniformity and improve the readability of plots:

+
    +
  1. Title Font Size and Text Wrapping: +- Added a text_wrap parameter to control the wrapping of plot titles. +- Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ax.set_title() after plot generation.

  2. +
  3. Legend Font Size Consistency: +- Incorporated label_fontsize into the legend font size by directly setting the font size of the legend text using plt.setp(legend.get_texts(), fontsize=label_fontsize). +- This ensures that the legend labels are consistent with the title and axis labels.

  4. +
+

Testing

+
    +
  • Verified that titles now wrap correctly and match the specified label_fontsize.

  • +
  • Confirmed that legend text scales according to label_fontsize, ensuring consistent font sizes across all plot elements.

  • +
+
+
+

Version 0.0.4

+
    +
  • Stable release

    +
      +
    • No new updates to the codebase.

    • +
    • Updated the project description variable in setup.py to re-emphasize key elements of the library.

    • +
    • Minor README cleanup:

      +
        +
      • Added icons for sections that did not have them.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.3

+
    +
  • Stable release

    +
      +
    • Updated logo size, fixed citation title, and made minor README cleanup:

      +
        +
      • Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.2

+
    +
  • +
    First stable release
      +
    • No new updates to the codebase; minimal documentation updates to README and setup.py files.

    • +
    • Added logo, badges, and Zenodo-certified citation to README.

    • +
    +
    +
    +
  • +
+
+
+

Version 0.0.1rc0

+
    +
  • No new updates to the codebase; minimal documentation updates to README and setup.py files.

  • +
+
+
+

Version 0.0.1b0

+

New Scatter Fit Plot and Additional Updates

+
    +
  • Added new scatter_fit_plot(), removed unused data_types(), and added comment section headers.

  • +
+

Added xlim and ylim Inputs to KDE Distribution

+
    +
  • kde_distribution():

    +
    +
      +
    • Added xlim and ylim inputs to allow users to customize axes limits in kde_distribution().

    • +
    +
    +
  • +
+

Added xlim and ylim Params to Stacked Crosstab Plot

+
    +
  • stacked_crosstab_plot():

    +
    +
      +
    • Added xlim and ylim input parameters to stacked_crosstab_plot() to give users more flexibility in controlling axes limits.

    • +
    +
    +
  • +
+

Added x and y Limits to Box and Violin Plots

+
    +
  • box_violin_plot():

    +
    +
      +
    • Changed function name from metrics_box_violin() to box_violin_plot().

    • +
    • Added xlim and ylim inputs to control x and y-axis limits of box_violin_plot() (formerly metrics_box_violin).

    • +
    +
    +
  • +
+

Added Ability to Remove Stacks from Plots, Plot All or One at a Time

+

Key Changes

+
    +
  1. Plot Type Parameter +- plot_type: This parameter allows the user to choose between "regular", "normalized", or "both" plot types.

  2. +
  3. Remove Stacks Parameter +- remove_stacks: This parameter, when set to True, generates a regular bar plot using only the col parameter instead of a stacked bar plot. It only works when plot_type is set to “regular”. If remove_stacks is set to True while plot_type is anything other than “regular”, the function will raise an exception.

  4. +
+

Explanation of Changes

+
    +
  • Plot Type Parameter

    +
      +
    • Provides flexibility to the user, allowing specification of the type of plot to generate:

      +
        +
      • "regular": Standard bar plot.

      • +
      • "normalized": Normalized bar plot.

      • +
      • "both": Both regular and normalized bar plots.

      • +
      +
    • +
    +
  • +
  • Remove Stacks Parameter +- remove_stacks: Generates a regular bar plot using only the col parameter, removing the stacking of the bars. Applicable only when plot_type is set to “regular”. An exception is raised if used with any other plot_type.

  • +
+

These changes enhance the flexibility and functionality of the stacked_crosstab_plot function, allowing for more customizable and specific plot generation based on user requirements.

+
+
+

Version 0.0.1b0

+

Refined KDE Distributions

+

Key Changes

+
    +
  1. Alpha Transparency for Histogram Fill +- Added a fill_alpha parameter to control the transparency of the histogram bars’ fill color. +- Default value is 0.6. An exception is raised if fill=False and fill_alpha is specified.

  2. +
  3. Custom Font Sizes +- Introduced label_fontsize and tick_fontsize parameters to control font size of axis labels and tick marks independently.

  4. +
  5. Scientific Notation Toggle +- Added a disable_sci_notation parameter to enable or disable scientific notation on axes.

  6. +
  7. Improved Error Handling +- Added validation for the stat parameter to ensure valid options are accepted. +- Added checks for proper usage of fill_alpha and hist_edgecolor when fill is set to False.

  8. +
  9. General Enhancements +- Updated the function’s docstring to reflect new parameters and provide comprehensive guidance on usage.

  10. +
+
+
+

Version 0.0.1b0

+

Enhanced KDE Distributions Function

+

Added Parameters

+
    +
  1. Grid Figsize and Single Figsize +- Control the size of the overall grid figure and individual figures separately.

  2. +
  3. Hist Color and KDE Color` +- Allow customization of histogram and KDE plot colors.

  4. +
  5. Edge Color +- Allows customization of histogram bar edges.

  6. +
  7. Hue +- Allows grouping data by a column.

  8. +
  9. Fill +- Controls whether to fill histogram bars with color.

  10. +
  11. Y-axis Label` +- Customizable y-axis label.

  12. +
  13. Log-Scaling +- Specifies which variables to apply log scale.

  14. +
  15. Bins and Bin Width +- Control the number and width of bins.

  16. +
  17. ``stat``: +- Allows different statistics for the histogram (count, density, frequency, probability, proportion, percent).

  18. +
+

Improvements

+
    +
  1. Validation and Error Handling +- Checks for invalid log_scale_vars and throws a ValueError if any are found. +- Throws a ValueError if edgecolor is changed while fill is set to False. +- Issues a PerformanceWarning if both bins and binwidth are specified, warning of potential performance impacts.

  2. +
  3. Customizable Y-Axis Label +- Allows users to specify custom y-axis labels.

  4. +
  5. Warning for KDE with Count +- Issues a warning if KDE is used with stat='count', as it may produce misleading plots.

  6. +
+

Updated Function to Ensure Unique IDs and Index Check

+
    +
  • Ensured that each generated ID in add_ids starts with a non-zero digit.

  • +
  • Added a check to verify that the DataFrame index is unique.

  • +
  • Printed a warning message if duplicate index entries are found.

  • +
+

These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique.

+

Check for Unique Indices +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries.

+

Generate Non-Zero Starting IDs

+
    +
  • The ID generation process is updated to ensure that the first digit of each ID is always non-zero.

  • +
+

Ensure Unique IDs

+
    +
  • A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame.

  • +
+

Fix Int Conversion for Numeric Columns, Reset Decimal Places

+
    +
  • Fixed integer conversion issue for numeric columns when decimal_places=0 in the save_dataframes_to_excel function.

  • +
  • Reset decimal_places default value to 0.

  • +
+

These changes ensure correct formatting and avoid errors during conversion.

+

Contingency Table Updates

+
    +
  1. Error Handling for Columns +- Added a check to ensure at least one column is specified. +- Updated the function to accept a single column as a string or multiple columns as a list. +- Raised a ValueError if no columns are provided or if cols is not correctly specified.

  2. +
  3. Function Parameters +- Changed parameters from col1 and col2 to a single parameter cols which can be either a string or a list.

  4. +
  5. Error Handling +- Renamed SortBy to sort_by to standardize nomenclature. +- Added a check to ensure sort_by is either 0 or 1. +- Raised a ValueError if sort_by is not 0 or 1.

  6. +
+
    +
  1. Sorting Logic +- Updated the sorting logic to handle the new cols parameter structure.

  2. +
  3. Handling Categorical Data +- Modified code to convert categorical columns to strings to avoid issues with fillna("").

  4. +
  5. Handling Missing Values +- Added df = df.fillna('') to fill NA values within the function to account for missing data.

  6. +
  7. Improved Function Documentation +- Updated function documentation to reflect new parameters and error handling.

  8. +
+
+
+

Version 0.0.1b0

+

Contingency Table Updates

+
    +
  • fillna('') added to output so that null values come through, removed 'All' column name from output, sort options 0 and 1, updated docstring documentation. Tested successfully on Python 3.7.3.

  • +
+

Compatibility Enhancement

+
    +
  1. Added a version check for Python 3.7 and above.

    +
      +
    • Conditional import of datetime to handle different Python versions.

    • +
    +
  2. +
+
if sys.version_info >= (3, 7):
+    from datetime import datetime
+else:
+    import datetime
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.6/citations.html b/_build/html/v0.0.6/citations.html new file mode 100644 index 000000000..b70462f2c --- /dev/null +++ b/_build/html/v0.0.6/citations.html @@ -0,0 +1,148 @@ + + + + + + + + + Citing EDA Toolkit — EDA Toolkit 0.0.6 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Citing EDA Toolkit

+

Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.4). Zenodo. https://doi.org/10.5281/zenodo.13163208

+
@software{shpaner_2024_13162633,
+author       = {Shpaner, Leonid and
+                Gil, Oscar},
+title        = {EDA Toolkit},
+month        = aug,
+year         = 2024,
+publisher    = {Zenodo},
+version      = {0.0.4},W
+doi          = {10.5281/zenodo.13162633},
+url          = {https://doi.org/10.5281/zenodo.13162633}
+}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.6/genindex.html b/_build/html/v0.0.6/genindex.html new file mode 100644 index 000000000..e0f4662aa --- /dev/null +++ b/_build/html/v0.0.6/genindex.html @@ -0,0 +1,315 @@ + + + + + + + + Index — EDA Toolkit 0.0.6 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | H + | K + | P + | S + +
+

A

+ + +
+ +

B

+ + +
+ +

C

+ + +
+ +

D

+ + +
+ +

E

+ + +
+ +

H

+ + +
+ +

K

+ + +
+ +

P

+ + +
+ +

S

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.6/getting_started.html b/_build/html/v0.0.6/getting_started.html new file mode 100644 index 000000000..a0aec8eef --- /dev/null +++ b/_build/html/v0.0.6/getting_started.html @@ -0,0 +1,222 @@ + + + + + + + + + Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.6 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Welcome to the EDA Toolkit Python Library Documentation!

+
+

Note

+

This documentation is for eda_toolkit version 0.0.6.

+
+

The eda_toolkit is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data.

+ +
+

What is EDA?

+

Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data.

+
+
+

Purpose of EDA Toolkit

+

The eda_toolkit library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including:

+
    +
  • Data Management: Tools for managing directories, generating unique IDs, +standardizing dates, and handling common DataFrame manipulations.

  • +
  • Data Cleaning: Functions to address missing values, remove outliers, and +correct formatting issues, ensuring data is ready for analysis.

  • +
  • Data Visualization: A variety of plotting functions, including KDE +distribution plots, stacked bar plots, scatter plots with optional best fit +lines, and box/violin plots, to visually explore data distributions, +relationships, and trends.

  • +
  • Descriptive and Summary Statistics: Methods to generate comprehensive +reports on data types, summary statistics (mean, median, standard deviation, +etc.), and to summarize all possible combinations of specified variables.

  • +
  • Reporting and Export: Features to save DataFrames to Excel with +customizable formatting, create contingency tables, and export generated +plots in multiple formats.

  • +
+
+
+

Key Features

+
    +
  • Ease of Use: The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions.

  • +
  • Customizable: Users can customize various aspects of the toolkit to fit their specific needs.

  • +
  • Integration: Seamlessly integrates with popular data science libraries such as Pandas, NumPy, Matplotlib, and Seaborn.

  • +
  • Documentation and Examples: Comprehensive documentation and examples to help users get started quickly and effectively.

  • +
+
+
+

Prerequisites

+

Before you install eda_toolkit, ensure your system meets the following requirements:

+
    +
  • Python: version 3.7.4 or higher is required to run eda_toolkit.

  • +
+

Additionally, eda_toolkit depends on the following packages, which will be automatically installed when you install eda_toolkit:

+
    +
  • numpy: version 1.21.6 or higher

  • +
  • pandas: version 1.3.5 or higher

  • +
  • matplotlib: version 3.5.3 or higher

  • +
  • seaborn: version 0.12.2 or higher

  • +
  • jinja2: version 3.1.4 or higher

  • +
  • xlsxwriter: version 3.2.0 or higher

  • +
+
+
+

Installation

+

You can install eda_toolkit directly from PyPI:

+
pip install eda_toolkit
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.6/index.html b/_build/html/v0.0.6/index.html new file mode 100644 index 000000000..8f1731ed4 --- /dev/null +++ b/_build/html/v0.0.6/index.html @@ -0,0 +1,240 @@ + + + + + + + + + Table of Contents — EDA Toolkit 0.0.6 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Table of Contents

+ + + +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.6/objects.inv b/_build/html/v0.0.6/objects.inv new file mode 100644 index 000000000..44efb400c Binary files /dev/null and b/_build/html/v0.0.6/objects.inv differ diff --git a/_build/html/v0.0.6/references.html b/_build/html/v0.0.6/references.html new file mode 100644 index 000000000..afc00126a --- /dev/null +++ b/_build/html/v0.0.6/references.html @@ -0,0 +1,138 @@ + + + + + + + + + References — EDA Toolkit 0.0.6 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+

The eda_toolkit library

+
+

References

+
    +
  1. Hunter, J. D. (2007). Matplotlib: A 2D Graphics Environment. Computing in Science & Engineering, 9(3), 90-95. https://doi.org/10.1109/MCSE.2007.55.

  2. +
  3. Kohavi, R. (1996). Census Income. UCI Machine Learning Repository. https://doi.org/10.24432/C5GP7S.

  4. +
  5. Waskom, M. (2021). Seaborn: Statistical Data Visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021.

  6. +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.6/search.html b/_build/html/v0.0.6/search.html new file mode 100644 index 000000000..55b7f6668 --- /dev/null +++ b/_build/html/v0.0.6/search.html @@ -0,0 +1,143 @@ + + + + + + + + Search — EDA Toolkit 0.0.6 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/_build/html/v0.0.6/searchindex.js b/_build/html/v0.0.6/searchindex.js new file mode 100644 index 000000000..a6ee253bd --- /dev/null +++ b/_build/html/v0.0.6/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"About EDA Toolkit": [[4, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[6, "adding-unique-identifiers"]], "Binning Numerical Columns": [[6, "binning-numerical-columns"]], "Box Plots Grid Example": [[6, "box-plots-grid-example"]], "Box and Violin Plots": [[6, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Creating Contingency Tables": [[6, "creating-contingency-tables"]], "Data Preparation and Management": [[6, "data-preparation-and-management"]], "DataFrame Analysis": [[6, "dataframe-analysis"]], "Description": [[6, null]], "Generating Summary Tables for Variable Combinations": [[6, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[4, null]], "Highlighting Specific Columns in a DataFrame": [[6, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[6, "histogram-example-count"]], "Histogram Example (Density)": [[6, "histogram-example-density"]], "Installation": [[3, "installation"]], "KDE and Histogram Distribution Plots": [[6, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[6, "kde-and-histograms-example"]], "Key Features": [[3, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[6, "non-normalized-stacked-bar-plots-example"]], "Path directories": [[6, "path-directories"]], "Pivoted Stacked Bar Plots Example": [[6, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[6, "pivoted-violin-plots-grid-example"]], "Prerequisites": [[3, "prerequisites"]], "Project Links": [[3, "project-links"]], "Purpose of EDA Toolkit": [[3, "purpose-of-eda-toolkit"]], "References": [[5, null]], "Regression-Centric Scatter Plots Example": [[6, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[6, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[6, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Plots Grouped by Category Example": [[6, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[6, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[6, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[6, "stacked-crosstab-plots"]], "Standardized Dates": [[6, "standardized-dates"]], "Table of Contents": [[4, null]], "Trailing Period Removal": [[6, "trailing-period-removal"]], "Usage Guide": [[4, null]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id2"], [1, "id3"], [1, "id4"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Violin Plots Grid Example": [[6, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[3, null]], "What is EDA?": [[3, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "getting_started", "index", "references", "usage_guide"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "getting_started.rst", "index.rst", "references.rst", "usage_guide.rst"], "indexentries": {"add_ids()": [[6, "add_ids", false]], "box_violin_plot()": [[6, "box_violin_plot", false]], "built-in function": [[6, "add_ids", false], [6, "box_violin_plot", false], [6, "contingency_table", false], [6, "dataframe_columns", false], [6, "ensure_directory", false], [6, "highlight_columns", false], [6, "kde_distributions", false], [6, "parse_date_with_rule", false], [6, "save_dataframes_to_excel", false], [6, "scatter_fit_plot", false], [6, "stacked_crosstab_plot", false], [6, "strip_trailing_period", false], [6, "summarize_all_combinations", false]], "contingency_table()": [[6, "contingency_table", false]], "dataframe_columns()": [[6, "dataframe_columns", false]], "ensure_directory()": [[6, "ensure_directory", false]], "highlight_columns()": [[6, "highlight_columns", false]], "kde_distributions()": [[6, "kde_distributions", false]], "parse_date_with_rule()": [[6, "parse_date_with_rule", false]], "save_dataframes_to_excel()": [[6, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[6, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[6, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[6, "strip_trailing_period", false]], "summarize_all_combinations()": [[6, "summarize_all_combinations", false]]}, "objects": {"": [[6, 0, 1, "", "add_ids"], [6, 0, 1, "", "box_violin_plot"], [6, 0, 1, "", "contingency_table"], [6, 0, 1, "", "dataframe_columns"], [6, 0, 1, "", "ensure_directory"], [6, 0, 1, "", "highlight_columns"], [6, 0, 1, "", "kde_distributions"], [6, 0, 1, "", "parse_date_with_rule"], [6, 0, 1, "", "save_dataframes_to_excel"], [6, 0, 1, "", "scatter_fit_plot"], [6, 0, 1, "", "stacked_crosstab_plot"], [6, 0, 1, "", "strip_trailing_period"], [6, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 6], "0": [2, 3, 4, 6], "00": 6, "000000": 6, "0000ff": 6, "00bfc4": 6, "01": 6, "02": 6, "03021": [5, 6], "04": 6, "07": 6, "09": 6, "1": [1, 3, 6], "10": [2, 5, 6], "100": 6, "10724": 6, "11": 6, "1109": [5, 6], "111": 6, "115": 6, "11687": 6, "11th": 6, "12": [3, 6], "12202842": 6, "123": 6, "12929": 6, "13": 6, "131": 6, "13162633": 2, "13163208": 2, "13174": 6, "1348": 6, "13920": 6, "14": 6, "147": 6, "14x4": 6, "15": 6, "150": 6, "15784": 6, "16": 6, "16192": 6, "17": 6, "18": 6, "1873": 6, "19716": 6, "1994": 6, "1996": [5, 6], "1b0": 4, "1rc0": 4, "2": [3, 4, 6], "200": 6, "2007": [5, 6], "2020": 6, "2021": [5, 6], "2022": 6, "2024": 2, "203488": 6, "21": [3, 6], "21105": [5, 6], "2115": 6, "215646": 6, "22379": 6, "2245": 6, "22803": 6, "23": 6, "234721": 6, "24432": [5, 6], "24720": 6, "25": 6, "250": 6, "2509": 6, "2565": 6, "26": 6, "27": 6, "274": 6, "28": 6, "280": 6, "28523": 6, "29": 6, "295": 6, "2d": [5, 6], "3": [3, 4, 5, 6], "30": 6, "300": 6, "3021": [5, 6], "3054": 6, "31": 6, "3188": 6, "32": 6, "32650": 6, "33": 6, "333333": 6, "338409": 6, "33906": 6, "34": 6, "3461": 6, "35130194": 6, "36": 6, "3680": 6, "37": 6, "37155": 6, "38": 6, "3853": 6, "39": 6, "3986": 6, "4": [2, 3, 4, 6], "40": 6, "41": 6, "4110": 6, "41762": 6, "42": 6, "42643227": 6, "4267": 6, "43832": 6, "44807": 6, "45": 6, "46": 6, "46560": 6, "467": 6, "468": 6, "469": 6, "47": 6, "470": 6, "471": 6, "472": 6, "4746": 6, "48842": 6, "49": 6, "5": [3, 4, 6], "50": 6, "50k": 6, "50k_": 6, "51": 6, "5281": 2, "53": 6, "535": 6, "55": [5, 6], "56": 6, "5623": 6, "5707": 6, "58": 6, "5856": 6, "59": 6, "595": 6, "6": [3, 4, 5, 6], "60": [5, 6], "61": 6, "6172": 6, "62": 6, "64": 6, "65": 6, "66": 6, "6619": 6, "668": 6, "6738": 6, "69": 6, "7": [1, 3, 6], "70": 6, "71": 6, "73": 6, "74": 6, "74130842": 6, "746": 6, "75": 6, "7536": 6, "76": 6, "77": 6, "77516": 6, "79": 6, "8": 6, "80": 6, "808080": 6, "809": 6, "81": 6, "815": 6, "82": 6, "8213": 6, "82943611": 6, "83": 6, "83311": 6, "85": 6, "8601": 6, "861555": 6, "87": 6, "87104229": 6, "89": 6, "9": [5, 6], "90": [5, 6], "90069867": 6, "9076": 6, "91": 6, "93": 6, "93837254": 6, "939": 6, "94": 6, "9468": 6, "95": [5, 6], "96": 6, "96078789": 6, "963": 6, "966": 6, "97": 6, "97751875": 6, "98": 6, "99": 6, "A": [1, 3, 5, 6], "By": 6, "For": 6, "If": [1, 6], "In": 6, "It": [1, 3, 6], "No": 1, "Not": 6, "One": 1, "The": [1, 3, 5, 6], "Then": 6, "These": [1, 6], "To": 6, "With": 4, "abil": [1, 6], "abl": 6, "about": 6, "abov": [1, 6], "academ": 0, "accept": 1, "access": 6, "accord": [1, 6], "account": 1, "accur": 6, "acknowledg": [1, 4], "across": [1, 6], "actual": 6, "ad": [1, 4], "adapt": 6, "add": [1, 6], "add_best_fit_lin": 6, "add_id": [1, 4, 6], "addit": [1, 6], "addition": [3, 6], "address": [1, 3], "adher": 6, "adjust": 6, "adm": 6, "aesthet": 6, "affect": 6, "after": [1, 6], "ag": 6, "against": 6, "age_boxplot_list": 6, "age_group": 6, "ages_18_to_40": 6, "aggreg": 6, "alic": 6, "align": 6, "all": [1, 3, 6], "all_combin": 6, "allow": [1, 6], "along": [1, 6], "alpha": [1, 6], "alreadi": 6, "also": [0, 6], "altern": 6, "alwai": 1, "amount": 6, "an": [0, 1, 6], "analysi": [3, 4], "analyst": 3, "analyz": 6, "angl": 6, "ani": [1, 3, 6], "annot": 6, "anomali": 3, "anoth": 6, "anyth": 1, "appear": 6, "append": 6, "appli": [0, 1, 3, 6], "applic": 1, "appropri": 6, "ar": [1, 6], "around": 6, "arrang": 6, "artifact": 6, "asian": 6, "aspect": 3, "assess": 6, "assign": 6, "associ": 3, "assum": 6, "attempt": 6, "attract": 6, "attribut": 6, "aug": 2, "author": 2, "auto": 6, "autofit": 6, "autom": 3, "automat": [3, 6], "avail": 6, "avoid": 1, "ax": [1, 6], "axi": [1, 6], "bachelor": 6, "back": 6, "background": 6, "badg": 1, "bar": [1, 3, 4], "barh": 6, "base": [1, 6], "base_path": 6, "bbox_inch": 6, "becaus": 6, "been": [1, 6], "befor": [1, 3, 6], "being": 6, "below": 6, "beneath": 6, "best": [3, 4], "best_fit_linecolor": 6, "best_fit_linestyl": 6, "better": [3, 6], "between": [1, 6], "bin": [1, 4], "bin_ag": 6, "binrang": 6, "binwidth": [1, 6], "black": 6, "bob": 6, "bold": 6, "bool": 6, "boolean": 6, "border": 6, "both": [1, 6], "bound": 6, "box": [1, 3, 4], "box_violin_plot": [1, 4, 6], "boxplot": 6, "breakdown": 6, "broad": 3, "brown": 6, "built": 6, "c0": 6, "c5gp7": [5, 6], "calcul": 6, "call": 6, "can": [1, 3, 6], "cannot": 6, "capit": 6, "career": 0, "case": 6, "categor": [1, 6], "categori": 4, "cell": 6, "censu": [5, 6], "census_id": 6, "census_summary_t": 6, "centric": 4, "certain": 6, "certifi": 1, "chang": [1, 6], "changelog": 4, "charact": 6, "characterist": 3, "charli": 6, "check": [1, 6], "choos": [1, 6], "circl": 6, "citat": 1, "cite": 4, "civ": 6, "clariti": 6, "clean": [1, 3, 6], "cleaner": 6, "cleanup": 1, "clear": [1, 6], "cleric": 6, "code": [1, 6], "codebas": 1, "coeffici": 6, "cohes": 6, "col": [1, 6], "col1": 1, "col2": 1, "color": [1, 6], "column": [1, 4], "column_nam": 6, "combin": [3, 4], "come": 1, "comment": 1, "common": [3, 6], "compar": 6, "comparison": 6, "compat": 1, "complex": 6, "comprehens": [1, 3, 6], "comput": [5, 6], "condit": 1, "configur": 6, "confirm": 1, "confus": 6, "consist": [1, 6], "constant": 6, "contain": 6, "content": 6, "conting": [1, 3, 4], "contingency_t": [4, 6], "control": [1, 6], "convers": [1, 6], "convert": [1, 6], "correct": [1, 3, 6], "correctli": [1, 6], "correl": 6, "correspond": 6, "count": [1, 4], "countri": 6, "creat": [3, 4], "creation": 6, "crop": 6, "crosstab": [1, 4], "crosstab_age_incom": 6, "crosstab_age_sex": 6, "crosstabs_dict": 6, "crosstabs_onli": 6, "crucial": [3, 6], "current": 6, "custom": [1, 3, 4], "custom_ord": 6, "customiz": [1, 3, 6], "cut": 6, "d": [5, 6], "dai": 6, "dark": 6, "data": [0, 1, 3, 4, 5], "data_nam": 6, "data_output": 6, "data_path": 6, "data_typ": 1, "datafram": [1, 3, 4], "dataframe_column": [4, 6], "dataset": [3, 6], "date": [3, 4], "date_column": 6, "date_str": 6, "datetim": 1, "david": 6, "dd": 6, "deal": 6, "decim": [1, 6], "decimal_plac": [1, 6], "dedic": 0, "deepest": 0, "default": [1, 6], "defin": 6, "degre": 6, "demograph": 6, "demonstr": 6, "densiti": [1, 4], "depend": [3, 6], "descend": 6, "describ": 6, "descript": [1, 3, 4], "design": [3, 6], "detail": 6, "deviat": 3, "df": [1, 6], "df_censu": 6, "df_dict": 6, "dict": 6, "dictionari": 6, "did": 1, "diego": 0, "differ": [1, 6], "digit": [1, 6], "dir": 6, "direct": 6, "directli": [1, 3, 6], "directori": [3, 4], "disabl": [1, 6], "disable_sci_not": [1, 6], "discov": 3, "displai": 6, "distinguish": 6, "distribut": [1, 3, 4], "divid": 6, "divorc": 6, "do": 6, "docstr": 1, "document": [1, 4], "doe": 6, "doi": [2, 5, 6], "doubl": 6, "dr": 0, "draw": 6, "dtype": 6, "due": [1, 6], "duplic": 1, "dure": [0, 1], "e": 6, "each": [1, 6], "eas": 3, "easi": [3, 6], "easier": 6, "easili": 6, "ebrahim": 0, "eda_toolkit": [3, 5, 6], "edg": [1, 6], "edgecolor": 1, "educ": [0, 6], "effect": [3, 6], "either": [1, 6], "element": [1, 6], "els": 1, "emp": 6, "emphas": 1, "emploi": 6, "empti": 6, "enabl": [1, 3, 6], "endeavor": 0, "engin": [0, 5, 6], "enhanc": [1, 3, 6], "ensu": 6, "ensur": [1, 3, 6], "ensure_directori": [4, 6], "enter": 6, "entir": 6, "entri": [1, 6], "environ": [0, 5, 6], "equal": 6, "equat": 6, "equival": 6, "error": [1, 6], "essenti": 3, "estim": 6, "etc": 3, "ev": 6, "even": 6, "everyth": 6, "examin": 6, "exampl": [3, 4], "excel": [3, 4], "except": [0, 1], "excess": 6, "exec": 6, "execut": 6, "exist": 6, "expect": 1, "explain": 6, "explan": 1, "explicitli": 1, "explor": 3, "exploratori": 3, "export": [3, 6], "express": 0, "extend": 0, "extens": 6, "f": 1, "f8766d": 6, "f8c5c8": 6, "facilit": [3, 6], "fall": 6, "fals": [1, 6], "famili": 6, "fashion": 6, "featur": [4, 6], "feder": 6, "feedback": 1, "femal": 6, "female_": 6, "few": 6, "ff0000": 6, "figsiz": 1, "figur": [1, 6], "file": [1, 6], "file_nam": 6, "file_path": 6, "file_prefix": 6, "filenam": 6, "fill": [1, 6], "fill_alpha": [1, 6], "fillna": 1, "filter": 6, "filtered_df": 6, "financi": 6, "first": [1, 6], "fit": [1, 3, 4], "fix": 1, "flexibl": [1, 6], "flip": 6, "float": 6, "fnlwgt": 6, "focu": 6, "focus": 6, "folder": 6, "follow": [1, 3, 6], "font": [1, 6], "fontsiz": 1, "form": 3, "format": [1, 3, 4], "former": 6, "formerli": 1, "found": 1, "four": 6, "frequenc": [1, 6], "frequent": 6, "from": [0, 1, 3, 6], "full": 6, "fulli": 6, "func_col": 6, "function": [1, 3, 6], "further": 6, "futur": 6, "g": 6, "gain": [3, 6], "gener": [1, 3, 4], "get": 3, "get_text": 1, "gil": 2, "github": 3, "give": 1, "given": 6, "go": 6, "got": 1, "gov": 6, "grad": 6, "graduat": 0, "graphic": [5, 6], "gratitud": 0, "greater": 6, "green": 6, "grei": 6, "grid": [1, 4], "grid_figs": 6, "ground": 6, "group": [1, 4], "gt": 6, "guid": [0, 6], "guidanc": 1, "guidelin": 6, "h": 6, "h_pad": 6, "ha": 6, "handl": [1, 3, 6], "handler": 6, "have": [1, 6], "header": [1, 6], "height": 6, "help": [1, 3, 6], "here": 6, "hi": 0, "hidden": 6, "hide": 6, "high": 6, "higher": 3, "highlight": 4, "highlight_column": [4, 6], "highlighted_df": 6, "hist": [1, 6], "hist_color": 6, "hist_edgecolor": [1, 6], "histogram": [1, 4], "horizont": 6, "hour": 6, "how": 6, "howev": 6, "html": 6, "http": [2, 5, 6], "hue": [1, 6], "hue_dict": 6, "hue_palett": 6, "hunter": [5, 6], "husband": 6, "hyperlink": 6, "hypothes": 3, "i": [1, 4, 6], "icon": 1, "id": [1, 3, 6], "id_colnam": 6, "identifi": [3, 4], "illustr": 6, "imag": 6, "image_filenam": 6, "image_path_png": 6, "image_path_svg": 6, "impact": 1, "implement": 1, "impor": 6, "import": [1, 6], "imposs": 6, "improv": 1, "inc": 6, "inch": 6, "includ": [3, 6], "incom": [5, 6], "inconsist": [1, 6], "incorpor": 1, "incorrect": [1, 6], "independ": 1, "index": [1, 6], "indic": [1, 6], "individu": [1, 6], "individual_figs": 6, "inf": 6, "inform": 6, "initi": 3, "input": [1, 6], "insight": [3, 6], "instal": 4, "instanc": 6, "instead": [1, 6], "instruct": 6, "int": [1, 6], "int64": 6, "integ": 1, "integr": [3, 6], "interest": 6, "interfac": 6, "interpret": 6, "introduc": 1, "intuit": 3, "invalid": 1, "investig": 3, "involv": [3, 6], "io": 6, "island": 6, "iso": 6, "issu": [1, 3], "its": 6, "j": [5, 6], "jinja2": 3, "join": 6, "joss": [5, 6], "journal": [5, 6], "journei": 0, "jupyt": 6, "kde": [1, 3, 4], "kde_color": 6, "kde_density_single_distribut": 6, "kde_distribut": [1, 4, 6], "keep": 6, "kei": [1, 4, 6], "kernel": 6, "keyerror": 6, "kind": 6, "kohavi": [5, 6], "l": 2, "label": [1, 6], "label_ag": 6, "label_fonts": [1, 6], "largest": 6, "last": 6, "layout": 6, "lead": 6, "learn": [0, 3, 5, 6], "least": [1, 6], "left": 6, "legend": [1, 6], "legend_label": 6, "legend_labels_list": 6, "legibl": 6, "length": 6, "leonid": 2, "less": 6, "level": 6, "leverag": 6, "librari": [1, 4, 5, 6], "licens": 1, "like": [0, 6], "limit": [1, 6], "line": [3, 4], "linear": 6, "linestyl": 6, "link": 4, "list": [1, 6], "load": 6, "local": 6, "locat": 6, "log": [1, 6], "log_scale_var": [1, 6], "logarithm": 6, "logic": [1, 6], "logo": 1, "logscal": 6, "longer": 6, "loop": 6, "loss": 6, "lower": 1, "lt": 6, "m": [0, 5, 6], "machin": [3, 5, 6], "made": 1, "magnitud": 6, "mai": [1, 6], "main": 3, "maintain": 6, "make": 6, "male": 6, "male_": 6, "manag": [3, 4], "manageri": 6, "mani": [3, 6], "manipul": 3, "map": 6, "marco": 0, "marit": 6, "mark": [1, 6], "marker": 6, "marri": 6, "match": [1, 6], "matplotlib": [3, 5, 6], "max": 6, "max_unique_valu": 6, "max_unique_value_pct": 6, "max_unique_value_tot": 6, "maximum": 6, "mcse": [5, 6], "mean": [3, 6], "meaning": 6, "measur": 6, "median": 3, "meet": 3, "mentor": 0, "mentorship": 0, "messag": 1, "method": [3, 6], "metric": 6, "metrics_box_violin": 1, "metrics_boxplot_comp": 6, "metrics_list": 6, "min": 6, "min_length": 6, "mind": 3, "minim": [1, 6], "minimum": 6, "minor": 1, "misalign": 6, "misinterpret": 6, "mislead": [1, 6], "miss": [1, 3, 6], "mm": 6, "mode": 6, "model": [3, 6], "modifi": [1, 6], "month": [2, 6], "more": [1, 6], "most": 6, "move": 1, "multipl": [1, 3, 6], "must": 6, "n_col": 6, "n_row": 6, "na": [1, 6], "name": [1, 6], "nativ": 6, "navig": 6, "necessari": [1, 6], "need": [3, 6], "never": 6, "new": [1, 6], "next": 6, "nomenclatur": 1, "non": [1, 4], "none": 6, "normal": [1, 4], "notat": [1, 6], "note": 6, "notebook": 6, "noth": 6, "now": 1, "null": [1, 6], "null_pct": 6, "null_tot": 6, "num": 6, "num_digit": 6, "number": [1, 6], "numer": [1, 4], "numpi": 3, "o": [2, 6], "object": 6, "observ": 6, "occup": 6, "occurr": 6, "offer": [3, 6], "often": [3, 6], "one": [1, 6], "onli": [1, 6], "opaqu": 6, "open": [5, 6], "oper": 6, "option": [1, 3, 6], "orang": 6, "order": 6, "org": [2, 5, 6], "organ": 6, "orient": 6, "origin": 6, "original_df": 6, "oscar": 2, "other": [1, 6], "otherwis": 6, "our": 0, "out": 6, "outlier": 3, "output": [1, 6], "over": 6, "overal": [1, 6], "overlai": 6, "overlaid": 6, "overrid": 6, "own": 6, "p": 6, "pac": 6, "packag": 3, "pad": 6, "page": 3, "pair": 6, "palett": 6, "panda": [3, 6], "param": 1, "paramet": [1, 6], "pardir": 6, "parent": 6, "pars": 6, "parse_date_with_rul": [4, 6], "part": 6, "particular": 6, "particularli": 6, "pass": 6, "path": 4, "patient": 6, "pattern": [3, 6], "pd": 6, "pearson": 6, "per": 6, "percent": [1, 6], "percentag": 6, "perform": [1, 6], "performancewarn": 1, "period": 4, "perspect": 6, "pink": 6, "pip": 3, "pivot": [0, 4], "place": [1, 6], "plai": 0, "plot": [1, 3, 4], "plot_typ": [1, 6], "plots_onli": 6, "plt": 1, "png": 6, "png_imag": 6, "point": 6, "popular": 3, "possibl": [3, 6], "potenti": [1, 6], "power": 6, "pr": 1, "preced": 6, "prefer": 6, "prefix": 6, "prepar": 4, "prerequisit": 4, "present": 6, "preval": 6, "prevent": [1, 6], "previou": 6, "print": [1, 6], "prior": 6, "privat": 6, "probabl": [1, 6], "process": [1, 3, 6], "produc": [1, 6], "prof": 6, "program": 0, "project": [1, 4, 6], "proper": [1, 6], "properli": 6, "proport": [1, 6], "provid": [0, 1, 3, 6], "public": 6, "publish": 2, "purpos": 4, "pursu": 0, "py": 1, "pypi": 3, "python": [1, 4], "qualiti": [3, 6], "quantit": 6, "quick": 6, "quickli": 3, "r": [5, 6], "race": 6, "rais": [1, 6], "random": 6, "rang": [3, 6], "raw": 6, "re": 1, "read": 6, "readabl": [1, 6], "readi": 3, "readm": 1, "record": 6, "red": 6, "refer": [4, 6], "refin": 1, "reflect": [1, 6], "regress": 4, "regular": [1, 4], "relat": 6, "relationship": [3, 6], "releas": 1, "relev": 3, "reli": 6, "remain": 6, "remov": [1, 3, 4], "remove_stack": [1, 6], "renam": 1, "render": 6, "replac": 6, "report": [3, 6], "repositori": [3, 5, 6], "repres": 6, "represent": 6, "reproduc": 6, "requir": [1, 3, 6], "research": 3, "reset": 1, "respect": 6, "rest": 6, "result": 6, "return": 6, "return_dict": 6, "rich": 6, "right": 6, "robust": 1, "role": 0, "rot": 6, "rotat": 6, "rotate_plot": 6, "round": 6, "row": 6, "rule": 6, "run": 3, "same": 6, "sampl": 6, "san": 0, "save": [3, 4], "save_dataframes_to_excel": [1, 4, 6], "save_format": 6, "save_plot": 6, "scale": [1, 6], "scatter": [1, 3, 4], "scatter_color": 6, "scatter_fit_plot": [1, 4, 6], "scenario": 6, "schema": 6, "scheme": 6, "school": 0, "scienc": [0, 3, 5, 6], "scientif": [1, 6], "scientist": [0, 3], "seaborn": [3, 5, 6], "seamlessli": 3, "second": 6, "section": [1, 6], "see": 6, "seed": 6, "select": 6, "self": 6, "separ": [1, 6], "sequenc": 6, "set": [1, 6], "set_as_index": 6, "set_titl": 1, "setp": 1, "setup": [1, 6], "sever": 6, "sex": 6, "shape": 6, "sheet": 6, "shilei": 0, "show": 6, "show_correl": 6, "show_legend": 6, "show_plot": 6, "shown": 6, "shpaner": 2, "shpaner_2024_13162633": 2, "similarli": 6, "simplic": 3, "sinc": 6, "singl": [1, 6], "single_figs": 6, "single_var_image_filenam": 6, "single_var_image_path_png": 6, "single_var_image_path_svg": 6, "size": [1, 6], "smallest": 6, "smooth": 6, "snippet": 6, "so": [1, 6], "softwar": [2, 5, 6], "some": 6, "sort": [1, 6], "sort_bi": [1, 6], "sortbi": 1, "sourc": [5, 6], "space": 6, "span": 6, "special": 6, "specialti": 6, "specif": [1, 3, 4], "specifi": [1, 3, 6], "spous": 6, "squar": 6, "stabl": 1, "stack": [1, 3, 4], "stacked_crosstab": 6, "stacked_crosstab_plot": [1, 4, 6], "standard": [1, 3, 4], "standardized_d": 6, "start": [1, 3, 6], "stat": [1, 6], "state": 6, "statist": [1, 3, 5, 6], "statu": 6, "step": [1, 3], "still": 6, "store": 1, "str": 6, "streamlin": 3, "strength": 6, "string": [1, 6], "strip": 6, "strip_trailing_period": [4, 6], "structur": [1, 3], "style": 6, "styler": 6, "subplot": 6, "success": 0, "successfulli": [0, 1], "suit": 3, "summar": 3, "summari": [3, 4], "summarize_all_combin": [4, 6], "summary_t": 6, "support": [0, 1, 6], "suppress": 6, "sure": 6, "svg": 6, "svg_imag": 6, "sy": 1, "system": [3, 6], "tab": 6, "tabl": [1, 3], "tailor": 6, "take": 6, "tall": 6, "tarshizi": 0, "task": [3, 6], "techniqu": 3, "test": 1, "text": [1, 6], "text_wrap": [1, 6], "than": [1, 6], "thank": 0, "thei": 6, "them": [1, 6], "therefor": 6, "thi": [1, 3, 6], "three": 6, "through": 1, "throw": 1, "thu": 6, "tick": [1, 6], "tick_fonts": [1, 6], "tight": 6, "time": [0, 1, 6], "titl": [1, 2, 6], "to_list": 6, "toggl": [1, 6], "tool": [3, 6], "top": 6, "total": 6, "trail": 4, "transpar": [1, 6], "trend": [3, 6], "true": [1, 6], "truth": 6, "tupl": 6, "two": 6, "type": [1, 3, 6], "u": [0, 6], "uci": [5, 6], "unambigu": 6, "uncov": 3, "underli": 3, "understand": [3, 6], "uniform": 1, "uniqu": [1, 3, 4], "unique_values_tot": 6, "unique_var": 6, "unit": 6, "univers": 0, "unrecogn": 6, "unstack": 6, "unus": 1, "unwav": 0, "up": [1, 6], "updat": [1, 6], "upright": 6, "url": 2, "us": [1, 3, 6], "usag": [1, 6], "user": [1, 3, 6], "userwarn": 6, "util": [3, 6], "valid": 1, "valid_plot_typ": 1, "valu": [1, 3, 6], "valueerror": [1, 6], "vari": 6, "variabl": [1, 3, 4], "varieti": 3, "variou": [1, 3, 6], "vars_of_interest": 6, "verbiag": 1, "verifi": [1, 6], "versatil": 6, "version": [2, 3, 4, 6], "version_info": 1, "vertic": 6, "via": 6, "view": 6, "violin": [1, 3, 4], "violinplot": 6, "visual": [3, 5, 6], "vriabl": 6, "w": 2, "w_pad": 6, "wa": 6, "warn": 1, "waskom": [5, 6], "we": [0, 6], "week": 6, "welcom": 4, "well": 6, "were": 6, "what": 4, "when": [1, 3, 6], "where": 6, "whether": [1, 6], "which": [1, 3, 6], "while": [1, 6], "white": 6, "whitespac": 6, "wide": 6, "width": [1, 6], "wife": 6, "within": [1, 6], "without": 6, "work": [1, 6], "workclass": 6, "workflow": 3, "would": [0, 6], "wrap": [1, 6], "write": 6, "x": [1, 6], "x_var": 6, "xlabel": 6, "xlabel_rot": 6, "xlim": [1, 6], "xlsx": 6, "xlsxwriter": 3, "y": [1, 6], "y_axis_label": 6, "y_var": 6, "year": [2, 6], "yellow": 6, "ylabel": 6, "ylim": [1, 6], "you": [3, 6], "your": [3, 6], "yyyi": 6, "zenodo": [1, 2], "zero": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References", "Description"], "titleterms": {"0": 1, "1b0": 1, "1rc0": 1, "2": 1, "3": 1, "4": 1, "5": 1, "6": 1, "With": 6, "about": 4, "acknowledg": 0, "ad": 6, "analysi": 6, "bar": 6, "best": 6, "bin": 6, "box": 6, "categori": 6, "centric": 6, "changelog": 1, "cite": 2, "column": 6, "combin": 6, "content": 4, "conting": 6, "count": 6, "creat": 6, "crosstab": 6, "custom": 6, "data": 6, "datafram": 6, "date": 6, "densiti": 6, "descript": 6, "directori": 6, "distribut": 6, "document": 3, "eda": [2, 3, 4], "exampl": 6, "excel": 6, "featur": 3, "fit": 6, "format": 6, "gener": 6, "get": 4, "grid": 6, "group": 6, "guid": 4, "highlight": 6, "histogram": 6, "i": 3, "identifi": 6, "instal": 3, "kde": 6, "kei": 3, "librari": 3, "line": 6, "link": 3, "manag": 6, "non": 6, "normal": 6, "numer": 6, "path": 6, "period": 6, "pivot": 6, "plot": 6, "prepar": 6, "prerequisit": 3, "project": 3, "purpos": 3, "python": 3, "refer": 5, "regress": 6, "regular": 6, "remov": 6, "save": 6, "scatter": 6, "specif": 6, "stack": 6, "standard": 6, "start": 4, "summari": 6, "tabl": [4, 6], "toolkit": [2, 3, 4], "trail": 6, "uniqu": 6, "usag": 4, "variabl": 6, "version": 1, "violin": 6, "welcom": 3, "what": 3}}) \ No newline at end of file diff --git a/_build/html/v0.0.6/usage_guide.html b/_build/html/v0.0.6/usage_guide.html new file mode 100644 index 000000000..3c801e9e3 --- /dev/null +++ b/_build/html/v0.0.6/usage_guide.html @@ -0,0 +1,2465 @@ + + + + + + + + + Description — EDA Toolkit 0.0.6 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Description

+

This guide provides detailed instructions and examples for using the functions +provided in the eda_toolkit library and how to use them effectively in your projects.

+

For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [1]. This dataset provides a rich source of +information for demonstrating the functionalities of the eda_toolkit.

+
+
+

Data Preparation and Management

+
+

Path directories

+

Ensure that the directory exists. If not, create it.

+
+
+ensure_directory(path)
+
+
Parameters:
+

path (str) – The path to the directory that needs to be ensured.

+
+
Returns:
+

None

+
+
+
+ +

The ensure_directory function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories.

+

Example Usage

+

In the example below, we demonstrate how to use the ensure_directory function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them.

+

First, we define the base path as the parent directory of the current directory. +The os.pardir constant, equivalent to ".."", is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory.

+

Next, we set paths for the PNG and SVG image directories, located within an +images folder in the parent directory. Using the ensure_directory +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them.

+
from eda_toolkit import ensure_directory
+
+import os # import operating system for dir
+
+
+base_path = os.path.join(os.pardir)
+
+# Go up one level from 'notebooks' to parent directory,
+# then into the 'data' folder
+data_path = os.path.join(os.pardir, "data")
+data_output = os.path.join(os.pardir, "data_output")
+
+# create image paths
+image_path_png = os.path.join(base_path, "images", "png_images")
+image_path_svg = os.path.join(base_path, "images", "svg_images")
+
+# Use the function to ensure'data' directory exists
+ensure_directory(data_path)
+ensure_directory(data_output)
+ensure_directory(image_path_png)
+ensure_directory(image_path_svg)
+
+
+

Output

+
Created directory: ../data
+Created directory: ../data_output
+Created directory: ../images/png_images
+Created directory: ../images/svg_images
+
+
+
+
+

Adding Unique Identifiers

+

Add a column of unique IDs with a specified number of digits to the dataframe.

+
+
+add_ids(df, id_colname='ID', num_digits=9, seed=None, set_as_index=True)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The dataframe to add IDs to.

  • +
  • id_colname (str) – The name of the new column for the IDs.

  • +
  • num_digits (int) – The number of digits for the unique IDs.

  • +
  • seed (int, optional) – The seed for the random number generator. Defaults to None.

  • +
  • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

  • +
+
+
Returns:
+

The updated dataframe with the new ID column.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +

The add_ids function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe.

+

Example Usage

+

In the example below, we demonstrate how to use the add_ids function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the add_ids function to generate +and append a column of unique IDs with a specified number of digits to the dataframe.

+

First, we import the pandas library and the add_ids function from the eda_toolkit. +Then, we create a sample dataframe with some data. We call the add_ids function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe.

+
from eda_toolkit import add_ids
+
+# Add a column of unique IDs with 9 digits and call it "census_id"
+df = add_ids(
+    df=df,
+    id_colname="census_id",
+    num_digits=9,
+    seed=111,
+    set_as_index=True,
+)
+
+
+

Output

+

First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
DataFrame index is unique.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+

+
+
+

Trailing Period Removal

+

Strip the trailing period from floats in a specified column of a DataFrame, if present.

+
+
+strip_trailing_period(df, column_name)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The DataFrame containing the column to be processed.

  • +
  • column_name (str) – The name of the column containing floats with potential trailing periods.

  • +
+
+
Returns:
+

The updated DataFrame with the trailing periods removed from the specified column.

+
+
Return type:
+

pd.DataFrame

+
+
+

The strip_trailing_period function is designed to remove trailing periods +from float values in a specified column of a DataFrame. This can be particularly +useful when dealing with data that has been inconsistently formatted, ensuring +that all float values are correctly represented.

+
+ +

Example Usage

+

In the example below, we demonstrate how to use the strip_trailing_period function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the strip_trailing_period function to remove any trailing periods from the specified column.

+
from eda_toolkit import strip_trailing_period
+
+# Create a sample dataframe with trailing periods in some values
+data = {
+    "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.],
+}
+df = pd.DataFrame(data)
+
+# Remove trailing periods from the 'values' column
+df = strip_trailing_period(df=df, column_name="values")
+
+
+

Output

+

First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)

+ + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +

+

Note: The last row shows 6 as an int with a trailing period with its conversion to float.

+

+
+
+

Standardized Dates

+

Parse and standardize date strings based on the provided rule.

+
+
+parse_date_with_rule(date_str)
+

This function takes a date string and standardizes it to the ISO 8601 format +(YYYY-MM-DD). It assumes dates are provided in either day/month/year or +month/day/year format. The function first checks if the first part of the +date string (day or month) is greater than 12, which unambiguously indicates +a day/month/year format. If the first part is 12 or less, the function +attempts to parse the date as month/day/year, falling back to day/month/year +if the former raises a ValueError due to an impossible date (e.g., month +being greater than 12).

+
+
Parameters:
+

date_str (str) – A date string to be standardized.

+
+
Returns:
+

A standardized date string in the format YYYY-MM-DD.

+
+
Return type:
+

str

+
+
Raises:
+

ValueError – If date_str is in an unrecognized format or if the function +cannot parse the date.

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the parse_date_with_rule +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the parse_date_with_rule +function to parse and standardize each date string to the ISO 8601 format.

+
from eda_toolkit import parse_date_with_rule
+
+# Sample date strings
+date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"]
+
+# Standardize the date strings
+standardized_dates = [parse_date_with_rule(date) for date in date_strings]
+
+print(standardized_dates)
+
+
+

Output

+
['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12']
+
+
+
+

Important

+

In the next example, we demonstrate how to apply the parse_date_with_rule +function to a DataFrame column containing date strings using the .apply() method. +This is particularly useful when you need to standardize date formats across an +entire column in a DataFrame.

+
+
# Creating the DataFrame
+data = {
+    "date_column": [
+        "31/12/2021",
+        "01/01/2022",
+        "12/31/2021",
+        "13/02/2022",
+        "07/04/2022",
+    ],
+    "name": ["Alice", "Bob", "Charlie", "David", "Eve"],
+    "amount": [100.0, 150.5, 200.75, 250.25, 300.0],
+}
+
+df = pd.DataFrame(data)
+
+# Apply the function to the DataFrame column
+df["standardized_date"] = df["date_column"].apply(parse_date_with_rule)
+
+print(df)
+
+
+

Output

+
   date_column     name  amount standardized_date
+0   31/12/2021    Alice  100.00        2021-12-31
+1   01/01/2022      Bob  150.50        2022-01-01
+2   12/31/2021  Charlie  200.75        2021-12-31
+3   13/02/2022    David  250.25        2022-02-13
+4   07/04/2022      Eve  300.00        2022-04-07
+
+
+
+
+

DataFrame Analysis

+

Analyze DataFrame columns, including dtype, null values, and unique value counts.

+
+
+dataframe_columns(df)
+

This function analyzes the columns of a DataFrame, providing details about the data type, +the number and percentage of null values, the total number of unique values, and the most +frequent unique value along with its count and percentage. It handles special cases such as +converting date columns and replacing empty strings with Pandas NA values.

+
+
Parameters:
+

df (pandas.DataFrame) – The DataFrame to analyze.

+
+
Returns:
+

A DataFrame with the analysis results for each column.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the dataframe_columns +function to analyze a DataFrame’s columns.

+
from eda_toolkit import dataframe_columns
+
+dataframe_columns(df=df)
+
+
+

Output

+

Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
Shape:  (48842, 16)
+
+Total seconds of processing time: 0.861555
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+

+
+
+

Generating Summary Tables for Variable Combinations

+

This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.

+
+
+summarize_all_combinations(df, variables, data_path, data_name, min_length=2)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The pandas DataFrame containing the data.

  • +
  • variables (list) – List of unique variables to generate combinations.

  • +
  • data_path (str) – Path where the output Excel file will be saved.

  • +
  • data_name (str) – Name of the output Excel file.

  • +
  • min_length (int) – Minimum length of combinations to generate. Defaults to 2.

  • +
+
+
Returns:
+

A dictionary of summary tables and a list of all generated combinations.

+
+
Return type:
+

tuple(dict, list)

+
+
+
+ +

The function returns two outputs:

+

1. summary_tables: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values.

+

2. all_combinations: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables.

+

Example Usage

+

Below, we use the summarize_all_combinations function to generate summary tables for the specified +variables from a DataFrame containing the census data [1].

+
from eda_toolkit import summarize_all_combinations
+
+# Define unique variables for the analysis
+unique_vars = [
+    "age_group",
+    "workclass",
+    "education",
+    "occupation",
+    "race",
+    "sex",
+    "income",
+]
+
+# Generate summary tables for all combinations of the specified variables
+summary_tables, all_combinations = summarize_all_combinations(
+    df=df,
+    data_path=data_output,
+    variables=unique_vars,
+    data_name="census_summary_tables.xlsx",
+)
+
+# Print all combinations of variables
+print(all_combinations)
+
+
+

Output

+
[('age_group', 'workclass'),
+('age_group', 'education'),
+('age_group', 'occupation'),
+('age_group', 'race'),
+('age_group', 'sex'),
+('age_group', 'income'),
+('workclass', 'education'),
+('workclass', 'occupation'),
+('workclass', 'race'),
+('workclass', 'sex'),
+('workclass', 'income'),
+('education', 'occupation'),
+('education', 'race'),
+('education', 'sex'),
+('education', 'income'),
+('occupation', 'race'),
+('occupation', 'sex'),
+('occupation', 'income'),
+('race', 'sex'),
+('race', 'income'),
+('sex', 'income'),
+('age_group', 'workclass', 'education'),
+('age_group', 'workclass', 'occupation'),
+('age_group', 'workclass', 'race'),
+('age_group', 'workclass', 'sex'),
+('age_group', 'workclass', 'income'),
+('age_group', 'education', 'occupation'),
+('age_group', 'education', 'race'),
+('age_group', 'education', 'sex'),
+('age_group', 'education', 'income'),
+('age_group', 'occupation', 'race'),
+('age_group', 'occupation', 'sex'),
+('age_group', 'occupation', 'income'),
+('age_group', 'race', 'sex'),
+('age_group', 'race', 'income'),
+('age_group', 'sex', 'income'),
+('workclass', 'education', 'occupation'),
+('workclass', 'education', 'race'),
+('workclass', 'education', 'sex'),
+('workclass', 'education', 'income'),
+('workclass', 'occupation', 'race'),
+('workclass', 'occupation', 'sex'),
+('workclass', 'occupation', 'income'),
+('workclass', 'race', 'sex'),
+('workclass', 'race', 'income'),
+('workclass', 'sex', 'income'),
+('education', 'occupation', 'race'),
+('education', 'occupation', 'sex'),
+('education', 'occupation', 'income'),
+('education', 'race', 'sex'),
+('education', 'race', 'income'),
+('education', 'sex', 'income'),
+('occupation', 'race', 'sex'),
+('occupation', 'race', 'income'),
+('occupation', 'sex', 'income'),
+('race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation'),
+('age_group', 'workclass', 'education', 'race'),
+('age_group', 'workclass', 'education', 'sex'),
+('age_group', 'workclass', 'education', 'income'),
+('age_group', 'workclass', 'occupation', 'race'),
+('age_group', 'workclass', 'occupation', 'sex'),
+('age_group', 'workclass', 'occupation', 'income'),
+('age_group', 'workclass', 'race', 'sex'),
+('age_group', 'workclass', 'race', 'income'),
+('age_group', 'workclass', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race'),
+('age_group', 'education', 'occupation', 'sex'),
+('age_group', 'education', 'occupation', 'income'),
+('age_group', 'education', 'race', 'sex'),
+('age_group', 'education', 'race', 'income'),
+('age_group', 'education', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex'),
+('age_group', 'occupation', 'race', 'income'),
+('age_group', 'occupation', 'sex', 'income'),
+('age_group', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race'),
+('workclass', 'education', 'occupation', 'sex'),
+('workclass', 'education', 'occupation', 'income'),
+('workclass', 'education', 'race', 'sex'),
+('workclass', 'education', 'race', 'income'),
+('workclass', 'education', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex'),
+('workclass', 'occupation', 'race', 'income'),
+('workclass', 'occupation', 'sex', 'income'),
+('workclass', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex'),
+('education', 'occupation', 'race', 'income'),
+('education', 'occupation', 'sex', 'income'),
+('education', 'race', 'sex', 'income'),
+('occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race'),
+('age_group', 'workclass', 'education', 'occupation', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'race', 'income'),
+('age_group', 'workclass', 'education', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'education', 'occupation', 'race', 'income'),
+('age_group', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'education', 'race', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex'),
+('workclass', 'education', 'occupation', 'race', 'income'),
+('workclass', 'education', 'occupation', 'sex', 'income'),
+('workclass', 'education', 'race', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex', 'income'),
+('age_group',
+'workclass',
+'education',
+'occupation',
+'race',
+'sex',
+'income')]
+
+
+

When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table.

+
EDA Toolkit Logo + +
+
+

Saving DataFrames to Excel with Customized Formatting

+

Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.

+

This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the save_dataframes_to_excel function.

+
+
+save_dataframes_to_excel(file_path, df_dict, decimal_places=0)
+
+
Parameters:
+
    +
  • file_path (str) – Full path to the output Excel file.

  • +
  • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

  • +
  • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

  • +
+
+
Notes:
+
    +
  • The function will autofit columns and left-align text.

  • +
  • Numeric columns will be formatted with the specified number of decimal places.

  • +
  • Headers will be bold and left-aligned without borders.

  • +
+
+
+
+ +

The function performs the following tasks:

+
    +
  • Writes each DataFrame to its respective sheet in the Excel file.

  • +
  • Rounds numeric columns to the specified number of decimal places.

  • +
  • Applies customized formatting to headers and cells.

  • +
  • Autofits columns based on the content length.

  • +
+

Example Usage

+

Below, we use the save_dataframes_to_excel function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between 18 and 40.

+
from eda_toolkit import save_dataframes_to_excel
+
+# Example usage
+file_name = "df_census.xlsx"  # Name of the output Excel file
+file_path = os.path.join(data_path, file_name)
+
+# filter DataFrame to Ages 18-40
+filtered_df = df[(df["age"] > 18) & (df["age"] < 40)]
+
+df_dict = {
+    "original_df": df,
+    "ages_18_to_40": filtered_df,
+}
+
+save_dataframes_to_excel(
+    file_path=file_path,
+    df_dict=df_dict,
+    decimal_places=0,
+)
+
+
+

Output

+

The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between 18 and 40, each on separate sheets with customized formatting.

+
+
+

Creating Contingency Tables

+

Create a contingency table from one or more columns in a DataFrame, with sorting options.

+

This section explains how to create contingency tables from one or more columns in a DataFrame using the contingency_table function.

+
+
+contingency_table(df, cols=None, sort_by=0)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • cols (str or list, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

  • +
  • sort_by (int) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order.

  • +
+
+
Raises:
+

ValueError – If no columns are specified or if sort_by is not 0 or 1.

+
+
Returns:
+

A DataFrame with the specified columns, 'Total', and 'Percentage'.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

Below, we use the contingency_table function to create a contingency table +from the specified columns in a DataFrame containing census data [1]

+
from eda_toolkit import contingency_table
+
+# Example usage
+contingency_table(
+    df=df,
+    cols=[
+        "age_group",
+        "workclass",
+        "race",
+        "sex",
+    ],
+    sort_by=1,
+)
+
+
+

Output

+

The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the 'Total' column in descending order because sort_by +is set to 1.

+
    age_group     workclass                race     sex  Total  Percentage
+0       30-39       Private               White    Male   5856       11.99
+1       18-29       Private               White    Male   5623       11.51
+2       40-49       Private               White    Male   4267        8.74
+3       18-29       Private               White  Female   3680        7.53
+4       50-59       Private               White    Male   2565        5.25
+..        ...           ...                 ...     ...    ...         ...
+467     50-59   Federal-gov               Other    Male      1        0.00
+468     50-59     Local-gov  Asian-Pac-Islander  Female      1        0.00
+469     70-79  Self-emp-inc               Black    Male      1        0.00
+470     80-89     Local-gov  Asian-Pac-Islander    Male      1        0.00
+471                                                      48842      100.00
+
+[472 rows x 6 columns]
+
+
+

+
+
+

Highlighting Specific Columns in a DataFrame

+

This section explains how to highlight specific columns in a DataFrame using the highlight_columns function.

+

Highlight specific columns in a DataFrame with a specified background color.

+
+
+highlight_columns(df, columns, color='yellow')
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to be styled.

  • +
  • columns (list of str) – List of column names to be highlighted.

  • +
  • color (str, optional) – The background color to be applied for highlighting (default is “yellow”).

  • +
+
+
Returns:
+

A Styler object with the specified columns highlighted.

+
+
Return type:
+

pandas.io.formats.style.Styler

+
+
+
+ +

Example Usage

+

Below, we use the highlight_columns function to highlight the age and education +columns in the first 5 rows of the census [1] DataFrame with a pink background color.

+
from eda_toolkit import highlight_columns
+
+# Applying the highlight function
+highlighted_df = highlight_columns(
+    df=df,
+    columns=["age", "education"],
+    color="#F8C5C8",
+)
+
+highlighted_df
+
+
+

Output

+

The output will be a DataFrame with the specified columns highlighted in the given background color. +The age and education columns will be highlighted in pink.

+

The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the .render() method of the Styler object.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife

+
+
+

Binning Numerical Columns

+

If your DataFrame (e.g., the census data [1]) +does not have age or any other numerical column of interest binned, you can +apply the following binning logic to categorize the data. Below, we use the age +column from the UCI Machine Learning Repository as an example:

+
# Create age bins so that the ages can be categorized
+bin_ages = [
+    0,
+    18,
+    30,
+    40,
+    50,
+    60,
+    70,
+    80,
+    90,
+    100,
+    float("inf"),
+]
+
+# Create labels for the bins
+label_ages = [
+    "< 18",
+    "18-29",
+    "30-39",
+    "40-49",
+    "50-59",
+    "60-69",
+    "70-79",
+    "80-89",
+    "90-99",
+    "100 +",
+]
+
+# Categorize the ages and assign to a new variable
+df["age_group"] = pd.cut(
+    df["age"],
+    bins=bin_ages,
+    labels=label_ages,
+    right=False,
+)
+
+
+

Note: This code snippet creates age bins and assigns a corresponding age group +label to each age in the DataFrame. The pd.cut function from pandas is used to +categorize the ages and assign them to a new column, age_group. Adjust the bins +and labels as needed for your specific data.

+
+
+
+

KDE and Histogram Distribution Plots

+

Generate KDE or histogram distribution plots for specified columns in a DataFrame.

+

The kde_distributions function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2] for plotting, which is built on top of +matplotlib [3] and provides a high-level interface for drawing attractive and informative +statistical graphics.

+

Key Features and Parameters

+
    +
  • Flexible Plotting: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively.

  • +
  • Leverages Seaborn Library: The function is built on the seaborn library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code.

  • +
  • Customization: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs.

  • +
  • Scientific Notation Control: The function allows disabling scientific notation on the axes, providing better readability for certain types of data.

  • +
  • Log Scaling: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude.

  • +
  • Output Options: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations.

  • +
+
+
+kde_distributions(df, vars_of_interest=None, grid_figsize=(10, 8), single_figsize=(6, 4), kde=True, hist_color='#0000FF', kde_color='#FF0000', hist_edgecolor='#000000', hue=None, fill=True, fill_alpha=1, n_rows=1, n_cols=1, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_path_png=None, single_var_image_path_svg=None, single_var_image_filename=None, y_axis_label='Density', plot_type='both', log_scale_vars=None, bins='auto', binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat='density', xlim=None, ylim=None)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots.

  • +
  • grid_figsize (tuple, optional) – Size of the overall grid figure, default is (10, 8).

  • +
  • single_figsize (tuple, optional) – Size of individual figures for each variable, default is (6, 4).

  • +
  • kde (bool, optional) – Whether to include KDE plots on the histograms, default is True.

  • +
  • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

  • +
  • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

  • +
  • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

  • +
  • hue (str, optional) – Column name to group data by, adding different colors for each group.

  • +
  • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

  • +
  • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where +0 is fully transparent and 1 is fully opaque. Default is 1.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid, default is 1.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid, default is 1.

  • +
  • w_pad (float, optional) – Width padding between subplots, default is 1.0.

  • +
  • h_pad (float, optional) – Height padding between subplots, default is 1.0.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

  • +
  • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

  • +
  • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

  • +
  • single_var_image_path_png (str, optional) – Directory path to save the PNG images of the separate distribution plots.

  • +
  • single_var_image_path_svg (str, optional) – Directory path to save the SVG images of the separate distribution plots.

  • +
  • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. +The variable name will be appended to this filename.

  • +
  • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

  • +
  • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

  • +
  • log_scale_vars (list of str, optional) – List of variable names to apply log scaling.

  • +
  • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

  • +
  • binwidth (number or pair of numbers, optional) – Width of each bin, overrides bins but can be used with binrange.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels, default is 10.

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

  • +
  • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

  • +
  • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', +'probability', 'percent', 'density'), default is 'density'.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If plot_type is not one of 'hist', 'kde', or 'both'.

    • +
    • If stat is not one of 'count', 'density', 'frequency', 'probability', 'proportion', 'percent'.

    • +
    • If log_scale_vars contains variables that are not present in the DataFrame.

    • +
    • If fill is set to False and hist_edgecolor is not the default.

    • +
    +

  • +
  • UserWarning

      +
    • If stat is set to ‘count’ while kde is True, as it may produce misleading plots.

    • +
    • If both bins and binwidth are specified, which may affect performance.

    • +
    +

  • +
+
+
Returns:
+

None

+
+
+
+ +

+
+

KDE and Histograms Example

+

In the below example, the kde_distributions function is used to generate +histograms for several variables of interest: "age", "education-num", and +"hours-per-week". These variables represent different demographic and +financial attributes from the dataset. The kde=True parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data’s probability density.

+

The visualizations are arranged in a single row of four columns, as specified +by n_rows=1 and n_cols=3, respectively. The overall size of the grid +figure is set to 14 inches wide and 4 inches tall (grid_figsize=(14, 4)), +while each individual plot is configured to be 4 inches by 4 inches +(single_figsize=(4, 4)). The fill=True parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +w_pad=1 and h_pad=1, which add 1 inch of padding both horizontally and +vertically.

+

To handle longer titles, the text_wrap=50 parameter ensures that the title +text wraps to a new line after 50 characters. The bbox_inches="tight" setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in vars_of_interest are +passed directly to the function for visualization.

+

Each plot is saved individually with filenames that are prefixed by +"kde_density_single_distribution", followed by the variable name. The `y-axis` +for all plots is labeled as “Density” (y_axis_label="Density"), reflecting that +the height of the bars or KDE line represents the data’s density. The histograms +are divided into 10 bins (bins=10), offering a clear view of the distribution +of each variable.

+

The plot_type="hist" parameter indicates that only histograms will be generated +for each variable. Additionally, the font sizes for the axis labels and tick labels +are set to 16 points (label_fontsize=16) and 14 points (tick_fontsize=14), +respectively, ensuring that all text within the plots is legible and well-formatted.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=True,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    fill=True,
+    fill_alpha=0.60,
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - KDE (+) Histograms (Density) + +
+
+

Histogram Example (Density)

+

In this example, the kde_distributions function is used to generate histograms for +the variables "age", "education-num", and "hours-per-week" but with +kde=False, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (n_rows=1, n_cols=3), +with a grid size of 14x4 inches (grid_figsize=(14, 4)). The histograms are +divided into 10 bins (bins=10), and the y-axis is labeled “Density” (y_axis_label="Density"). +Font sizes for the axis labels and tick labels are set to 16 and 14 points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=False,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Density) + +
+
+

Histogram Example (Count)

+

In this example, the kde_distributions function is modified to generate histograms +with a few key changes. The hist_color is set to “orange”, changing the color of the +histogram bars. The `y-axis` label is updated to “Count” (y_axis_label="Count"), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to “Count” to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (n_rows=1, n_cols=4), +a grid size of 14x4 inches, and a bin count of 10. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=False,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    hist_color="orange",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Count",
+    bins=10,
+    plot_type="hist",
+    stat="Count",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+
+

Stacked Crosstab Plots

+

Generates stacked bar plots and crosstabs for specified columns in a DataFrame.

+

The stacked_crosstab_plot function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats.

+

The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis.

+
+
+stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind='bar', width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output='both', return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type='both', show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False)
+

Generates stacked or regular bar plots and crosstabs for specified columns.

+

This function allows users to create stacked bar plots (or regular bar plots +if stacks are removed) and corresponding crosstabs for specific columns +in a DataFrame. It provides options to customize the appearance, including +font sizes for axis labels, tick labels, and title text wrapping, and to +choose between regular or normalized plots.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • col (str) – The name of the column in the DataFrame to be analyzed.

  • +
  • func_col (list) – List of ground truth columns to be analyzed.

  • +
  • legend_labels_list (list) – List of legend labels for each ground truth column.

  • +
  • title (list) – List of titles for the plots.

  • +
  • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

  • +
  • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

  • +
  • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

  • +
  • custom_order (list, optional) – Specifies a custom order for the categories in the col.

  • +
  • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

  • +
  • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

  • +
  • save_formats (list, optional) – List of file formats to save the plot images in.

  • +
  • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

  • +
  • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

  • +
  • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

  • +
  • x (int, optional) – The width of the figure.

  • +
  • y (int, optional) – The height of the figure.

  • +
  • p (int, optional) – The padding between the subplots.

  • +
  • file_prefix (str, optional) – Prefix for the filename when output includes plots.

  • +
  • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

  • +
  • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

  • +
  • show_legend (bool, optional) – Specify whether to show the legend, default is True.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If output is not one of "both", "plots_only", or "crosstabs_only".

    • +
    • If plot_type is not one of "both", "regular", "normalized".

    • +
    • If remove_stacks is set to True and plot_type is not "regular".

    • +
    • If the lengths of title, func_col, and legend_labels_list are not equal.

    • +
    +

  • +
  • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

  • +
+
+
Returns:
+

Dictionary of crosstabs DataFrames if return_dict is True. Otherwise, returns None.

+
+
Return type:
+

dict or None

+
+
+
+ +
+

Stacked Bar Plots With Crosstabs Example

+

The provided code snippet demonstrates how to use the stacked_crosstab_plot +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here’s a detailed breakdown of the code using the census +dataset as an example [1].

+

First, the func_col list is defined, specifying the columns ["sex", "income"] +to be analyzed. These columns will be used in the loop to generate separate plots. +The legend_labels_list is then defined, with each entry corresponding to a +column in func_col. In this case, the labels for the sex column are +["Male", "Female"], and for the income column, they are ["<=50K", ">50K"]. +These labels will be used to annotate the legends of the plots.

+

Next, the title list is defined, providing titles for each plot corresponding +to the columns in func_col. The titles are set to ["Sex", "Income"], +which will be displayed on top of each respective plot.

+
# Define the func_col to use in the loop in order of usage
+func_col = ["sex", "income"]
+
+# Define the legend_labels to use in the loop
+legend_labels_list = [
+    ["Male", "Female"],
+    ["<=50K", ">50K"],
+]
+
+# Define titles for the plots
+title = [
+    "Sex",
+    "Income",
+]
+
+
+
+

Note

+

If you assign the function to a variable, the dictionary returned when +return_dict=True will be suppressed in the output. However, the dictionary +is still available within the assigned variable for further use.

+
+
from eda_toolkit import stacked_crosstab_plot
+
+# Call the stacked_crosstab_plot function
+stacked_crosstabs = stacked_crosstab_plot(
+    df=df,
+    col="age_group",
+    func_col=func_col,
+    legend_labels_list=legend_labels_list,
+    title=title,
+    kind="bar",
+    width=0.8,
+    rot=45, # axis rotation angle
+    custom_order=None,
+    color=["#00BFC4", "#F8766D"], # default color schema
+    output="both",
+    return_dict=True,
+    x=14,
+    y=8,
+    p=10,
+    logscale=False,
+    plot_type="both",
+    show_legend=True,
+    label_fontsize=14,
+    tick_fontsize=12,
+)
+
+
+

The above example generates stacked bar plots for "sex" and "income" +grouped by "education". The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export.

+
+

Important

+

Importance of Correctly Aligning Labels

+

It is crucial to properly align the elements in the legend_labels_list, +title, and func_col parameters when using the stacked_crosstab_plot +function. Each of these lists must be ordered consistently because the function +relies on their alignment to correctly assign labels and titles to the +corresponding plots and legends.

+

For instance, in the example above:

+
    +
  • The first element in func_col is "sex", and it is aligned with the first set of labels ["Male", "Female"] in legend_labels_list and the first title "Sex" in the title list.

  • +
  • Similarly, the second element in func_col, "income", aligns with the labels ["<=50K", ">50K"] and the title "Income".

  • +
+

Misalignment between these lists would result in incorrect labels or titles being +applied to the plots, potentially leading to confusion or misinterpretation of the data. +Therefore, it’s important to ensure that each list is ordered appropriately and +consistently to accurately reflect the data being visualized.

+

Proper Setup of Lists

+

When setting up the legend_labels_list, title, and func_col, ensure +that each element in the lists corresponds to the correct variable in the DataFrame. +This involves:

+
    +
  • Ordering: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted.

  • +
  • Consistency: Double-checking that each label in legend_labels_list matches the categories present in the corresponding func_col, and that the title accurately describes the plot.

  • +
+

By adhering to these guidelines, you can ensure that the stacked_crosstab_plot +function produces accurate and meaningful visualizations that are easy to interpret and analyze.

+
+

Output

+
KDE Distributions + +
Stacked Bar Plot Age vs. Income + +
+

Note

+

When you set return_dict=True, you are able to see the crosstabs printed out +as shown below.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93

+

When you set return_dict=True, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example:

+
crosstab_age_sex = crosstabs_dict["sex"]
+crosstab_age_income = crosstabs_dict["income"]
+
+
+
+
+

Pivoted Stacked Bar Plots Example

+

Using the census dataset [1], to create horizontal stacked bar plots, set the kind parameter to +"barh" in the stacked_crosstab_plot function. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the y-axis.

+
Stacked Bar Plot Age vs. Income (Pivoted) + +
+
+

Non-Normalized Stacked Bar Plots Example

+

In the census data [1], to create stacked bar plots without the normalized versions, +set the plot_type parameter to "regular" in the stacked_crosstab_plot +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the plot_type to "normalized" will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age.

+
Stacked Bar Plot Age vs. Income (Regular) + +
+
+

Regular Non-Stacked Bar Plots Example

+

In the census data [1], to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the plot_type parameter to "regular" +in the stacked_crosstab_plot function and enable remove_stacks by setting +it to True. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +plot_type to "normalized" will display only the normalized plots.

+

When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories.

+

In the example below, the color of the bars has been set to a dark grey (#333333), +and the legend has been removed by setting show_legend=False. This illustrates +regular bar plots for income by age, without stacking.

+
Bar Plot Age vs. Income (Regular) + +
+
+
+

Box and Violin Plots

+

Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.

+

The box_violin_plot function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories.

+

With options to customize the plot type (boxplot or violinplot), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis.

+

Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures.

+

The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset.

+
+
+box_violin_plot(df, metrics_list, metrics_boxplot_comp, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type='boxplot', xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • metrics_list (list of str) – List of metric names (columns in df) to plot.

  • +
  • metrics_boxplot_comp (list of str) – List of comparison categories (columns in df).

  • +
  • n_rows (int) – Number of rows in the subplot grid.

  • +
  • n_cols (int) – Number of columns in the subplot grid.

  • +
  • image_path_png (str, optional) – Optional directory path to save .png images.

  • +
  • image_path_svg (str, optional) – Optional directory path to save .svg images.

  • +
  • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

  • +
  • show_legend (bool, optional) – Boolean, True if showing the legend in the plots.

  • +
  • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set without specifying image_path_png or image_path_svg.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize is not a tuple or list of two numbers.

  • +
  • If grid_figsize is specified but is not a tuple or list of two numbers.

  • +
+

+
+
Returns:
+

None

+
+
+
+ +

This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels.

+
+

Box Plots Grid Example

+

In this example with the US census data [1], the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the "age_group" column in the +DataFrame. The metrics_boxplot_comp parameter is set to ["age_group"], meaning +that the comparison will be based on different age groups. The metrics_list is +provided as age_boxplot_list, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid format with 3 rows and 4 +columns, using the n_rows=3 and n_cols=4 parameters. The image_path_png and +image_path_svg parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to "all", ensuring that both +individual and grid plots are saved.

+

The plots are displayed in a grid format, as indicated by the show_plot="grid" +parameter. The plot_type is set to "boxplot", so the function will generate +boxplots for each metric in the list. Additionally, the `x-axis` labels are rotated +by 90 degrees (xlabel_rot=90) to ensure that the labels are legible. The legend is +hidden by setting show_legend=False, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication.

+
age_boxplot_list = df[
+    [
+        "education-num",
+        "hours-per-week",
+    ]
+].columns.to_list()
+
+
+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="boxplot",
+    xlabel_rot=90,
+)
+
+
+
Box Plot Comparisons + +
+
+

Violin Plots Grid Example

+

In this example with the US census data [1], we keep everything the same as the prior example, but change the +plot_type to violinplot. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings.

+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=90,
+)
+
+
+
Violin Plot Comparisons + +
+
+

Pivoted Violin Plots Grid Example

+

In this example with the US census data [1], we set xlabel_rot=0 and rotate_plot=True +to pivot the plot, changing the orientation of the axes while keeping the `x-axis` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution.

+
from eda_toolkit impor box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    rotate_plot=True,
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=0,
+)
+
+
+
Violin Plot Comparisons (Pivoted) + +
+
+
+

Scatter Plots and Best Fit Lines

+

Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.

+

Create and Save Scatter Plots or a Grid of Scatter Plots

+

This function, scatter_fit_plot, is designed to generate scatter plots for +one or more pairs of variables (x_vars and y_vars) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view.

+

Optional Best Fit Line

+

An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s

+

Customizable Plot Aesthetics

+

The function offers a wide range of customization options to tailor the appearance +of the scatter plots:

+
    +
  • Point Color: You can specify a default color for the scatter points or use a hue parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data.

  • +
  • Point Size: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable.

  • +
  • Markers: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data.

  • +
+

Axis and Label Configuration

+

The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges.

+

Plot Display and Saving Options

+

The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations.

+

Correlation Coefficient Display

+

For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship.

+
+
+scatter_fit_plot(df, x_vars, y_vars, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color='C0', best_fit_linecolor='red', best_fit_linestyle='-', hue=None, hue_palette=None, size=None, sizes=None, marker='o', show_correlation=True, xlim=None, ylim=None)
+

Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • x_vars (list of str) – List of variable names to plot on the x-axis.

  • +
  • y_vars (list of str) – List of variable names to plot on the y-axis.

  • +
  • n_rows (int) – Number of rows in the subplot grid.

  • +
  • n_cols (int) – Number of columns in the subplot grid.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

  • +
  • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid".

  • +
  • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

  • +
  • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

  • +
  • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

  • +
  • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

  • +
  • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

  • +
  • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette.

  • +
  • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

  • +
  • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

  • +
  • marker (str, optional) – Marker style used for the scatter points. Default is "o".

  • +
  • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set but no image paths are provided.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize or grid_figsize are not tuples/lists with two numeric values.

  • +
+

+
+
Returns:
+

None +This function does not return any value but generates and optionally saves scatter plots for the specified x_vars and y_vars.

+
+
+
+ +
+

Regression-Centric Scatter Plots Example

+

In this US census data [1] example, the scatter_fit_plot function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the show_correlation=True parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the add_best_fit_line=True parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="grid",
+    show_legend=True,
+    xlabel_rot=0,
+    show_plot="grid",
+    rotate_plot=False,
+     grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (with Best Fit Lines) + +
+
+

Scatter Plots Grouped by Category Example

+

In this example, the scatter_fit_plot function is used to generate a grid of +scatter plots that examine the relationships between age and hours-per-week +as well as education-num and hours-per-week. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots:

+
    +
  1. Hue and Hue Palette: The hue parameter is set to "income", meaning that the +data points in the scatter plots are colored according to the values in the income +column. A custom color mapping is provided via the hue_palette parameter, where the +income categories "<=50K" and ">50K" are assigned the colors "brown" and +"green", respectively. This change visually distinguishes the data points based on +income levels.

  2. +
  3. Scatter Color: The scatter_color parameter is set to "#808080", which applies +a grey color to the scatter points when no hue is provided. However, since a hue +is specified in this example, the hue_palette takes precedence and overrides this color setting.

  4. +
  5. Best Fit Line: The add_best_fit_line parameter is set to False, meaning that +no best fit line is added to the scatter plots. This differs from the previous example where +a best fit line was included.

  6. +
  7. Correlation Coefficient: The show_correlation parameter is set to False, so the +Pearson correlation coefficient will not be displayed in the plot titles. This is another +change from the previous example where the correlation coefficient was included.

  8. +
  9. Hue Legend: The show_legend parameter remains set to True, ensuring that the +legend displaying the hue categories ("<=50K" and ">50K") appears on the plots, +helping to interpret the color coding of the data points.

  10. +
+

These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths.

+
from eda_toolkit import scatter_fit_plot
+
+hue_dict = {"<=50K": "brown", ">50K": "green"}
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="grid",
+    show_legend=True,
+    xlabel_rot=0,
+    show_plot="grid",
+    rotate_plot=False,
+    grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=False,
+    scatter_color="#808080",
+    hue="income",
+    hue_palette=hue_dict,
+    show_correlation=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/.buildinfo b/_build/html/v0.0.7/.buildinfo new file mode 100644 index 000000000..3935fecaa --- /dev/null +++ b/_build/html/v0.0.7/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 71b627a2c469b41c409ab10b07f4ed3e +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/v0.0.7/.doctrees/acknowledgements.doctree b/_build/html/v0.0.7/.doctrees/acknowledgements.doctree new file mode 100644 index 000000000..74bc543a3 Binary files /dev/null and b/_build/html/v0.0.7/.doctrees/acknowledgements.doctree differ diff --git a/_build/html/v0.0.7/.doctrees/changelog.doctree b/_build/html/v0.0.7/.doctrees/changelog.doctree new file mode 100644 index 000000000..4d2a2bbc8 Binary files /dev/null and b/_build/html/v0.0.7/.doctrees/changelog.doctree differ diff --git a/_build/html/v0.0.7/.doctrees/citations.doctree b/_build/html/v0.0.7/.doctrees/citations.doctree new file mode 100644 index 000000000..a4cbeb7c1 Binary files /dev/null and b/_build/html/v0.0.7/.doctrees/citations.doctree differ diff --git a/_build/html/v0.0.7/.doctrees/contributors.doctree b/_build/html/v0.0.7/.doctrees/contributors.doctree new file mode 100644 index 000000000..ef218785e Binary files /dev/null and b/_build/html/v0.0.7/.doctrees/contributors.doctree differ diff --git a/_build/html/v0.0.7/.doctrees/environment.pickle b/_build/html/v0.0.7/.doctrees/environment.pickle new file mode 100644 index 000000000..22cbdfb1e Binary files /dev/null and b/_build/html/v0.0.7/.doctrees/environment.pickle differ diff --git a/_build/html/v0.0.7/.doctrees/getting_started.doctree b/_build/html/v0.0.7/.doctrees/getting_started.doctree new file mode 100644 index 000000000..9649cf6b2 Binary files /dev/null and b/_build/html/v0.0.7/.doctrees/getting_started.doctree differ diff --git a/_build/html/v0.0.7/.doctrees/index.doctree b/_build/html/v0.0.7/.doctrees/index.doctree new file mode 100644 index 000000000..15a59a929 Binary files /dev/null and b/_build/html/v0.0.7/.doctrees/index.doctree differ diff --git a/_build/html/v0.0.7/.doctrees/references.doctree b/_build/html/v0.0.7/.doctrees/references.doctree new file mode 100644 index 000000000..c3e00e723 Binary files /dev/null and b/_build/html/v0.0.7/.doctrees/references.doctree differ diff --git a/_build/html/v0.0.7/.doctrees/usage_guide.doctree b/_build/html/v0.0.7/.doctrees/usage_guide.doctree new file mode 100644 index 000000000..006912c7d Binary files /dev/null and b/_build/html/v0.0.7/.doctrees/usage_guide.doctree differ diff --git a/_build/html/v0.0.7/_images/Bar_Age_regular_income.svg b/_build/html/v0.0.7/_images/Bar_Age_regular_income.svg new file mode 100644 index 000000000..6f8aa40d4 --- /dev/null +++ b/_build/html/v0.0.7/_images/Bar_Age_regular_income.svg @@ -0,0 +1,1201 @@ + + + + + + + + 2024-08-04T12:01:07.319833 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_images/Stacked_Bar_Age_income.svg b/_build/html/v0.0.7/_images/Stacked_Bar_Age_income.svg new file mode 100644 index 000000000..d5510308b --- /dev/null +++ b/_build/html/v0.0.7/_images/Stacked_Bar_Age_income.svg @@ -0,0 +1,1943 @@ + + + + + + + + 2024-08-04T11:47:19.816889 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_images/Stacked_Bar_Age_income_pivoted.svg b/_build/html/v0.0.7/_images/Stacked_Bar_Age_income_pivoted.svg new file mode 100644 index 000000000..2147fce1a --- /dev/null +++ b/_build/html/v0.0.7/_images/Stacked_Bar_Age_income_pivoted.svg @@ -0,0 +1,2043 @@ + + + + + + + + 2024-08-04T11:56:38.571027 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_images/Stacked_Bar_Age_income_regular.svg b/_build/html/v0.0.7/_images/Stacked_Bar_Age_income_regular.svg new file mode 100644 index 000000000..04478581f --- /dev/null +++ b/_build/html/v0.0.7/_images/Stacked_Bar_Age_income_regular.svg @@ -0,0 +1,1347 @@ + + + + + + + + 2024-08-04T11:54:36.826244 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_images/Stacked_Bar_Age_sex.svg b/_build/html/v0.0.7/_images/Stacked_Bar_Age_sex.svg new file mode 100644 index 000000000..7b2bcb137 --- /dev/null +++ b/_build/html/v0.0.7/_images/Stacked_Bar_Age_sex.svg @@ -0,0 +1,1970 @@ + + + + + + + + 2024-08-04T11:55:12.796551 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_images/all_plots_comparisons_boxplot.png b/_build/html/v0.0.7/_images/all_plots_comparisons_boxplot.png new file mode 100644 index 000000000..c4f54b520 Binary files /dev/null and b/_build/html/v0.0.7/_images/all_plots_comparisons_boxplot.png differ diff --git a/_build/html/v0.0.7/_images/all_plots_comparisons_violinplot.png b/_build/html/v0.0.7/_images/all_plots_comparisons_violinplot.png new file mode 100644 index 000000000..cc236e21c Binary files /dev/null and b/_build/html/v0.0.7/_images/all_plots_comparisons_violinplot.png differ diff --git a/_build/html/v0.0.7/_images/all_plots_comparisons_violinplot_pivoted.png b/_build/html/v0.0.7/_images/all_plots_comparisons_violinplot_pivoted.png new file mode 100644 index 000000000..b05150e06 Binary files /dev/null and b/_build/html/v0.0.7/_images/all_plots_comparisons_violinplot_pivoted.png differ diff --git a/_build/html/v0.0.7/_images/count_hist_distributions.svg b/_build/html/v0.0.7/_images/count_hist_distributions.svg new file mode 100644 index 000000000..521cd5a95 --- /dev/null +++ b/_build/html/v0.0.7/_images/count_hist_distributions.svg @@ -0,0 +1,1719 @@ + + + + + + + + 2024-07-31T18:14:40.266523 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_images/eda_toolkit_logo.svg b/_build/html/v0.0.7/_images/eda_toolkit_logo.svg new file mode 100644 index 000000000..d039d6f79 --- /dev/null +++ b/_build/html/v0.0.7/_images/eda_toolkit_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_build/html/v0.0.7/_images/hist_density_distributions.svg b/_build/html/v0.0.7/_images/hist_density_distributions.svg new file mode 100644 index 000000000..8bf1787a6 --- /dev/null +++ b/_build/html/v0.0.7/_images/hist_density_distributions.svg @@ -0,0 +1,1744 @@ + + + + + + + + 2024-07-31T18:12:26.650100 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_images/kde_density_distributions.svg b/_build/html/v0.0.7/_images/kde_density_distributions.svg new file mode 100644 index 000000000..7564724e1 --- /dev/null +++ b/_build/html/v0.0.7/_images/kde_density_distributions.svg @@ -0,0 +1,2571 @@ + + + + + + + + 2024-07-31T18:08:35.979182 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_images/normal_distribution.png b/_build/html/v0.0.7/_images/normal_distribution.png new file mode 100644 index 000000000..837c60e0c Binary files /dev/null and b/_build/html/v0.0.7/_images/normal_distribution.png differ diff --git a/_build/html/v0.0.7/_images/scatter_plots_grid.png b/_build/html/v0.0.7/_images/scatter_plots_grid.png new file mode 100644 index 000000000..5a51facd8 Binary files /dev/null and b/_build/html/v0.0.7/_images/scatter_plots_grid.png differ diff --git a/_build/html/v0.0.7/_images/scatter_plots_grid_grouped.png b/_build/html/v0.0.7/_images/scatter_plots_grid_grouped.png new file mode 100644 index 000000000..02a3b3916 Binary files /dev/null and b/_build/html/v0.0.7/_images/scatter_plots_grid_grouped.png differ diff --git a/_build/html/v0.0.7/_images/summarize_combos.gif b/_build/html/v0.0.7/_images/summarize_combos.gif new file mode 100644 index 000000000..402ee1efc Binary files /dev/null and b/_build/html/v0.0.7/_images/summarize_combos.gif differ diff --git a/_build/html/v0.0.7/_images/us_census_correlation_matrix.svg b/_build/html/v0.0.7/_images/us_census_correlation_matrix.svg new file mode 100644 index 000000000..2a41e1afa --- /dev/null +++ b/_build/html/v0.0.7/_images/us_census_correlation_matrix.svg @@ -0,0 +1,1766 @@ + + + + + + + + 2024-08-09T18:12:33.390718 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_images/us_census_correlation_matrix_full.svg b/_build/html/v0.0.7/_images/us_census_correlation_matrix_full.svg new file mode 100644 index 000000000..d0df5da46 --- /dev/null +++ b/_build/html/v0.0.7/_images/us_census_correlation_matrix_full.svg @@ -0,0 +1,1907 @@ + + + + + + + + 2024-08-09T18:30:04.884359 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_sources/acknowledgements.rst.txt b/_build/html/v0.0.7/_sources/acknowledgements.rst.txt new file mode 100644 index 000000000..e62da5a10 --- /dev/null +++ b/_build/html/v0.0.7/_sources/acknowledgements.rst.txt @@ -0,0 +1,30 @@ +.. _acknowledgements: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Acknowledgements +================= + +We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists. + +We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors. diff --git a/_build/html/v0.0.7/_sources/changelog.rst.txt b/_build/html/v0.0.7/_sources/changelog.rst.txt new file mode 100644 index 000000000..828e1aebd --- /dev/null +++ b/_build/html/v0.0.7/_sources/changelog.rst.txt @@ -0,0 +1,338 @@ +.. _changelog: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Changelog +========= + +Version 0.0.7 +--------------------------- + +**Added Function for Customizable Correlation Matrix Visualization** + +This release introduces a new function, ``flex_corr_matrix``, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to ``seaborn.heatmap()``. + +**Summary of Changes** + +- **New Function**: ``flex_corr_matrix``. + + - **Functionality**: + - Generates a correlation heatmap for a given DataFrame. + - Supports both full and upper triangular correlation matrices based on the ``triangular`` parameter. + - Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. + - Accepts additional keyword arguments via ``**kwargs`` to pass directly to ``seaborn.heatmap()``. + - Includes validation to ensure the ``triangular``, ``annot``, and ``save_plots`` parameters are boolean values. + - Raises an exception if ``save_plots=True`` but neither ``image_path_png`` nor ``image_path_svg`` is specified. + +**Usage** + +.. code-block:: python + + # Full correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True) + + # Upper triangular correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True) + + +**Contingency table df to object type** + +Convert all columns in the DataFrame to object type to prevent issues with numerical columns. + +.. code-block:: python + + df = df.astype(str).fillna("") + + +Version 0.0.6 +--------------------------- + +**Added validation for Plot Type Parameter in KDE Distributions Function** + +This release adds a validation step for the ``plot_type`` parameter in the ``kde_distributions`` function. The allowed values for ``plot_type`` are ``"hist"``, ``"kde"``, and ``"both"``. If an invalid value is provided, the function will now raise a ``ValueError`` with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values. + +.. code-block:: python + + # Validate plot_type parameter + valid_plot_types = ["hist", "kde", "both"] + if plot_type.lower() not in valid_plot_types: + raise ValueError( + f"Invalid plot_type value. Expected one of {valid_plot_types}, " + f"got '{plot_type}' instead." + ) + +Version 0.0.5 +--------------------------- + +**Ensure Consistent Font Size and Text Wrapping Across Plot Elements** + +This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the ``stacked_crosstab_plot`` function. The following updates have been implemented to ensure uniformity and improve the readability of plots: + +1. **Title Font Size and Text Wrapping:** + - Added a ``text_wrap`` parameter to control the wrapping of plot titles. + - Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ``ax.set_title()`` after plot generation. + +2. **Legend Font Size Consistency:** + - Incorporated ``label_fontsize`` into the legend font size by directly setting the font size of the legend text using ``plt.setp(legend.get_texts(), fontsize=label_fontsize)``. + - This ensures that the legend labels are consistent with the title and axis labels. + +**Testing** + +- Verified that titles now wrap correctly and match the specified ``label_fontsize``. +- Confirmed that legend text scales according to ``label_fontsize``, ensuring consistent font sizes across all plot elements. + + +Version 0.0.4 +--------------------------- + +- **Stable release** + + - No new updates to the codebase. + + - Updated the project ``description`` variable in ``setup.py`` to re-emphasize key elements of the library. + + - Minor README cleanup: + + - Added icons for sections that did not have them. + + +Version 0.0.3 +--------------------------- + +- **Stable release** + + - Updated logo size, fixed citation title, and made minor README cleanup: + + - Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support. + +Version 0.0.2 +--------------------------- + +- **First stable release** + - No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + - Added logo, badges, and Zenodo-certified citation to README. + +Version 0.0.1rc0 +------------------------------- + +- No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + +Version 0.0.1b0 +----------------------------- + +**New Scatter Fit Plot and Additional Updates** + +- Added new ``scatter_fit_plot()``, removed unused ``data_types()``, and added comment section headers. + +**Added xlim and ylim Inputs to KDE Distribution** + +- ``kde_distribution()``: + + - Added ``xlim`` and ``ylim`` inputs to allow users to customize axes limits in ``kde_distribution()``. + +**Added xlim and ylim Params to Stacked Crosstab Plot** + +- ``stacked_crosstab_plot()``: + + - Added ``xlim`` and ``ylim`` input parameters to ``stacked_crosstab_plot()`` to give users more flexibility in controlling axes limits. + +**Added x and y Limits to Box and Violin Plots** + +- ``box_violin_plot()``: + + - Changed function name from ``metrics_box_violin()`` to ``box_violin_plot()``. + - Added ``xlim`` and ``ylim`` inputs to control x and y-axis limits of ``box_violin_plot()`` (formerly ``metrics_box_violin``). + +**Added Ability to Remove Stacks from Plots, Plot All or One at a Time** + +**Key Changes** + +1. **Plot Type Parameter** + - ``plot_type``: This parameter allows the user to choose between ``"regular"``, ``"normalized"``, or ``"both"`` plot types. + +2. **Remove Stacks Parameter** + - ``remove_stacks``: This parameter, when set to ``True``, generates a regular bar plot using only the ``col`` parameter instead of a stacked bar plot. It only works when ``plot_type`` is set to "regular". If ``remove_stacks`` is set to ``True`` while ``plot_type`` is anything other than "regular", the function will raise an exception. + +**Explanation of Changes** + +- **Plot Type Parameter** + + - Provides flexibility to the user, allowing specification of the type of plot to generate: + + - ``"regular"``: Standard bar plot. + + - ``"normalized"``: Normalized bar plot. + + - ``"both"``: Both regular and normalized bar plots. + +- **Remove Stacks Parameter** + - ``remove_stacks``: Generates a regular bar plot using only the ``col`` parameter, removing the stacking of the bars. Applicable only when ``plot_type`` is set to "regular". An exception is raised if used with any other ``plot_type``. + +These changes enhance the flexibility and functionality of the ``stacked_crosstab_plot`` function, allowing for more customizable and specific plot generation based on user requirements. + +Version 0.0.1b0 +----------------------------- + +**Refined KDE Distributions** + +**Key Changes** + +1. **Alpha Transparency for Histogram Fill** + - Added a ``fill_alpha`` parameter to control the transparency of the histogram bars' fill color. + - Default value is ``0.6``. An exception is raised if ``fill=False`` and ``fill_alpha`` is specified. + +2. **Custom Font Sizes** + - Introduced ``label_fontsize`` and ``tick_fontsize`` parameters to control font size of axis labels and tick marks independently. + +3. **Scientific Notation Toggle** + - Added a ``disable_sci_notation`` parameter to enable or disable scientific notation on axes. + +4. **Improved Error Handling** + - Added validation for the ``stat`` parameter to ensure valid options are accepted. + - Added checks for proper usage of ``fill_alpha`` and ``hist_edgecolor`` when ``fill`` is set to ``False``. + +5. **General Enhancements** + - Updated the function's docstring to reflect new parameters and provide comprehensive guidance on usage. + +Version 0.0.1b0 +----------------------------- + +**Enhanced KDE Distributions Function** + +**Added Parameters** + +1. **Grid Figsize and Single Figsize** + - Control the size of the overall grid figure and individual figures separately. + +2. **Hist Color and KDE Color`** + - Allow customization of histogram and KDE plot colors. + +3. **Edge Color** + - Allows customization of histogram bar edges. + +4. **Hue** + - Allows grouping data by a column. + +5. **Fill** + - Controls whether to fill histogram bars with color. + +6. **Y-axis Label`** + - Customizable y-axis label. + +7. **Log-Scaling** + - Specifies which variables to apply log scale. + +8. **Bins and Bin Width** + - Control the number and width of bins. + +9. **``stat``:** + - Allows different statistics for the histogram (``count``, ``density``, ``frequency``, ``probability``, ``proportion``, ``percent``). + +**Improvements** + +1. **Validation and Error Handling** + - Checks for invalid ``log_scale_vars`` and throws a ``ValueError`` if any are found. + - Throws a ``ValueError`` if ``edgecolor`` is changed while ``fill`` is set to ``False``. + - Issues a ``PerformanceWarning`` if both ``bins`` and ``binwidth`` are specified, warning of potential performance impacts. + +2. **Customizable Y-Axis Label** + - Allows users to specify custom y-axis labels. + +3. **Warning for KDE with Count** + - Issues a warning if KDE is used with ``stat='count'``, as it may produce misleading plots. + +**Updated Function to Ensure Unique IDs and Index Check** + +- Ensured that each generated ID in ``add_ids`` starts with a non-zero digit. +- Added a check to verify that the DataFrame index is unique. +- Printed a warning message if duplicate index entries are found. + +These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique. + +**Check for Unique Indices** +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries. + +**Generate Non-Zero Starting IDs** + +- The ID generation process is updated to ensure that the first digit of each ID is always non-zero. + +**Ensure Unique IDs** + +- A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame. + +**Fix Int Conversion for Numeric Columns, Reset Decimal Places** + +- Fixed integer conversion issue for numeric columns when ``decimal_places=0`` in the ``save_dataframes_to_excel`` function. +- Reset ``decimal_places`` default value to ``0``. + +These changes ensure correct formatting and avoid errors during conversion. + +**Contingency Table Updates** + +1. **Error Handling for Columns** + - Added a check to ensure at least one column is specified. + - Updated the function to accept a single column as a string or multiple columns as a list. + - Raised a ``ValueError`` if no columns are provided or if ``cols`` is not correctly specified. + +2. **Function Parameters** + - Changed parameters from ``col1`` and ``col2`` to a single parameter ``cols`` which can be either a string or a list. + +3. **Error Handling** + - Renamed ``SortBy`` to ``sort_by`` to standardize nomenclature. + - Added a check to ensure ``sort_by`` is either 0 or 1. + - Raised a ``ValueError`` if ``sort_by`` is not 0 or 1. + +5. **Sorting Logic** + - Updated the sorting logic to handle the new ``cols`` parameter structure. + +6. **Handling Categorical Data** + - Modified code to convert categorical columns to strings to avoid issues with ``fillna("")``. + +7. **Handling Missing Values** + - Added ``df = df.fillna('')`` to fill NA values within the function to account for missing data. + +8. **Improved Function Documentation** + - Updated function documentation to reflect new parameters and error handling. + +Version 0.0.1b0 +----------------------------- + +**Contingency Table Updates** + +- ``fillna('')`` added to output so that null values come through, removed ``'All'`` column name from output, sort options ``0`` and ``1``, updated docstring documentation. Tested successfully on ``Python 3.7.3``. + +**Compatibility Enhancement** + +1. Added a version check for ``Python 3.7`` and above. + + - Conditional import of ``datetime`` to handle different Python versions. + +.. code-block:: python + + if sys.version_info >= (3, 7): + from datetime import datetime + else: + import datetime diff --git a/_build/html/v0.0.7/_sources/citations.rst.txt b/_build/html/v0.0.7/_sources/citations.rst.txt new file mode 100644 index 000000000..5c8dc7744 --- /dev/null +++ b/_build/html/v0.0.7/_sources/citations.rst.txt @@ -0,0 +1,42 @@ +.. _citations: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Citing EDA Toolkit +=================== + +Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.7). Zenodo. https://doi.org/10.5281/zenodo.13163208 + +.. code:: bash + + @software{shpaner_2024_13162633, + author = {Shpaner, Leonid and + Gil, Oscar}, + title = {EDA Toolkit}, + month = aug, + year = 2024, + publisher = {Zenodo}, + version = {0.0.7},W + doi = {10.5281/zenodo.13162633}, + url = {https://doi.org/10.5281/zenodo.13162633} + } + diff --git a/_build/html/v0.0.7/_sources/contributors.rst.txt b/_build/html/v0.0.7/_sources/contributors.rst.txt new file mode 100644 index 000000000..48874021f --- /dev/null +++ b/_build/html/v0.0.7/_sources/contributors.rst.txt @@ -0,0 +1,53 @@ +.. _contributors: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Contributors/Maintainers +========================= + +.. raw:: html + +
+ +.. image:: https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + :align: left + :width: 150 + :height: 150 + +`Leonid Shpaner `_ is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego's M.S. Applied Artificial Intelligence program. + +.. raw:: html + +


+ +.. raw:: html + +
+ +.. image:: https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + :align: left + :width: 150 + :height: 150 + +`Oscar Gil `_ is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego. + + diff --git a/_build/html/v0.0.7/_sources/getting_started.rst.txt b/_build/html/v0.0.7/_sources/getting_started.rst.txt new file mode 100644 index 000000000..5962e685c --- /dev/null +++ b/_build/html/v0.0.7/_sources/getting_started.rst.txt @@ -0,0 +1,121 @@ +.. _getting_started: + +.. KFRE Python Library Documentation documentation master file, created by + sphinx-quickstart on Thu May 2 15:44:56 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Welcome to the EDA Toolkit Python Library Documentation! +======================================================== +.. note:: + This documentation is for ``eda_toolkit`` version ``0.0.7``. + + +The ``eda_toolkit`` is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data. + +Project Links +--------------- + +1. `PyPI Page `_ + +2. `GitHub Repository `_ + + +What is EDA? +------------- + +Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data. + + +Purpose of EDA Toolkit +----------------------- +The ``eda_toolkit`` library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including: + +- **Data Management:** Tools for managing directories, generating unique IDs, + standardizing dates, and handling common DataFrame manipulations. +- **Data Cleaning:** Functions to address missing values, remove outliers, and + correct formatting issues, ensuring data is ready for analysis. +- **Data Visualization:** A variety of plotting functions, including KDE + distribution plots, stacked bar plots, scatter plots with optional best fit + lines, and box/violin plots, to visually explore data distributions, + relationships, and trends. +- **Descriptive and Summary Statistics:** Methods to generate comprehensive + reports on data types, summary statistics (mean, median, standard deviation, + etc.), and to summarize all possible combinations of specified variables. +- **Reporting and Export:** Features to save DataFrames to Excel with + customizable formatting, create contingency tables, and export generated + plots in multiple formats. + + + +Key Features +------------- + +- **Ease of Use:** The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions. +- **Customizable:** Users can customize various aspects of the toolkit to fit their specific needs. +- **Integration:** Seamlessly integrates with popular data science libraries such as ``Pandas``, ``NumPy``, ``Matplotlib``, and ``Seaborn``. +- **Documentation and Examples:** Comprehensive documentation and examples to help users get started quickly and effectively. + +.. _prerequisites: + +Prerequisites +------------- +Before you install ``eda_toolkit``, ensure your system meets the following requirements: + +- **Python**: version ``3.7.4`` or higher is required to run ``eda_toolkit``. + +Additionally, ``eda_toolkit`` depends on the following packages, which will be automatically installed when you install ``eda_toolkit``: + +- ``numpy``: version ``1.21.6`` or higher +- ``pandas``: version ``1.3.5`` or higher +- ``matplotlib``: version ``3.5.3`` or higher +- ``seaborn``: version ``0.12.2`` or higher +- ``jinja2``: version ``3.1.4`` or higher +- ``xlsxwriter``: version ``3.2.0`` or higher + +.. _installation: + +Installation +------------- + +You can install ``eda_toolkit`` directly from PyPI: + +.. code-block:: bash + + pip install eda_toolkit + + diff --git a/_build/html/v0.0.7/_sources/index.rst.txt b/_build/html/v0.0.7/_sources/index.rst.txt new file mode 100644 index 000000000..77d24a0f7 --- /dev/null +++ b/_build/html/v0.0.7/_sources/index.rst.txt @@ -0,0 +1,51 @@ +.. EDA Toolkit documentation master file, created by + sphinx-quickstart on Mon Jul 29 08:15:33 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Table of Contents +=================== + +.. toctree:: + :maxdepth: 4 + :caption: Getting Started + + getting_started + + +.. toctree:: + :maxdepth: 4 + :caption: Usage Guide + + usage_guide + +.. toctree:: + :maxdepth: 4 + :caption: About EDA Toolkit + + acknowledgements + contributors + citations + changelog + references + + \ No newline at end of file diff --git a/_build/html/v0.0.7/_sources/references.rst.txt b/_build/html/v0.0.7/_sources/references.rst.txt new file mode 100644 index 000000000..cf7c135da --- /dev/null +++ b/_build/html/v0.0.7/_sources/references.rst.txt @@ -0,0 +1,33 @@ +.. _references: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +References +=========== + +1. Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +2. Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +3. Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + + diff --git a/_build/html/v0.0.7/_sources/usage_guide.rst.txt b/_build/html/v0.0.7/_sources/usage_guide.rst.txt new file mode 100644 index 000000000..1e0148d5b --- /dev/null +++ b/_build/html/v0.0.7/_sources/usage_guide.rst.txt @@ -0,0 +1,3190 @@ +.. _usage_guide: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Description +=========== + +This guide provides detailed instructions and examples for using the functions +provided in the ``eda_toolkit`` library and how to use them effectively in your projects. + +For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [#]_. This dataset provides a rich source of +information for demonstrating the functionalities of the ``eda_toolkit``. + + +Data Preparation and Management +=============================== + +Path directories +---------------- + +**Ensure that the directory exists. If not, create it.** + +.. function:: ensure_directory(path) + + :param path: The path to the directory that needs to be ensured. + :type path: str + + :returns: None + + +The ``ensure_directory`` function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``ensure_directory`` function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them. + +First, we define the base path as the parent directory of the current directory. +The ``os.pardir`` constant, equivalent to ``"..""``, is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory. + + +Next, we set paths for the PNG and SVG image directories, located within an +``images`` folder in the parent directory. Using the ``ensure_directory`` +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them. + +.. code-block:: python + + from eda_toolkit import ensure_directory + + import os # import operating system for dir + + + base_path = os.path.join(os.pardir) + + # Go up one level from 'notebooks' to parent directory, + # then into the 'data' folder + data_path = os.path.join(os.pardir, "data") + data_output = os.path.join(os.pardir, "data_output") + + # create image paths + image_path_png = os.path.join(base_path, "images", "png_images") + image_path_svg = os.path.join(base_path, "images", "svg_images") + + # Use the function to ensure'data' directory exists + ensure_directory(data_path) + ensure_directory(data_output) + ensure_directory(image_path_png) + ensure_directory(image_path_svg) + +**Output** + +.. code-block:: python + + Created directory: ../data + Created directory: ../data_output + Created directory: ../images/png_images + Created directory: ../images/svg_images + + +Adding Unique Identifiers +-------------------------- + +**Add a column of unique IDs with a specified number of digits to the dataframe.** + +.. function:: add_ids(df, id_colname="ID", num_digits=9, seed=None, set_as_index=True) + + :param df: The dataframe to add IDs to. + :type df: pd.DataFrame + :param id_colname: The name of the new column for the IDs. + :type id_colname: str + :param num_digits: The number of digits for the unique IDs. + :type num_digits: int + :param seed: The seed for the random number generator. Defaults to ``None``. + :type seed: int, optional + :param set_as_index: Whether to set the new ID column as the index. Defaults to ``False``. + :type set_as_index: bool, optional + + :returns: The updated dataframe with the new ID column. + :rtype: pd.DataFrame + +The ``add_ids`` function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe. + +**Example Usage** + +In the example below, we demonstrate how to use the ``add_ids`` function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the ``add_ids`` function to generate +and append a column of unique IDs with a specified number of digits to the dataframe. + +First, we import the pandas library and the ``add_ids`` function from the ``eda_toolkit``. +Then, we create a sample dataframe with some data. We call the ``add_ids`` function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe. + +.. code-block:: python + + from eda_toolkit import add_ids + + # Add a column of unique IDs with 9 digits and call it "census_id" + df = add_ids( + df=df, + id_colname="census_id", + num_digits=9, + seed=111, + set_as_index=True, + ) + +**Output** + +`First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: bash + + DataFrame index is unique. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+
+ + +\ + + +Trailing Period Removal +----------------------- + +**Strip the trailing period from floats in a specified column of a DataFrame, if present.** + +.. function:: strip_trailing_period(df, column_name) + + :param df: The DataFrame containing the column to be processed. + :type df: pd.DataFrame + :param column_name: The name of the column containing floats with potential trailing periods. + :type column_name: str + + :returns: The updated DataFrame with the trailing periods removed from the specified column. + :rtype: pd.DataFrame + + The ``strip_trailing_period`` function is designed to remove trailing periods + from float values in a specified column of a DataFrame. This can be particularly + useful when dealing with data that has been inconsistently formatted, ensuring + that all float values are correctly represented. + +**Example Usage** + +In the example below, we demonstrate how to use the ``strip_trailing_period`` function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the ``strip_trailing_period`` function to remove any trailing periods from the specified column. + +.. code-block:: python + + from eda_toolkit import strip_trailing_period + + # Create a sample dataframe with trailing periods in some values + data = { + "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.], + } + df = pd.DataFrame(data) + + # Remove trailing periods from the 'values' column + df = strip_trailing_period(df=df, column_name="values") + + +**Output** + +`First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)` + +.. raw:: html + + + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +
+ + +\ + +`Note:` The last row shows 6 as an `int` with a trailing period with its conversion to `float`. + + +\ + +Standardized Dates +------------------- + +**Parse and standardize date strings based on the provided rule.** + +.. function:: parse_date_with_rule(date_str) + + This function takes a date string and standardizes it to the ``ISO 8601`` format + (``YYYY-MM-DD``). It assumes dates are provided in either `day/month/year` or + `month/day/year` format. The function first checks if the first part of the + date string (day or month) is greater than 12, which unambiguously indicates + a `day/month/year` format. If the first part is 12 or less, the function + attempts to parse the date as `month/day/year`, falling back to `day/month/year` + if the former raises a ``ValueError`` due to an impossible date (e.g., month + being greater than 12). + + :param date_str: A date string to be standardized. + :type date_str: str + + :returns: A standardized date string in the format ``YYYY-MM-DD``. + :rtype: str + + :raises ValueError: If ``date_str`` is in an unrecognized format or if the function + cannot parse the date. + +**Example Usage** + +In the example below, we demonstrate how to use the ``parse_date_with_rule`` +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the ``parse_date_with_rule`` +function to parse and standardize each date string to the ``ISO 8601`` format. + +.. code-block:: python + + from eda_toolkit import parse_date_with_rule + + # Sample date strings + date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"] + + # Standardize the date strings + standardized_dates = [parse_date_with_rule(date) for date in date_strings] + + print(standardized_dates) + +**Output** + +.. code-block:: python + + ['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12'] + + + +.. important:: + + In the next example, we demonstrate how to apply the ``parse_date_with_rule`` + function to a DataFrame column containing date strings using the ``.apply()`` method. + This is particularly useful when you need to standardize date formats across an + entire column in a DataFrame. + +.. code-block:: python + + # Creating the DataFrame + data = { + "date_column": [ + "31/12/2021", + "01/01/2022", + "12/31/2021", + "13/02/2022", + "07/04/2022", + ], + "name": ["Alice", "Bob", "Charlie", "David", "Eve"], + "amount": [100.0, 150.5, 200.75, 250.25, 300.0], + } + + df = pd.DataFrame(data) + + # Apply the function to the DataFrame column + df["standardized_date"] = df["date_column"].apply(parse_date_with_rule) + + print(df) + +**Output** + +.. code-block:: python + + date_column name amount standardized_date + 0 31/12/2021 Alice 100.00 2021-12-31 + 1 01/01/2022 Bob 150.50 2022-01-01 + 2 12/31/2021 Charlie 200.75 2021-12-31 + 3 13/02/2022 David 250.25 2022-02-13 + 4 07/04/2022 Eve 300.00 2022-04-07 + + +DataFrame Analysis +------------------- + +**Analyze DataFrame columns, including dtype, null values, and unique value counts.** + +.. function:: dataframe_columns(df) + + This function analyzes the columns of a DataFrame, providing details about the data type, + the number and percentage of ``null`` values, the total number of unique values, and the most + frequent unique value along with its count and percentage. It handles special cases such as + converting date columns and replacing empty strings with Pandas ``NA`` values. + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + + :returns: A DataFrame with the analysis results for each column. + :rtype: pandas.DataFrame + +**Example Usage** + +In the example below, we demonstrate how to use the ``dataframe_columns`` +function to analyze a DataFrame's columns. + +.. code-block:: python + + from eda_toolkit import dataframe_columns + + dataframe_columns(df=df) + + +**Output** + +`Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: python + + Shape: (48842, 16) + + Total seconds of processing time: 0.861555 + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+
+ + + +\ + +Generating Summary Tables for Variable Combinations +----------------------------------------------------- + +**This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.** + + +.. function:: summarize_all_combinations(df, variables, data_path, data_name, min_length=2) + + :param df: The pandas DataFrame containing the data. + :type df: pandas.DataFrame + :param variables: List of unique variables to generate combinations. + :type variables: list + :param data_path: Path where the output Excel file will be saved. + :type data_path: str + :param data_name: Name of the output Excel file. + :type data_name: str + :param min_length: Minimum length of combinations to generate. Defaults to ``2``. + :type min_length: int + + :returns: A dictionary of summary tables and a list of all generated combinations. + :rtype: tuple(dict, list) + +The function returns two outputs: + +1. ``summary_tables``: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values. + +2. ``all_combinations``: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables. + +**Example Usage** + +Below, we use the ``summarize_all_combinations`` function to generate summary tables for the specified +variables from a DataFrame containing the census data [1]_. + +.. code-block:: python + + from eda_toolkit import summarize_all_combinations + + # Define unique variables for the analysis + unique_vars = [ + "age_group", + "workclass", + "education", + "occupation", + "race", + "sex", + "income", + ] + + # Generate summary tables for all combinations of the specified variables + summary_tables, all_combinations = summarize_all_combinations( + df=df, + data_path=data_output, + variables=unique_vars, + data_name="census_summary_tables.xlsx", + ) + + # Print all combinations of variables + print(all_combinations) + +**Output** + +.. code-blocK:: python + + [('age_group', 'workclass'), + ('age_group', 'education'), + ('age_group', 'occupation'), + ('age_group', 'race'), + ('age_group', 'sex'), + ('age_group', 'income'), + ('workclass', 'education'), + ('workclass', 'occupation'), + ('workclass', 'race'), + ('workclass', 'sex'), + ('workclass', 'income'), + ('education', 'occupation'), + ('education', 'race'), + ('education', 'sex'), + ('education', 'income'), + ('occupation', 'race'), + ('occupation', 'sex'), + ('occupation', 'income'), + ('race', 'sex'), + ('race', 'income'), + ('sex', 'income'), + ('age_group', 'workclass', 'education'), + ('age_group', 'workclass', 'occupation'), + ('age_group', 'workclass', 'race'), + ('age_group', 'workclass', 'sex'), + ('age_group', 'workclass', 'income'), + ('age_group', 'education', 'occupation'), + ('age_group', 'education', 'race'), + ('age_group', 'education', 'sex'), + ('age_group', 'education', 'income'), + ('age_group', 'occupation', 'race'), + ('age_group', 'occupation', 'sex'), + ('age_group', 'occupation', 'income'), + ('age_group', 'race', 'sex'), + ('age_group', 'race', 'income'), + ('age_group', 'sex', 'income'), + ('workclass', 'education', 'occupation'), + ('workclass', 'education', 'race'), + ('workclass', 'education', 'sex'), + ('workclass', 'education', 'income'), + ('workclass', 'occupation', 'race'), + ('workclass', 'occupation', 'sex'), + ('workclass', 'occupation', 'income'), + ('workclass', 'race', 'sex'), + ('workclass', 'race', 'income'), + ('workclass', 'sex', 'income'), + ('education', 'occupation', 'race'), + ('education', 'occupation', 'sex'), + ('education', 'occupation', 'income'), + ('education', 'race', 'sex'), + ('education', 'race', 'income'), + ('education', 'sex', 'income'), + ('occupation', 'race', 'sex'), + ('occupation', 'race', 'income'), + ('occupation', 'sex', 'income'), + ('race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation'), + ('age_group', 'workclass', 'education', 'race'), + ('age_group', 'workclass', 'education', 'sex'), + ('age_group', 'workclass', 'education', 'income'), + ('age_group', 'workclass', 'occupation', 'race'), + ('age_group', 'workclass', 'occupation', 'sex'), + ('age_group', 'workclass', 'occupation', 'income'), + ('age_group', 'workclass', 'race', 'sex'), + ('age_group', 'workclass', 'race', 'income'), + ('age_group', 'workclass', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race'), + ('age_group', 'education', 'occupation', 'sex'), + ('age_group', 'education', 'occupation', 'income'), + ('age_group', 'education', 'race', 'sex'), + ('age_group', 'education', 'race', 'income'), + ('age_group', 'education', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex'), + ('age_group', 'occupation', 'race', 'income'), + ('age_group', 'occupation', 'sex', 'income'), + ('age_group', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race'), + ('workclass', 'education', 'occupation', 'sex'), + ('workclass', 'education', 'occupation', 'income'), + ('workclass', 'education', 'race', 'sex'), + ('workclass', 'education', 'race', 'income'), + ('workclass', 'education', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex'), + ('workclass', 'occupation', 'race', 'income'), + ('workclass', 'occupation', 'sex', 'income'), + ('workclass', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex'), + ('education', 'occupation', 'race', 'income'), + ('education', 'occupation', 'sex', 'income'), + ('education', 'race', 'sex', 'income'), + ('occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race'), + ('age_group', 'workclass', 'education', 'occupation', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'race', 'income'), + ('age_group', 'workclass', 'education', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'education', 'occupation', 'race', 'income'), + ('age_group', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'education', 'race', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex'), + ('workclass', 'education', 'occupation', 'race', 'income'), + ('workclass', 'education', 'occupation', 'sex', 'income'), + ('workclass', 'education', 'race', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex', 'income'), + ('age_group', + 'workclass', + 'education', + 'occupation', + 'race', + 'sex', + 'income')] + + +When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table. + +.. raw:: html + +
+ +.. image:: ../assets/summarize_combos.gif + :alt: EDA Toolkit Logo + :align: left + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Saving DataFrames to Excel with Customized Formatting +------------------------------------------------------- +**Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.** + + +This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the ``save_dataframes_to_excel`` function. + + +.. function:: save_dataframes_to_excel(file_path, df_dict, decimal_places=0) + + :param file_path: Full path to the output Excel file. + :type file_path: str + :param df_dict: Dictionary where keys are sheet names and values are DataFrames to save. + :type df_dict: dict + :param decimal_places: Number of decimal places to round numeric columns. Default is 0. + :type decimal_places: int + + :notes: + - The function will autofit columns and left-align text. + - Numeric columns will be formatted with the specified number of decimal places. + - Headers will be bold and left-aligned without borders. + +The function performs the following tasks: + +- Writes each DataFrame to its respective sheet in the Excel file. +- Rounds numeric columns to the specified number of decimal places. +- Applies customized formatting to headers and cells. +- Autofits columns based on the content length. + +**Example Usage** + +Below, we use the ``save_dataframes_to_excel`` function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between `18` and `40`. + +.. code-block:: python + + from eda_toolkit import save_dataframes_to_excel + + # Example usage + file_name = "df_census.xlsx" # Name of the output Excel file + file_path = os.path.join(data_path, file_name) + + # filter DataFrame to Ages 18-40 + filtered_df = df[(df["age"] > 18) & (df["age"] < 40)] + + df_dict = { + "original_df": df, + "ages_18_to_40": filtered_df, + } + + save_dataframes_to_excel( + file_path=file_path, + df_dict=df_dict, + decimal_places=0, + ) + + +**Output** + +The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between `18` and `40`, each on separate sheets with customized formatting. + + +Creating Contingency Tables +---------------------------- + +**Create a contingency table from one or more columns in a DataFrame, with sorting options.** + +This section explains how to create contingency tables from one or more columns in a DataFrame using the ``contingency_table`` function. + +.. function:: contingency_table(df, cols=None, sort_by=0) + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param cols: Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column. + :type cols: str or list, optional + :param sort_by: Enter ``0`` to sort results by column groups; enter ``1`` to sort results by totals in descending order. + :type sort_by: int + :raises ValueError: If no columns are specified or if sort_by is not ``0`` or ``1``. + :returns: A DataFrame with the specified columns, ``'Total'``, and ``'Percentage'``. + :rtype: pandas.DataFrame + +**Example Usage** + +Below, we use the ``contingency_table`` function to create a contingency table +from the specified columns in a DataFrame containing census data [1]_ + +.. code-block:: python + + from eda_toolkit import contingency_table + + # Example usage + contingency_table( + df=df, + cols=[ + "age_group", + "workclass", + "race", + "sex", + ], + sort_by=1, + ) + +**Output** + +The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the ``'Total'`` column in descending order because ``sort_by`` +is set to ``1``. + + +.. code-block:: python + + + age_group workclass race sex Total Percentage + 0 30-39 Private White Male 5856 11.99 + 1 18-29 Private White Male 5623 11.51 + 2 40-49 Private White Male 4267 8.74 + 3 18-29 Private White Female 3680 7.53 + 4 50-59 Private White Male 2565 5.25 + .. ... ... ... ... ... ... + 467 50-59 Federal-gov Other Male 1 0.00 + 468 50-59 Local-gov Asian-Pac-Islander Female 1 0.00 + 469 70-79 Self-emp-inc Black Male 1 0.00 + 470 80-89 Local-gov Asian-Pac-Islander Male 1 0.00 + 471 48842 100.00 + + [472 rows x 6 columns] + + +\ + +Highlighting Specific Columns in a DataFrame +--------------------------------------------- + +This section explains how to highlight specific columns in a DataFrame using the ``highlight_columns`` function. + +**Highlight specific columns in a DataFrame with a specified background color.** + +.. function:: highlight_columns(df, columns, color="yellow") + + :param df: The DataFrame to be styled. + :type df: pandas.DataFrame + :param columns: List of column names to be highlighted. + :type columns: list of str + :param color: The background color to be applied for highlighting (default is `"yellow"`). + :type color: str, optional + + :returns: A Styler object with the specified columns highlighted. + :rtype: pandas.io.formats.style.Styler + +**Example Usage** + +Below, we use the ``highlight_columns`` function to highlight the ``age`` and ``education`` +columns in the first 5 rows of the census [1]_ DataFrame with a pink background color. + +.. code-block:: python + + from eda_toolkit import highlight_columns + + # Applying the highlight function + highlighted_df = highlight_columns( + df=df, + columns=["age", "education"], + color="#F8C5C8", + ) + + highlighted_df + +**Output** + +The output will be a DataFrame with the specified columns highlighted in the given background color. +The ``age`` and ``education`` columns will be highlighted in pink. + +The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the ``.render()`` method of the Styler object. + + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+ +\ + +Binning Numerical Columns +--------------------------- + +Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or "bins." This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or "bins," and +then assigning each value to one of these intervals. + +.. note:: + + The code snippets below create age bins and assign a corresponding age group + label to each age in the DataFrame. The ``pd.cut`` function from pandas is used to + categorize the ages and assign them to a new column, ``age_group``. Adjust the bins + and labels as needed for your specific data. + + +Below, we use the ``age`` column of the census data [1]_ from the UCI Machine Learning Repository as an example: + +1. **Bins Definition**: + The bins are defined by specifying the boundaries of each interval. For example, + in the code snippet below, the ``bin_ages`` list specifies the boundaries for age groups: + + .. code-block:: python + + bin_ages = [ + 0, + 18, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + float("inf"), + ] + + + Each pair of consecutive elements in ``bin_ages`` defines a bin. For example: + + - The first bin is ``[0, 18)``, + - The second bin is ``[18, 30)``, + - and so on. + +\ + +2. **Labels for Bins**: + The `label_ages` list provides labels corresponding to each bin: + + .. code-block:: python + + label_ages = [ + "< 18", + "18-29", + "30-39", + "40-49", + "50-59", + "60-69", + "70-79", + "80-89", + "90-99", + "100 +", + ] + + These labels are used to categorize the numerical values into meaningful groups. + +3. **Applying the Binning**: + The `pd.cut `_ function + from Pandas is used to apply the binning process. For each value in the ``age`` + column of the DataFrame, it assigns a corresponding label based on which bin the + value falls into. Here, ``right=False`` indicates that each bin includes the + left endpoint but excludes the right endpoint. For example, if ``bin_ages = + [0, 10, 20, 30]``, then a value of ``10`` will fall into the bin ``[10, 20)`` and + be labeled accordingly. + + .. code-block:: python + + df["age_group"] = pd.cut( + df["age"], + bins=bin_ages, + labels=label_ages, + right=False, + ) + + **Mathematically**, for a given value `x` in the ``age`` column: + + .. math:: + + \text{age_group} = + \begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 + \end{cases} + + The parameter `right=False` in `pd.cut` means that the bins are left-inclusive + and right-exclusive, except for the last bin, which is always right-inclusive + when the upper bound is infinity (`float("inf")`). + + +KDE and Histogram Distribution Plots +======================================= + +Gaussian Assumption for Normality +---------------------------------- + +The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF): + +.. math:: + + f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) + +where: + +- :math:`\mu` is the mean +- :math:`\sigma^2` is the variance + +In a normally distributed dataset: + +- 68% of data falls within :math:`\mu \pm \sigma` +- 95% within :math:`\mu \pm 2\sigma` +- 99.7% within :math:`\mu \pm 3\sigma` + +.. raw:: html + +
+ +.. image:: ../assets/normal_distribution.png + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histograms and KDE +^^^^^^^^^^^^^^^^^^^^^^ + +**Histograms**: + +- Visualize data distribution by binning values and counting frequencies. +- If data is Gaussian, the histogram approximates a bell curve. + +**Kernel Density Estimation (KDE)**: + +- A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function. +- The KDE for a dataset :math:`X = \{x_1, x_2, \ldots, x_n\}` is given by: + +.. math:: + + \hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right) + +where: + +- :math:`K` is the kernel function (often Gaussian) +- :math:`h` is the bandwidth (smoothing parameter) + +**Combined Use of Histograms and KDE** + +- **Histograms** offer a discrete, binned view of the data. +- **KDE** provides a smooth, continuous estimate of the underlying distribution. +- Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality. + +KDE Distribution Function +----------------------------- + +**Generate KDE or histogram distribution plots for specified columns in a DataFrame.** + +The ``kde_distributions`` function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2]_ for plotting, which is built on top of +matplotlib [3]_ and provides a high-level interface for drawing attractive and informative +statistical graphics. + + +**Key Features and Parameters** + +- **Flexible Plotting**: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively. +- **Leverages Seaborn Library**: The function is built on the `seaborn` library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code. +- **Customization**: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs. +- **Scientific Notation Control**: The function allows disabling scientific notation on the axes, providing better readability for certain types of data. +- **Log Scaling**: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude. +- **Output Options**: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations. + +.. function:: kde_distributions(df, vars_of_interest=None, grid_figsize=(10, 8), single_figsize=(6, 4), kde=True, hist_color="#0000FF", kde_color="#FF0000", hist_edgecolor="#000000", hue=None, fill=True, fill_alpha=1, n_rows=1, n_cols=1, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_path_png=None, single_var_image_path_svg=None, single_var_image_filename=None, y_axis_label="Density", plot_type="both", log_scale_vars=None, bins="auto", binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat="density", xlim=None, ylim=None) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param vars_of_interest: List of column names for which to generate distribution plots. + :type vars_of_interest: list of str, optional + :param grid_figsize: Size of the overall grid figure, default is ``(10, 8)``. + :type grid_figsize: tuple, optional + :param single_figsize: Size of individual figures for each variable, default is ``(6, 4)``. + :type single_figsize: tuple, optional + :param kde: Whether to include KDE plots on the histograms, default is ``True``. + :type kde: bool, optional + :param hist_color: Color of the histogram bars, default is ``'#0000FF'``. + :type hist_color: str, optional + :param kde_color: Color of the KDE plot, default is ``'#FF0000'``. + :type kde_color: str, optional + :param hist_edgecolor: Color of the histogram bar edges, default is ``'#000000'``. + :type hist_edgecolor: str, optional + :param hue: Column name to group data by, adding different colors for each group. + :type hue: str, optional + :param fill: Whether to fill the histogram bars with color, default is ``True``. + :type fill: bool, optional + :param fill_alpha: Alpha transparency for the fill color of the histogram bars, where + ``0`` is fully transparent and ``1`` is fully opaque. Default is ``1``. + :type fill_alpha: float, optional + :param n_rows: Number of rows in the subplot grid, default is ``1``. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid, default is ``1``. + :type n_cols: int, optional + :param w_pad: Width padding between subplots, default is ``1.0``. + :type w_pad: float, optional + :param h_pad: Height padding between subplots, default is ``1.0``. + :type h_pad: float, optional + :param image_path_png: Directory path to save the PNG image of the overall distribution plots. + :type image_path_png: str, optional + :param image_path_svg: Directory path to save the SVG image of the overall distribution plots. + :type image_path_svg: str, optional + :param image_filename: Filename to use when saving the overall distribution plots. + :type image_filename: str, optional + :param bbox_inches: Bounding box to use when saving the figure. For example, ``'tight'``. + :type bbox_inches: str, optional + :param single_var_image_path_png: Directory path to save the PNG images of the separate distribution plots. + :type single_var_image_path_png: str, optional + :param single_var_image_path_svg: Directory path to save the SVG images of the separate distribution plots. + :type single_var_image_path_svg: str, optional + :param single_var_image_filename: Filename to use when saving the separate distribution plots. + The variable name will be appended to this filename. + :type single_var_image_filename: str, optional + :param y_axis_label: The label to display on the ``y-axis``, default is ``'Density'``. + :type y_axis_label: str, optional + :param plot_type: The type of plot to generate, options are ``'hist'``, ``'kde'``, or ``'both'``. Default is ``'both'``. + :type plot_type: str, optional + :param log_scale_vars: List of variable names to apply log scaling. + :type log_scale_vars: list of str, optional + :param bins: Specification of histogram bins, default is ``'auto'``. + :type bins: int or sequence, optional + :param binwidth: Width of each bin, overrides bins but can be used with binrange. + :type binwidth: number or pair of numbers, optional + :param label_fontsize: Font size for axis labels, including xlabel, ylabel, and tick marks, default is ``10``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: Maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param disable_sci_notation: Toggle to disable scientific notation on axes, default is ``False``. + :type disable_sci_notation: bool, optional + :param stat: Aggregate statistic to compute in each bin (e.g., ``'count'``, ``'frequency'``, + ``'probability'``, ``'percent'``, ``'density'``), default is ``'density'``. + :type stat: str, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``plot_type`` is not one of ``'hist'``, ``'kde'``, or ``'both'``. + - If ``stat`` is not one of ``'count'``, ``'density'``, ``'frequency'``, ``'probability'``, ``'proportion'``, ``'percent'``. + - If ``log_scale_vars`` contains variables that are not present in the DataFrame. + - If ``fill`` is set to ``False`` and ``hist_edgecolor`` is not the default. + + :raises UserWarning: + - If ``stat`` is set to 'count' while ``kde`` is ``True``, as it may produce misleading plots. + - If both ``bins`` and ``binwidth`` are specified, which may affect performance. + + :returns: ``None`` + + +\ + +.. raw:: html + +
+ + + +KDE and Histograms Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the below example, the ``kde_distributions`` function is used to generate +histograms for several variables of interest: ``"age"``, ``"education-num"``, and +``"hours-per-week"``. These variables represent different demographic and +financial attributes from the dataset. The ``kde=True`` parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data's probability density. + +The visualizations are arranged in a single row of four columns, as specified +by ``n_rows=1`` and ``n_cols=3``, respectively. The overall size of the grid +figure is set to `14 inches` wide and `4 inches tall` (``grid_figsize=(14, 4)``), +while each individual plot is configured to be `4 inches` by `4 inches` +(``single_figsize=(4, 4)``). The ``fill=True`` parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +``w_pad=1`` and ``h_pad=1``, which add `1 inch` of padding both horizontally and +vertically. + +To handle longer titles, the ``text_wrap=50`` parameter ensures that the title +text wraps to a new line after `50 characters`. The ``bbox_inches="tight"`` setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in ``vars_of_interest`` are +passed directly to the function for visualization. + +Each plot is saved individually with filenames that are prefixed by +``"kde_density_single_distribution"``, followed by the variable name. The ```y-axis``` +for all plots is labeled as "Density" (``y_axis_label="Density"``), reflecting that +the height of the bars or KDE line represents the data's density. The histograms +are divided into `10 bins` (``bins=10``), offering a clear view of the distribution +of each variable. + +The ``plot_type="hist"`` parameter indicates that only histograms will be generated +for each variable. Additionally, the font sizes for the axis labels and tick labels +are set to `16 points` (``label_fontsize=16``) and `14 points` (``tick_fontsize=14``), +respectively, ensuring that all text within the plots is legible and well-formatted. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=True, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + fill=True, + fill_alpha=0.60, + w_pad=1, + h_pad=1, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + +.. raw:: html + +
+ +.. image:: ../assets/kde_density_distributions.svg + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Density) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the kde_distributions function is used to generate histograms for +the variables ``"age"``, ``"education-num"``, and ``"hours-per-week"`` but with +``kde=False``, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (``n_rows=1, n_cols=3``), +with a grid size of `14x4 inches` (``grid_figsize=(14, 4)``). The histograms are +divided into `10 bins` (``bins=10``), and the ``y-axis`` is labeled "Density" (``y_axis_label="Density"``). +Font sizes for the axis labels and tick labels are set to `16` and `14` points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=False, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + w_pad=1, + h_pad=1, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/hist_density_distributions.svg + :alt: KDE Distributions - Histograms (Density) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Count) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the kde_distributions function is modified to generate histograms +with a few key changes. The ``hist_color`` is set to `"orange"`, changing the color of the +histogram bars. The ```y-axis``` label is updated to "Count" (``y_axis_label="Count"``), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to `"Count"` to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (``n_rows=1, n_cols=4``), +a grid size of `14x4 inches`, and a bin count of `10`. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=False, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + w_pad=1, + h_pad=1, + text_wrap=50, + hist_color="orange", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Count", + bins=10, + plot_type="hist", + stat="Count", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/count_hist_distributions.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Stacked Crosstab Plots +======================= + +**Generates stacked bar plots and crosstabs for specified columns in a DataFrame.** + +The ``stacked_crosstab_plot`` function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats. + +The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis. + +.. function:: stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind="bar", width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output="both", return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type="both", show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False) + + Generates stacked or regular bar plots and crosstabs for specified columns. + + This function allows users to create stacked bar plots (or regular bar plots + if stacks are removed) and corresponding crosstabs for specific columns + in a DataFrame. It provides options to customize the appearance, including + font sizes for axis labels, tick labels, and title text wrapping, and to + choose between regular or normalized plots. + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param col: The name of the column in the DataFrame to be analyzed. + :type col: str + :param func_col: List of ground truth columns to be analyzed. + :type func_col: list + :param legend_labels_list: List of legend labels for each ground truth column. + :type legend_labels_list: list + :param title: List of titles for the plots. + :type title: list + :param kind: The kind of plot to generate (``'bar'`` or ``'barh'`` for horizontal bars), default is ``'bar'``. + :type kind: str, optional + :param width: The width of the bars in the bar plot, default is ``0.9``. + :type width: float, optional + :param rot: The rotation angle of the ``x-axis`` labels, default is ``0``. + :type rot: int, optional + :param custom_order: Specifies a custom order for the categories in the ``col``. + :type custom_order: list, optional + :param image_path_png: Directory path where generated PNG plot images will be saved. + :type image_path_png: str, optional + :param image_path_svg: Directory path where generated SVG plot images will be saved. + :type image_path_svg: str, optional + :param save_formats: List of file formats to save the plot images in. + :type save_formats: list, optional + :param color: List of colors to use for the plots. If not provided, a default color scheme is used. + :type color: list, optional + :param output: Specify the output type: ``"plots_only"``, ``"crosstabs_only"``, or ``"both"``. Default is ``"both"``. + :type output: str, optional + :param return_dict: Specify whether to return the crosstabs dictionary, default is ``False``. + :type return_dict: bool, optional + :param x: The width of the figure. + :type x: int, optional + :param y: The height of the figure. + :type y: int, optional + :param p: The padding between the subplots. + :type p: int, optional + :param file_prefix: Prefix for the filename when output includes plots. + :type file_prefix: str, optional + :param logscale: Apply log scale to the ``y-axis``, default is ``False``. + :type logscale: bool, optional + :param plot_type: Specify the type of plot to generate: ``"both"``, ``"regular"``, ``"normalized"``. Default is ``"both"``. + :type plot_type: str, optional + :param show_legend: Specify whether to show the legend, default is ``True``. + :type show_legend: bool, optional + :param label_fontsize: Font size for axis labels, default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param remove_stacks: If ``True``, removes stacks and creates a regular bar plot using only the ``col`` parameter. Only works when ``plot_type`` is set to ``'regular'``. Default is ``False``. + :type remove_stacks: bool, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``output`` is not one of ``"both"``, ``"plots_only"``, or ``"crosstabs_only"``. + - If ``plot_type`` is not one of ``"both"``, ``"regular"``, ``"normalized"``. + - If ``remove_stacks`` is set to True and ``plot_type`` is not ``"regular"``. + - If the lengths of ``title``, ``func_col``, and ``legend_labels_list`` are not equal. + :raises KeyError: If any columns specified in ``col`` or ``func_col`` are missing in the DataFrame. + + :returns: Dictionary of crosstabs DataFrames if ``return_dict`` is ``True``. Otherwise, returns ``None``. + :rtype: ``dict`` or ``None`` + + + +Stacked Bar Plots With Crosstabs Example +----------------------------------------- + +The provided code snippet demonstrates how to use the ``stacked_crosstab_plot`` +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here's a detailed breakdown of the code using the census +dataset as an example [1]_. + +First, the ``func_col`` list is defined, specifying the columns ``["sex", "income"]`` +to be analyzed. These columns will be used in the loop to generate separate plots. +The ``legend_labels_list`` is then defined, with each entry corresponding to a +column in ``func_col``. In this case, the labels for the ``sex`` column are +``["Male", "Female"]``, and for the ``income`` column, they are ``["<=50K", ">50K"]``. +These labels will be used to annotate the legends of the plots. + +Next, the ``title`` list is defined, providing titles for each plot corresponding +to the columns in ``func_col``. The titles are set to ``["Sex", "Income"]``, +which will be displayed on top of each respective plot. + +.. note:: + + The ``legend_labels_list`` parameter should be a list of lists, where each + inner list corresponds to the ground truth labels for the respective item in + the ``func_col`` list. Each element in the ``func_col`` list represents a + column in your DataFrame that you wish to analyze, and the corresponding + inner list in ``legend_labels_list`` should contain the labels that will be + used in the legend of your plots. + +For example: + +.. code-block:: python + + # Define the func_col to use in the loop in order of usage + func_col = ["sex", "income"] + + # Define the legend_labels to use in the loop + legend_labels_list = [ + ["Male", "Female"], # Corresponds to "sex" + ["<=50K", ">50K"], # Corresponds to "income" + ] + + # Define titles for the plots + title = [ + "Sex", + "Income", + ] + +.. important:: + + Ensure that the number of elements in ``func_col``, ``legend_labels_list``, + and ``title`` are the same. Each item in ``func_col`` must have a corresponding + list of labels in ``legend_labels_list`` and a title in ``title``. This + consistency is essential for the function to correctly generate the plots + with the appropriate labels and titles. + + +In this example: + +- ``func_col`` contains two elements: ``"sex"`` and ``"income"``. Each corresponds to a specific column in your DataFrame. +- ``legend_labels_list`` is a nested list containing two inner lists: + + - The first inner list, ``["Male", "Female"]``, corresponds to the ``"sex"`` column in ``func_col``. + - The second inner list, ``["<=50K", ">50K"]``, corresponds to the ``"income"`` column in ``func_col``. + +- ``title`` contains two elements: ``"Sex"`` and ``"Income"``, which will be used as the titles for the respective plots. + +.. note:: + + If you assign the function to a variable, the dictionary returned when + ``return_dict=True`` will be suppressed in the output. However, the dictionary + is still available within the assigned variable for further use. + + +.. code-block:: python + + from eda_toolkit import stacked_crosstab_plot + + # Call the stacked_crosstab_plot function + stacked_crosstabs = stacked_crosstab_plot( + df=df, + col="age_group", + func_col=func_col, + legend_labels_list=legend_labels_list, + title=title, + kind="bar", + width=0.8, + rot=45, # axis rotation angle + custom_order=None, + color=["#00BFC4", "#F8766D"], # default color schema + output="both", + return_dict=True, + x=14, + y=8, + p=10, + logscale=False, + plot_type="both", + show_legend=True, + label_fontsize=14, + tick_fontsize=12, + ) + +The above example generates stacked bar plots for ``"sex"`` and ``"income"`` +grouped by ``"education"``. The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export. + +.. important:: + + **Importance of Correctly Aligning Labels** + + It is crucial to properly align the elements in the ``legend_labels_list``, + ``title``, and ``func_col`` parameters when using the ``stacked_crosstab_plot`` + function. Each of these lists must be ordered consistently because the function + relies on their alignment to correctly assign labels and titles to the + corresponding plots and legends. + + **For instance, in the example above:** + + - The first element in ``func_col`` is ``"sex"``, and it is aligned with the first set of labels ``["Male", "Female"]`` in ``legend_labels_list`` and the first title ``"Sex"`` in the ``title`` list. + - Similarly, the second element in ``func_col``, ``"income"``, aligns with the labels ``["<=50K", ">50K"]`` and the title ``"Income"``. + + **Misalignment between these lists would result in incorrect labels or titles being + applied to the plots, potentially leading to confusion or misinterpretation of the data. + Therefore, it's important to ensure that each list is ordered appropriately and + consistently to accurately reflect the data being visualized.** + + **Proper Setup of Lists** + + When setting up the ``legend_labels_list``, ``title``, and ``func_col``, ensure + that each element in the lists corresponds to the correct variable in the DataFrame. + This involves: + + - **Ordering**: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted. + - **Consistency**: Double-checking that each label in ``legend_labels_list`` matches the categories present in the corresponding ``func_col``, and that the ``title`` accurately describes the plot. + + By adhering to these guidelines, you can ensure that the ``stacked_crosstab_plot`` + function produces accurate and meaningful visualizations that are easy to interpret and analyze. + +**Output** + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_sex.svg + :alt: KDE Distributions + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income.svg + :alt: Stacked Bar Plot Age vs. Income + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +.. note:: + + When you set ``return_dict=True``, you are able to see the crosstabs printed out + as shown below. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93
+ +\ + +When you set ``return_dict=True``, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example: + +.. code-block:: python + + crosstab_age_sex = crosstabs_dict["sex"] + crosstab_age_income = crosstabs_dict["income"] + + +Pivoted Stacked Bar Plots Example +----------------------------------- + +Using the census dataset [1]_, to create horizontal stacked bar plots, set the ``kind`` parameter to +``"barh"`` in the ``stacked_crosstab_plot function``. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the ``y-axis``. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_pivoted.svg + :alt: Stacked Bar Plot Age vs. Income (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Non-Normalized Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to create stacked bar plots without the normalized versions, +set the ``plot_type`` parameter to ``"regular"`` in the ``stacked_crosstab_plot`` +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the ``plot_type`` to ``"normalized"`` will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_regular.svg + :alt: Stacked Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Regular Non-Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the ``plot_type`` parameter to ``"regular"`` +in the ``stacked_crosstab_plot`` function and enable ``remove_stacks`` by setting +it to ``True``. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +``plot_type`` to ``"normalized"`` will display only the normalized plots. + +When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories. + +In the example below, the color of the bars has been set to a dark grey (``#333333``), +and the legend has been removed by setting ``show_legend=False``. This illustrates +regular bar plots for income by age, without stacking. + + +.. raw:: html + +
+ +.. image:: ../assets/Bar_Age_regular_income.svg + :alt: Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Box and Violin Plots +=========================== + +**Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.** + +The ``box_violin_plot`` function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories. + +With options to customize the plot type (``boxplot`` or ``violinplot``), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis. + +Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures. + +The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset. + +.. function:: box_violin_plot(df, metrics_list, metrics_boxplot_comp, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type="boxplot", xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param metrics_list: List of metric names (columns in df) to plot. + :type metrics_list: list of str + :param metrics_boxplot_comp: List of comparison categories (columns in df). + :type metrics_boxplot_comp: list of str + :param n_rows: Number of rows in the subplot grid. + :type n_rows: int + :param n_cols: Number of columns in the subplot grid. + :type n_cols: int + :param image_path_png: Optional directory path to save ``.png`` images. + :type image_path_png: str, optional + :param image_path_svg: Optional directory path to save ``.svg`` images. + :type image_path_svg: str, optional + :param save_plots: String, ``"all"``, ``"individual"``, or ``"grid"`` to control saving plots. + :type save_plots: str, optional + :param show_legend: Boolean, True if showing the legend in the plots. + :type show_legend: bool, optional + :param plot_type: Specify the type of plot, either ``"boxplot"`` or ``"violinplot"``. Default is ``"boxplot"``. + :type plot_type: str, optional + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + :param show_plot: Specify the plot display mode: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + :param rotate_plot: Boolean, True if rotating (pivoting) the plots. + :type rotate_plot: bool, optional + :param individual_figsize: Width and height of the figure for individual plots. Default is (``6, 4``). + :type individual_figsize: tuple or list, optional + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of None, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set without specifying ``image_path_png`` or ``image_path_svg``. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` is not a tuple or list of two numbers. + - If ``grid_figsize`` is specified but is not a tuple or list of two numbers. + + :returns: ``None`` + + + + +This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels. + +Box Plots Grid Example +----------------------- + +In this example with the US census data [1]_, the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the ``"age_group"`` column in the +DataFrame. The ``metrics_boxplot_comp`` parameter is set to [``"age_group"``], meaning +that the comparison will be based on different age groups. The ``metrics_list`` is +provided as ``age_boxplot_list``, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid format with `3` rows and `4` +columns, using the ``n_rows=3`` and ``n_cols=4`` parameters. The ``image_path_png`` and +``image_path_svg`` parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to ``"all"``, ensuring that both +individual and grid plots are saved. + +The plots are displayed in a grid format, as indicated by the ``show_plot="grid"`` +parameter. The ``plot_type`` is set to ``"boxplot"``, so the function will generate +boxplots for each metric in the list. Additionally, the ```x-axis``` labels are rotated +by 90 degrees (``xlabel_rot=90``) to ensure that the labels are legible. The legend is +hidden by setting ``show_legend=False``, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication. + + +.. code-block:: python + + age_boxplot_list = df[ + [ + "education-num", + "hours-per-week", + ] + ].columns.to_list() + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="boxplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_boxplot.png + :alt: Box Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Violin Plots Grid Example +-------------------------- + +In this example with the US census data [1]_, we keep everything the same as the prior example, but change the +``plot_type`` to ``violinplot``. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings. + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="violinplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot.png + :alt: Violin Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Pivoted Violin Plots Grid Example +------------------------------------ + +In this example with the US census data [1]_, we set ``xlabel_rot=0`` and ``rotate_plot=True`` +to pivot the plot, changing the orientation of the axes while keeping the ```x-axis``` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution. + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + rotate_plot=True, + show_legend=False, + plot_type="violinplot", + xlabel_rot=0, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot_pivoted.png + :alt: Violin Plot Comparisons (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots and Best Fit Lines +================================== + +Pearson Correlation Coefficient +-------------------------------- + +The Pearson correlation coefficient, often denoted as :math:`r`, is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from :math:`-1` to :math:`1`, where: + +- :math:`r = 1` indicates a perfect positive linear relationship. +- :math:`r = -1` indicates a perfect negative linear relationship. +- :math:`r = 0` indicates no linear relationship. + +The Pearson correlation coefficient between two variables :math:`X` and :math:`Y` is defined as: + +.. math:: + + r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} + +where: + +- :math:`\text{Cov}(X, Y)` is the covariance of :math:`X` and :math:`Y`. +- :math:`\sigma_X` is the standard deviation of :math:`X`. +- :math:`\sigma_Y` is the standard deviation of :math:`Y`. + +Covariance measures how much two variables change together. It is defined as: + +.. math:: + + \text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y) + +where: + +- :math:`n` is the number of data points. +- :math:`X_i` and :math:`Y_i` are the individual data points. +- :math:`\mu_X` and :math:`\mu_Y` are the means of :math:`X` and :math:`Y`. + +The standard deviation measures the dispersion or spread of a set of values. For +a variable :math:`X`, the standard deviation :math:`\sigma_X` is: + +.. math:: + + \sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2} + +Substituting the covariance and standard deviation into the Pearson correlation formula: + +.. math:: + + r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}} + +This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between :math:`X` and :math:`Y`. + +- :math:`r > 0`: Positive correlation. As :math:`X` increases, :math:`Y` tends to increase. +- :math:`r < 0`: Negative correlation. As :math:`X` increases, :math:`Y` tends to decrease. +- :math:`r = 0`: No linear correlation. There is no consistent linear relationship between :math:`X` and :math:`Y`. + +The closer the value of :math:`r` is to :math:`\pm 1`, the stronger the linear relationship between the two variables. + +Scatter Fit Plot +------------------ + +**Create and Save Scatter Plots or a Grid of Scatter Plots** + +This function, ``scatter_fit_plot``, is designed to generate scatter plots for +one or more pairs of variables (``x_vars`` and ``y_vars``) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view. + +**Optional Best Fit Line** + +An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s + +**Customizable Plot Aesthetics** + +The function offers a wide range of customization options to tailor the appearance +of the scatter plots: + +- **Point Color**: You can specify a default color for the scatter points or use a ``hue`` parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data. + +- **Point Size**: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable. + +- **Markers**: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data. + +**Axis and Label Configuration** + +The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges. + +**Plot Display and Saving Options** + +The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations. + +**Correlation Coefficient Display** + +For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship. + +.. function:: scatter_fit_plot(df, x_vars, y_vars, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color="C0", best_fit_linecolor="red", best_fit_linestyle="-", hue=None, hue_palette=None, size=None, sizes=None, marker="o", show_correlation=True, xlim=None, ylim=None) + + Create and save scatter plots or a grid of scatter plots for given x_vars + and y_vars, with an optional best fit line and customizable point color, + size, and markers. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param x_vars: List of variable names to plot on the `x-axis`. + :type x_vars: list of str + + :param y_vars: List of variable names to plot on the `y-axis`. + :type y_vars: list of str + + :param n_rows: Number of rows in the subplot grid. + :type n_rows: int + + :param n_cols: Number of columns in the subplot grid. + :type n_cols: int + + :param image_path_png: Directory path to save PNG images of the scatter plots. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the scatter plots. + :type image_path_svg: str, optional + + :param save_plots: Controls which plots to save: ``"all"``, ``"individual"``, or ``"grid"``. + :type save_plots: str, optional + + :param show_legend: Whether to display the legend on the plots. Default is ``True``. + :type show_legend: bool, optional + + :param xlabel_rot: Rotation angle for `x-axis` labels. Default is ``0``. + :type xlabel_rot: int, optional + + :param show_plot: Controls plot display: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + + :param rotate_plot: Whether to rotate (pivot) the plots. Default is ``False``. + :type rotate_plot: bool, optional + + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + + :param add_best_fit_line: Whether to add a best fit line to the scatter plots. Default is ``False``. + :type add_best_fit_line: bool, optional + + :param scatter_color: Color code for the scattered points. Default is ``"C0"``. + :type scatter_color: str, optional + + :param best_fit_linecolor: Color code for the best fit line. Default is ``"red"``. + :type best_fit_linecolor: str, optional + + :param best_fit_linestyle: Linestyle for the best fit line. Default is ``"-"``. + :type best_fit_linestyle: str, optional + + :param hue: Column name for the grouping variable that will produce points with different colors. + :type hue: str, optional + + :param hue_palette: Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. + :type hue_palette: dict, list, or str, optional + + :param size: Column name for the grouping variable that will produce points with different sizes. + :type size: str, optional + + :param sizes: Dictionary mapping sizes (smallest and largest) to min and max values. + :type sizes: dict, optional + + :param marker: Marker style used for the scatter points. Default is ``"o"``. + :type marker: str, optional + + :param show_correlation: Whether to display the Pearson correlation coefficient in the plot title. Default is ``True``. + :type show_correlation: bool, optional + + :param xlim: Limits for the `x-axis` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + + :param ylim: Limits for the `y-axis` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set but no image paths are provided. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` or ``grid_figsize`` are not tuples/lists with two numeric values. + + :returns: ``None`` + This function does not return any value but generates and optionally saves scatter plots for the specified `x_vars` and `y_vars`. + + +Regression-Centric Scatter Plots Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this US census data [1]_ example, the ``scatter_fit_plot`` function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the ``show_correlation=True`` parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the ``add_best_fit_line=True`` parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="grid", + show_legend=True, + xlabel_rot=0, + show_plot="grid", + rotate_plot=False, + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid.png + :alt: Scatter Plot Comparisons (with Best Fit Lines) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Scatter Plots Grouped by Category Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of +scatter plots that examine the relationships between ``age`` and ``hours-per-week`` +as well as ``education-num`` and ``hours-per-week``. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots: + +1. **Hue and Hue Palette**: The ``hue`` parameter is set to ``"income"``, meaning that the + data points in the scatter plots are colored according to the values in the ``income`` + column. A custom color mapping is provided via the ``hue_palette`` parameter, where the + income categories ``"<=50K"`` and ``">50K"`` are assigned the colors ``"brown"`` and + ``"green"``, respectively. This change visually distinguishes the data points based on + income levels. + +2. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, which applies + a grey color to the scatter points when no ``hue`` is provided. However, since a ``hue`` + is specified in this example, the ``hue_palette`` takes precedence and overrides this color setting. + +3. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``False``, meaning that + no best fit line is added to the scatter plots. This differs from the previous example where + a best fit line was included. + +4. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``False``, so the + Pearson correlation coefficient will not be displayed in the plot titles. This is another + change from the previous example where the correlation coefficient was included. + +5. **Hue Legend**: The ``show_legend`` parameter remains set to ``True``, ensuring that the + legend displaying the hue categories (``"<=50K"`` and ``">50K"``) appears on the plots, + helping to interpret the color coding of the data points. + +These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths. + + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + hue_dict = {"<=50K": "brown", ">50K": "green"} + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="grid", + show_legend=True, + xlabel_rot=0, + show_plot="grid", + rotate_plot=False, + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=False, + scatter_color="#808080", + hue="income", + hue_palette=hue_dict, + show_correlation=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid_grouped.png + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Correlation Matrices +===================== + +**Generate and Save Customizable Correlation Heatmaps** + +The ``flex_corr_matrix`` function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats. + +**Customizable Plot Appearance** + +The function provides extensive customization options for the heatmap's appearance: + +- **Colormap Selection**: Choose from a variety of colormaps to represent the strength of correlations. The default is ``"coolwarm"``, but this can be adjusted to fit the needs of the analysis. + +- **Annotation**: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance. + +- **Figure Size and Layout**: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards. + +**Triangular vs. Full Correlation Matrix** + + +A key feature of the ``flex_corr_matrix`` function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations. + +**Label and Axis Configuration** + + +The function offers flexibility in configuring axis labels and titles: + +- **Label Rotation**: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names. +- **Font Sizes**: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable. +- **Title Wrapping**: Control the wrapping of long titles to fit within the plot without overlapping other elements. + +**Plot Display and Saving Options** + + +The ``flex_corr_matrix`` function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images. + +.. function:: flex_corr_matrix(df, cols=None, annot=True, cmap="coolwarm", save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title="Cervical Cancer Data: Correlation Matrix", label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment="right", ylabel_alignment="center_baseline", text_wrap=50, vmin=-1, vmax=1, cbar_label="Correlation Index", triangular=True, **kwargs) + + Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param cols: List of column names to include in the correlation matrix. If None, all columns are included. + :type cols: list of str, optional + + :param annot: Whether to annotate the heatmap with correlation coefficients. Default is ``True``. + :type annot: bool, optional + + :param cmap: The colormap to use for the heatmap. Default is ``"coolwarm"``. + :type cmap: str, optional + + :param save_plots: Controls whether to save the plots. Default is ``False``. + :type save_plots: bool, optional + + :param image_path_png: Directory path to save PNG images of the heatmap. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the heatmap. + :type image_path_svg: str, optional + + :param figsize: Width and height of the figure for the heatmap. Default is ``(10, 10)``. + :type figsize: tuple, optional + + :param title: Title of the heatmap. Default is ``"Cervical Cancer Data: Correlation Matrix"``. + :type title: str, optional + + :param label_fontsize: Font size for tick labels and colorbar label. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param xlabel_rot: Rotation angle for x-axis labels. Default is ``45``. + :type xlabel_rot: int, optional + + :param ylabel_rot: Rotation angle for y-axis labels. Default is ``0``. + :type ylabel_rot: int, optional + + :param xlabel_alignment: Horizontal alignment for x-axis labels. Default is ``"right"``. + :type xlabel_alignment: str, optional + + :param ylabel_alignment: Vertical alignment for y-axis labels. Default is ``"center_baseline"``. + :type ylabel_alignment: str, optional + + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + + :param vmin: Minimum value for the heatmap color scale. Default is ``-1``. + :type vmin: float, optional + + :param vmax: Maximum value for the heatmap color scale. Default is ``1``. + :type vmax: float, optional + + :param cbar_label: Label for the colorbar. Default is ``"Correlation Index"``. + :type cbar_label: str, optional + + :param triangular: Whether to show only the upper triangle of the correlation matrix. Default is ``True``. + :type triangular: bool, optional + + :param kwargs: Additional keyword arguments to pass to ``seaborn.heatmap()``. + :type kwargs: dict, optional + + :raises ValueError: + - If ``annot`` is not a boolean. + - If ``cols`` is not a list. + - If ``save_plots`` is not a boolean. + - If ``triangular`` is not a boolean. + - If ``save_plots`` is True but no image paths are provided. + + :returns: ``None`` + This function does not return any value but generates and optionally saves a correlation heatmap. + +Triangular Correlation Matrix Example +-------------------------------------- + +The provided code filters the census [1]_ DataFrame ``df`` to include only numeric columns using +``select_dtypes(np.number)``. It then utilizes the ``flex_corr_matrix()`` function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options. + +.. note:: + + This triangular matrix format is particularly useful for avoiding + redundancy in correlation matrices, as it excludes the lower half, + making it easier to focus on unique pairwise correlations. + +The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations. + +.. code-block:: python + + # Select only numeric data to pass into the function + df_num = df.select_dtypes(np.number) + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="coolwarm", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Full Correlation Matrix Example +---------------------------------- + +In this modified census [1]_ example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting ``cmap="viridis"``, the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting ``triangular=False``, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset. + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="viridis", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix_full.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +.. [#] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +.. [2] Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +.. [3] Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. diff --git a/_build/html/v0.0.7/_static/_sphinx_javascript_frameworks_compat.js b/_build/html/v0.0.7/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/_build/html/v0.0.7/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * 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/_build/html/v0.0.7/_static/basic.css b/_build/html/v0.0.7/_static/basic.css new file mode 100644 index 000000000..7ebbd6d07 --- /dev/null +++ b/_build/html/v0.0.7/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- 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: 230px; + 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-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +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; +} + +a:visited { + color: #551A8B; +} + +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; +} + +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; +} + +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 > 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; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +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; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- 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/_build/html/v0.0.7/_static/check-solid.svg b/_build/html/v0.0.7/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_build/html/v0.0.7/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_build/html/v0.0.7/_static/clipboard.min.js b/_build/html/v0.0.7/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_build/html/v0.0.7/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * 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/_build/html/v0.0.7/_static/copybutton.css b/_build/html/v0.0.7/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_build/html/v0.0.7/_static/copybutton.css @@ -0,0 +1,94 @@ +/* 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/_build/html/v0.0.7/_static/copybutton.js b/_build/html/v0.0.7/_static/copybutton.js new file mode 100644 index 000000000..0ea5f6c60 --- /dev/null +++ b/_build/html/v0.0.7/_static/copybutton.js @@ -0,0 +1,248 @@ +// 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, '>|\\$ ', true, 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/_build/html/v0.0.7/_static/copybutton_funcs.js b/_build/html/v0.0.7/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_build/html/v0.0.7/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +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/_build/html/v0.0.7/_static/css/badge_only.css b/_build/html/v0.0.7/_static/css/badge_only.css new file mode 100644 index 000000000..88ba55b96 --- /dev/null +++ b/_build/html/v0.0.7/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Bold.woff b/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Regular.woff b/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.eot b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.svg b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.ttf b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.woff b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.woff2 b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_build/html/v0.0.7/_static/css/fonts/lato-bold-italic.woff b/_build/html/v0.0.7/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_build/html/v0.0.7/_static/css/fonts/lato-bold-italic.woff2 b/_build/html/v0.0.7/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_build/html/v0.0.7/_static/css/fonts/lato-bold.woff b/_build/html/v0.0.7/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/lato-bold.woff differ diff --git a/_build/html/v0.0.7/_static/css/fonts/lato-bold.woff2 b/_build/html/v0.0.7/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/lato-bold.woff2 differ diff --git a/_build/html/v0.0.7/_static/css/fonts/lato-normal-italic.woff b/_build/html/v0.0.7/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_build/html/v0.0.7/_static/css/fonts/lato-normal-italic.woff2 b/_build/html/v0.0.7/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_build/html/v0.0.7/_static/css/fonts/lato-normal.woff b/_build/html/v0.0.7/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/lato-normal.woff differ diff --git a/_build/html/v0.0.7/_static/css/fonts/lato-normal.woff2 b/_build/html/v0.0.7/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.7/_static/css/fonts/lato-normal.woff2 differ diff --git a/_build/html/v0.0.7/_static/css/theme.css b/_build/html/v0.0.7/_static/css/theme.css new file mode 100644 index 000000000..0f14f1064 --- /dev/null +++ b/_build/html/v0.0.7/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_build/html/v0.0.7/_static/doctools.js b/_build/html/v0.0.7/_static/doctools.js new file mode 100644 index 000000000..0398ebb9f --- /dev/null +++ b/_build/html/v0.0.7/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + 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; + }, + + /** + * 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; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + 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; + } + } + + // 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/_build/html/v0.0.7/_static/documentation_options.js b/_build/html/v0.0.7/_static/documentation_options.js new file mode 100644 index 000000000..65486ea30 --- /dev/null +++ b/_build/html/v0.0.7/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.0.7', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_build/html/v0.0.7/_static/file.png b/_build/html/v0.0.7/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_build/html/v0.0.7/_static/file.png differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.eot b/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.eot differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.ttf b/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.ttf differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.woff b/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.woff differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.woff2 b/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.eot b/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.ttf b/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.woff b/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.woff2 b/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.eot b/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.eot differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.ttf b/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.ttf differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.woff b/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.woff differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.woff2 b/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.eot b/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.eot differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.ttf b/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.ttf differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.woff b/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.woff differ diff --git a/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.woff2 b/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.7/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/_build/html/v0.0.7/_static/jquery.js b/_build/html/v0.0.7/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/_build/html/v0.0.7/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/_build/html/v0.0.7/_static/language_data.js b/_build/html/v0.0.7/_static/language_data.js new file mode 100644 index 000000000..c7fe6c6fa --- /dev/null +++ b/_build/html/v0.0.7/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_build/html/v0.0.7/_static/minus.png b/_build/html/v0.0.7/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/_build/html/v0.0.7/_static/minus.png differ diff --git a/_build/html/v0.0.7/_static/plus.png b/_build/html/v0.0.7/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/_build/html/v0.0.7/_static/plus.png differ diff --git a/_build/html/v0.0.7/_static/pygments.css b/_build/html/v0.0.7/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/_build/html/v0.0.7/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_build/html/v0.0.7/_static/searchtools.js b/_build/html/v0.0.7/_static/searchtools.js new file mode 100644 index 000000000..2c774d17a --- /dev/null +++ b/_build/html/v0.0.7/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_build/html/v0.0.7/_static/sphinx_highlight.js b/_build/html/v0.0.7/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/_build/html/v0.0.7/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * 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))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + 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 SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + 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")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_build/html/v0.0.7/acknowledgements.html b/_build/html/v0.0.7/acknowledgements.html new file mode 100644 index 000000000..4c2600845 --- /dev/null +++ b/_build/html/v0.0.7/acknowledgements.html @@ -0,0 +1,138 @@ + + + + + + + + + Acknowledgements — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Acknowledgements

+

We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists.

+

We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/changelog.html b/_build/html/v0.0.7/changelog.html new file mode 100644 index 000000000..2fd8f142e --- /dev/null +++ b/_build/html/v0.0.7/changelog.html @@ -0,0 +1,451 @@ + + + + + + + + + Changelog — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Changelog

+
+

Version 0.0.7

+

Added Function for Customizable Correlation Matrix Visualization

+

This release introduces a new function, flex_corr_matrix, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to seaborn.heatmap().

+

Summary of Changes

+
    +
  • New Function: flex_corr_matrix.

    +
      +
    • Functionality: +- Generates a correlation heatmap for a given DataFrame. +- Supports both full and upper triangular correlation matrices based on the triangular parameter. +- Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. +- Accepts additional keyword arguments via **kwargs to pass directly to seaborn.heatmap(). +- Includes validation to ensure the triangular, annot, and save_plots parameters are boolean values. +- Raises an exception if save_plots=True but neither image_path_png nor image_path_svg is specified.

    • +
    +
  • +
+

Usage

+
# Full correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True)
+
+# Upper triangular correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True)
+
+
+

Contingency table df to object type

+

Convert all columns in the DataFrame to object type to prevent issues with numerical columns.

+
df = df.astype(str).fillna("")
+
+
+
+
+

Version 0.0.6

+

Added validation for Plot Type Parameter in KDE Distributions Function

+

This release adds a validation step for the plot_type parameter in the kde_distributions function. The allowed values for plot_type are "hist", "kde", and "both". If an invalid value is provided, the function will now raise a ValueError with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values.

+
# Validate plot_type parameter
+valid_plot_types = ["hist", "kde", "both"]
+if plot_type.lower() not in valid_plot_types:
+    raise ValueError(
+        f"Invalid plot_type value. Expected one of {valid_plot_types}, "
+        f"got '{plot_type}' instead."
+    )
+
+
+
+
+

Version 0.0.5

+

Ensure Consistent Font Size and Text Wrapping Across Plot Elements

+

This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the stacked_crosstab_plot function. The following updates have been implemented to ensure uniformity and improve the readability of plots:

+
    +
  1. Title Font Size and Text Wrapping: +- Added a text_wrap parameter to control the wrapping of plot titles. +- Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ax.set_title() after plot generation.

  2. +
  3. Legend Font Size Consistency: +- Incorporated label_fontsize into the legend font size by directly setting the font size of the legend text using plt.setp(legend.get_texts(), fontsize=label_fontsize). +- This ensures that the legend labels are consistent with the title and axis labels.

  4. +
+

Testing

+
    +
  • Verified that titles now wrap correctly and match the specified label_fontsize.

  • +
  • Confirmed that legend text scales according to label_fontsize, ensuring consistent font sizes across all plot elements.

  • +
+
+
+

Version 0.0.4

+
    +
  • Stable release

    +
      +
    • No new updates to the codebase.

    • +
    • Updated the project description variable in setup.py to re-emphasize key elements of the library.

    • +
    • Minor README cleanup:

      +
        +
      • Added icons for sections that did not have them.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.3

+
    +
  • Stable release

    +
      +
    • Updated logo size, fixed citation title, and made minor README cleanup:

      +
        +
      • Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.2

+
    +
  • +
    First stable release
      +
    • No new updates to the codebase; minimal documentation updates to README and setup.py files.

    • +
    • Added logo, badges, and Zenodo-certified citation to README.

    • +
    +
    +
    +
  • +
+
+
+

Version 0.0.1rc0

+
    +
  • No new updates to the codebase; minimal documentation updates to README and setup.py files.

  • +
+
+
+

Version 0.0.1b0

+

New Scatter Fit Plot and Additional Updates

+
    +
  • Added new scatter_fit_plot(), removed unused data_types(), and added comment section headers.

  • +
+

Added xlim and ylim Inputs to KDE Distribution

+
    +
  • kde_distribution():

    +
    +
      +
    • Added xlim and ylim inputs to allow users to customize axes limits in kde_distribution().

    • +
    +
    +
  • +
+

Added xlim and ylim Params to Stacked Crosstab Plot

+
    +
  • stacked_crosstab_plot():

    +
    +
      +
    • Added xlim and ylim input parameters to stacked_crosstab_plot() to give users more flexibility in controlling axes limits.

    • +
    +
    +
  • +
+

Added x and y Limits to Box and Violin Plots

+
    +
  • box_violin_plot():

    +
    +
      +
    • Changed function name from metrics_box_violin() to box_violin_plot().

    • +
    • Added xlim and ylim inputs to control x and y-axis limits of box_violin_plot() (formerly metrics_box_violin).

    • +
    +
    +
  • +
+

Added Ability to Remove Stacks from Plots, Plot All or One at a Time

+

Key Changes

+
    +
  1. Plot Type Parameter +- plot_type: This parameter allows the user to choose between "regular", "normalized", or "both" plot types.

  2. +
  3. Remove Stacks Parameter +- remove_stacks: This parameter, when set to True, generates a regular bar plot using only the col parameter instead of a stacked bar plot. It only works when plot_type is set to “regular”. If remove_stacks is set to True while plot_type is anything other than “regular”, the function will raise an exception.

  4. +
+

Explanation of Changes

+
    +
  • Plot Type Parameter

    +
      +
    • Provides flexibility to the user, allowing specification of the type of plot to generate:

      +
        +
      • "regular": Standard bar plot.

      • +
      • "normalized": Normalized bar plot.

      • +
      • "both": Both regular and normalized bar plots.

      • +
      +
    • +
    +
  • +
  • Remove Stacks Parameter +- remove_stacks: Generates a regular bar plot using only the col parameter, removing the stacking of the bars. Applicable only when plot_type is set to “regular”. An exception is raised if used with any other plot_type.

  • +
+

These changes enhance the flexibility and functionality of the stacked_crosstab_plot function, allowing for more customizable and specific plot generation based on user requirements.

+
+
+

Version 0.0.1b0

+

Refined KDE Distributions

+

Key Changes

+
    +
  1. Alpha Transparency for Histogram Fill +- Added a fill_alpha parameter to control the transparency of the histogram bars’ fill color. +- Default value is 0.6. An exception is raised if fill=False and fill_alpha is specified.

  2. +
  3. Custom Font Sizes +- Introduced label_fontsize and tick_fontsize parameters to control font size of axis labels and tick marks independently.

  4. +
  5. Scientific Notation Toggle +- Added a disable_sci_notation parameter to enable or disable scientific notation on axes.

  6. +
  7. Improved Error Handling +- Added validation for the stat parameter to ensure valid options are accepted. +- Added checks for proper usage of fill_alpha and hist_edgecolor when fill is set to False.

  8. +
  9. General Enhancements +- Updated the function’s docstring to reflect new parameters and provide comprehensive guidance on usage.

  10. +
+
+
+

Version 0.0.1b0

+

Enhanced KDE Distributions Function

+

Added Parameters

+
    +
  1. Grid Figsize and Single Figsize +- Control the size of the overall grid figure and individual figures separately.

  2. +
  3. Hist Color and KDE Color` +- Allow customization of histogram and KDE plot colors.

  4. +
  5. Edge Color +- Allows customization of histogram bar edges.

  6. +
  7. Hue +- Allows grouping data by a column.

  8. +
  9. Fill +- Controls whether to fill histogram bars with color.

  10. +
  11. Y-axis Label` +- Customizable y-axis label.

  12. +
  13. Log-Scaling +- Specifies which variables to apply log scale.

  14. +
  15. Bins and Bin Width +- Control the number and width of bins.

  16. +
  17. ``stat``: +- Allows different statistics for the histogram (count, density, frequency, probability, proportion, percent).

  18. +
+

Improvements

+
    +
  1. Validation and Error Handling +- Checks for invalid log_scale_vars and throws a ValueError if any are found. +- Throws a ValueError if edgecolor is changed while fill is set to False. +- Issues a PerformanceWarning if both bins and binwidth are specified, warning of potential performance impacts.

  2. +
  3. Customizable Y-Axis Label +- Allows users to specify custom y-axis labels.

  4. +
  5. Warning for KDE with Count +- Issues a warning if KDE is used with stat='count', as it may produce misleading plots.

  6. +
+

Updated Function to Ensure Unique IDs and Index Check

+
    +
  • Ensured that each generated ID in add_ids starts with a non-zero digit.

  • +
  • Added a check to verify that the DataFrame index is unique.

  • +
  • Printed a warning message if duplicate index entries are found.

  • +
+

These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique.

+

Check for Unique Indices +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries.

+

Generate Non-Zero Starting IDs

+
    +
  • The ID generation process is updated to ensure that the first digit of each ID is always non-zero.

  • +
+

Ensure Unique IDs

+
    +
  • A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame.

  • +
+

Fix Int Conversion for Numeric Columns, Reset Decimal Places

+
    +
  • Fixed integer conversion issue for numeric columns when decimal_places=0 in the save_dataframes_to_excel function.

  • +
  • Reset decimal_places default value to 0.

  • +
+

These changes ensure correct formatting and avoid errors during conversion.

+

Contingency Table Updates

+
    +
  1. Error Handling for Columns +- Added a check to ensure at least one column is specified. +- Updated the function to accept a single column as a string or multiple columns as a list. +- Raised a ValueError if no columns are provided or if cols is not correctly specified.

  2. +
  3. Function Parameters +- Changed parameters from col1 and col2 to a single parameter cols which can be either a string or a list.

  4. +
  5. Error Handling +- Renamed SortBy to sort_by to standardize nomenclature. +- Added a check to ensure sort_by is either 0 or 1. +- Raised a ValueError if sort_by is not 0 or 1.

  6. +
+
    +
  1. Sorting Logic +- Updated the sorting logic to handle the new cols parameter structure.

  2. +
  3. Handling Categorical Data +- Modified code to convert categorical columns to strings to avoid issues with fillna("").

  4. +
  5. Handling Missing Values +- Added df = df.fillna('') to fill NA values within the function to account for missing data.

  6. +
  7. Improved Function Documentation +- Updated function documentation to reflect new parameters and error handling.

  8. +
+
+
+

Version 0.0.1b0

+

Contingency Table Updates

+
    +
  • fillna('') added to output so that null values come through, removed 'All' column name from output, sort options 0 and 1, updated docstring documentation. Tested successfully on Python 3.7.3.

  • +
+

Compatibility Enhancement

+
    +
  1. Added a version check for Python 3.7 and above.

    +
      +
    • Conditional import of datetime to handle different Python versions.

    • +
    +
  2. +
+
if sys.version_info >= (3, 7):
+    from datetime import datetime
+else:
+    import datetime
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/citations.html b/_build/html/v0.0.7/citations.html new file mode 100644 index 000000000..797142acc --- /dev/null +++ b/_build/html/v0.0.7/citations.html @@ -0,0 +1,150 @@ + + + + + + + + + Citing EDA Toolkit — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Citing EDA Toolkit

+

Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.7). Zenodo. https://doi.org/10.5281/zenodo.13163208

+
@software{shpaner_2024_13162633,
+author       = {Shpaner, Leonid and
+                Gil, Oscar},
+title        = {EDA Toolkit},
+month        = aug,
+year         = 2024,
+publisher    = {Zenodo},
+version      = {0.0.7},W
+doi          = {10.5281/zenodo.13162633},
+url          = {https://doi.org/10.5281/zenodo.13162633}
+}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/contributors.html b/_build/html/v0.0.7/contributors.html new file mode 100644 index 000000000..3d7b31757 --- /dev/null +++ b/_build/html/v0.0.7/contributors.html @@ -0,0 +1,142 @@ + + + + + + + + + Contributors/Maintainers — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Contributors/Maintainers

+
https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + +

Leonid Shpaner is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego’s M.S. Applied Artificial Intelligence program.

+


https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + +

Oscar Gil is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/genindex.html b/_build/html/v0.0.7/genindex.html new file mode 100644 index 000000000..d65b37b5f --- /dev/null +++ b/_build/html/v0.0.7/genindex.html @@ -0,0 +1,333 @@ + + + + + + + + Index — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | H + | K + | P + | S + +
+

A

+ + +
+ +

B

+ + +
+ +

C

+ + +
+ +

D

+ + +
+ +

E

+ + +
+ +

F

+ + +
+ +

H

+ + +
+ +

K

+ + +
+ +

P

+ + +
+ +

S

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/getting_started.html b/_build/html/v0.0.7/getting_started.html new file mode 100644 index 000000000..536487d11 --- /dev/null +++ b/_build/html/v0.0.7/getting_started.html @@ -0,0 +1,224 @@ + + + + + + + + + Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Welcome to the EDA Toolkit Python Library Documentation!

+
+

Note

+

This documentation is for eda_toolkit version 0.0.7.

+
+

The eda_toolkit is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data.

+ +
+

What is EDA?

+

Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data.

+
+
+

Purpose of EDA Toolkit

+

The eda_toolkit library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including:

+
    +
  • Data Management: Tools for managing directories, generating unique IDs, +standardizing dates, and handling common DataFrame manipulations.

  • +
  • Data Cleaning: Functions to address missing values, remove outliers, and +correct formatting issues, ensuring data is ready for analysis.

  • +
  • Data Visualization: A variety of plotting functions, including KDE +distribution plots, stacked bar plots, scatter plots with optional best fit +lines, and box/violin plots, to visually explore data distributions, +relationships, and trends.

  • +
  • Descriptive and Summary Statistics: Methods to generate comprehensive +reports on data types, summary statistics (mean, median, standard deviation, +etc.), and to summarize all possible combinations of specified variables.

  • +
  • Reporting and Export: Features to save DataFrames to Excel with +customizable formatting, create contingency tables, and export generated +plots in multiple formats.

  • +
+
+
+

Key Features

+
    +
  • Ease of Use: The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions.

  • +
  • Customizable: Users can customize various aspects of the toolkit to fit their specific needs.

  • +
  • Integration: Seamlessly integrates with popular data science libraries such as Pandas, NumPy, Matplotlib, and Seaborn.

  • +
  • Documentation and Examples: Comprehensive documentation and examples to help users get started quickly and effectively.

  • +
+
+
+

Prerequisites

+

Before you install eda_toolkit, ensure your system meets the following requirements:

+
    +
  • Python: version 3.7.4 or higher is required to run eda_toolkit.

  • +
+

Additionally, eda_toolkit depends on the following packages, which will be automatically installed when you install eda_toolkit:

+
    +
  • numpy: version 1.21.6 or higher

  • +
  • pandas: version 1.3.5 or higher

  • +
  • matplotlib: version 3.5.3 or higher

  • +
  • seaborn: version 0.12.2 or higher

  • +
  • jinja2: version 3.1.4 or higher

  • +
  • xlsxwriter: version 3.2.0 or higher

  • +
+
+
+

Installation

+

You can install eda_toolkit directly from PyPI:

+
pip install eda_toolkit
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/index.html b/_build/html/v0.0.7/index.html new file mode 100644 index 000000000..b9a1edb77 --- /dev/null +++ b/_build/html/v0.0.7/index.html @@ -0,0 +1,262 @@ + + + + + + + + + Table of Contents — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Table of Contents

+ +
+

Usage Guide

+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/objects.inv b/_build/html/v0.0.7/objects.inv new file mode 100644 index 000000000..a1d42f972 Binary files /dev/null and b/_build/html/v0.0.7/objects.inv differ diff --git a/_build/html/v0.0.7/references.html b/_build/html/v0.0.7/references.html new file mode 100644 index 000000000..1a664dd88 --- /dev/null +++ b/_build/html/v0.0.7/references.html @@ -0,0 +1,139 @@ + + + + + + + + + References — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

References

+
    +
  1. Hunter, J. D. (2007). Matplotlib: A 2D Graphics Environment. Computing in Science & Engineering, 9(3), 90-95. https://doi.org/10.1109/MCSE.2007.55.

  2. +
  3. Kohavi, R. (1996). Census Income. UCI Machine Learning Repository. https://doi.org/10.24432/C5GP7S.

  4. +
  5. Waskom, M. (2021). Seaborn: Statistical Data Visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021.

  6. +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/search.html b/_build/html/v0.0.7/search.html new file mode 100644 index 000000000..762641518 --- /dev/null +++ b/_build/html/v0.0.7/search.html @@ -0,0 +1,145 @@ + + + + + + + + Search — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/_build/html/v0.0.7/searchindex.js b/_build/html/v0.0.7/searchindex.js new file mode 100644 index 000000000..ae887de81 --- /dev/null +++ b/_build/html/v0.0.7/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"About EDA Toolkit": [[5, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[7, "adding-unique-identifiers"]], "Binning Numerical Columns": [[7, "binning-numerical-columns"]], "Box Plots Grid Example": [[7, "box-plots-grid-example"]], "Box and Violin Plots": [[7, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[7, "correlation-matrices"]], "Creating Contingency Tables": [[7, "creating-contingency-tables"]], "Data Preparation and Management": [[7, "data-preparation-and-management"]], "DataFrame Analysis": [[7, "dataframe-analysis"]], "Description": [[7, null]], "Full Correlation Matrix Example": [[7, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[7, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[7, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[5, null]], "Highlighting Specific Columns in a DataFrame": [[7, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[7, "histogram-example-count"]], "Histogram Example (Density)": [[7, "histogram-example-density"]], "Histograms and KDE": [[7, "histograms-and-kde"]], "Installation": [[4, "installation"]], "KDE Distribution Function": [[7, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[7, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[7, "kde-and-histograms-example"]], "Key Features": [[4, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[7, "non-normalized-stacked-bar-plots-example"]], "Path directories": [[7, "path-directories"]], "Pearson Correlation Coefficient": [[7, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[7, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[7, "pivoted-violin-plots-grid-example"]], "Prerequisites": [[4, "prerequisites"]], "Project Links": [[4, "project-links"]], "Purpose of EDA Toolkit": [[4, "purpose-of-eda-toolkit"]], "References": [[6, null]], "Regression-Centric Scatter Plots Example": [[7, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[7, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[7, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[7, "scatter-fit-plot"]], "Scatter Plots Grouped by Category Example": [[7, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[7, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[7, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[7, "stacked-crosstab-plots"]], "Standardized Dates": [[7, "standardized-dates"]], "Table of Contents": [[5, null]], "Trailing Period Removal": [[7, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[7, "triangular-correlation-matrix-example"]], "Usage Guide": [[5, null]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id2"], [1, "id3"], [1, "id4"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Violin Plots Grid Example": [[7, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[4, null]], "What is EDA?": [[4, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "getting_started", "index", "references", "usage_guide"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "getting_started.rst", "index.rst", "references.rst", "usage_guide.rst"], "indexentries": {"add_ids()": [[7, "add_ids", false]], "box_violin_plot()": [[7, "box_violin_plot", false]], "built-in function": [[7, "add_ids", false], [7, "box_violin_plot", false], [7, "contingency_table", false], [7, "dataframe_columns", false], [7, "ensure_directory", false], [7, "flex_corr_matrix", false], [7, "highlight_columns", false], [7, "kde_distributions", false], [7, "parse_date_with_rule", false], [7, "save_dataframes_to_excel", false], [7, "scatter_fit_plot", false], [7, "stacked_crosstab_plot", false], [7, "strip_trailing_period", false], [7, "summarize_all_combinations", false]], "contingency_table()": [[7, "contingency_table", false]], "dataframe_columns()": [[7, "dataframe_columns", false]], "ensure_directory()": [[7, "ensure_directory", false]], "flex_corr_matrix()": [[7, "flex_corr_matrix", false]], "highlight_columns()": [[7, "highlight_columns", false]], "kde_distributions()": [[7, "kde_distributions", false]], "parse_date_with_rule()": [[7, "parse_date_with_rule", false]], "save_dataframes_to_excel()": [[7, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[7, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[7, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[7, "strip_trailing_period", false]], "summarize_all_combinations()": [[7, "summarize_all_combinations", false]]}, "objects": {"": [[7, 0, 1, "", "add_ids"], [7, 0, 1, "", "box_violin_plot"], [7, 0, 1, "", "contingency_table"], [7, 0, 1, "", "dataframe_columns"], [7, 0, 1, "", "ensure_directory"], [7, 0, 1, "", "flex_corr_matrix"], [7, 0, 1, "", "highlight_columns"], [7, 0, 1, "", "kde_distributions"], [7, 0, 1, "", "parse_date_with_rule"], [7, 0, 1, "", "save_dataframes_to_excel"], [7, 0, 1, "", "scatter_fit_plot"], [7, 0, 1, "", "stacked_crosstab_plot"], [7, 0, 1, "", "strip_trailing_period"], [7, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 7], "0": [2, 4, 5, 7], "00": 7, "000000": 7, "0000ff": 7, "00bfc4": 7, "01": 7, "02": 7, "03021": [6, 7], "04": 7, "07": 7, "09": 7, "1": [1, 4, 7], "10": [2, 6, 7], "100": 7, "10724": 7, "11": 7, "1109": [6, 7], "111": 7, "115": 7, "11687": 7, "11th": 7, "12": [4, 7], "12202842": 7, "123": 7, "12929": 7, "13": 7, "131": 7, "13162633": 2, "13163208": 2, "13174": 7, "1348": 7, "13920": 7, "14": 7, "147": 7, "14x4": 7, "15": 7, "150": 7, "15784": 7, "16": 7, "16192": 7, "17": 7, "18": 7, "1873": 7, "19716": 7, "1994": 7, "1996": [6, 7], "1b0": 5, "1rc0": 5, "2": [4, 5, 7], "20": 7, "200": 7, "2007": [6, 7], "2020": 7, "2021": [6, 7], "2022": 7, "2024": 2, "203488": 7, "21": [4, 7], "21105": [6, 7], "2115": 7, "215646": 7, "22379": 7, "2245": 7, "22803": 7, "23": 7, "234721": 7, "24432": [6, 7], "24720": 7, "25": 7, "250": 7, "2509": 7, "2565": 7, "26": 7, "27": 7, "274": 7, "28": 7, "280": 7, "28523": 7, "29": 7, "295": 7, "2d": [6, 7], "3": [4, 5, 6, 7], "30": 7, "300": 7, "3021": [6, 7], "3054": 7, "31": 7, "3188": 7, "32": 7, "32650": 7, "33": 7, "333333": 7, "338409": 7, "33906": 7, "34": 7, "3461": 7, "35130194": 7, "36": 7, "3680": 7, "37": 7, "37155": 7, "38": 7, "3853": 7, "39": 7, "3986": 7, "4": [4, 5, 7], "40": 7, "41": 7, "4110": 7, "41762": 7, "42": 7, "42643227": 7, "4267": 7, "43832": 7, "44807": 7, "45": 7, "46": 7, "46560": 7, "467": 7, "468": 7, "469": 7, "47": 7, "470": 7, "471": 7, "472": 7, "4746": 7, "48842": 7, "49": 7, "5": [4, 5, 7], "50": 7, "50k": 7, "50k_": 7, "51": 7, "5281": 2, "53": 7, "535": 7, "55": [6, 7], "56": 7, "5623": 7, "5707": 7, "58": 7, "5856": 7, "59": 7, "595": 7, "6": [4, 5, 6, 7], "60": [6, 7], "61": 7, "6172": 7, "62": 7, "64": 7, "65": 7, "66": 7, "6619": 7, "668": 7, "6738": 7, "68": 7, "69": 7, "7": [2, 4, 5, 7], "70": 7, "71": 7, "73": 7, "74": 7, "74130842": 7, "746": 7, "75": 7, "7536": 7, "76": 7, "77": 7, "77516": 7, "79": 7, "8": 7, "80": 7, "808080": 7, "809": 7, "81": 7, "815": 7, "82": 7, "8213": 7, "82943611": 7, "83": 7, "83311": 7, "85": 7, "8601": 7, "861555": 7, "87": 7, "87104229": 7, "89": 7, "9": [6, 7], "90": [6, 7], "90069867": 7, "9076": 7, "91": 7, "93": 7, "93837254": 7, "939": 7, "94": 7, "9468": 7, "95": [6, 7], "96": 7, "96078789": 7, "963": 7, "966": 7, "97": 7, "97751875": 7, "98": 7, "99": 7, "A": [1, 4, 6, 7], "As": 7, "By": 7, "For": 7, "If": [1, 7], "In": 7, "It": [1, 4, 7], "No": [1, 7], "Not": 7, "One": 1, "The": [1, 4, 7], "Then": 7, "There": 7, "These": [1, 7], "To": 7, "With": [3, 5], "abil": [1, 7], "abl": 7, "about": 7, "abov": [1, 7], "academ": 0, "accept": 1, "access": 7, "accord": [1, 7], "accordingli": 7, "account": 1, "accur": 7, "acknowledg": [1, 5], "across": [1, 7], "actual": 7, "ad": [1, 5], "adapt": 7, "add": [1, 7], "add_best_fit_lin": 7, "add_id": [1, 5, 7], "addit": [1, 7], "addition": [4, 7], "address": [1, 4], "adher": 7, "adjust": 7, "adm": 7, "aesthet": 7, "affect": 7, "after": [1, 7], "ag": 7, "against": 7, "age_boxplot_list": 7, "age_group": 7, "ages_18_to_40": 7, "aggreg": 7, "alic": 7, "align": 7, "all": [1, 4, 7], "all_combin": 7, "allow": [1, 7], "along": [1, 7], "alpha": [1, 7], "alreadi": 7, "also": [0, 7], "altern": 7, "alwai": [1, 7], "amount": 7, "an": [0, 1, 3, 7], "analysi": [4, 5], "analyst": 4, "analyt": 3, "analyz": 7, "angl": 7, "ani": [1, 4, 7], "annot": [1, 7], "anomali": 4, "anoth": 7, "anyth": 1, "appear": 7, "append": 7, "appli": [0, 1, 3, 4, 7], "applic": 1, "approach": 7, "appropri": 7, "approxim": 7, "ar": [1, 7], "argument": [1, 7], "around": 7, "arrang": 7, "artifact": 7, "artifici": 3, "asian": 7, "aspect": [1, 4], "assess": 7, "assign": 7, "associ": [4, 7], "assum": 7, "assumpt": 5, "astyp": 1, "attempt": 7, "attent": 7, "attract": 7, "attribut": 7, "aug": 2, "author": [2, 3], "auto": 7, "autofit": 7, "autom": [3, 4], "automat": [4, 7], "avail": 7, "avoid": [1, 7], "ax": [1, 7], "axi": [1, 7], "bachelor": 7, "back": 7, "background": 7, "badg": 1, "bandwidth": 7, "bar": [1, 4, 5], "barh": 7, "base": [1, 7], "base_path": 7, "bbox_inch": 7, "becaus": 7, "been": [1, 7], "befor": [1, 4, 7], "begin": 7, "being": 7, "bell": 7, "below": 7, "beneath": 7, "benefici": 7, "best": [4, 5], "best_fit_linecolor": 7, "best_fit_linestyl": 7, "better": [4, 7], "between": [1, 7], "bin": [1, 5], "bin_ag": 7, "binrang": 7, "binwidth": [1, 7], "black": 7, "bob": 7, "bold": 7, "bool": 7, "boolean": [1, 7], "border": 7, "both": [1, 7], "bound": 7, "boundari": 7, "box": [1, 4, 5], "box_violin_plot": [1, 5, 7], "boxplot": 7, "breakdown": 7, "bring": 3, "broad": 4, "brown": 7, "built": 7, "c0": 7, "c5gp7": [6, 7], "calcul": 7, "california": 3, "call": 7, "can": [1, 4, 7], "cancer": 7, "cannot": 7, "capit": 7, "career": 0, "case": 7, "categor": [1, 7], "categori": 5, "cbar_label": 7, "cell": 7, "censu": [6, 7], "census_id": 7, "census_summary_t": 7, "center_baselin": 7, "centric": 5, "certain": 7, "certifi": 1, "cervic": 7, "chang": [1, 7], "changelog": 5, "charact": 7, "characterist": 4, "charli": 7, "check": [1, 7], "choos": [1, 7], "circl": 7, "citat": 1, "cite": 5, "civ": 7, "clariti": 7, "clean": [1, 4, 7], "cleaner": 7, "cleanup": 1, "clear": [1, 7], "cleric": 7, "closer": 7, "clutter": 7, "cmap": [1, 7], "code": [1, 7], "codebas": 1, "coeffici": 5, "cohes": 7, "col": [1, 7], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 7], "colorbar": 7, "colormap": [1, 7], "column": [1, 5], "column_nam": 7, "combin": [4, 5], "come": 1, "comment": 1, "common": [4, 7], "compar": 7, "comparison": 7, "compat": 1, "complex": 7, "comprehens": [1, 4, 7], "comput": [6, 7], "condit": 1, "configur": 7, "confirm": 1, "confus": 7, "consecut": 7, "consist": [1, 7], "constant": 7, "contain": 7, "content": 7, "conting": [1, 4, 5], "contingency_t": [5, 7], "continu": 7, "contrast": 7, "contributor": 5, "control": [1, 7], "convers": [1, 7], "convert": [1, 7], "coolwarm": [1, 7], "cornel": 3, "correct": [1, 4, 7], "correctli": [1, 7], "correl": [1, 5], "correspond": 7, "count": [1, 5], "countri": 7, "cours": 3, "cov": 7, "covari": 7, "creat": [4, 5], "creation": 7, "crop": 7, "crosstab": [1, 5], "crosstab_age_incom": 7, "crosstab_age_sex": 7, "crosstabs_dict": 7, "crosstabs_onli": 7, "crucial": [4, 7], "current": 7, "curv": 7, "custom": [1, 4, 5], "custom_ord": 7, "customiz": [1, 4, 7], "cut": 7, "d": [6, 7], "dai": 7, "dark": 7, "dashboard": 7, "data": [0, 1, 3, 4, 5, 6], "data_nam": 7, "data_output": 7, "data_path": 7, "data_typ": 1, "datafram": [1, 4, 5], "dataframe_column": [5, 7], "dataset": [4, 7], "date": [4, 5], "date_column": 7, "date_str": 7, "datetim": 1, "david": 7, "dd": 7, "deal": 7, "decad": 3, "decim": [1, 7], "decimal_plac": [1, 7], "decis": 7, "decreas": 7, "dedic": 0, "deepest": 0, "default": [1, 7], "defin": 7, "definit": 7, "degre": [1, 7], "demograph": 7, "demonstr": 7, "denot": 7, "densiti": [1, 5], "depend": [4, 7], "descend": 7, "describ": 7, "descript": [1, 4, 5], "design": [4, 7], "detail": 7, "develop": 3, "deviat": [4, 7], "df": [1, 7], "df_censu": 7, "df_dict": 7, "df_num": 7, "dict": 7, "dictionari": 7, "did": 1, "diego": [0, 3], "differ": [1, 7], "digit": [1, 7], "dimens": 7, "dimensionless": 7, "dir": 7, "direct": 7, "directli": [1, 4, 7], "directori": [4, 5], "disabl": [1, 7], "disable_sci_not": [1, 7], "discov": 4, "discret": 7, "dispers": 7, "displai": 7, "distinguish": 7, "distribut": [1, 4, 5], "divid": 7, "divorc": 7, "do": 7, "docstr": 1, "document": [1, 5], "doe": 7, "doi": [2, 6, 7], "doubl": 7, "dr": 0, "draw": 7, "dtype": 7, "due": [1, 7], "duplic": 1, "dure": [0, 1], "e": 7, "each": [1, 7], "eas": 4, "easi": [4, 7], "easier": 7, "easili": 7, "ebrahim": 0, "eda_toolkit": [4, 7], "edg": [1, 7], "edgecolor": 1, "educ": [0, 3, 7], "effect": [3, 4, 7], "either": [1, 7], "element": [1, 7], "els": 1, "emp": 7, "emphas": 1, "emploi": 7, "empti": 7, "enabl": [1, 4, 7], "end": 7, "endeavor": 0, "endpoint": 7, "engin": [0, 6, 7], "enhanc": [1, 4, 7], "ensu": 7, "ensur": [1, 4, 7], "ensure_directori": [5, 7], "enter": 7, "entir": 7, "entri": [1, 7], "environ": [0, 6, 7], "equal": 7, "equat": 7, "equival": 7, "error": [1, 7], "especi": 7, "essenti": [4, 7], "estim": 7, "etc": 4, "ev": 7, "even": 7, "everyth": 7, "examin": 7, "exampl": [1, 4, 5], "excel": [3, 4, 5], "except": [0, 1, 7], "excess": 7, "exclud": 7, "exclus": 7, "exec": 7, "execut": 7, "exist": 7, "exp": 7, "expect": 1, "experi": 3, "explain": 7, "explan": 1, "explicitli": 1, "explor": 4, "exploratori": 4, "export": [4, 7], "express": 0, "extend": 0, "extens": 7, "f": [1, 7], "f8766d": 7, "f8c5c8": 7, "facilit": [3, 4, 7], "fall": 7, "fals": [1, 7], "famili": 7, "fashion": 7, "featur": [5, 7], "feder": 7, "feedback": 1, "femal": 7, "female_": 7, "few": 7, "ff0000": 7, "figsiz": [1, 7], "figur": [1, 7], "file": [1, 7], "file_nam": 7, "file_path": 7, "file_prefix": 7, "filenam": 7, "fill": [1, 7], "fill_alpha": [1, 7], "fillna": 1, "filter": 7, "filtered_df": 7, "financi": [3, 7], "first": [1, 7], "fit": [1, 4, 5], "fix": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 7], "flip": 7, "float": 7, "fnlwgt": 7, "focu": 7, "focus": 7, "folder": 7, "follow": [1, 4, 7], "font": [1, 7], "fontsiz": 1, "form": 4, "format": [1, 4, 5], "former": 7, "formerli": 1, "formula": 7, "found": 1, "four": 7, "frac": 7, "frequenc": [1, 7], "frequent": 7, "from": [0, 1, 3, 4, 7], "full": [1, 5], "fulli": 7, "func_col": 7, "function": [1, 4, 5], "further": 7, "futur": 7, "g": 7, "gain": [4, 7], "gaussian": 5, "gener": [1, 4, 5], "geq": 7, "get": 4, "get_text": 1, "gil": [2, 3], "github": 4, "give": 1, "given": [1, 7], "glanc": 7, "go": 7, "got": 1, "gov": 7, "grad": 7, "graduat": 0, "graphic": [6, 7], "gratitud": 0, "greater": 7, "green": 7, "grei": 7, "grid": [1, 5], "grid_figs": 7, "ground": 7, "group": [1, 5], "gt": 7, "guid": [0, 7], "guidanc": 1, "guidelin": 7, "h": 7, "h_pad": 7, "ha": [3, 7], "half": 7, "halv": 7, "handl": [1, 4, 7], "handler": 7, "hat": 7, "have": [1, 7], "he": 3, "header": [1, 7], "health": 3, "healthcar": 3, "heatmap": [1, 7], "height": 7, "help": [1, 4, 7], "here": 7, "hi": 0, "hidden": 7, "hide": 7, "high": [1, 7], "higher": 4, "highli": 7, "highlight": 5, "highlight_column": [5, 7], "highlighted_df": 7, "hist": [1, 7], "hist_color": 7, "hist_edgecolor": [1, 7], "histogram": [1, 5], "hold": 3, "horizont": 7, "hour": 7, "how": 7, "howev": 7, "html": 7, "http": [2, 6, 7], "hue": [1, 7], "hue_dict": 7, "hue_palett": 7, "hunter": [6, 7], "husband": 7, "hyperlink": 7, "hypothes": 4, "i": [1, 3, 5, 7], "icon": 1, "id": [1, 4, 7], "id_colnam": 7, "identifi": [4, 5], "illustr": 7, "imag": 7, "image_filenam": 7, "image_path_png": [1, 7], "image_path_svg": [1, 7], "impact": 1, "implement": 1, "import": [1, 7], "imposs": 7, "improv": 1, "inc": 7, "inch": 7, "includ": [1, 4, 7], "inclus": 7, "incom": [6, 7], "inconsist": [1, 7], "incorpor": 1, "incorrect": [1, 7], "increas": 7, "independ": 1, "index": [1, 7], "indic": [1, 7], "individu": [1, 7], "individual_figs": 7, "industri": 3, "inf": 7, "infin": 7, "inform": 7, "initi": 4, "inner": 7, "input": [1, 7], "insight": [4, 7], "instal": 5, "instanc": 7, "instead": [1, 7], "instruct": 7, "int": [1, 7], "int64": 7, "integ": 1, "integr": [4, 7], "intellig": 3, "interest": 7, "interfac": 7, "interpret": 7, "interv": 7, "introduc": 1, "intuit": 4, "invalid": 1, "investig": 4, "involv": [4, 7], "io": 7, "island": 7, "iso": 7, "issu": [1, 4], "item": 7, "its": 7, "j": [6, 7], "jinja2": 4, "join": 7, "joss": [6, 7], "journal": [6, 7], "journei": 0, "jupyt": 7, "just": 7, "k": 7, "kde": [1, 4, 5], "kde_color": 7, "kde_density_single_distribut": 7, "kde_distribut": [1, 5, 7], "keep": 7, "kei": [1, 5, 7], "kernel": 7, "keyerror": 7, "keyword": [1, 7], "kind": 7, "kohavi": [6, 7], "kwarg": [1, 7], "l": 2, "label": [1, 7], "label_ag": 7, "label_fonts": [1, 7], "larg": 7, "largest": 7, "last": 7, "layout": 7, "ldot": 7, "lead": 7, "learn": [0, 3, 4, 6, 7], "least": [1, 7], "lectur": 3, "left": 7, "legend": [1, 7], "legend_label": 7, "legend_labels_list": 7, "legibl": 7, "length": 7, "leonid": [2, 3], "leq": 7, "less": 7, "level": 7, "leverag": 7, "librari": [1, 5, 7], "licens": 1, "like": [0, 7], "limit": [1, 7], "line": [4, 5], "linear": 7, "linestyl": 7, "link": 5, "list": [1, 7], "load": 7, "local": 7, "locat": 7, "log": [1, 7], "log_scale_var": [1, 7], "logarithm": 7, "logic": 1, "logo": 1, "logscal": 7, "long": 7, "longer": 7, "loop": 7, "loss": 7, "lower": [1, 7], "lt": 7, "m": [0, 3, 6, 7], "machin": [3, 4, 6, 7], "made": 1, "magnitud": 7, "mai": [1, 7], "main": 4, "maintain": [5, 7], "make": 7, "male": 7, "male_": 7, "manag": [3, 4, 5], "manageri": 7, "mani": [4, 7], "manipul": 4, "map": 7, "marco": 0, "marit": 7, "mark": [1, 7], "marker": 7, "marri": 7, "master": 3, "match": [1, 7], "mathemat": 7, "matplotlib": [4, 6, 7], "matric": [1, 5], "matrix": [1, 5], "max": 7, "max_unique_valu": 7, "max_unique_value_pct": 7, "max_unique_value_tot": 7, "maximum": 7, "mcse": [6, 7], "mean": [4, 7], "meaning": 7, "measur": 7, "median": 4, "meet": 4, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 7], "metric": 7, "metrics_box_violin": 1, "metrics_boxplot_comp": 7, "metrics_list": 7, "min": 7, "min_length": 7, "mind": 4, "minim": [1, 7], "minimum": 7, "minor": 1, "misalign": 7, "misinterpret": 7, "mislead": [1, 7], "miss": [1, 4, 7], "mm": 7, "mode": 7, "model": [4, 7], "modifi": [1, 7], "month": [2, 7], "more": [1, 7], "most": 7, "move": 1, "mu": 7, "mu_i": 7, "mu_x": 7, "much": 7, "multipl": [1, 4, 7], "must": 7, "my_datafram": 1, "n": 7, "n_col": 7, "n_row": 7, "na": [1, 7], "name": [1, 7], "nativ": 7, "navig": 7, "necessari": [1, 7], "need": [4, 7], "neg": 7, "neither": 1, "nest": 7, "never": 7, "new": [1, 7], "next": 7, "nh": 7, "nomenclatur": 1, "non": [1, 5], "none": 7, "nor": 1, "normal": [1, 5], "notat": [1, 7], "note": 7, "notebook": 7, "noth": 7, "now": 1, "np": 7, "null": [1, 7], "null_pct": 7, "null_tot": 7, "num": 7, "num_digit": 7, "number": [1, 7], "numer": [1, 5], "numpi": 4, "o": [2, 7], "object": [1, 7], "observ": 7, "occup": 7, "occurr": 7, "offer": [4, 7], "often": [4, 7], "one": [1, 7], "onli": [1, 7], "opaqu": 7, "open": [6, 7], "oper": 7, "option": [1, 4, 7], "orang": 7, "order": 7, "org": [2, 6, 7], "organ": 7, "orient": 7, "origin": 7, "original_df": 7, "oscar": [2, 3], "other": [1, 7], "otherwis": 7, "our": 0, "out": 7, "outlier": 4, "output": [1, 7], "over": [3, 7], "overal": [1, 7], "overlai": 7, "overlaid": 7, "overlap": 7, "overrid": 7, "own": 7, "p": 7, "pac": 7, "packag": 4, "pad": 7, "page": 4, "pair": 7, "pairwis": 7, "palett": 7, "panda": [4, 7], "param": 1, "paramet": [1, 7], "parametr": 7, "pardir": 7, "parent": 7, "pars": 7, "parse_date_with_rul": [5, 7], "part": 7, "particular": 7, "particularli": 7, "pass": [1, 7], "path": 5, "patient": 7, "pattern": [4, 7], "pd": 7, "pdf": 7, "pearson": 5, "per": 7, "percent": [1, 7], "percentag": 7, "perfect": 7, "perform": [1, 7], "performancewarn": 1, "period": 5, "person": 3, "perspect": 7, "pi": 7, "pink": 7, "pip": 4, "pivot": [0, 5], "place": [1, 7], "plai": 0, "plot": [1, 4, 5], "plot_typ": [1, 7], "plots_onli": 7, "plt": 1, "pm": 7, "png": 7, "png_imag": 7, "point": 7, "popular": 4, "posit": 7, "possibl": [4, 7], "potenti": [1, 7], "power": 7, "pr": 1, "preced": 7, "prefer": 7, "prefix": 7, "prepar": 5, "prerequisit": 5, "present": 7, "preval": 7, "prevent": [1, 7], "previou": 7, "print": [1, 7], "prior": 7, "privat": 7, "probabl": [1, 7], "process": [1, 4, 7], "produc": [1, 7], "product": 7, "prof": 7, "profession": 3, "program": [0, 3], "project": [1, 3, 5, 7], "proper": [1, 7], "properli": 7, "proport": [1, 7], "provid": [0, 1, 4, 7], "public": 7, "publish": 2, "purpos": 5, "pursu": 0, "py": 1, "pypi": 4, "python": [1, 3, 5], "qualiti": [4, 7], "quantifi": 7, "quantit": 7, "quick": 7, "quickli": [4, 7], "r": [3, 6, 7], "r_": 7, "race": 7, "rais": [1, 7], "random": 7, "rang": [4, 7], "raw": 7, "re": 1, "read": 7, "readabl": [1, 7], "readi": 4, "readm": 1, "record": 7, "red": 7, "reduc": 7, "redund": 7, "refer": [5, 7], "refin": 1, "reflect": [1, 7], "regress": 5, "regular": [1, 5], "relat": 7, "relationship": [4, 7], "releas": 1, "relev": 4, "reli": 7, "remain": 7, "remov": [1, 4, 5], "remove_stack": [1, 7], "renam": 1, "render": 7, "replac": 7, "report": [3, 4, 7], "repositori": [4, 6, 7], "repres": 7, "represent": 7, "reproduc": 7, "requir": [1, 4, 7], "research": 4, "reset": 1, "respect": 7, "rest": 7, "result": 7, "return": 7, "return_dict": 7, "rich": 7, "right": 7, "riversid": 3, "robust": 1, "role": 0, "rot": 7, "rotat": [1, 7], "rotate_plot": 7, "round": 7, "row": 7, "rule": 7, "run": 4, "same": 7, "sampl": 7, "san": [0, 3], "save": [1, 4, 5], "save_dataframes_to_excel": [1, 5, 7], "save_format": 7, "save_plot": [1, 7], "scale": [1, 7], "scatter": [1, 4, 5], "scatter_color": 7, "scatter_fit_plot": [1, 5, 7], "scenario": 7, "schema": 7, "scheme": 7, "school": 0, "scienc": [0, 3, 4, 6, 7], "scientif": [1, 7], "scientist": [0, 3, 4], "seaborn": [1, 4, 6, 7], "seamlessli": 4, "second": 7, "section": [1, 7], "see": 7, "seed": 7, "select": 7, "select_dtyp": 7, "self": 7, "separ": [1, 7], "sequenc": 7, "seri": 7, "serv": 3, "servic": 3, "set": [1, 7], "set_as_index": 7, "set_titl": 1, "setp": 1, "setup": [1, 7], "sever": 7, "sex": 7, "shape": 7, "sheet": 7, "shilei": 0, "should": 7, "show": 7, "show_correl": 7, "show_legend": 7, "show_plot": 7, "shown": 7, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "sigma": 7, "sigma_i": 7, "sigma_x": 7, "similarli": 7, "simplic": 4, "simplifi": 7, "sinc": 7, "singl": [1, 7], "single_figs": 7, "single_var_image_filenam": 7, "single_var_image_path_png": 7, "single_var_image_path_svg": 7, "size": [1, 7], "smallest": 7, "smooth": 7, "snippet": 7, "so": [1, 7], "softwar": [2, 6, 7], "some": 7, "sort": [1, 7], "sort_bi": [1, 7], "sortbi": 1, "sourc": [6, 7], "space": 7, "span": 7, "special": 7, "specialti": 7, "specif": [1, 4, 5], "specifi": [1, 4, 7], "spous": 7, "spread": 7, "sql": 3, "sqrt": 7, "squar": 7, "stabl": 1, "stack": [1, 4, 5], "stacked_crosstab": 7, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 4, 5], "standardized_d": 7, "start": [1, 4, 7], "stat": [1, 7], "state": 7, "statist": [1, 3, 4, 6, 7], "statu": 7, "step": [1, 4], "still": 7, "store": 1, "str": [1, 7], "streamlin": 4, "strength": 7, "string": [1, 7], "strip": 7, "strip_trailing_period": [5, 7], "stronger": 7, "structur": [1, 4], "style": 7, "styler": 7, "subplot": 7, "substitut": 7, "success": 0, "successfulli": [0, 1], "suit": 4, "sum_": 7, "summar": 4, "summari": [1, 4, 5], "summarize_all_combin": [5, 7], "summary_t": 7, "support": [0, 1, 7], "suppress": 7, "sure": 7, "svg": 7, "svg_imag": 7, "sy": 1, "system": [4, 7], "tab": 7, "tabl": [1, 4], "tailor": 7, "take": 7, "tall": 7, "tarshizi": 0, "task": [4, 7], "teach": 3, "techniqu": [4, 7], "ten": 3, "tend": 7, "test": 1, "text": [1, 7], "text_wrap": [1, 7], "than": [1, 7], "thank": 0, "thei": 7, "them": [1, 7], "therefor": 7, "thi": [1, 4, 7], "three": 7, "through": 1, "throw": 1, "thu": 7, "tick": [1, 7], "tick_fonts": [1, 7], "tight": 7, "time": [0, 1, 7], "titl": [1, 2, 7], "to_list": 7, "togeth": 7, "toggl": [1, 7], "tool": [4, 7], "top": 7, "total": 7, "trail": 5, "transpar": [1, 7], "trend": [4, 7], "triangl": 7, "triangular": [1, 5], "true": [1, 7], "truth": 7, "tupl": 7, "two": 7, "type": [1, 4, 7], "u": [0, 7], "uci": [6, 7], "ucla": 3, "unambigu": 7, "uncov": 4, "underli": [4, 7], "understand": [4, 7], "uniform": 1, "uniqu": [1, 4, 5], "unique_values_tot": 7, "unique_var": 7, "unit": 7, "univers": [0, 3], "unrecogn": 7, "unstack": 7, "unus": 1, "unwav": 0, "up": [1, 7], "updat": [1, 7], "upper": [1, 7], "upright": 7, "url": 2, "us": [1, 4, 7], "usag": [1, 7], "user": [1, 4, 7], "userwarn": 7, "util": [4, 7], "v": 7, "valid": 1, "valid_plot_typ": 1, "valu": [1, 4, 7], "valueerror": [1, 7], "vari": 7, "variabl": [1, 4, 5], "varianc": 7, "varieti": [3, 4, 7], "variou": [1, 4, 7], "vars_of_interest": 7, "vdot": 7, "verbiag": 1, "verifi": [1, 7], "versatil": 7, "version": [2, 4, 5, 7], "version_info": 1, "vertic": 7, "via": [1, 7], "view": 7, "violin": [1, 4, 5], "violinplot": 7, "viridi": 7, "visual": [1, 4, 6, 7], "vmax": 7, "vmin": 7, "vriabl": 7, "w": 2, "w_pad": 7, "wa": 7, "wai": 7, "want": 7, "wareh": 3, "warn": 1, "waskom": [6, 7], "we": [0, 7], "week": 7, "welcom": 5, "well": 7, "were": 7, "what": 5, "when": [1, 4, 7], "where": 7, "whether": [1, 7], "which": [1, 4, 7], "while": [1, 7], "white": 7, "whitespac": 7, "wide": [3, 7], "width": [1, 7], "wife": 7, "wish": 7, "within": [1, 3, 7], "without": 7, "work": [1, 7], "workclass": 7, "workflow": 4, "would": [0, 7], "wrangl": 3, "wrap": [1, 7], "write": 7, "x": [1, 7], "x_1": 7, "x_2": 7, "x_i": 7, "x_n": 7, "x_var": 7, "xlabel": 7, "xlabel_align": 7, "xlabel_rot": 7, "xlim": [1, 7], "xlsx": 7, "xlsxwriter": 4, "xy": 7, "y": [1, 7], "y_axis_label": 7, "y_i": 7, "y_var": 7, "year": [2, 3, 7], "yellow": 7, "ylabel": 7, "ylabel_align": 7, "ylabel_rot": 7, "ylim": [1, 7], "you": [4, 7], "your": [4, 7], "yyyi": 7, "zenodo": [1, 2], "zero": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References", "Description"], "titleterms": {"0": 1, "1b0": 1, "1rc0": 1, "2": 1, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "With": 7, "about": 5, "acknowledg": 0, "ad": 7, "analysi": 7, "assumpt": 7, "bar": 7, "best": 7, "bin": 7, "box": 7, "categori": 7, "centric": 7, "changelog": 1, "cite": 2, "coeffici": 7, "column": 7, "combin": 7, "content": 5, "conting": 7, "contributor": 3, "correl": 7, "count": 7, "creat": 7, "crosstab": 7, "custom": 7, "data": 7, "datafram": 7, "date": 7, "densiti": 7, "descript": 7, "directori": 7, "distribut": 7, "document": 4, "eda": [2, 4, 5], "exampl": 7, "excel": 7, "featur": 4, "fit": 7, "format": 7, "full": 7, "function": 7, "gaussian": 7, "gener": 7, "get": 5, "grid": 7, "group": 7, "guid": 5, "highlight": 7, "histogram": 7, "i": 4, "identifi": 7, "instal": 4, "kde": 7, "kei": 4, "librari": 4, "line": 7, "link": 4, "maintain": 3, "manag": 7, "matric": 7, "matrix": 7, "non": 7, "normal": 7, "numer": 7, "path": 7, "pearson": 7, "period": 7, "pivot": 7, "plot": 7, "prepar": 7, "prerequisit": 4, "project": 4, "purpos": 4, "python": 4, "refer": 6, "regress": 7, "regular": 7, "remov": 7, "save": 7, "scatter": 7, "specif": 7, "stack": 7, "standard": 7, "start": 5, "summari": 7, "tabl": [5, 7], "toolkit": [2, 4, 5], "trail": 7, "triangular": 7, "uniqu": 7, "usag": 5, "variabl": 7, "version": 1, "violin": 7, "welcom": 4, "what": 4}}) \ No newline at end of file diff --git a/_build/html/v0.0.7/usage_guide.html b/_build/html/v0.0.7/usage_guide.html new file mode 100644 index 000000000..33be1470f --- /dev/null +++ b/_build/html/v0.0.7/usage_guide.html @@ -0,0 +1,2802 @@ + + + + + + + + + Description — EDA Toolkit 0.0.7 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Description

+

This guide provides detailed instructions and examples for using the functions +provided in the eda_toolkit library and how to use them effectively in your projects.

+

For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [1]. This dataset provides a rich source of +information for demonstrating the functionalities of the eda_toolkit.

+
+
+

Data Preparation and Management

+
+

Path directories

+

Ensure that the directory exists. If not, create it.

+
+
+ensure_directory(path)
+
+
Parameters:
+

path (str) – The path to the directory that needs to be ensured.

+
+
Returns:
+

None

+
+
+
+ +

The ensure_directory function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories.

+

Example Usage

+

In the example below, we demonstrate how to use the ensure_directory function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them.

+

First, we define the base path as the parent directory of the current directory. +The os.pardir constant, equivalent to ".."", is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory.

+

Next, we set paths for the PNG and SVG image directories, located within an +images folder in the parent directory. Using the ensure_directory +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them.

+
from eda_toolkit import ensure_directory
+
+import os # import operating system for dir
+
+
+base_path = os.path.join(os.pardir)
+
+# Go up one level from 'notebooks' to parent directory,
+# then into the 'data' folder
+data_path = os.path.join(os.pardir, "data")
+data_output = os.path.join(os.pardir, "data_output")
+
+# create image paths
+image_path_png = os.path.join(base_path, "images", "png_images")
+image_path_svg = os.path.join(base_path, "images", "svg_images")
+
+# Use the function to ensure'data' directory exists
+ensure_directory(data_path)
+ensure_directory(data_output)
+ensure_directory(image_path_png)
+ensure_directory(image_path_svg)
+
+
+

Output

+
Created directory: ../data
+Created directory: ../data_output
+Created directory: ../images/png_images
+Created directory: ../images/svg_images
+
+
+
+
+

Adding Unique Identifiers

+

Add a column of unique IDs with a specified number of digits to the dataframe.

+
+
+add_ids(df, id_colname='ID', num_digits=9, seed=None, set_as_index=True)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The dataframe to add IDs to.

  • +
  • id_colname (str) – The name of the new column for the IDs.

  • +
  • num_digits (int) – The number of digits for the unique IDs.

  • +
  • seed (int, optional) – The seed for the random number generator. Defaults to None.

  • +
  • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

  • +
+
+
Returns:
+

The updated dataframe with the new ID column.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +

The add_ids function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe.

+

Example Usage

+

In the example below, we demonstrate how to use the add_ids function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the add_ids function to generate +and append a column of unique IDs with a specified number of digits to the dataframe.

+

First, we import the pandas library and the add_ids function from the eda_toolkit. +Then, we create a sample dataframe with some data. We call the add_ids function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe.

+
from eda_toolkit import add_ids
+
+# Add a column of unique IDs with 9 digits and call it "census_id"
+df = add_ids(
+    df=df,
+    id_colname="census_id",
+    num_digits=9,
+    seed=111,
+    set_as_index=True,
+)
+
+
+

Output

+

First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
DataFrame index is unique.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+

+
+
+

Trailing Period Removal

+

Strip the trailing period from floats in a specified column of a DataFrame, if present.

+
+
+strip_trailing_period(df, column_name)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The DataFrame containing the column to be processed.

  • +
  • column_name (str) – The name of the column containing floats with potential trailing periods.

  • +
+
+
Returns:
+

The updated DataFrame with the trailing periods removed from the specified column.

+
+
Return type:
+

pd.DataFrame

+
+
+

The strip_trailing_period function is designed to remove trailing periods +from float values in a specified column of a DataFrame. This can be particularly +useful when dealing with data that has been inconsistently formatted, ensuring +that all float values are correctly represented.

+
+ +

Example Usage

+

In the example below, we demonstrate how to use the strip_trailing_period function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the strip_trailing_period function to remove any trailing periods from the specified column.

+
from eda_toolkit import strip_trailing_period
+
+# Create a sample dataframe with trailing periods in some values
+data = {
+    "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.],
+}
+df = pd.DataFrame(data)
+
+# Remove trailing periods from the 'values' column
+df = strip_trailing_period(df=df, column_name="values")
+
+
+

Output

+

First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)

+ + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +

+

Note: The last row shows 6 as an int with a trailing period with its conversion to float.

+

+
+
+

Standardized Dates

+

Parse and standardize date strings based on the provided rule.

+
+
+parse_date_with_rule(date_str)
+

This function takes a date string and standardizes it to the ISO 8601 format +(YYYY-MM-DD). It assumes dates are provided in either day/month/year or +month/day/year format. The function first checks if the first part of the +date string (day or month) is greater than 12, which unambiguously indicates +a day/month/year format. If the first part is 12 or less, the function +attempts to parse the date as month/day/year, falling back to day/month/year +if the former raises a ValueError due to an impossible date (e.g., month +being greater than 12).

+
+
Parameters:
+

date_str (str) – A date string to be standardized.

+
+
Returns:
+

A standardized date string in the format YYYY-MM-DD.

+
+
Return type:
+

str

+
+
Raises:
+

ValueError – If date_str is in an unrecognized format or if the function +cannot parse the date.

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the parse_date_with_rule +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the parse_date_with_rule +function to parse and standardize each date string to the ISO 8601 format.

+
from eda_toolkit import parse_date_with_rule
+
+# Sample date strings
+date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"]
+
+# Standardize the date strings
+standardized_dates = [parse_date_with_rule(date) for date in date_strings]
+
+print(standardized_dates)
+
+
+

Output

+
['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12']
+
+
+
+

Important

+

In the next example, we demonstrate how to apply the parse_date_with_rule +function to a DataFrame column containing date strings using the .apply() method. +This is particularly useful when you need to standardize date formats across an +entire column in a DataFrame.

+
+
# Creating the DataFrame
+data = {
+    "date_column": [
+        "31/12/2021",
+        "01/01/2022",
+        "12/31/2021",
+        "13/02/2022",
+        "07/04/2022",
+    ],
+    "name": ["Alice", "Bob", "Charlie", "David", "Eve"],
+    "amount": [100.0, 150.5, 200.75, 250.25, 300.0],
+}
+
+df = pd.DataFrame(data)
+
+# Apply the function to the DataFrame column
+df["standardized_date"] = df["date_column"].apply(parse_date_with_rule)
+
+print(df)
+
+
+

Output

+
   date_column     name  amount standardized_date
+0   31/12/2021    Alice  100.00        2021-12-31
+1   01/01/2022      Bob  150.50        2022-01-01
+2   12/31/2021  Charlie  200.75        2021-12-31
+3   13/02/2022    David  250.25        2022-02-13
+4   07/04/2022      Eve  300.00        2022-04-07
+
+
+
+
+

DataFrame Analysis

+

Analyze DataFrame columns, including dtype, null values, and unique value counts.

+
+
+dataframe_columns(df)
+

This function analyzes the columns of a DataFrame, providing details about the data type, +the number and percentage of null values, the total number of unique values, and the most +frequent unique value along with its count and percentage. It handles special cases such as +converting date columns and replacing empty strings with Pandas NA values.

+
+
Parameters:
+

df (pandas.DataFrame) – The DataFrame to analyze.

+
+
Returns:
+

A DataFrame with the analysis results for each column.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the dataframe_columns +function to analyze a DataFrame’s columns.

+
from eda_toolkit import dataframe_columns
+
+dataframe_columns(df=df)
+
+
+

Output

+

Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
Shape:  (48842, 16)
+
+Total seconds of processing time: 0.861555
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+

+
+
+

Generating Summary Tables for Variable Combinations

+

This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.

+
+
+summarize_all_combinations(df, variables, data_path, data_name, min_length=2)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The pandas DataFrame containing the data.

  • +
  • variables (list) – List of unique variables to generate combinations.

  • +
  • data_path (str) – Path where the output Excel file will be saved.

  • +
  • data_name (str) – Name of the output Excel file.

  • +
  • min_length (int) – Minimum length of combinations to generate. Defaults to 2.

  • +
+
+
Returns:
+

A dictionary of summary tables and a list of all generated combinations.

+
+
Return type:
+

tuple(dict, list)

+
+
+
+ +

The function returns two outputs:

+

1. summary_tables: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values.

+

2. all_combinations: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables.

+

Example Usage

+

Below, we use the summarize_all_combinations function to generate summary tables for the specified +variables from a DataFrame containing the census data [1].

+
from eda_toolkit import summarize_all_combinations
+
+# Define unique variables for the analysis
+unique_vars = [
+    "age_group",
+    "workclass",
+    "education",
+    "occupation",
+    "race",
+    "sex",
+    "income",
+]
+
+# Generate summary tables for all combinations of the specified variables
+summary_tables, all_combinations = summarize_all_combinations(
+    df=df,
+    data_path=data_output,
+    variables=unique_vars,
+    data_name="census_summary_tables.xlsx",
+)
+
+# Print all combinations of variables
+print(all_combinations)
+
+
+

Output

+
[('age_group', 'workclass'),
+('age_group', 'education'),
+('age_group', 'occupation'),
+('age_group', 'race'),
+('age_group', 'sex'),
+('age_group', 'income'),
+('workclass', 'education'),
+('workclass', 'occupation'),
+('workclass', 'race'),
+('workclass', 'sex'),
+('workclass', 'income'),
+('education', 'occupation'),
+('education', 'race'),
+('education', 'sex'),
+('education', 'income'),
+('occupation', 'race'),
+('occupation', 'sex'),
+('occupation', 'income'),
+('race', 'sex'),
+('race', 'income'),
+('sex', 'income'),
+('age_group', 'workclass', 'education'),
+('age_group', 'workclass', 'occupation'),
+('age_group', 'workclass', 'race'),
+('age_group', 'workclass', 'sex'),
+('age_group', 'workclass', 'income'),
+('age_group', 'education', 'occupation'),
+('age_group', 'education', 'race'),
+('age_group', 'education', 'sex'),
+('age_group', 'education', 'income'),
+('age_group', 'occupation', 'race'),
+('age_group', 'occupation', 'sex'),
+('age_group', 'occupation', 'income'),
+('age_group', 'race', 'sex'),
+('age_group', 'race', 'income'),
+('age_group', 'sex', 'income'),
+('workclass', 'education', 'occupation'),
+('workclass', 'education', 'race'),
+('workclass', 'education', 'sex'),
+('workclass', 'education', 'income'),
+('workclass', 'occupation', 'race'),
+('workclass', 'occupation', 'sex'),
+('workclass', 'occupation', 'income'),
+('workclass', 'race', 'sex'),
+('workclass', 'race', 'income'),
+('workclass', 'sex', 'income'),
+('education', 'occupation', 'race'),
+('education', 'occupation', 'sex'),
+('education', 'occupation', 'income'),
+('education', 'race', 'sex'),
+('education', 'race', 'income'),
+('education', 'sex', 'income'),
+('occupation', 'race', 'sex'),
+('occupation', 'race', 'income'),
+('occupation', 'sex', 'income'),
+('race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation'),
+('age_group', 'workclass', 'education', 'race'),
+('age_group', 'workclass', 'education', 'sex'),
+('age_group', 'workclass', 'education', 'income'),
+('age_group', 'workclass', 'occupation', 'race'),
+('age_group', 'workclass', 'occupation', 'sex'),
+('age_group', 'workclass', 'occupation', 'income'),
+('age_group', 'workclass', 'race', 'sex'),
+('age_group', 'workclass', 'race', 'income'),
+('age_group', 'workclass', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race'),
+('age_group', 'education', 'occupation', 'sex'),
+('age_group', 'education', 'occupation', 'income'),
+('age_group', 'education', 'race', 'sex'),
+('age_group', 'education', 'race', 'income'),
+('age_group', 'education', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex'),
+('age_group', 'occupation', 'race', 'income'),
+('age_group', 'occupation', 'sex', 'income'),
+('age_group', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race'),
+('workclass', 'education', 'occupation', 'sex'),
+('workclass', 'education', 'occupation', 'income'),
+('workclass', 'education', 'race', 'sex'),
+('workclass', 'education', 'race', 'income'),
+('workclass', 'education', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex'),
+('workclass', 'occupation', 'race', 'income'),
+('workclass', 'occupation', 'sex', 'income'),
+('workclass', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex'),
+('education', 'occupation', 'race', 'income'),
+('education', 'occupation', 'sex', 'income'),
+('education', 'race', 'sex', 'income'),
+('occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race'),
+('age_group', 'workclass', 'education', 'occupation', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'race', 'income'),
+('age_group', 'workclass', 'education', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'education', 'occupation', 'race', 'income'),
+('age_group', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'education', 'race', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex'),
+('workclass', 'education', 'occupation', 'race', 'income'),
+('workclass', 'education', 'occupation', 'sex', 'income'),
+('workclass', 'education', 'race', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex', 'income'),
+('age_group',
+'workclass',
+'education',
+'occupation',
+'race',
+'sex',
+'income')]
+
+
+

When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table.

+
EDA Toolkit Logo + +
+
+

Saving DataFrames to Excel with Customized Formatting

+

Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.

+

This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the save_dataframes_to_excel function.

+
+
+save_dataframes_to_excel(file_path, df_dict, decimal_places=0)
+
+
Parameters:
+
    +
  • file_path (str) – Full path to the output Excel file.

  • +
  • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

  • +
  • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

  • +
+
+
Notes:
+
    +
  • The function will autofit columns and left-align text.

  • +
  • Numeric columns will be formatted with the specified number of decimal places.

  • +
  • Headers will be bold and left-aligned without borders.

  • +
+
+
+
+ +

The function performs the following tasks:

+
    +
  • Writes each DataFrame to its respective sheet in the Excel file.

  • +
  • Rounds numeric columns to the specified number of decimal places.

  • +
  • Applies customized formatting to headers and cells.

  • +
  • Autofits columns based on the content length.

  • +
+

Example Usage

+

Below, we use the save_dataframes_to_excel function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between 18 and 40.

+
from eda_toolkit import save_dataframes_to_excel
+
+# Example usage
+file_name = "df_census.xlsx"  # Name of the output Excel file
+file_path = os.path.join(data_path, file_name)
+
+# filter DataFrame to Ages 18-40
+filtered_df = df[(df["age"] > 18) & (df["age"] < 40)]
+
+df_dict = {
+    "original_df": df,
+    "ages_18_to_40": filtered_df,
+}
+
+save_dataframes_to_excel(
+    file_path=file_path,
+    df_dict=df_dict,
+    decimal_places=0,
+)
+
+
+

Output

+

The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between 18 and 40, each on separate sheets with customized formatting.

+
+
+

Creating Contingency Tables

+

Create a contingency table from one or more columns in a DataFrame, with sorting options.

+

This section explains how to create contingency tables from one or more columns in a DataFrame using the contingency_table function.

+
+
+contingency_table(df, cols=None, sort_by=0)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • cols (str or list, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

  • +
  • sort_by (int) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order.

  • +
+
+
Raises:
+

ValueError – If no columns are specified or if sort_by is not 0 or 1.

+
+
Returns:
+

A DataFrame with the specified columns, 'Total', and 'Percentage'.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

Below, we use the contingency_table function to create a contingency table +from the specified columns in a DataFrame containing census data [1]

+
from eda_toolkit import contingency_table
+
+# Example usage
+contingency_table(
+    df=df,
+    cols=[
+        "age_group",
+        "workclass",
+        "race",
+        "sex",
+    ],
+    sort_by=1,
+)
+
+
+

Output

+

The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the 'Total' column in descending order because sort_by +is set to 1.

+
    age_group     workclass                race     sex  Total  Percentage
+0       30-39       Private               White    Male   5856       11.99
+1       18-29       Private               White    Male   5623       11.51
+2       40-49       Private               White    Male   4267        8.74
+3       18-29       Private               White  Female   3680        7.53
+4       50-59       Private               White    Male   2565        5.25
+..        ...           ...                 ...     ...    ...         ...
+467     50-59   Federal-gov               Other    Male      1        0.00
+468     50-59     Local-gov  Asian-Pac-Islander  Female      1        0.00
+469     70-79  Self-emp-inc               Black    Male      1        0.00
+470     80-89     Local-gov  Asian-Pac-Islander    Male      1        0.00
+471                                                      48842      100.00
+
+[472 rows x 6 columns]
+
+
+

+
+
+

Highlighting Specific Columns in a DataFrame

+

This section explains how to highlight specific columns in a DataFrame using the highlight_columns function.

+

Highlight specific columns in a DataFrame with a specified background color.

+
+
+highlight_columns(df, columns, color='yellow')
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to be styled.

  • +
  • columns (list of str) – List of column names to be highlighted.

  • +
  • color (str, optional) – The background color to be applied for highlighting (default is “yellow”).

  • +
+
+
Returns:
+

A Styler object with the specified columns highlighted.

+
+
Return type:
+

pandas.io.formats.style.Styler

+
+
+
+ +

Example Usage

+

Below, we use the highlight_columns function to highlight the age and education +columns in the first 5 rows of the census [1] DataFrame with a pink background color.

+
from eda_toolkit import highlight_columns
+
+# Applying the highlight function
+highlighted_df = highlight_columns(
+    df=df,
+    columns=["age", "education"],
+    color="#F8C5C8",
+)
+
+highlighted_df
+
+
+

Output

+

The output will be a DataFrame with the specified columns highlighted in the given background color. +The age and education columns will be highlighted in pink.

+

The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the .render() method of the Styler object.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife

+
+
+

Binning Numerical Columns

+

Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or “bins.” This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or “bins,” and +then assigning each value to one of these intervals.

+
+

Note

+

The code snippets below create age bins and assign a corresponding age group +label to each age in the DataFrame. The pd.cut function from pandas is used to +categorize the ages and assign them to a new column, age_group. Adjust the bins +and labels as needed for your specific data.

+
+

Below, we use the age column of the census data [1] from the UCI Machine Learning Repository as an example:

+
    +
  1. Bins Definition: +The bins are defined by specifying the boundaries of each interval. For example, +in the code snippet below, the bin_ages list specifies the boundaries for age groups:

    +
    bin_ages = [
    +    0,
    +    18,
    +    30,
    +    40,
    +    50,
    +    60,
    +    70,
    +    80,
    +    90,
    +    100,
    +    float("inf"),
    +]
    +
    +
    +

    Each pair of consecutive elements in bin_ages defines a bin. For example:

    +
      +
    • The first bin is [0, 18),

    • +
    • The second bin is [18, 30),

    • +
    • and so on.

    • +
    +
  2. +
+

+
    +
  1. Labels for Bins: +The label_ages list provides labels corresponding to each bin:

    +
    label_ages = [
    +    "< 18",
    +    "18-29",
    +    "30-39",
    +    "40-49",
    +    "50-59",
    +    "60-69",
    +    "70-79",
    +    "80-89",
    +    "90-99",
    +    "100 +",
    +]
    +
    +
    +

    These labels are used to categorize the numerical values into meaningful groups.

    +
  2. +
  3. Applying the Binning: +The pd.cut function +from Pandas is used to apply the binning process. For each value in the age +column of the DataFrame, it assigns a corresponding label based on which bin the +value falls into. Here, right=False indicates that each bin includes the +left endpoint but excludes the right endpoint. For example, if bin_ages = +[0, 10, 20, 30], then a value of 10 will fall into the bin [10, 20) and +be labeled accordingly.

    +
    df["age_group"] = pd.cut(
    +    df["age"],
    +    bins=bin_ages,
    +    labels=label_ages,
    +    right=False,
    +)
    +
    +
    +

    Mathematically, for a given value x in the age column:

    +
    +\[\begin{split}\text{age_group} = +\begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 +\end{cases}\end{split}\]
    +

    The parameter right=False in pd.cut means that the bins are left-inclusive +and right-exclusive, except for the last bin, which is always right-inclusive +when the upper bound is infinity (float(“inf”)).

    +
  4. +
+
+
+
+

KDE and Histogram Distribution Plots

+
+

Gaussian Assumption for Normality

+

The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF):

+
+\[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)\]
+

where:

+
    +
  • \(\mu\) is the mean

  • +
  • \(\sigma^2\) is the variance

  • +
+

In a normally distributed dataset:

+
    +
  • 68% of data falls within \(\mu \pm \sigma\)

  • +
  • 95% within \(\mu \pm 2\sigma\)

  • +
  • 99.7% within \(\mu \pm 3\sigma\)

  • +
+
KDE Distributions - KDE (+) Histograms (Density) + +
+

Histograms and KDE

+

Histograms:

+
    +
  • Visualize data distribution by binning values and counting frequencies.

  • +
  • If data is Gaussian, the histogram approximates a bell curve.

  • +
+

Kernel Density Estimation (KDE):

+
    +
  • A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function.

  • +
  • The KDE for a dataset \(X = \{x_1, x_2, \ldots, x_n\}\) is given by:

  • +
+
+\[\hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right)\]
+

where:

+
    +
  • \(K\) is the kernel function (often Gaussian)

  • +
  • \(h\) is the bandwidth (smoothing parameter)

  • +
+

Combined Use of Histograms and KDE

+
    +
  • Histograms offer a discrete, binned view of the data.

  • +
  • KDE provides a smooth, continuous estimate of the underlying distribution.

  • +
  • Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality.

  • +
+
+
+
+

KDE Distribution Function

+

Generate KDE or histogram distribution plots for specified columns in a DataFrame.

+

The kde_distributions function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2] for plotting, which is built on top of +matplotlib [3] and provides a high-level interface for drawing attractive and informative +statistical graphics.

+

Key Features and Parameters

+
    +
  • Flexible Plotting: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively.

  • +
  • Leverages Seaborn Library: The function is built on the seaborn library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code.

  • +
  • Customization: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs.

  • +
  • Scientific Notation Control: The function allows disabling scientific notation on the axes, providing better readability for certain types of data.

  • +
  • Log Scaling: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude.

  • +
  • Output Options: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations.

  • +
+
+
+kde_distributions(df, vars_of_interest=None, grid_figsize=(10, 8), single_figsize=(6, 4), kde=True, hist_color='#0000FF', kde_color='#FF0000', hist_edgecolor='#000000', hue=None, fill=True, fill_alpha=1, n_rows=1, n_cols=1, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_path_png=None, single_var_image_path_svg=None, single_var_image_filename=None, y_axis_label='Density', plot_type='both', log_scale_vars=None, bins='auto', binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat='density', xlim=None, ylim=None)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots.

  • +
  • grid_figsize (tuple, optional) – Size of the overall grid figure, default is (10, 8).

  • +
  • single_figsize (tuple, optional) – Size of individual figures for each variable, default is (6, 4).

  • +
  • kde (bool, optional) – Whether to include KDE plots on the histograms, default is True.

  • +
  • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

  • +
  • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

  • +
  • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

  • +
  • hue (str, optional) – Column name to group data by, adding different colors for each group.

  • +
  • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

  • +
  • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where +0 is fully transparent and 1 is fully opaque. Default is 1.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid, default is 1.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid, default is 1.

  • +
  • w_pad (float, optional) – Width padding between subplots, default is 1.0.

  • +
  • h_pad (float, optional) – Height padding between subplots, default is 1.0.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

  • +
  • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

  • +
  • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

  • +
  • single_var_image_path_png (str, optional) – Directory path to save the PNG images of the separate distribution plots.

  • +
  • single_var_image_path_svg (str, optional) – Directory path to save the SVG images of the separate distribution plots.

  • +
  • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. +The variable name will be appended to this filename.

  • +
  • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

  • +
  • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

  • +
  • log_scale_vars (list of str, optional) – List of variable names to apply log scaling.

  • +
  • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

  • +
  • binwidth (number or pair of numbers, optional) – Width of each bin, overrides bins but can be used with binrange.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels, default is 10.

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

  • +
  • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

  • +
  • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', +'probability', 'percent', 'density'), default is 'density'.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If plot_type is not one of 'hist', 'kde', or 'both'.

    • +
    • If stat is not one of 'count', 'density', 'frequency', 'probability', 'proportion', 'percent'.

    • +
    • If log_scale_vars contains variables that are not present in the DataFrame.

    • +
    • If fill is set to False and hist_edgecolor is not the default.

    • +
    +

  • +
  • UserWarning

      +
    • If stat is set to ‘count’ while kde is True, as it may produce misleading plots.

    • +
    • If both bins and binwidth are specified, which may affect performance.

    • +
    +

  • +
+
+
Returns:
+

None

+
+
+
+ +

+
+

KDE and Histograms Example

+

In the below example, the kde_distributions function is used to generate +histograms for several variables of interest: "age", "education-num", and +"hours-per-week". These variables represent different demographic and +financial attributes from the dataset. The kde=True parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data’s probability density.

+

The visualizations are arranged in a single row of four columns, as specified +by n_rows=1 and n_cols=3, respectively. The overall size of the grid +figure is set to 14 inches wide and 4 inches tall (grid_figsize=(14, 4)), +while each individual plot is configured to be 4 inches by 4 inches +(single_figsize=(4, 4)). The fill=True parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +w_pad=1 and h_pad=1, which add 1 inch of padding both horizontally and +vertically.

+

To handle longer titles, the text_wrap=50 parameter ensures that the title +text wraps to a new line after 50 characters. The bbox_inches="tight" setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in vars_of_interest are +passed directly to the function for visualization.

+

Each plot is saved individually with filenames that are prefixed by +"kde_density_single_distribution", followed by the variable name. The `y-axis` +for all plots is labeled as “Density” (y_axis_label="Density"), reflecting that +the height of the bars or KDE line represents the data’s density. The histograms +are divided into 10 bins (bins=10), offering a clear view of the distribution +of each variable.

+

The plot_type="hist" parameter indicates that only histograms will be generated +for each variable. Additionally, the font sizes for the axis labels and tick labels +are set to 16 points (label_fontsize=16) and 14 points (tick_fontsize=14), +respectively, ensuring that all text within the plots is legible and well-formatted.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=True,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    fill=True,
+    fill_alpha=0.60,
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - KDE (+) Histograms (Density) + +
+
+

Histogram Example (Density)

+

In this example, the kde_distributions function is used to generate histograms for +the variables "age", "education-num", and "hours-per-week" but with +kde=False, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (n_rows=1, n_cols=3), +with a grid size of 14x4 inches (grid_figsize=(14, 4)). The histograms are +divided into 10 bins (bins=10), and the y-axis is labeled “Density” (y_axis_label="Density"). +Font sizes for the axis labels and tick labels are set to 16 and 14 points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=False,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Density) + +
+
+

Histogram Example (Count)

+

In this example, the kde_distributions function is modified to generate histograms +with a few key changes. The hist_color is set to “orange”, changing the color of the +histogram bars. The `y-axis` label is updated to “Count” (y_axis_label="Count"), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to “Count” to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (n_rows=1, n_cols=4), +a grid size of 14x4 inches, and a bin count of 10. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=False,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    hist_color="orange",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Count",
+    bins=10,
+    plot_type="hist",
+    stat="Count",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+
+
+

Stacked Crosstab Plots

+

Generates stacked bar plots and crosstabs for specified columns in a DataFrame.

+

The stacked_crosstab_plot function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats.

+

The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis.

+
+
+stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind='bar', width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output='both', return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type='both', show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False)
+

Generates stacked or regular bar plots and crosstabs for specified columns.

+

This function allows users to create stacked bar plots (or regular bar plots +if stacks are removed) and corresponding crosstabs for specific columns +in a DataFrame. It provides options to customize the appearance, including +font sizes for axis labels, tick labels, and title text wrapping, and to +choose between regular or normalized plots.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • col (str) – The name of the column in the DataFrame to be analyzed.

  • +
  • func_col (list) – List of ground truth columns to be analyzed.

  • +
  • legend_labels_list (list) – List of legend labels for each ground truth column.

  • +
  • title (list) – List of titles for the plots.

  • +
  • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

  • +
  • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

  • +
  • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

  • +
  • custom_order (list, optional) – Specifies a custom order for the categories in the col.

  • +
  • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

  • +
  • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

  • +
  • save_formats (list, optional) – List of file formats to save the plot images in.

  • +
  • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

  • +
  • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

  • +
  • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

  • +
  • x (int, optional) – The width of the figure.

  • +
  • y (int, optional) – The height of the figure.

  • +
  • p (int, optional) – The padding between the subplots.

  • +
  • file_prefix (str, optional) – Prefix for the filename when output includes plots.

  • +
  • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

  • +
  • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

  • +
  • show_legend (bool, optional) – Specify whether to show the legend, default is True.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If output is not one of "both", "plots_only", or "crosstabs_only".

    • +
    • If plot_type is not one of "both", "regular", "normalized".

    • +
    • If remove_stacks is set to True and plot_type is not "regular".

    • +
    • If the lengths of title, func_col, and legend_labels_list are not equal.

    • +
    +

  • +
  • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

  • +
+
+
Returns:
+

Dictionary of crosstabs DataFrames if return_dict is True. Otherwise, returns None.

+
+
Return type:
+

dict or None

+
+
+
+ +
+

Stacked Bar Plots With Crosstabs Example

+

The provided code snippet demonstrates how to use the stacked_crosstab_plot +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here’s a detailed breakdown of the code using the census +dataset as an example [1].

+

First, the func_col list is defined, specifying the columns ["sex", "income"] +to be analyzed. These columns will be used in the loop to generate separate plots. +The legend_labels_list is then defined, with each entry corresponding to a +column in func_col. In this case, the labels for the sex column are +["Male", "Female"], and for the income column, they are ["<=50K", ">50K"]. +These labels will be used to annotate the legends of the plots.

+

Next, the title list is defined, providing titles for each plot corresponding +to the columns in func_col. The titles are set to ["Sex", "Income"], +which will be displayed on top of each respective plot.

+
+

Note

+

The legend_labels_list parameter should be a list of lists, where each +inner list corresponds to the ground truth labels for the respective item in +the func_col list. Each element in the func_col list represents a +column in your DataFrame that you wish to analyze, and the corresponding +inner list in legend_labels_list should contain the labels that will be +used in the legend of your plots.

+
+

For example:

+
# Define the func_col to use in the loop in order of usage
+func_col = ["sex", "income"]
+
+# Define the legend_labels to use in the loop
+legend_labels_list = [
+    ["Male", "Female"],  # Corresponds to "sex"
+    ["<=50K", ">50K"],   # Corresponds to "income"
+]
+
+# Define titles for the plots
+title = [
+    "Sex",
+    "Income",
+]
+
+
+
+

Important

+

Ensure that the number of elements in func_col, legend_labels_list, +and title are the same. Each item in func_col must have a corresponding +list of labels in legend_labels_list and a title in title. This +consistency is essential for the function to correctly generate the plots +with the appropriate labels and titles.

+
+

In this example:

+
    +
  • func_col contains two elements: "sex" and "income". Each corresponds to a specific column in your DataFrame.

  • +
  • legend_labels_list is a nested list containing two inner lists:

    +
    +
      +
    • The first inner list, ["Male", "Female"], corresponds to the "sex" column in func_col.

    • +
    • The second inner list, ["<=50K", ">50K"], corresponds to the "income" column in func_col.

    • +
    +
    +
  • +
  • title contains two elements: "Sex" and "Income", which will be used as the titles for the respective plots.

  • +
+
+

Note

+

If you assign the function to a variable, the dictionary returned when +return_dict=True will be suppressed in the output. However, the dictionary +is still available within the assigned variable for further use.

+
+
from eda_toolkit import stacked_crosstab_plot
+
+# Call the stacked_crosstab_plot function
+stacked_crosstabs = stacked_crosstab_plot(
+    df=df,
+    col="age_group",
+    func_col=func_col,
+    legend_labels_list=legend_labels_list,
+    title=title,
+    kind="bar",
+    width=0.8,
+    rot=45, # axis rotation angle
+    custom_order=None,
+    color=["#00BFC4", "#F8766D"], # default color schema
+    output="both",
+    return_dict=True,
+    x=14,
+    y=8,
+    p=10,
+    logscale=False,
+    plot_type="both",
+    show_legend=True,
+    label_fontsize=14,
+    tick_fontsize=12,
+)
+
+
+

The above example generates stacked bar plots for "sex" and "income" +grouped by "education". The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export.

+
+

Important

+

Importance of Correctly Aligning Labels

+

It is crucial to properly align the elements in the legend_labels_list, +title, and func_col parameters when using the stacked_crosstab_plot +function. Each of these lists must be ordered consistently because the function +relies on their alignment to correctly assign labels and titles to the +corresponding plots and legends.

+

For instance, in the example above:

+
    +
  • The first element in func_col is "sex", and it is aligned with the first set of labels ["Male", "Female"] in legend_labels_list and the first title "Sex" in the title list.

  • +
  • Similarly, the second element in func_col, "income", aligns with the labels ["<=50K", ">50K"] and the title "Income".

  • +
+

Misalignment between these lists would result in incorrect labels or titles being +applied to the plots, potentially leading to confusion or misinterpretation of the data. +Therefore, it’s important to ensure that each list is ordered appropriately and +consistently to accurately reflect the data being visualized.

+

Proper Setup of Lists

+

When setting up the legend_labels_list, title, and func_col, ensure +that each element in the lists corresponds to the correct variable in the DataFrame. +This involves:

+
    +
  • Ordering: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted.

  • +
  • Consistency: Double-checking that each label in legend_labels_list matches the categories present in the corresponding func_col, and that the title accurately describes the plot.

  • +
+

By adhering to these guidelines, you can ensure that the stacked_crosstab_plot +function produces accurate and meaningful visualizations that are easy to interpret and analyze.

+
+

Output

+
KDE Distributions + +
Stacked Bar Plot Age vs. Income + +
+

Note

+

When you set return_dict=True, you are able to see the crosstabs printed out +as shown below.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93

+

When you set return_dict=True, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example:

+
crosstab_age_sex = crosstabs_dict["sex"]
+crosstab_age_income = crosstabs_dict["income"]
+
+
+
+
+

Pivoted Stacked Bar Plots Example

+

Using the census dataset [1], to create horizontal stacked bar plots, set the kind parameter to +"barh" in the stacked_crosstab_plot function. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the y-axis.

+
Stacked Bar Plot Age vs. Income (Pivoted) + +
+
+

Non-Normalized Stacked Bar Plots Example

+

In the census data [1], to create stacked bar plots without the normalized versions, +set the plot_type parameter to "regular" in the stacked_crosstab_plot +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the plot_type to "normalized" will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age.

+
Stacked Bar Plot Age vs. Income (Regular) + +
+
+

Regular Non-Stacked Bar Plots Example

+

In the census data [1], to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the plot_type parameter to "regular" +in the stacked_crosstab_plot function and enable remove_stacks by setting +it to True. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +plot_type to "normalized" will display only the normalized plots.

+

When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories.

+

In the example below, the color of the bars has been set to a dark grey (#333333), +and the legend has been removed by setting show_legend=False. This illustrates +regular bar plots for income by age, without stacking.

+
Bar Plot Age vs. Income (Regular) + +
+
+
+

Box and Violin Plots

+

Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.

+

The box_violin_plot function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories.

+

With options to customize the plot type (boxplot or violinplot), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis.

+

Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures.

+

The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset.

+
+
+box_violin_plot(df, metrics_list, metrics_boxplot_comp, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type='boxplot', xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • metrics_list (list of str) – List of metric names (columns in df) to plot.

  • +
  • metrics_boxplot_comp (list of str) – List of comparison categories (columns in df).

  • +
  • n_rows (int) – Number of rows in the subplot grid.

  • +
  • n_cols (int) – Number of columns in the subplot grid.

  • +
  • image_path_png (str, optional) – Optional directory path to save .png images.

  • +
  • image_path_svg (str, optional) – Optional directory path to save .svg images.

  • +
  • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

  • +
  • show_legend (bool, optional) – Boolean, True if showing the legend in the plots.

  • +
  • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set without specifying image_path_png or image_path_svg.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize is not a tuple or list of two numbers.

  • +
  • If grid_figsize is specified but is not a tuple or list of two numbers.

  • +
+

+
+
Returns:
+

None

+
+
+
+ +

This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels.

+
+

Box Plots Grid Example

+

In this example with the US census data [1], the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the "age_group" column in the +DataFrame. The metrics_boxplot_comp parameter is set to ["age_group"], meaning +that the comparison will be based on different age groups. The metrics_list is +provided as age_boxplot_list, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid format with 3 rows and 4 +columns, using the n_rows=3 and n_cols=4 parameters. The image_path_png and +image_path_svg parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to "all", ensuring that both +individual and grid plots are saved.

+

The plots are displayed in a grid format, as indicated by the show_plot="grid" +parameter. The plot_type is set to "boxplot", so the function will generate +boxplots for each metric in the list. Additionally, the `x-axis` labels are rotated +by 90 degrees (xlabel_rot=90) to ensure that the labels are legible. The legend is +hidden by setting show_legend=False, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication.

+
age_boxplot_list = df[
+    [
+        "education-num",
+        "hours-per-week",
+    ]
+].columns.to_list()
+
+
+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="boxplot",
+    xlabel_rot=90,
+)
+
+
+
Box Plot Comparisons + +
+
+

Violin Plots Grid Example

+

In this example with the US census data [1], we keep everything the same as the prior example, but change the +plot_type to violinplot. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings.

+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=90,
+)
+
+
+
Violin Plot Comparisons + +
+
+

Pivoted Violin Plots Grid Example

+

In this example with the US census data [1], we set xlabel_rot=0 and rotate_plot=True +to pivot the plot, changing the orientation of the axes while keeping the `x-axis` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution.

+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    rotate_plot=True,
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=0,
+)
+
+
+
Violin Plot Comparisons (Pivoted) + +
+
+
+

Scatter Plots and Best Fit Lines

+
+

Pearson Correlation Coefficient

+

The Pearson correlation coefficient, often denoted as \(r\), is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from \(-1\) to \(1\), where:

+
    +
  • \(r = 1\) indicates a perfect positive linear relationship.

  • +
  • \(r = -1\) indicates a perfect negative linear relationship.

  • +
  • \(r = 0\) indicates no linear relationship.

  • +
+

The Pearson correlation coefficient between two variables \(X\) and \(Y\) is defined as:

+
+\[r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y}\]
+

where:

+
    +
  • \(\text{Cov}(X, Y)\) is the covariance of \(X\) and \(Y\).

  • +
  • \(\sigma_X\) is the standard deviation of \(X\).

  • +
  • \(\sigma_Y\) is the standard deviation of \(Y\).

  • +
+

Covariance measures how much two variables change together. It is defined as:

+
+\[\text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)\]
+

where:

+
    +
  • \(n\) is the number of data points.

  • +
  • \(X_i\) and \(Y_i\) are the individual data points.

  • +
  • \(\mu_X\) and \(\mu_Y\) are the means of \(X\) and \(Y\).

  • +
+

The standard deviation measures the dispersion or spread of a set of values. For +a variable \(X\), the standard deviation \(\sigma_X\) is:

+
+\[\sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2}\]
+

Substituting the covariance and standard deviation into the Pearson correlation formula:

+
+\[r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}}\]
+

This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between \(X\) and \(Y\).

+
    +
  • \(r > 0\): Positive correlation. As \(X\) increases, \(Y\) tends to increase.

  • +
  • \(r < 0\): Negative correlation. As \(X\) increases, \(Y\) tends to decrease.

  • +
  • \(r = 0\): No linear correlation. There is no consistent linear relationship between \(X\) and \(Y\).

  • +
+

The closer the value of \(r\) is to \(\pm 1\), the stronger the linear relationship between the two variables.

+
+
+

Scatter Fit Plot

+

Create and Save Scatter Plots or a Grid of Scatter Plots

+

This function, scatter_fit_plot, is designed to generate scatter plots for +one or more pairs of variables (x_vars and y_vars) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view.

+

Optional Best Fit Line

+

An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s

+

Customizable Plot Aesthetics

+

The function offers a wide range of customization options to tailor the appearance +of the scatter plots:

+
    +
  • Point Color: You can specify a default color for the scatter points or use a hue parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data.

  • +
  • Point Size: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable.

  • +
  • Markers: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data.

  • +
+

Axis and Label Configuration

+

The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges.

+

Plot Display and Saving Options

+

The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations.

+

Correlation Coefficient Display

+

For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship.

+
+
+scatter_fit_plot(df, x_vars, y_vars, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color='C0', best_fit_linecolor='red', best_fit_linestyle='-', hue=None, hue_palette=None, size=None, sizes=None, marker='o', show_correlation=True, xlim=None, ylim=None)
+

Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • x_vars (list of str) – List of variable names to plot on the x-axis.

  • +
  • y_vars (list of str) – List of variable names to plot on the y-axis.

  • +
  • n_rows (int) – Number of rows in the subplot grid.

  • +
  • n_cols (int) – Number of columns in the subplot grid.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

  • +
  • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid".

  • +
  • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

  • +
  • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

  • +
  • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

  • +
  • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

  • +
  • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

  • +
  • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette.

  • +
  • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

  • +
  • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

  • +
  • marker (str, optional) – Marker style used for the scatter points. Default is "o".

  • +
  • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set but no image paths are provided.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize or grid_figsize are not tuples/lists with two numeric values.

  • +
+

+
+
Returns:
+

None +This function does not return any value but generates and optionally saves scatter plots for the specified x_vars and y_vars.

+
+
+
+ +
+

Regression-Centric Scatter Plots Example

+

In this US census data [1] example, the scatter_fit_plot function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the show_correlation=True parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the add_best_fit_line=True parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="grid",
+    show_legend=True,
+    xlabel_rot=0,
+    show_plot="grid",
+    rotate_plot=False,
+    grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (with Best Fit Lines) + +
+
+

Scatter Plots Grouped by Category Example

+

In this example, the scatter_fit_plot function is used to generate a grid of +scatter plots that examine the relationships between age and hours-per-week +as well as education-num and hours-per-week. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots:

+
    +
  1. Hue and Hue Palette: The hue parameter is set to "income", meaning that the +data points in the scatter plots are colored according to the values in the income +column. A custom color mapping is provided via the hue_palette parameter, where the +income categories "<=50K" and ">50K" are assigned the colors "brown" and +"green", respectively. This change visually distinguishes the data points based on +income levels.

  2. +
  3. Scatter Color: The scatter_color parameter is set to "#808080", which applies +a grey color to the scatter points when no hue is provided. However, since a hue +is specified in this example, the hue_palette takes precedence and overrides this color setting.

  4. +
  5. Best Fit Line: The add_best_fit_line parameter is set to False, meaning that +no best fit line is added to the scatter plots. This differs from the previous example where +a best fit line was included.

  6. +
  7. Correlation Coefficient: The show_correlation parameter is set to False, so the +Pearson correlation coefficient will not be displayed in the plot titles. This is another +change from the previous example where the correlation coefficient was included.

  8. +
  9. Hue Legend: The show_legend parameter remains set to True, ensuring that the +legend displaying the hue categories ("<=50K" and ">50K") appears on the plots, +helping to interpret the color coding of the data points.

  10. +
+

These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths.

+
from eda_toolkit import scatter_fit_plot
+
+hue_dict = {"<=50K": "brown", ">50K": "green"}
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="grid",
+    show_legend=True,
+    xlabel_rot=0,
+    show_plot="grid",
+    rotate_plot=False,
+    grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=False,
+    scatter_color="#808080",
+    hue="income",
+    hue_palette=hue_dict,
+    show_correlation=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+
+

Correlation Matrices

+

Generate and Save Customizable Correlation Heatmaps

+

The flex_corr_matrix function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats.

+

Customizable Plot Appearance

+

The function provides extensive customization options for the heatmap’s appearance:

+
    +
  • Colormap Selection: Choose from a variety of colormaps to represent the strength of correlations. The default is "coolwarm", but this can be adjusted to fit the needs of the analysis.

  • +
  • Annotation: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance.

  • +
  • Figure Size and Layout: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards.

  • +
+

Triangular vs. Full Correlation Matrix

+

A key feature of the flex_corr_matrix function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations.

+

Label and Axis Configuration

+

The function offers flexibility in configuring axis labels and titles:

+
    +
  • Label Rotation: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names.

  • +
  • Font Sizes: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable.

  • +
  • Title Wrapping: Control the wrapping of long titles to fit within the plot without overlapping other elements.

  • +
+

Plot Display and Saving Options

+

The flex_corr_matrix function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images.

+
+
+flex_corr_matrix(df, cols=None, annot=True, cmap='coolwarm', save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title='Cervical Cancer Data: Correlation Matrix', label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment='right', ylabel_alignment='center_baseline', text_wrap=50, vmin=-1, vmax=1, cbar_label='Correlation Index', triangular=True, **kwargs)
+

Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

  • +
  • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

  • +
  • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

  • +
  • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

  • +
  • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

  • +
  • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

  • +
  • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

  • +
  • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

  • +
  • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

  • +
  • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

  • +
  • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

  • +
  • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

  • +
  • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

  • +
  • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

  • +
+
+
Raises:
+

ValueError

    +
  • If annot is not a boolean.

  • +
  • If cols is not a list.

  • +
  • If save_plots is not a boolean.

  • +
  • If triangular is not a boolean.

  • +
  • If save_plots is True but no image paths are provided.

  • +
+

+
+
Returns:
+

None +This function does not return any value but generates and optionally saves a correlation heatmap.

+
+
+
+ +
+

Triangular Correlation Matrix Example

+

The provided code filters the census [1] DataFrame df to include only numeric columns using +select_dtypes(np.number). It then utilizes the flex_corr_matrix() function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options.

+
+

Note

+

This triangular matrix format is particularly useful for avoiding +redundancy in correlation matrices, as it excludes the lower half, +making it easier to focus on unique pairwise correlations.

+
+

The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations.

+
# Select only numeric data to pass into the function
+df_num = df.select_dtypes(np.number)
+
+
+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="coolwarm",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=True,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Full Correlation Matrix Example

+

In this modified census [1] example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting cmap="viridis", the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting triangular=False, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset.

+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="viridis",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/.buildinfo b/_build/html/v0.0.8/.buildinfo new file mode 100644 index 000000000..74e366f34 --- /dev/null +++ b/_build/html/v0.0.8/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 0cc49252ae4a13912e09d6bd38b18b52 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/v0.0.8/.doctrees/acknowledgements.doctree b/_build/html/v0.0.8/.doctrees/acknowledgements.doctree new file mode 100644 index 000000000..da086b700 Binary files /dev/null and b/_build/html/v0.0.8/.doctrees/acknowledgements.doctree differ diff --git a/_build/html/v0.0.8/.doctrees/changelog.doctree b/_build/html/v0.0.8/.doctrees/changelog.doctree new file mode 100644 index 000000000..c39c63fa3 Binary files /dev/null and b/_build/html/v0.0.8/.doctrees/changelog.doctree differ diff --git a/_build/html/v0.0.8/.doctrees/citations.doctree b/_build/html/v0.0.8/.doctrees/citations.doctree new file mode 100644 index 000000000..eaca8ade2 Binary files /dev/null and b/_build/html/v0.0.8/.doctrees/citations.doctree differ diff --git a/_build/html/v0.0.8/.doctrees/contributors.doctree b/_build/html/v0.0.8/.doctrees/contributors.doctree new file mode 100644 index 000000000..246645d32 Binary files /dev/null and b/_build/html/v0.0.8/.doctrees/contributors.doctree differ diff --git a/_build/html/v0.0.8/.doctrees/environment.pickle b/_build/html/v0.0.8/.doctrees/environment.pickle new file mode 100644 index 000000000..9b3be3d92 Binary files /dev/null and b/_build/html/v0.0.8/.doctrees/environment.pickle differ diff --git a/_build/html/v0.0.8/.doctrees/getting_started.doctree b/_build/html/v0.0.8/.doctrees/getting_started.doctree new file mode 100644 index 000000000..6f34bdec3 Binary files /dev/null and b/_build/html/v0.0.8/.doctrees/getting_started.doctree differ diff --git a/_build/html/v0.0.8/.doctrees/index.doctree b/_build/html/v0.0.8/.doctrees/index.doctree new file mode 100644 index 000000000..fd4d378cb Binary files /dev/null and b/_build/html/v0.0.8/.doctrees/index.doctree differ diff --git a/_build/html/v0.0.8/.doctrees/references.doctree b/_build/html/v0.0.8/.doctrees/references.doctree new file mode 100644 index 000000000..5f3c625c7 Binary files /dev/null and b/_build/html/v0.0.8/.doctrees/references.doctree differ diff --git a/_build/html/v0.0.8/.doctrees/usage_guide.doctree b/_build/html/v0.0.8/.doctrees/usage_guide.doctree new file mode 100644 index 000000000..0c96d7195 Binary files /dev/null and b/_build/html/v0.0.8/.doctrees/usage_guide.doctree differ diff --git a/_build/html/v0.0.8/_images/2d_pdp_grid.svg b/_build/html/v0.0.8/_images/2d_pdp_grid.svg new file mode 100644 index 000000000..641db4ba6 --- /dev/null +++ b/_build/html/v0.0.8/_images/2d_pdp_grid.svg @@ -0,0 +1,4405 @@ + + + + + + + + 2024-09-08T21:59:22.990207 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/3d_pdp.svg b/_build/html/v0.0.8/_images/3d_pdp.svg new file mode 100644 index 000000000..535371233 --- /dev/null +++ b/_build/html/v0.0.8/_images/3d_pdp.svg @@ -0,0 +1,8326 @@ + + + + + + + + 2024-09-12T22:36:25.786914 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/Bar_Age_regular_income.svg b/_build/html/v0.0.8/_images/Bar_Age_regular_income.svg new file mode 100644 index 000000000..6f8aa40d4 --- /dev/null +++ b/_build/html/v0.0.8/_images/Bar_Age_regular_income.svg @@ -0,0 +1,1201 @@ + + + + + + + + 2024-08-04T12:01:07.319833 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/Stacked_Bar_Age_income.svg b/_build/html/v0.0.8/_images/Stacked_Bar_Age_income.svg new file mode 100644 index 000000000..d5510308b --- /dev/null +++ b/_build/html/v0.0.8/_images/Stacked_Bar_Age_income.svg @@ -0,0 +1,1943 @@ + + + + + + + + 2024-08-04T11:47:19.816889 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/Stacked_Bar_Age_income_pivoted.svg b/_build/html/v0.0.8/_images/Stacked_Bar_Age_income_pivoted.svg new file mode 100644 index 000000000..2147fce1a --- /dev/null +++ b/_build/html/v0.0.8/_images/Stacked_Bar_Age_income_pivoted.svg @@ -0,0 +1,2043 @@ + + + + + + + + 2024-08-04T11:56:38.571027 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/Stacked_Bar_Age_income_regular.svg b/_build/html/v0.0.8/_images/Stacked_Bar_Age_income_regular.svg new file mode 100644 index 000000000..04478581f --- /dev/null +++ b/_build/html/v0.0.8/_images/Stacked_Bar_Age_income_regular.svg @@ -0,0 +1,1347 @@ + + + + + + + + 2024-08-04T11:54:36.826244 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/Stacked_Bar_Age_sex.svg b/_build/html/v0.0.8/_images/Stacked_Bar_Age_sex.svg new file mode 100644 index 000000000..7b2bcb137 --- /dev/null +++ b/_build/html/v0.0.8/_images/Stacked_Bar_Age_sex.svg @@ -0,0 +1,1970 @@ + + + + + + + + 2024-08-04T11:55:12.796551 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/all_plots_comparisons_boxplot.png b/_build/html/v0.0.8/_images/all_plots_comparisons_boxplot.png new file mode 100644 index 000000000..c4f54b520 Binary files /dev/null and b/_build/html/v0.0.8/_images/all_plots_comparisons_boxplot.png differ diff --git a/_build/html/v0.0.8/_images/all_plots_comparisons_violinplot.png b/_build/html/v0.0.8/_images/all_plots_comparisons_violinplot.png new file mode 100644 index 000000000..cc236e21c Binary files /dev/null and b/_build/html/v0.0.8/_images/all_plots_comparisons_violinplot.png differ diff --git a/_build/html/v0.0.8/_images/all_plots_comparisons_violinplot_pivoted.png b/_build/html/v0.0.8/_images/all_plots_comparisons_violinplot_pivoted.png new file mode 100644 index 000000000..b05150e06 Binary files /dev/null and b/_build/html/v0.0.8/_images/all_plots_comparisons_violinplot_pivoted.png differ diff --git a/_build/html/v0.0.8/_images/count_hist_distributions.svg b/_build/html/v0.0.8/_images/count_hist_distributions.svg new file mode 100644 index 000000000..521cd5a95 --- /dev/null +++ b/_build/html/v0.0.8/_images/count_hist_distributions.svg @@ -0,0 +1,1719 @@ + + + + + + + + 2024-07-31T18:14:40.266523 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/eda_toolkit_logo.svg b/_build/html/v0.0.8/_images/eda_toolkit_logo.svg new file mode 100644 index 000000000..d039d6f79 --- /dev/null +++ b/_build/html/v0.0.8/_images/eda_toolkit_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_build/html/v0.0.8/_images/hist_density_distributions.svg b/_build/html/v0.0.8/_images/hist_density_distributions.svg new file mode 100644 index 000000000..8bf1787a6 --- /dev/null +++ b/_build/html/v0.0.8/_images/hist_density_distributions.svg @@ -0,0 +1,1744 @@ + + + + + + + + 2024-07-31T18:12:26.650100 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/kde_density_distributions.svg b/_build/html/v0.0.8/_images/kde_density_distributions.svg new file mode 100644 index 000000000..7564724e1 --- /dev/null +++ b/_build/html/v0.0.8/_images/kde_density_distributions.svg @@ -0,0 +1,2571 @@ + + + + + + + + 2024-07-31T18:08:35.979182 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/normal_distribution.png b/_build/html/v0.0.8/_images/normal_distribution.png new file mode 100644 index 000000000..837c60e0c Binary files /dev/null and b/_build/html/v0.0.8/_images/normal_distribution.png differ diff --git a/_build/html/v0.0.8/_images/scatter_plots_grid.png b/_build/html/v0.0.8/_images/scatter_plots_grid.png new file mode 100644 index 000000000..5a51facd8 Binary files /dev/null and b/_build/html/v0.0.8/_images/scatter_plots_grid.png differ diff --git a/_build/html/v0.0.8/_images/scatter_plots_grid_grouped.png b/_build/html/v0.0.8/_images/scatter_plots_grid_grouped.png new file mode 100644 index 000000000..02a3b3916 Binary files /dev/null and b/_build/html/v0.0.8/_images/scatter_plots_grid_grouped.png differ diff --git a/_build/html/v0.0.8/_images/summarize_combos.gif b/_build/html/v0.0.8/_images/summarize_combos.gif new file mode 100644 index 000000000..402ee1efc Binary files /dev/null and b/_build/html/v0.0.8/_images/summarize_combos.gif differ diff --git a/_build/html/v0.0.8/_images/us_census_correlation_matrix.svg b/_build/html/v0.0.8/_images/us_census_correlation_matrix.svg new file mode 100644 index 000000000..2a41e1afa --- /dev/null +++ b/_build/html/v0.0.8/_images/us_census_correlation_matrix.svg @@ -0,0 +1,1766 @@ + + + + + + + + 2024-08-09T18:12:33.390718 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_images/us_census_correlation_matrix_full.svg b/_build/html/v0.0.8/_images/us_census_correlation_matrix_full.svg new file mode 100644 index 000000000..d0df5da46 --- /dev/null +++ b/_build/html/v0.0.8/_images/us_census_correlation_matrix_full.svg @@ -0,0 +1,1907 @@ + + + + + + + + 2024-08-09T18:30:04.884359 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_sources/acknowledgements.rst.txt b/_build/html/v0.0.8/_sources/acknowledgements.rst.txt new file mode 100644 index 000000000..e62da5a10 --- /dev/null +++ b/_build/html/v0.0.8/_sources/acknowledgements.rst.txt @@ -0,0 +1,30 @@ +.. _acknowledgements: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Acknowledgements +================= + +We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists. + +We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors. diff --git a/_build/html/v0.0.8/_sources/changelog.rst.txt b/_build/html/v0.0.8/_sources/changelog.rst.txt new file mode 100644 index 000000000..7fb600f84 --- /dev/null +++ b/_build/html/v0.0.8/_sources/changelog.rst.txt @@ -0,0 +1,558 @@ +.. _changelog: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Changelog +========= + +Version 0.0.8 +-------------------- + +:class:`stacked_crosstab_plot` + +- **Flexible `save_formats` Input**: + - `save_formats` now accepts a string, tuple, or list for specifying formats (e.g., `"png"`, `("png", "svg")`, or `["png", "svg"]`). + - Single strings or tuples are automatically converted to lists for consistent processing. + +- **Dynamic Error Handling**: + - Added checks to ensure a valid path is provided for each format in `save_formats`. + - Raises a `ValueError` if a format is specified without a corresponding path, with a clear, dynamic error message. + +- **Improved Plot Saving Logic**: + - Updated logic allows saving plots in one format (e.g., only `"png"` or `"svg"`) without requiring the other. + - Simplified and more intuitive path handling for saving plots. + + +:class:`plot_3d_pdp` + +This update introduces several key changes to the `plot_3d_pdp` function, simplifying the function's interface and improving usability, while maintaining the flexibility needed for diverse visualization needs. + +**1. Parameter Changes** + + +- **Removed Parameters:** + + - The parameters ``x_label_plotly``, ``y_label_plotly``, and ``z_label_plotly`` have been removed. These parameters previously allowed custom axis labels specifically for the Plotly plot, defaulting to the general ``x_label``, ``y_label``, and ``z_label``. Removing these parameters simplifies the function signature while maintaining flexibility. + +- **Default Values for Labels:** + + - The parameters ``x_label``, ``y_label``, and ``z_label`` are now optional, with ``None`` as the default. If not provided, these labels will automatically default to the names of the features in the ``feature_names_list``. This change makes the function more user-friendly, particularly for cases where default labels are sufficient. + +- **Changes in Default Values for View Angles:** + + - The default values for camera positioning parameters have been updated: ``horizontal`` is now ``-1.25``, ``depth`` is now ``1.25``, and ``vertical`` is now ``1.25``. These adjustments refine the default 3D view perspective for the Plotly plot, providing a more intuitive starting view. + +**2. Plot Generation Logic** + +- **Conditionally Checking Labels:** + + - The function now checks whether ``x_label``, ``y_label``, and ``z_label`` are provided. If these are ``None``, the function will automatically assign default labels based on the ``feature_names_list``. This enhancement reduces the need for users to manually specify labels, making the function more adaptive. + +- **Camera Position Adjustments:** + + - The camera positions for the Plotly plot are now adjusted by multiplying ``horizontal``, ``depth``, and ``vertical`` by ``zoom_out_factor``. This change allows for more granular control over the 3D view, enhancing the interactivity and flexibility of the Plotly visualizations. + +- **Surface Plot Coordinates Adjustments:** + + - The order of the coordinates for the Plotly plot’s surface has been changed from ``ZZ, XX, YY[::-1]`` to ``ZZ, XX, YY``. This adjustment ensures the proper alignment of axes and grids, resulting in more accurate visual representations. + +**3. Code Simplifications** + +- **Removed Complexity:** + + - By removing the ``x_label_plotly``, ``y_label_plotly``, and ``z_label_plotly`` parameters, the code is now simpler and easier to maintain. This change reduces potential confusion and streamlines the function for users who do not need distinct labels for Matplotlib and Plotly plots. + +- **Fallback Mechanism for Grid Values:** + + - The function continues to implement a fallback mechanism when extracting grid values, ensuring compatibility with various versions of scikit-learn. This makes the function robust across different environments. + +**4. Style Adjustments** + +- **Label Formatting:** + + - The new version consistently uses ``y_label``, ``x_label``, and ``z_label`` for axis labels in the Matplotlib plot, aligning the formatting across different plot types. + +- **Color Bar Adjustments:** + + - The color bar configuration in the Matplotlib plot has been slightly adjusted with a shrink value of ``0.6`` and a pad value of ``0.02``. These adjustments result in a more refined visual appearance, particularly in cases where space is limited. + +**5. Potential Use Case Differences** + +- **Simplified Interface:** + + - The updated function is more streamlined for users who prefer a simplified interface without the need for separate label customizations for Plotly and Matplotlib plots. This makes it easier to use in common scenarios. + +- **Less Granular Control:** + + - Users who need more granular control, particularly for presentations or specific formatting, may find the older version more suitable. The removal of the ``*_plotly`` label parameters means that all plots now use the same labels across Matplotlib and Plotly. + +**6. Matplotlib Plot Adjustments** + +- **Wireframe and Surface Plot Enhancements:** + + - The logic for plotting wireframes and surface plots in Matplotlib remains consistent with previous versions, with subtle enhancements to color and layout management to improve overall aesthetics. + +**Summary** + +- Version ``0.0.8d`` of the `plot_3d_pdp` function introduces simplifications that reduce the number of parameters and streamline the plotting process. While some customizability has been removed, the function remains flexible enough for most use cases and is easier to use. +- Key updates include adjusted default camera views for 3D plots, removal of Plotly-specific label parameters, and improved automatic labeling and plotting logic. + +**Decision Point** + +- This update may be especially useful for users who prefer a cleaner and more straightforward interface. However, those requiring detailed customizations may want to continue using the older version, depending on their specific needs. + + +Version 0.0.8c +------------------------ + +Version 0.0.8c is a follow-up release to version 0.0.8b. This update includes minor enhancements and refinements based on feedback and additional testing. It serves as an incremental step towards improving the stability and functionality of the toolkit. + +**Key Updates in 0.0.8c:** + +- **Bug Fixes:** Addressed minor issues identified in version ``0.0.8b`` to ensure smoother performance and better user experience. +- **Additional Testing:** Incorporated further tests to validate the changes introduced in previous versions and to prepare for future stable releases. +- **Refinements:** Made small enhancements to existing features based on user feedback and internal testing results. + +**Summary of Changes** + +1. New Features & Enhancements + +- ``plot_3d_pdp`` Function: + + - Added ``show_modebar`` Parameter: Introduced a new boolean parameter, ``show_modebar``, to allow users to toggle the visibility of the mode bar in Plotly interactive plots. + + - Custom Margins and Layout Adjustments: + + - Added parameters for ``left_margin``, ``right_margin``, and ``top_margin`` to provide users with more control over the plot layout in Plotly. + + - Adjusted default values and added options for better customization of the Plotly color bar (``cbar_x``, ``cbar_thickness``) and title positioning (``title_x``, ``title_y``). + + - Plotly Configuration: + + - Enhanced the configuration options to allow users to enable or disable zoom functionality (``enable_zoom``) in the interactive Plotly plots. + + - Updated the code to reflect these new parameters, allowing for greater flexibility in the appearance and interaction with the Plotly plots. + + - Error Handling: + + - Added input validation for ``html_file_path`` and ``html_file_name`` to ensure these are provided when necessary based on the selected ``plot_type``. + +- ``plot_2d_pdp`` Function: + + - Introduced ``file_prefix`` Parameter: + + - Added a new ``file_prefix`` parameter to allow users to specify a prefix for filenames when saving grid plots. This change streamlines the naming process for saved plots and improves file organization. + + - Enhanced Plot Type Flexibility: + + - The ``plot_type`` parameter now includes an option to generate both grid and individual plots (``both``). This feature allows users to create a combination of both layout styles in one function call. + + - Updated input validation and logic to handle this new option effectively. + + - Added ``save_plots`` Parameter: + + - Introduced a new parameter, ``save_plots``, to control the saving of plots. Users can specify whether to save all plots, only individual plots, only grid plots, or none. + + - Custom Margins and Layout Adjustments: + + - Included the ``save_plots`` parameter in the validation process to ensure paths are provided when needed for saving the plots. + +2. Documentation Updates + +- Docstrings: + + - Updated docstrings for both functions to reflect the new parameters and enhancements, providing clearer and more comprehensive guidance for users. + + - Detailed the use of new parameters such as ``show_modebar``, ``file_prefix``, ``save_plots``, and others, ensuring that the function documentation is up-to-date with the latest changes. + +3. Refactoring & Code Cleanup + +- Code Structure: + + - Improved the code structure to maintain clarity and readability, particularly around the new functionality. + + - Consolidated the layout configuration settings for the Plotly plots into a more flexible and user-friendly format, making it easier for users to customize their plots. + + +Version 0.0.8b +-------------------------------- + +Version 0.0.8b is an exact replica of version ``0.0.8a``. The purpose of this +beta release was to test whether releasing it as the latest version would update +its status on PyPI to reflect it as the latest release. However, it continues to +be identified as a pre-release on PyPI. + + +Version 0.0.8a +-------------------------------- + +Version 0.0.8a introduces significant enhancements and new features to improve +the usability and functionality of the EDA Toolkit. + +**New Features:** + +1. Optional ``file_prefix`` in ``stacked_crosstab_plot`` Function + + - The ``stacked_crosstab_plot`` function has been updated to make the ``file_prefix`` argument optional. If the user does not provide a ``file_prefix``, the function will now automatically generate a default prefix based on the ``col`` and ``func_col`` parameters. This change streamlines the process of generating plots by reducing the number of required arguments. + + - **Key Improvement:** + + - Users can now omit the ``file_prefix`` argument, and the function will still produce appropriately named plot files, enhancing ease of use. + + - Backward compatibility is maintained, allowing users who prefer to specify a custom ``file_prefix`` to continue doing so without any issues. + +2. **Introduction of 3D and 2D Partial Dependence Plot Functions** + + - Two new functions, ``plot_3d_pdp`` and ``plot_2d_pdp``, have been added to the toolkit, expanding the visualization capabilities for machine learning models. + + - ``plot_3d_pdp``: Generates 3D partial dependence plots for two features, supporting both static visualizations (using Matplotlib) and interactive plots (using Plotly). The function offers extensive customization options, including labels, color maps, and saving formats. + + - ``plot_2d_pdp``: Creates 2D partial dependence plots for specified features with flexible layout options (grid or individual plots) and customization of figure size, font size, and saving formats. + + - **Key Features:** + + - **Compatibility:** Both functions are compatible with various versions of scikit-learn, ensuring broad usability. + + - **Customization:** Extensive options for customizing visual elements, including figure size, font size, and color maps. + + - **Interactive 3D Plots:** The ``plot_3d_pdp`` function supports interactive visualizations, providing an enhanced user experience for exploring model predictions in 3D space. + +**Impact:** + +- These updates improve the user experience by reducing the complexity of function calls and introducing powerful new tools for model interpretation. +- The optional ``file_prefix`` enhancement simplifies plot generation while maintaining the flexibility to define custom filenames. +- The new partial dependence plot functions offer robust visualization options, making it easier to analyze and interpret the influence of specific features in machine learning models. + + + +Version 0.0.7 +--------------------------- + +**Added Function for Customizable Correlation Matrix Visualization** + +This release introduces a new function, ``flex_corr_matrix``, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to ``seaborn.heatmap()``. + +**Summary of Changes** + +- **New Function**: ``flex_corr_matrix``. + + - **Functionality**: + - Generates a correlation heatmap for a given DataFrame. + - Supports both full and upper triangular correlation matrices based on the ``triangular`` parameter. + - Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. + - Accepts additional keyword arguments via ``**kwargs`` to pass directly to ``seaborn.heatmap()``. + - Includes validation to ensure the ``triangular``, ``annot``, and ``save_plots`` parameters are boolean values. + - Raises an exception if ``save_plots=True`` but neither ``image_path_png`` nor ``image_path_svg`` is specified. + +**Usage** + +.. code-block:: python + + # Full correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True) + + # Upper triangular correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True) + + +**Contingency table df to object type** + +Convert all columns in the DataFrame to object type to prevent issues with numerical columns. + +.. code-block:: python + + df = df.astype(str).fillna("") + + +Version 0.0.6 +--------------------------- + +**Added validation for Plot Type Parameter in KDE Distributions Function** + +This release adds a validation step for the ``plot_type`` parameter in the ``kde_distributions`` function. The allowed values for ``plot_type`` are ``"hist"``, ``"kde"``, and ``"both"``. If an invalid value is provided, the function will now raise a ``ValueError`` with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values. + +.. code-block:: python + + # Validate plot_type parameter + valid_plot_types = ["hist", "kde", "both"] + if plot_type.lower() not in valid_plot_types: + raise ValueError( + f"Invalid plot_type value. Expected one of {valid_plot_types}, " + f"got '{plot_type}' instead." + ) + +Version 0.0.5 +--------------------------- + +**Ensure Consistent Font Size and Text Wrapping Across Plot Elements** + +This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the ``stacked_crosstab_plot`` function. The following updates have been implemented to ensure uniformity and improve the readability of plots: + +1. **Title Font Size and Text Wrapping:** + - Added a ``text_wrap`` parameter to control the wrapping of plot titles. + - Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ``ax.set_title()`` after plot generation. + +2. **Legend Font Size Consistency:** + - Incorporated ``label_fontsize`` into the legend font size by directly setting the font size of the legend text using ``plt.setp(legend.get_texts(), fontsize=label_fontsize)``. + - This ensures that the legend labels are consistent with the title and axis labels. + +**Testing** + +- Verified that titles now wrap correctly and match the specified ``label_fontsize``. +- Confirmed that legend text scales according to ``label_fontsize``, ensuring consistent font sizes across all plot elements. + + +Version 0.0.4 +--------------------------- + +- **Stable release** + + - No new updates to the codebase. + + - Updated the project ``description`` variable in ``setup.py`` to re-emphasize key elements of the library. + + - Minor README cleanup: + + - Added icons for sections that did not have them. + + +Version 0.0.3 +--------------------------- + +- **Stable release** + + - Updated logo size, fixed citation title, and made minor README cleanup: + + - Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support. + +Version 0.0.2 +--------------------------- + +- **First stable release** + - No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + - Added logo, badges, and Zenodo-certified citation to README. + +Version 0.0.1rc0 +------------------------------- + +- No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + +Version 0.0.1b0 +----------------------------- + +**New Scatter Fit Plot and Additional Updates** + +- Added new ``scatter_fit_plot()``, removed unused ``data_types()``, and added comment section headers. + +**Added xlim and ylim Inputs to KDE Distribution** + +- ``kde_distribution()``: + + - Added ``xlim`` and ``ylim`` inputs to allow users to customize axes limits in ``kde_distribution()``. + +**Added xlim and ylim Params to Stacked Crosstab Plot** + +- ``stacked_crosstab_plot()``: + + - Added ``xlim`` and ``ylim`` input parameters to ``stacked_crosstab_plot()`` to give users more flexibility in controlling axes limits. + +**Added x and y Limits to Box and Violin Plots** + +- ``box_violin_plot()``: + + - Changed function name from ``metrics_box_violin()`` to ``box_violin_plot()``. + - Added ``xlim`` and ``ylim`` inputs to control x and y-axis limits of ``box_violin_plot()`` (formerly ``metrics_box_violin``). + +**Added Ability to Remove Stacks from Plots, Plot All or One at a Time** + +**Key Changes** + +1. **Plot Type Parameter** + - ``plot_type``: This parameter allows the user to choose between ``"regular"``, ``"normalized"``, or ``"both"`` plot types. + +2. **Remove Stacks Parameter** + - ``remove_stacks``: This parameter, when set to ``True``, generates a regular bar plot using only the ``col`` parameter instead of a stacked bar plot. It only works when ``plot_type`` is set to "regular". If ``remove_stacks`` is set to ``True`` while ``plot_type`` is anything other than "regular", the function will raise an exception. + +**Explanation of Changes** + +- **Plot Type Parameter** + + - Provides flexibility to the user, allowing specification of the type of plot to generate: + + - ``"regular"``: Standard bar plot. + + - ``"normalized"``: Normalized bar plot. + + - ``"both"``: Both regular and normalized bar plots. + +- **Remove Stacks Parameter** + - ``remove_stacks``: Generates a regular bar plot using only the ``col`` parameter, removing the stacking of the bars. Applicable only when ``plot_type`` is set to "regular". An exception is raised if used with any other ``plot_type``. + +These changes enhance the flexibility and functionality of the ``stacked_crosstab_plot`` function, allowing for more customizable and specific plot generation based on user requirements. + +Version 0.0.1b0 +----------------------------- + +**Refined KDE Distributions** + +**Key Changes** + +1. **Alpha Transparency for Histogram Fill** + - Added a ``fill_alpha`` parameter to control the transparency of the histogram bars' fill color. + - Default value is ``0.6``. An exception is raised if ``fill=False`` and ``fill_alpha`` is specified. + +2. **Custom Font Sizes** + - Introduced ``label_fontsize`` and ``tick_fontsize`` parameters to control font size of axis labels and tick marks independently. + +3. **Scientific Notation Toggle** + - Added a ``disable_sci_notation`` parameter to enable or disable scientific notation on axes. + +4. **Improved Error Handling** + - Added validation for the ``stat`` parameter to ensure valid options are accepted. + - Added checks for proper usage of ``fill_alpha`` and ``hist_edgecolor`` when ``fill`` is set to ``False``. + +5. **General Enhancements** + - Updated the function's docstring to reflect new parameters and provide comprehensive guidance on usage. + +Version 0.0.1b0 +----------------------------- + +**Enhanced KDE Distributions Function** + +**Added Parameters** + +1. **Grid Figsize and Single Figsize** + - Control the size of the overall grid figure and individual figures separately. + +2. **Hist Color and KDE Color`** + - Allow customization of histogram and KDE plot colors. + +3. **Edge Color** + - Allows customization of histogram bar edges. + +4. **Hue** + - Allows grouping data by a column. + +5. **Fill** + - Controls whether to fill histogram bars with color. + +6. **Y-axis Label`** + - Customizable y-axis label. + +7. **Log-Scaling** + - Specifies which variables to apply log scale. + +8. **Bins and Bin Width** + - Control the number and width of bins. + +9. **``stat``:** + - Allows different statistics for the histogram (``count``, ``density``, ``frequency``, ``probability``, ``proportion``, ``percent``). + +**Improvements** + +1. **Validation and Error Handling** + - Checks for invalid ``log_scale_vars`` and throws a ``ValueError`` if any are found. + - Throws a ``ValueError`` if ``edgecolor`` is changed while ``fill`` is set to ``False``. + - Issues a ``PerformanceWarning`` if both ``bins`` and ``binwidth`` are specified, warning of potential performance impacts. + +2. **Customizable Y-Axis Label** + - Allows users to specify custom y-axis labels. + +3. **Warning for KDE with Count** + - Issues a warning if KDE is used with ``stat='count'``, as it may produce misleading plots. + +**Updated Function to Ensure Unique IDs and Index Check** + +- Ensured that each generated ID in ``add_ids`` starts with a non-zero digit. +- Added a check to verify that the DataFrame index is unique. +- Printed a warning message if duplicate index entries are found. + +These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique. + +**Check for Unique Indices** +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries. + +**Generate Non-Zero Starting IDs** + +- The ID generation process is updated to ensure that the first digit of each ID is always non-zero. + +**Ensure Unique IDs** + +- A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame. + +**Fix Int Conversion for Numeric Columns, Reset Decimal Places** + +- Fixed integer conversion issue for numeric columns when ``decimal_places=0`` in the ``save_dataframes_to_excel`` function. +- Reset ``decimal_places`` default value to ``0``. + +These changes ensure correct formatting and avoid errors during conversion. + +**Contingency Table Updates** + +1. **Error Handling for Columns** + - Added a check to ensure at least one column is specified. + - Updated the function to accept a single column as a string or multiple columns as a list. + - Raised a ``ValueError`` if no columns are provided or if ``cols`` is not correctly specified. + +2. **Function Parameters** + - Changed parameters from ``col1`` and ``col2`` to a single parameter ``cols`` which can be either a string or a list. + +3. **Error Handling** + - Renamed ``SortBy`` to ``sort_by`` to standardize nomenclature. + - Added a check to ensure ``sort_by`` is either 0 or 1. + - Raised a ``ValueError`` if ``sort_by`` is not 0 or 1. + +5. **Sorting Logic** + - Updated the sorting logic to handle the new ``cols`` parameter structure. + +6. **Handling Categorical Data** + - Modified code to convert categorical columns to strings to avoid issues with ``fillna("")``. + +7. **Handling Missing Values** + - Added ``df = df.fillna('')`` to fill NA values within the function to account for missing data. + +8. **Improved Function Documentation** + - Updated function documentation to reflect new parameters and error handling. + +Version 0.0.1b0 +----------------------------- + +**Contingency Table Updates** + +- ``fillna('')`` added to output so that null values come through, removed ``'All'`` column name from output, sort options ``0`` and ``1``, updated docstring documentation. Tested successfully on ``Python 3.7.3``. + +**Compatibility Enhancement** + +1. Added a version check for ``Python 3.7`` and above. + + - Conditional import of ``datetime`` to handle different Python versions. + +.. code-block:: python + + if sys.version_info >= (3, 7): + from datetime import datetime + else: + import datetime diff --git a/_build/html/v0.0.8/_sources/citations.rst.txt b/_build/html/v0.0.8/_sources/citations.rst.txt new file mode 100644 index 000000000..634dbd3b2 --- /dev/null +++ b/_build/html/v0.0.8/_sources/citations.rst.txt @@ -0,0 +1,42 @@ +.. _citations: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Citing EDA Toolkit +=================== + +Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.8). Zenodo. https://doi.org/10.5281/zenodo.13163208 + +.. code:: bash + + @software{shpaner_2024_13162633, + author = {Shpaner, Leonid and + Gil, Oscar}, + title = {EDA Toolkit}, + month = aug, + year = 2024, + publisher = {Zenodo}, + version = {0.0.8}, + doi = {10.5281/zenodo.13162633}, + url = {https://doi.org/10.5281/zenodo.13162633} + } + diff --git a/_build/html/v0.0.8/_sources/contributors.rst.txt b/_build/html/v0.0.8/_sources/contributors.rst.txt new file mode 100644 index 000000000..4da2fa18b --- /dev/null +++ b/_build/html/v0.0.8/_sources/contributors.rst.txt @@ -0,0 +1,59 @@ +.. _contributors: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Contributors/Maintainers +========================= + +.. raw:: html + +
+ +.. image:: https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + :align: left + :width: 150 + :height: 150 + +.. raw:: html + +
+ +`Leonid Shpaner `_ is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego's M.S. Applied Artificial Intelligence program. + +.. raw:: html + +


+ +.. raw:: html + +
+ +.. image:: https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + :align: left + :width: 150 + :height: 150 + +.. raw:: html + +
+ +`Oscar Gil `_ is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego. diff --git a/_build/html/v0.0.8/_sources/getting_started.rst.txt b/_build/html/v0.0.8/_sources/getting_started.rst.txt new file mode 100644 index 000000000..19d3687d7 --- /dev/null +++ b/_build/html/v0.0.8/_sources/getting_started.rst.txt @@ -0,0 +1,124 @@ +.. _getting_started: + +.. KFRE Python Library Documentation documentation master file, created by + sphinx-quickstart on Thu May 2 15:44:56 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Welcome to the EDA Toolkit Python Library Documentation! +======================================================== +.. note:: + This documentation is for ``eda_toolkit`` version ``0.0.8``. + + +The ``eda_toolkit`` is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data. + +Project Links +--------------- + +1. `PyPI Page `_ + +2. `GitHub Repository `_ + + +What is EDA? +------------- + +Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data. + + +Purpose of EDA Toolkit +----------------------- +The ``eda_toolkit`` library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including: + +- **Data Management:** Tools for managing directories, generating unique IDs, + standardizing dates, and handling common DataFrame manipulations. +- **Data Cleaning:** Functions to address missing values, remove outliers, and + correct formatting issues, ensuring data is ready for analysis. +- **Data Visualization:** A variety of plotting functions, including KDE + distribution plots, stacked bar plots, scatter plots with optional best fit + lines, and box/violin plots, to visually explore data distributions, + relationships, and trends. +- **Descriptive and Summary Statistics:** Methods to generate comprehensive + reports on data types, summary statistics (mean, median, standard deviation, + etc.), and to summarize all possible combinations of specified variables. +- **Reporting and Export:** Features to save DataFrames to Excel with + customizable formatting, create contingency tables, and export generated + plots in multiple formats. + + + +Key Features +------------- + +- **Ease of Use:** The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions. +- **Customizable:** Users can customize various aspects of the toolkit to fit their specific needs. +- **Integration:** Seamlessly integrates with popular data science libraries such as ``Pandas``, ``NumPy``, ``Matplotlib``, and ``Seaborn``. +- **Documentation and Examples:** Comprehensive documentation and examples to help users get started quickly and effectively. + +.. _prerequisites: + +Prerequisites +------------- +Before you install ``eda_toolkit``, ensure your system meets the following requirements: + +- **Python**: version ``3.7.4`` or higher is required to run ``eda_toolkit``. + +Additionally, ``eda_toolkit`` depends on the following packages, which will be automatically installed when you install ``eda_toolkit``: + +- ``jinja2``: version ``3.1.4`` or higher +- ``matplotlib``: version ``3.5.3`` or higher +- ``nbformat``: version ``4.2.0`` or higher +- ``numpy``: version ``1.21.6`` or higher +- ``pandas``: version ``1.3.5`` or higher +- ``plotly``: version ``5.18.0`` or higher +- ``scikit-learn``: version ``1.0.2`` or higher +- ``seaborn``: version ``0.12.2`` or higher +- ``xlsxwriter``: version ``3.2.0`` or higher + +.. _installation: + +Installation +------------- + +You can install ``eda_toolkit`` directly from PyPI: + +.. code-block:: bash + + pip install eda_toolkit + + diff --git a/_build/html/v0.0.8/_sources/index.rst.txt b/_build/html/v0.0.8/_sources/index.rst.txt new file mode 100644 index 000000000..77d24a0f7 --- /dev/null +++ b/_build/html/v0.0.8/_sources/index.rst.txt @@ -0,0 +1,51 @@ +.. EDA Toolkit documentation master file, created by + sphinx-quickstart on Mon Jul 29 08:15:33 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Table of Contents +=================== + +.. toctree:: + :maxdepth: 4 + :caption: Getting Started + + getting_started + + +.. toctree:: + :maxdepth: 4 + :caption: Usage Guide + + usage_guide + +.. toctree:: + :maxdepth: 4 + :caption: About EDA Toolkit + + acknowledgements + contributors + citations + changelog + references + + \ No newline at end of file diff --git a/_build/html/v0.0.8/_sources/references.rst.txt b/_build/html/v0.0.8/_sources/references.rst.txt new file mode 100644 index 000000000..335337c3a --- /dev/null +++ b/_build/html/v0.0.8/_sources/references.rst.txt @@ -0,0 +1,33 @@ +.. _references: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +References +=========== + +1. Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +2. Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +3. Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +4. Pace, R. K., & Barry, R. (1997). *Sparse Spatial Autoregressions*. *Statistics & Probability Letters*, 33(3), 291-297. `https://doi.org/10.1016/S0167-7152(96)00140-X `_. diff --git a/_build/html/v0.0.8/_sources/usage_guide.rst.txt b/_build/html/v0.0.8/_sources/usage_guide.rst.txt new file mode 100644 index 000000000..ee66b96ac --- /dev/null +++ b/_build/html/v0.0.8/_sources/usage_guide.rst.txt @@ -0,0 +1,3789 @@ +.. _usage_guide: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Description +=========== + +This guide provides detailed instructions and examples for using the functions +provided in the ``eda_toolkit`` library and how to use them effectively in your projects. + +For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [#]_. This dataset provides a rich source of +information for demonstrating the functionalities of the ``eda_toolkit``. + + +Data Preparation and Management +=============================== + +Path directories +---------------- + +**Ensure that the directory exists. If not, create it.** + +.. function:: ensure_directory(path) + + :param path: The path to the directory that needs to be ensured. + :type path: str + + :returns: None + + +The ``ensure_directory`` function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``ensure_directory`` function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them. + +First, we define the base path as the parent directory of the current directory. +The ``os.pardir`` constant, equivalent to ``"..""``, is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory. + + +Next, we set paths for the PNG and SVG image directories, located within an +``images`` folder in the parent directory. Using the ``ensure_directory`` +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them. + +.. code-block:: python + + from eda_toolkit import ensure_directory + + import os # import operating system for dir + + + base_path = os.path.join(os.pardir) + + # Go up one level from 'notebooks' to parent directory, + # then into the 'data' folder + data_path = os.path.join(os.pardir, "data") + data_output = os.path.join(os.pardir, "data_output") + + # create image paths + image_path_png = os.path.join(base_path, "images", "png_images") + image_path_svg = os.path.join(base_path, "images", "svg_images") + + # Use the function to ensure'data' directory exists + ensure_directory(data_path) + ensure_directory(data_output) + ensure_directory(image_path_png) + ensure_directory(image_path_svg) + +**Output** + +.. code-block:: python + + Created directory: ../data + Created directory: ../data_output + Created directory: ../images/png_images + Created directory: ../images/svg_images + + +Adding Unique Identifiers +-------------------------- + +**Add a column of unique IDs with a specified number of digits to the dataframe.** + +.. function:: add_ids(df, id_colname="ID", num_digits=9, seed=None, set_as_index=True) + + :param df: The dataframe to add IDs to. + :type df: pd.DataFrame + :param id_colname: The name of the new column for the IDs. + :type id_colname: str + :param num_digits: The number of digits for the unique IDs. + :type num_digits: int + :param seed: The seed for the random number generator. Defaults to ``None``. + :type seed: int, optional + :param set_as_index: Whether to set the new ID column as the index. Defaults to ``False``. + :type set_as_index: bool, optional + + :returns: The updated dataframe with the new ID column. + :rtype: pd.DataFrame + +The ``add_ids`` function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe. + +**Example Usage** + +In the example below, we demonstrate how to use the ``add_ids`` function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the ``add_ids`` function to generate +and append a column of unique IDs with a specified number of digits to the dataframe. + +First, we import the pandas library and the ``add_ids`` function from the ``eda_toolkit``. +Then, we create a sample dataframe with some data. We call the ``add_ids`` function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe. + +.. code-block:: python + + from eda_toolkit import add_ids + + # Add a column of unique IDs with 9 digits and call it "census_id" + df = add_ids( + df=df, + id_colname="census_id", + num_digits=9, + seed=111, + set_as_index=True, + ) + +**Output** + +`First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: bash + + DataFrame index is unique. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+
+ + +\ + + +Trailing Period Removal +----------------------- + +**Strip the trailing period from floats in a specified column of a DataFrame, if present.** + +.. function:: strip_trailing_period(df, column_name) + + :param df: The DataFrame containing the column to be processed. + :type df: pd.DataFrame + :param column_name: The name of the column containing floats with potential trailing periods. + :type column_name: str + + :returns: The updated DataFrame with the trailing periods removed from the specified column. + :rtype: pd.DataFrame + + The ``strip_trailing_period`` function is designed to remove trailing periods + from float values in a specified column of a DataFrame. This can be particularly + useful when dealing with data that has been inconsistently formatted, ensuring + that all float values are correctly represented. + +**Example Usage** + +In the example below, we demonstrate how to use the ``strip_trailing_period`` function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the ``strip_trailing_period`` function to remove any trailing periods from the specified column. + +.. code-block:: python + + from eda_toolkit import strip_trailing_period + + # Create a sample dataframe with trailing periods in some values + data = { + "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.], + } + df = pd.DataFrame(data) + + # Remove trailing periods from the 'values' column + df = strip_trailing_period(df=df, column_name="values") + + +**Output** + +`First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)` + +.. raw:: html + + + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +
+ + +\ + +`Note:` The last row shows 6 as an `int` with a trailing period with its conversion to `float`. + + +\ + +Standardized Dates +------------------- + +**Parse and standardize date strings based on the provided rule.** + +.. function:: parse_date_with_rule(date_str) + + This function takes a date string and standardizes it to the ``ISO 8601`` format + (``YYYY-MM-DD``). It assumes dates are provided in either `day/month/year` or + `month/day/year` format. The function first checks if the first part of the + date string (day or month) is greater than 12, which unambiguously indicates + a `day/month/year` format. If the first part is 12 or less, the function + attempts to parse the date as `month/day/year`, falling back to `day/month/year` + if the former raises a ``ValueError`` due to an impossible date (e.g., month + being greater than 12). + + :param date_str: A date string to be standardized. + :type date_str: str + + :returns: A standardized date string in the format ``YYYY-MM-DD``. + :rtype: str + + :raises ValueError: If ``date_str`` is in an unrecognized format or if the function + cannot parse the date. + +**Example Usage** + +In the example below, we demonstrate how to use the ``parse_date_with_rule`` +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the ``parse_date_with_rule`` +function to parse and standardize each date string to the ``ISO 8601`` format. + +.. code-block:: python + + from eda_toolkit import parse_date_with_rule + + # Sample date strings + date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"] + + # Standardize the date strings + standardized_dates = [parse_date_with_rule(date) for date in date_strings] + + print(standardized_dates) + +**Output** + +.. code-block:: python + + ['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12'] + + + +.. important:: + + In the next example, we demonstrate how to apply the ``parse_date_with_rule`` + function to a DataFrame column containing date strings using the ``.apply()`` method. + This is particularly useful when you need to standardize date formats across an + entire column in a DataFrame. + +.. code-block:: python + + # Creating the DataFrame + data = { + "date_column": [ + "31/12/2021", + "01/01/2022", + "12/31/2021", + "13/02/2022", + "07/04/2022", + ], + "name": ["Alice", "Bob", "Charlie", "David", "Eve"], + "amount": [100.0, 150.5, 200.75, 250.25, 300.0], + } + + df = pd.DataFrame(data) + + # Apply the function to the DataFrame column + df["standardized_date"] = df["date_column"].apply(parse_date_with_rule) + + print(df) + +**Output** + +.. code-block:: python + + date_column name amount standardized_date + 0 31/12/2021 Alice 100.00 2021-12-31 + 1 01/01/2022 Bob 150.50 2022-01-01 + 2 12/31/2021 Charlie 200.75 2021-12-31 + 3 13/02/2022 David 250.25 2022-02-13 + 4 07/04/2022 Eve 300.00 2022-04-07 + + +DataFrame Analysis +------------------- + +**Analyze DataFrame columns, including dtype, null values, and unique value counts.** + +.. function:: dataframe_columns(df) + + This function analyzes the columns of a DataFrame, providing details about the data type, + the number and percentage of ``null`` values, the total number of unique values, and the most + frequent unique value along with its count and percentage. It handles special cases such as + converting date columns and replacing empty strings with Pandas ``NA`` values. + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + + :returns: A DataFrame with the analysis results for each column. + :rtype: pandas.DataFrame + +**Example Usage** + +In the example below, we demonstrate how to use the ``dataframe_columns`` +function to analyze a DataFrame's columns. + +.. code-block:: python + + from eda_toolkit import dataframe_columns + + dataframe_columns(df=df) + + +**Output** + +`Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: python + + Shape: (48842, 16) + + Total seconds of processing time: 0.861555 + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+
+ + + +\ + +Generating Summary Tables for Variable Combinations +----------------------------------------------------- + +**This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.** + + +.. function:: summarize_all_combinations(df, variables, data_path, data_name, min_length=2) + + :param df: The pandas DataFrame containing the data. + :type df: pandas.DataFrame + :param variables: List of unique variables to generate combinations. + :type variables: list + :param data_path: Path where the output Excel file will be saved. + :type data_path: str + :param data_name: Name of the output Excel file. + :type data_name: str + :param min_length: Minimum length of combinations to generate. Defaults to ``2``. + :type min_length: int + + :returns: A dictionary of summary tables and a list of all generated combinations. + :rtype: tuple(dict, list) + +The function returns two outputs: + +1. ``summary_tables``: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values. + +2. ``all_combinations``: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables. + +**Example Usage** + +Below, we use the ``summarize_all_combinations`` function to generate summary tables for the specified +variables from a DataFrame containing the census data [1]_. + +.. code-block:: python + + from eda_toolkit import summarize_all_combinations + + # Define unique variables for the analysis + unique_vars = [ + "age_group", + "workclass", + "education", + "occupation", + "race", + "sex", + "income", + ] + + # Generate summary tables for all combinations of the specified variables + summary_tables, all_combinations = summarize_all_combinations( + df=df, + data_path=data_output, + variables=unique_vars, + data_name="census_summary_tables.xlsx", + ) + + # Print all combinations of variables + print(all_combinations) + +**Output** + +.. code-blocK:: python + + [('age_group', 'workclass'), + ('age_group', 'education'), + ('age_group', 'occupation'), + ('age_group', 'race'), + ('age_group', 'sex'), + ('age_group', 'income'), + ('workclass', 'education'), + ('workclass', 'occupation'), + ('workclass', 'race'), + ('workclass', 'sex'), + ('workclass', 'income'), + ('education', 'occupation'), + ('education', 'race'), + ('education', 'sex'), + ('education', 'income'), + ('occupation', 'race'), + ('occupation', 'sex'), + ('occupation', 'income'), + ('race', 'sex'), + ('race', 'income'), + ('sex', 'income'), + ('age_group', 'workclass', 'education'), + ('age_group', 'workclass', 'occupation'), + ('age_group', 'workclass', 'race'), + ('age_group', 'workclass', 'sex'), + ('age_group', 'workclass', 'income'), + ('age_group', 'education', 'occupation'), + ('age_group', 'education', 'race'), + ('age_group', 'education', 'sex'), + ('age_group', 'education', 'income'), + ('age_group', 'occupation', 'race'), + ('age_group', 'occupation', 'sex'), + ('age_group', 'occupation', 'income'), + ('age_group', 'race', 'sex'), + ('age_group', 'race', 'income'), + ('age_group', 'sex', 'income'), + ('workclass', 'education', 'occupation'), + ('workclass', 'education', 'race'), + ('workclass', 'education', 'sex'), + ('workclass', 'education', 'income'), + ('workclass', 'occupation', 'race'), + ('workclass', 'occupation', 'sex'), + ('workclass', 'occupation', 'income'), + ('workclass', 'race', 'sex'), + ('workclass', 'race', 'income'), + ('workclass', 'sex', 'income'), + ('education', 'occupation', 'race'), + ('education', 'occupation', 'sex'), + ('education', 'occupation', 'income'), + ('education', 'race', 'sex'), + ('education', 'race', 'income'), + ('education', 'sex', 'income'), + ('occupation', 'race', 'sex'), + ('occupation', 'race', 'income'), + ('occupation', 'sex', 'income'), + ('race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation'), + ('age_group', 'workclass', 'education', 'race'), + ('age_group', 'workclass', 'education', 'sex'), + ('age_group', 'workclass', 'education', 'income'), + ('age_group', 'workclass', 'occupation', 'race'), + ('age_group', 'workclass', 'occupation', 'sex'), + ('age_group', 'workclass', 'occupation', 'income'), + ('age_group', 'workclass', 'race', 'sex'), + ('age_group', 'workclass', 'race', 'income'), + ('age_group', 'workclass', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race'), + ('age_group', 'education', 'occupation', 'sex'), + ('age_group', 'education', 'occupation', 'income'), + ('age_group', 'education', 'race', 'sex'), + ('age_group', 'education', 'race', 'income'), + ('age_group', 'education', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex'), + ('age_group', 'occupation', 'race', 'income'), + ('age_group', 'occupation', 'sex', 'income'), + ('age_group', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race'), + ('workclass', 'education', 'occupation', 'sex'), + ('workclass', 'education', 'occupation', 'income'), + ('workclass', 'education', 'race', 'sex'), + ('workclass', 'education', 'race', 'income'), + ('workclass', 'education', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex'), + ('workclass', 'occupation', 'race', 'income'), + ('workclass', 'occupation', 'sex', 'income'), + ('workclass', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex'), + ('education', 'occupation', 'race', 'income'), + ('education', 'occupation', 'sex', 'income'), + ('education', 'race', 'sex', 'income'), + ('occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race'), + ('age_group', 'workclass', 'education', 'occupation', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'race', 'income'), + ('age_group', 'workclass', 'education', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'education', 'occupation', 'race', 'income'), + ('age_group', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'education', 'race', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex'), + ('workclass', 'education', 'occupation', 'race', 'income'), + ('workclass', 'education', 'occupation', 'sex', 'income'), + ('workclass', 'education', 'race', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex', 'income'), + ('age_group', + 'workclass', + 'education', + 'occupation', + 'race', + 'sex', + 'income')] + + +When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table. + +.. raw:: html + +
+ +.. image:: ../assets/summarize_combos.gif + :alt: EDA Toolkit Logo + :align: left + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Saving DataFrames to Excel with Customized Formatting +------------------------------------------------------- +**Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.** + + +This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the ``save_dataframes_to_excel`` function. + + +.. function:: save_dataframes_to_excel(file_path, df_dict, decimal_places=0) + + :param file_path: Full path to the output Excel file. + :type file_path: str + :param df_dict: Dictionary where keys are sheet names and values are DataFrames to save. + :type df_dict: dict + :param decimal_places: Number of decimal places to round numeric columns. Default is 0. + :type decimal_places: int + + :notes: + - The function will autofit columns and left-align text. + - Numeric columns will be formatted with the specified number of decimal places. + - Headers will be bold and left-aligned without borders. + +The function performs the following tasks: + +- Writes each DataFrame to its respective sheet in the Excel file. +- Rounds numeric columns to the specified number of decimal places. +- Applies customized formatting to headers and cells. +- Autofits columns based on the content length. + +**Example Usage** + +Below, we use the ``save_dataframes_to_excel`` function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between `18` and `40`. + +.. code-block:: python + + from eda_toolkit import save_dataframes_to_excel + + # Example usage + file_name = "df_census.xlsx" # Name of the output Excel file + file_path = os.path.join(data_path, file_name) + + # filter DataFrame to Ages 18-40 + filtered_df = df[(df["age"] > 18) & (df["age"] < 40)] + + df_dict = { + "original_df": df, + "ages_18_to_40": filtered_df, + } + + save_dataframes_to_excel( + file_path=file_path, + df_dict=df_dict, + decimal_places=0, + ) + + +**Output** + +The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between `18` and `40`, each on separate sheets with customized formatting. + + +Creating Contingency Tables +---------------------------- + +**Create a contingency table from one or more columns in a DataFrame, with sorting options.** + +This section explains how to create contingency tables from one or more columns in a DataFrame using the ``contingency_table`` function. + +.. function:: contingency_table(df, cols=None, sort_by=0) + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param cols: Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column. + :type cols: str or list, optional + :param sort_by: Enter ``0`` to sort results by column groups; enter ``1`` to sort results by totals in descending order. + :type sort_by: int + :raises ValueError: If no columns are specified or if sort_by is not ``0`` or ``1``. + :returns: A DataFrame with the specified columns, ``'Total'``, and ``'Percentage'``. + :rtype: pandas.DataFrame + +**Example Usage** + +Below, we use the ``contingency_table`` function to create a contingency table +from the specified columns in a DataFrame containing census data [1]_ + +.. code-block:: python + + from eda_toolkit import contingency_table + + # Example usage + contingency_table( + df=df, + cols=[ + "age_group", + "workclass", + "race", + "sex", + ], + sort_by=1, + ) + +**Output** + +The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the ``'Total'`` column in descending order because ``sort_by`` +is set to ``1``. + + +.. code-block:: python + + + age_group workclass race sex Total Percentage + 0 30-39 Private White Male 5856 11.99 + 1 18-29 Private White Male 5623 11.51 + 2 40-49 Private White Male 4267 8.74 + 3 18-29 Private White Female 3680 7.53 + 4 50-59 Private White Male 2565 5.25 + .. ... ... ... ... ... ... + 467 50-59 Federal-gov Other Male 1 0.00 + 468 50-59 Local-gov Asian-Pac-Islander Female 1 0.00 + 469 70-79 Self-emp-inc Black Male 1 0.00 + 470 80-89 Local-gov Asian-Pac-Islander Male 1 0.00 + 471 48842 100.00 + + [472 rows x 6 columns] + + +\ + +Highlighting Specific Columns in a DataFrame +--------------------------------------------- + +This section explains how to highlight specific columns in a DataFrame using the ``highlight_columns`` function. + +**Highlight specific columns in a DataFrame with a specified background color.** + +.. function:: highlight_columns(df, columns, color="yellow") + + :param df: The DataFrame to be styled. + :type df: pandas.DataFrame + :param columns: List of column names to be highlighted. + :type columns: list of str + :param color: The background color to be applied for highlighting (default is `"yellow"`). + :type color: str, optional + + :returns: A Styler object with the specified columns highlighted. + :rtype: pandas.io.formats.style.Styler + +**Example Usage** + +Below, we use the ``highlight_columns`` function to highlight the ``age`` and ``education`` +columns in the first 5 rows of the census [1]_ DataFrame with a pink background color. + +.. code-block:: python + + from eda_toolkit import highlight_columns + + # Applying the highlight function + highlighted_df = highlight_columns( + df=df, + columns=["age", "education"], + color="#F8C5C8", + ) + + highlighted_df + +**Output** + +The output will be a DataFrame with the specified columns highlighted in the given background color. +The ``age`` and ``education`` columns will be highlighted in pink. + +The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the ``.render()`` method of the Styler object. + + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+ +\ + +Binning Numerical Columns +--------------------------- + +Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or "bins." This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or "bins," and +then assigning each value to one of these intervals. + +.. note:: + + The code snippets below create age bins and assign a corresponding age group + label to each age in the DataFrame. The ``pd.cut`` function from pandas is used to + categorize the ages and assign them to a new column, ``age_group``. Adjust the bins + and labels as needed for your specific data. + + +Below, we use the ``age`` column of the census data [1]_ from the UCI Machine Learning Repository as an example: + +1. **Bins Definition**: + The bins are defined by specifying the boundaries of each interval. For example, + in the code snippet below, the ``bin_ages`` list specifies the boundaries for age groups: + + .. code-block:: python + + bin_ages = [ + 0, + 18, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + float("inf"), + ] + + + Each pair of consecutive elements in ``bin_ages`` defines a bin. For example: + + - The first bin is ``[0, 18)``, + - The second bin is ``[18, 30)``, + - and so on. + +\ + +2. **Labels for Bins**: + The `label_ages` list provides labels corresponding to each bin: + + .. code-block:: python + + label_ages = [ + "< 18", + "18-29", + "30-39", + "40-49", + "50-59", + "60-69", + "70-79", + "80-89", + "90-99", + "100 +", + ] + + These labels are used to categorize the numerical values into meaningful groups. + +3. **Applying the Binning**: + The `pd.cut `_ function + from Pandas is used to apply the binning process. For each value in the ``age`` + column of the DataFrame, it assigns a corresponding label based on which bin the + value falls into. Here, ``right=False`` indicates that each bin includes the + left endpoint but excludes the right endpoint. For example, if ``bin_ages = + [0, 10, 20, 30]``, then a value of ``10`` will fall into the bin ``[10, 20)`` and + be labeled accordingly. + + .. code-block:: python + + df["age_group"] = pd.cut( + df["age"], + bins=bin_ages, + labels=label_ages, + right=False, + ) + + **Mathematically**, for a given value `x` in the ``age`` column: + + .. math:: + + \text{age_group} = + \begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 + \end{cases} + + The parameter `right=False` in `pd.cut` means that the bins are left-inclusive + and right-exclusive, except for the last bin, which is always right-inclusive + when the upper bound is infinity (`float("inf")`). + + +KDE and Histogram Distribution Plots +======================================= + +Gaussian Assumption for Normality +---------------------------------- + +The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF): + +.. math:: + + f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) + +where: + +- :math:`\mu` is the mean +- :math:`\sigma^2` is the variance + +In a normally distributed dataset: + +- 68% of data falls within :math:`\mu \pm \sigma` +- 95% within :math:`\mu \pm 2\sigma` +- 99.7% within :math:`\mu \pm 3\sigma` + +.. raw:: html + +
+ +.. image:: ../assets/normal_distribution.png + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histograms and KDE +^^^^^^^^^^^^^^^^^^^^^^ + +**Histograms**: + +- Visualize data distribution by binning values and counting frequencies. +- If data is Gaussian, the histogram approximates a bell curve. + +**Kernel Density Estimation (KDE)**: + +- A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function. +- The KDE for a dataset :math:`X = \{x_1, x_2, \ldots, x_n\}` is given by: + +.. math:: + + \hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right) + +where: + +- :math:`K` is the kernel function (often Gaussian) +- :math:`h` is the bandwidth (smoothing parameter) + +**Combined Use of Histograms and KDE** + +- **Histograms** offer a discrete, binned view of the data. +- **KDE** provides a smooth, continuous estimate of the underlying distribution. +- Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality. + +KDE Distribution Function +----------------------------- + +**Generate KDE or histogram distribution plots for specified columns in a DataFrame.** + +The ``kde_distributions`` function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2]_ for plotting, which is built on top of +matplotlib [3]_ and provides a high-level interface for drawing attractive and informative +statistical graphics. + + +**Key Features and Parameters** + +- **Flexible Plotting**: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively. +- **Leverages Seaborn Library**: The function is built on the `seaborn` library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code. +- **Customization**: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs. +- **Scientific Notation Control**: The function allows disabling scientific notation on the axes, providing better readability for certain types of data. +- **Log Scaling**: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude. +- **Output Options**: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations. + +.. function:: kde_distributions(df, vars_of_interest=None, grid_figsize=(10, 8), single_figsize=(6, 4), kde=True, hist_color="#0000FF", kde_color="#FF0000", hist_edgecolor="#000000", hue=None, fill=True, fill_alpha=1, n_rows=1, n_cols=1, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_path_png=None, single_var_image_path_svg=None, single_var_image_filename=None, y_axis_label="Density", plot_type="both", log_scale_vars=None, bins="auto", binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat="density", xlim=None, ylim=None) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param vars_of_interest: List of column names for which to generate distribution plots. + :type vars_of_interest: list of str, optional + :param grid_figsize: Size of the overall grid figure, default is ``(10, 8)``. + :type grid_figsize: tuple, optional + :param single_figsize: Size of individual figures for each variable, default is ``(6, 4)``. + :type single_figsize: tuple, optional + :param kde: Whether to include KDE plots on the histograms, default is ``True``. + :type kde: bool, optional + :param hist_color: Color of the histogram bars, default is ``'#0000FF'``. + :type hist_color: str, optional + :param kde_color: Color of the KDE plot, default is ``'#FF0000'``. + :type kde_color: str, optional + :param hist_edgecolor: Color of the histogram bar edges, default is ``'#000000'``. + :type hist_edgecolor: str, optional + :param hue: Column name to group data by, adding different colors for each group. + :type hue: str, optional + :param fill: Whether to fill the histogram bars with color, default is ``True``. + :type fill: bool, optional + :param fill_alpha: Alpha transparency for the fill color of the histogram bars, where + ``0`` is fully transparent and ``1`` is fully opaque. Default is ``1``. + :type fill_alpha: float, optional + :param n_rows: Number of rows in the subplot grid, default is ``1``. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid, default is ``1``. + :type n_cols: int, optional + :param w_pad: Width padding between subplots, default is ``1.0``. + :type w_pad: float, optional + :param h_pad: Height padding between subplots, default is ``1.0``. + :type h_pad: float, optional + :param image_path_png: Directory path to save the PNG image of the overall distribution plots. + :type image_path_png: str, optional + :param image_path_svg: Directory path to save the SVG image of the overall distribution plots. + :type image_path_svg: str, optional + :param image_filename: Filename to use when saving the overall distribution plots. + :type image_filename: str, optional + :param bbox_inches: Bounding box to use when saving the figure. For example, ``'tight'``. + :type bbox_inches: str, optional + :param single_var_image_path_png: Directory path to save the PNG images of the separate distribution plots. + :type single_var_image_path_png: str, optional + :param single_var_image_path_svg: Directory path to save the SVG images of the separate distribution plots. + :type single_var_image_path_svg: str, optional + :param single_var_image_filename: Filename to use when saving the separate distribution plots. + The variable name will be appended to this filename. + :type single_var_image_filename: str, optional + :param y_axis_label: The label to display on the ``y-axis``, default is ``'Density'``. + :type y_axis_label: str, optional + :param plot_type: The type of plot to generate, options are ``'hist'``, ``'kde'``, or ``'both'``. Default is ``'both'``. + :type plot_type: str, optional + :param log_scale_vars: List of variable names to apply log scaling. + :type log_scale_vars: list of str, optional + :param bins: Specification of histogram bins, default is ``'auto'``. + :type bins: int or sequence, optional + :param binwidth: Width of each bin, overrides bins but can be used with binrange. + :type binwidth: number or pair of numbers, optional + :param label_fontsize: Font size for axis labels, including xlabel, ylabel, and tick marks, default is ``10``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: Maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param disable_sci_notation: Toggle to disable scientific notation on axes, default is ``False``. + :type disable_sci_notation: bool, optional + :param stat: Aggregate statistic to compute in each bin (e.g., ``'count'``, ``'frequency'``, + ``'probability'``, ``'percent'``, ``'density'``), default is ``'density'``. + :type stat: str, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``plot_type`` is not one of ``'hist'``, ``'kde'``, or ``'both'``. + - If ``stat`` is not one of ``'count'``, ``'density'``, ``'frequency'``, ``'probability'``, ``'proportion'``, ``'percent'``. + - If ``log_scale_vars`` contains variables that are not present in the DataFrame. + - If ``fill`` is set to ``False`` and ``hist_edgecolor`` is not the default. + + :raises UserWarning: + - If ``stat`` is set to 'count' while ``kde`` is ``True``, as it may produce misleading plots. + - If both ``bins`` and ``binwidth`` are specified, which may affect performance. + + :returns: ``None`` + + +\ + +.. raw:: html + +
+ + + +KDE and Histograms Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the below example, the ``kde_distributions`` function is used to generate +histograms for several variables of interest: ``"age"``, ``"education-num"``, and +``"hours-per-week"``. These variables represent different demographic and +financial attributes from the dataset. The ``kde=True`` parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data's probability density. + +The visualizations are arranged in a single row of four columns, as specified +by ``n_rows=1`` and ``n_cols=3``, respectively. The overall size of the grid +figure is set to `14 inches` wide and `4 inches tall` (``grid_figsize=(14, 4)``), +while each individual plot is configured to be `4 inches` by `4 inches` +(``single_figsize=(4, 4)``). The ``fill=True`` parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +``w_pad=1`` and ``h_pad=1``, which add `1 inch` of padding both horizontally and +vertically. + +To handle longer titles, the ``text_wrap=50`` parameter ensures that the title +text wraps to a new line after `50 characters`. The ``bbox_inches="tight"`` setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in ``vars_of_interest`` are +passed directly to the function for visualization. + +Each plot is saved individually with filenames that are prefixed by +``"kde_density_single_distribution"``, followed by the variable name. The ```y-axis``` +for all plots is labeled as "Density" (``y_axis_label="Density"``), reflecting that +the height of the bars or KDE line represents the data's density. The histograms +are divided into `10 bins` (``bins=10``), offering a clear view of the distribution +of each variable. + +The ``plot_type="hist"`` parameter indicates that only histograms will be generated +for each variable. Additionally, the font sizes for the axis labels and tick labels +are set to `16 points` (``label_fontsize=16``) and `14 points` (``tick_fontsize=14``), +respectively, ensuring that all text within the plots is legible and well-formatted. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=True, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + fill=True, + fill_alpha=0.60, + w_pad=1, + h_pad=1, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + +.. raw:: html + +
+ +.. image:: ../assets/kde_density_distributions.svg + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Density) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the kde_distributions function is used to generate histograms for +the variables ``"age"``, ``"education-num"``, and ``"hours-per-week"`` but with +``kde=False``, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (``n_rows=1, n_cols=3``), +with a grid size of `14x4 inches` (``grid_figsize=(14, 4)``). The histograms are +divided into `10 bins` (``bins=10``), and the ``y-axis`` is labeled "Density" (``y_axis_label="Density"``). +Font sizes for the axis labels and tick labels are set to `16` and `14` points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=False, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + w_pad=1, + h_pad=1, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/hist_density_distributions.svg + :alt: KDE Distributions - Histograms (Density) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Count) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the kde_distributions function is modified to generate histograms +with a few key changes. The ``hist_color`` is set to `"orange"`, changing the color of the +histogram bars. The ```y-axis``` label is updated to "Count" (``y_axis_label="Count"``), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to `"Count"` to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (``n_rows=1, n_cols=4``), +a grid size of `14x4 inches`, and a bin count of `10`. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + kde=False, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + single_figsize=(4, 4), # Size of individual figures + w_pad=1, + h_pad=1, + text_wrap=50, + hist_color="orange", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Count", + bins=10, + plot_type="hist", + stat="Count", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + + +.. raw:: html + +
+ +.. image:: ../assets/count_hist_distributions.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Stacked Crosstab Plots +======================= + +**Generates stacked bar plots and crosstabs for specified columns in a DataFrame.** + +The ``stacked_crosstab_plot`` function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats. + +The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis. + +.. function:: stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind="bar", width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output="both", return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type="both", show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False) + + Generates stacked or regular bar plots and crosstabs for specified columns. + + This function allows users to create stacked bar plots (or regular bar plots + if stacks are removed) and corresponding crosstabs for specific columns + in a DataFrame. It provides options to customize the appearance, including + font sizes for axis labels, tick labels, and title text wrapping, and to + choose between regular or normalized plots. + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param col: The name of the column in the DataFrame to be analyzed. + :type col: str + :param func_col: List of ground truth columns to be analyzed. + :type func_col: list + :param legend_labels_list: List of legend labels for each ground truth column. + :type legend_labels_list: list + :param title: List of titles for the plots. + :type title: list + :param kind: The kind of plot to generate (``'bar'`` or ``'barh'`` for horizontal bars), default is ``'bar'``. + :type kind: str, optional + :param width: The width of the bars in the bar plot, default is ``0.9``. + :type width: float, optional + :param rot: The rotation angle of the ``x-axis`` labels, default is ``0``. + :type rot: int, optional + :param custom_order: Specifies a custom order for the categories in the ``col``. + :type custom_order: list, optional + :param image_path_png: Directory path where generated PNG plot images will be saved. + :type image_path_png: str, optional + :param image_path_svg: Directory path where generated SVG plot images will be saved. + :type image_path_svg: str, optional + :param save_formats: List of file formats to save the plot images in. + :type save_formats: list, optional + :param color: List of colors to use for the plots. If not provided, a default color scheme is used. + :type color: list, optional + :param output: Specify the output type: ``"plots_only"``, ``"crosstabs_only"``, or ``"both"``. Default is ``"both"``. + :type output: str, optional + :param return_dict: Specify whether to return the crosstabs dictionary, default is ``False``. + :type return_dict: bool, optional + :param x: The width of the figure. + :type x: int, optional + :param y: The height of the figure. + :type y: int, optional + :param p: The padding between the subplots. + :type p: int, optional + :param file_prefix: Prefix for the filename when output includes plots. + :type file_prefix: str, optional + :param logscale: Apply log scale to the ``y-axis``, default is ``False``. + :type logscale: bool, optional + :param plot_type: Specify the type of plot to generate: ``"both"``, ``"regular"``, ``"normalized"``. Default is ``"both"``. + :type plot_type: str, optional + :param show_legend: Specify whether to show the legend, default is ``True``. + :type show_legend: bool, optional + :param label_fontsize: Font size for axis labels, default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param remove_stacks: If ``True``, removes stacks and creates a regular bar plot using only the ``col`` parameter. Only works when ``plot_type`` is set to ``'regular'``. Default is ``False``. + :type remove_stacks: bool, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``output`` is not one of ``"both"``, ``"plots_only"``, or ``"crosstabs_only"``. + - If ``plot_type`` is not one of ``"both"``, ``"regular"``, ``"normalized"``. + - If ``remove_stacks`` is set to True and ``plot_type`` is not ``"regular"``. + - If the lengths of ``title``, ``func_col``, and ``legend_labels_list`` are not equal. + :raises KeyError: If any columns specified in ``col`` or ``func_col`` are missing in the DataFrame. + + :returns: Dictionary of crosstabs DataFrames if ``return_dict`` is ``True``. Otherwise, returns ``None``. + :rtype: ``dict`` or ``None`` + + + +Stacked Bar Plots With Crosstabs Example +----------------------------------------- + +The provided code snippet demonstrates how to use the ``stacked_crosstab_plot`` +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here's a detailed breakdown of the code using the census +dataset as an example [1]_. + +First, the ``func_col`` list is defined, specifying the columns ``["sex", "income"]`` +to be analyzed. These columns will be used in the loop to generate separate plots. +The ``legend_labels_list`` is then defined, with each entry corresponding to a +column in ``func_col``. In this case, the labels for the ``sex`` column are +``["Male", "Female"]``, and for the ``income`` column, they are ``["<=50K", ">50K"]``. +These labels will be used to annotate the legends of the plots. + +Next, the ``title`` list is defined, providing titles for each plot corresponding +to the columns in ``func_col``. The titles are set to ``["Sex", "Income"]``, +which will be displayed on top of each respective plot. + +.. note:: + + The ``legend_labels_list`` parameter should be a list of lists, where each + inner list corresponds to the ground truth labels for the respective item in + the ``func_col`` list. Each element in the ``func_col`` list represents a + column in your DataFrame that you wish to analyze, and the corresponding + inner list in ``legend_labels_list`` should contain the labels that will be + used in the legend of your plots. + +For example: + +.. code-block:: python + + # Define the func_col to use in the loop in order of usage + func_col = ["sex", "income"] + + # Define the legend_labels to use in the loop + legend_labels_list = [ + ["Male", "Female"], # Corresponds to "sex" + ["<=50K", ">50K"], # Corresponds to "income" + ] + + # Define titles for the plots + title = [ + "Sex", + "Income", + ] + +.. important:: + + Ensure that the number of elements in ``func_col``, ``legend_labels_list``, + and ``title`` are the same. Each item in ``func_col`` must have a corresponding + list of labels in ``legend_labels_list`` and a title in ``title``. This + consistency is essential for the function to correctly generate the plots + with the appropriate labels and titles. + + +In this example: + +- ``func_col`` contains two elements: ``"sex"`` and ``"income"``. Each corresponds to a specific column in your DataFrame. +- ``legend_labels_list`` is a nested list containing two inner lists: + + - The first inner list, ``["Male", "Female"]``, corresponds to the ``"sex"`` column in ``func_col``. + - The second inner list, ``["<=50K", ">50K"]``, corresponds to the ``"income"`` column in ``func_col``. + +- ``title`` contains two elements: ``"Sex"`` and ``"Income"``, which will be used as the titles for the respective plots. + +.. note:: + + If you assign the function to a variable, the dictionary returned when + ``return_dict=True`` will be suppressed in the output. However, the dictionary + is still available within the assigned variable for further use. + + +.. code-block:: python + + from eda_toolkit import stacked_crosstab_plot + + # Call the stacked_crosstab_plot function + stacked_crosstabs = stacked_crosstab_plot( + df=df, + col="age_group", + func_col=func_col, + legend_labels_list=legend_labels_list, + title=title, + kind="bar", + width=0.8, + rot=45, # axis rotation angle + custom_order=None, + color=["#00BFC4", "#F8766D"], # default color schema + output="both", + return_dict=True, + x=14, + y=8, + p=10, + logscale=False, + plot_type="both", + show_legend=True, + label_fontsize=14, + tick_fontsize=12, + ) + +The above example generates stacked bar plots for ``"sex"`` and ``"income"`` +grouped by ``"education"``. The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export. + +.. important:: + + **Importance of Correctly Aligning Labels** + + It is crucial to properly align the elements in the ``legend_labels_list``, + ``title``, and ``func_col`` parameters when using the ``stacked_crosstab_plot`` + function. Each of these lists must be ordered consistently because the function + relies on their alignment to correctly assign labels and titles to the + corresponding plots and legends. + + **For instance, in the example above:** + + - The first element in ``func_col`` is ``"sex"``, and it is aligned with the first set of labels ``["Male", "Female"]`` in ``legend_labels_list`` and the first title ``"Sex"`` in the ``title`` list. + - Similarly, the second element in ``func_col``, ``"income"``, aligns with the labels ``["<=50K", ">50K"]`` and the title ``"Income"``. + + **Misalignment between these lists would result in incorrect labels or titles being + applied to the plots, potentially leading to confusion or misinterpretation of the data. + Therefore, it's important to ensure that each list is ordered appropriately and + consistently to accurately reflect the data being visualized.** + + **Proper Setup of Lists** + + When setting up the ``legend_labels_list``, ``title``, and ``func_col``, ensure + that each element in the lists corresponds to the correct variable in the DataFrame. + This involves: + + - **Ordering**: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted. + - **Consistency**: Double-checking that each label in ``legend_labels_list`` matches the categories present in the corresponding ``func_col``, and that the ``title`` accurately describes the plot. + + By adhering to these guidelines, you can ensure that the ``stacked_crosstab_plot`` + function produces accurate and meaningful visualizations that are easy to interpret and analyze. + +**Output** + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_sex.svg + :alt: KDE Distributions + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income.svg + :alt: Stacked Bar Plot Age vs. Income + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +.. note:: + + When you set ``return_dict=True``, you are able to see the crosstabs printed out + as shown below. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93
+ +\ + +When you set ``return_dict=True``, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example: + +.. code-block:: python + + crosstab_age_sex = crosstabs_dict["sex"] + crosstab_age_income = crosstabs_dict["income"] + + +Pivoted Stacked Bar Plots Example +----------------------------------- + +Using the census dataset [1]_, to create horizontal stacked bar plots, set the ``kind`` parameter to +``"barh"`` in the ``stacked_crosstab_plot function``. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the ``y-axis``. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_pivoted.svg + :alt: Stacked Bar Plot Age vs. Income (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Non-Normalized Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to create stacked bar plots without the normalized versions, +set the ``plot_type`` parameter to ``"regular"`` in the ``stacked_crosstab_plot`` +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the ``plot_type`` to ``"normalized"`` will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_regular.svg + :alt: Stacked Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Regular Non-Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the ``plot_type`` parameter to ``"regular"`` +in the ``stacked_crosstab_plot`` function and enable ``remove_stacks`` by setting +it to ``True``. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +``plot_type`` to ``"normalized"`` will display only the normalized plots. + +When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories. + +In the example below, the color of the bars has been set to a dark grey (``#333333``), +and the legend has been removed by setting ``show_legend=False``. This illustrates +regular bar plots for income by age, without stacking. + + +.. raw:: html + +
+ +.. image:: ../assets/Bar_Age_regular_income.svg + :alt: Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Box and Violin Plots +=========================== + +**Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.** + +The ``box_violin_plot`` function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories. + +With options to customize the plot type (``boxplot`` or ``violinplot``), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis. + +Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures. + +The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset. + +.. function:: box_violin_plot(df, metrics_list, metrics_boxplot_comp, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type="boxplot", xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param metrics_list: List of metric names (columns in df) to plot. + :type metrics_list: list of str + :param metrics_boxplot_comp: List of comparison categories (columns in df). + :type metrics_boxplot_comp: list of str + :param n_rows: Number of rows in the subplot grid. + :type n_rows: int + :param n_cols: Number of columns in the subplot grid. + :type n_cols: int + :param image_path_png: Optional directory path to save ``.png`` images. + :type image_path_png: str, optional + :param image_path_svg: Optional directory path to save ``.svg`` images. + :type image_path_svg: str, optional + :param save_plots: String, ``"all"``, ``"individual"``, or ``"grid"`` to control saving plots. + :type save_plots: str, optional + :param show_legend: Boolean, True if showing the legend in the plots. + :type show_legend: bool, optional + :param plot_type: Specify the type of plot, either ``"boxplot"`` or ``"violinplot"``. Default is ``"boxplot"``. + :type plot_type: str, optional + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + :param show_plot: Specify the plot display mode: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + :param rotate_plot: Boolean, True if rotating (pivoting) the plots. + :type rotate_plot: bool, optional + :param individual_figsize: Width and height of the figure for individual plots. Default is (``6, 4``). + :type individual_figsize: tuple or list, optional + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of None, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set without specifying ``image_path_png`` or ``image_path_svg``. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` is not a tuple or list of two numbers. + - If ``grid_figsize`` is specified but is not a tuple or list of two numbers. + + :returns: ``None`` + + + + +This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels. + +Box Plots Grid Example +----------------------- + +In this example with the US census data [1]_, the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the ``"age_group"`` column in the +DataFrame. The ``metrics_boxplot_comp`` parameter is set to [``"age_group"``], meaning +that the comparison will be based on different age groups. The ``metrics_list`` is +provided as ``age_boxplot_list``, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid format with `3` rows and `4` +columns, using the ``n_rows=3`` and ``n_cols=4`` parameters. The ``image_path_png`` and +``image_path_svg`` parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to ``"all"``, ensuring that both +individual and grid plots are saved. + +The plots are displayed in a grid format, as indicated by the ``show_plot="grid"`` +parameter. The ``plot_type`` is set to ``"boxplot"``, so the function will generate +boxplots for each metric in the list. Additionally, the ```x-axis``` labels are rotated +by 90 degrees (``xlabel_rot=90``) to ensure that the labels are legible. The legend is +hidden by setting ``show_legend=False``, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication. + + +.. code-block:: python + + age_boxplot_list = df[ + [ + "education-num", + "hours-per-week", + ] + ].columns.to_list() + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="boxplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_boxplot.png + :alt: Box Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Violin Plots Grid Example +-------------------------- + +In this example with the US census data [1]_, we keep everything the same as the prior example, but change the +``plot_type`` to ``violinplot``. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings. + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="violinplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot.png + :alt: Violin Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Pivoted Violin Plots Grid Example +------------------------------------ + +In this example with the US census data [1]_, we set ``xlabel_rot=0`` and ``rotate_plot=True`` +to pivot the plot, changing the orientation of the axes while keeping the ```x-axis``` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution. + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_boxplot_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_boxplot_comp, + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + rotate_plot=True, + show_legend=False, + plot_type="violinplot", + xlabel_rot=0, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot_pivoted.png + :alt: Violin Plot Comparisons (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots and Best Fit Lines +================================== + +Pearson Correlation Coefficient +-------------------------------- + +The Pearson correlation coefficient, often denoted as :math:`r`, is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from :math:`-1` to :math:`1`, where: + +- :math:`r = 1` indicates a perfect positive linear relationship. +- :math:`r = -1` indicates a perfect negative linear relationship. +- :math:`r = 0` indicates no linear relationship. + +The Pearson correlation coefficient between two variables :math:`X` and :math:`Y` is defined as: + +.. math:: + + r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} + +where: + +- :math:`\text{Cov}(X, Y)` is the covariance of :math:`X` and :math:`Y`. +- :math:`\sigma_X` is the standard deviation of :math:`X`. +- :math:`\sigma_Y` is the standard deviation of :math:`Y`. + +Covariance measures how much two variables change together. It is defined as: + +.. math:: + + \text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y) + +where: + +- :math:`n` is the number of data points. +- :math:`X_i` and :math:`Y_i` are the individual data points. +- :math:`\mu_X` and :math:`\mu_Y` are the means of :math:`X` and :math:`Y`. + +The standard deviation measures the dispersion or spread of a set of values. For +a variable :math:`X`, the standard deviation :math:`\sigma_X` is: + +.. math:: + + \sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2} + +Substituting the covariance and standard deviation into the Pearson correlation formula: + +.. math:: + + r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}} + +This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between :math:`X` and :math:`Y`. + +- :math:`r > 0`: Positive correlation. As :math:`X` increases, :math:`Y` tends to increase. +- :math:`r < 0`: Negative correlation. As :math:`X` increases, :math:`Y` tends to decrease. +- :math:`r = 0`: No linear correlation. There is no consistent linear relationship between :math:`X` and :math:`Y`. + +The closer the value of :math:`r` is to :math:`\pm 1`, the stronger the linear relationship between the two variables. + +Scatter Fit Plot +------------------ + +**Create and Save Scatter Plots or a Grid of Scatter Plots** + +This function, ``scatter_fit_plot``, is designed to generate scatter plots for +one or more pairs of variables (``x_vars`` and ``y_vars``) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view. + +**Optional Best Fit Line** + +An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s + +**Customizable Plot Aesthetics** + +The function offers a wide range of customization options to tailor the appearance +of the scatter plots: + +- **Point Color**: You can specify a default color for the scatter points or use a ``hue`` parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data. + +- **Point Size**: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable. + +- **Markers**: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data. + +**Axis and Label Configuration** + +The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges. + +**Plot Display and Saving Options** + +The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations. + +**Correlation Coefficient Display** + +For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship. + +.. function:: scatter_fit_plot(df, x_vars, y_vars, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color="C0", best_fit_linecolor="red", best_fit_linestyle="-", hue=None, hue_palette=None, size=None, sizes=None, marker="o", show_correlation=True, xlim=None, ylim=None) + + Create and save scatter plots or a grid of scatter plots for given x_vars + and y_vars, with an optional best fit line and customizable point color, + size, and markers. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param x_vars: List of variable names to plot on the `x-axis`. + :type x_vars: list of str + + :param y_vars: List of variable names to plot on the `y-axis`. + :type y_vars: list of str + + :param n_rows: Number of rows in the subplot grid. + :type n_rows: int + + :param n_cols: Number of columns in the subplot grid. + :type n_cols: int + + :param image_path_png: Directory path to save PNG images of the scatter plots. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the scatter plots. + :type image_path_svg: str, optional + + :param save_plots: Controls which plots to save: ``"all"``, ``"individual"``, or ``"grid"``. + :type save_plots: str, optional + + :param show_legend: Whether to display the legend on the plots. Default is ``True``. + :type show_legend: bool, optional + + :param xlabel_rot: Rotation angle for `x-axis` labels. Default is ``0``. + :type xlabel_rot: int, optional + + :param show_plot: Controls plot display: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + + :param rotate_plot: Whether to rotate (pivot) the plots. Default is ``False``. + :type rotate_plot: bool, optional + + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + + :param add_best_fit_line: Whether to add a best fit line to the scatter plots. Default is ``False``. + :type add_best_fit_line: bool, optional + + :param scatter_color: Color code for the scattered points. Default is ``"C0"``. + :type scatter_color: str, optional + + :param best_fit_linecolor: Color code for the best fit line. Default is ``"red"``. + :type best_fit_linecolor: str, optional + + :param best_fit_linestyle: Linestyle for the best fit line. Default is ``"-"``. + :type best_fit_linestyle: str, optional + + :param hue: Column name for the grouping variable that will produce points with different colors. + :type hue: str, optional + + :param hue_palette: Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. + :type hue_palette: dict, list, or str, optional + + :param size: Column name for the grouping variable that will produce points with different sizes. + :type size: str, optional + + :param sizes: Dictionary mapping sizes (smallest and largest) to min and max values. + :type sizes: dict, optional + + :param marker: Marker style used for the scatter points. Default is ``"o"``. + :type marker: str, optional + + :param show_correlation: Whether to display the Pearson correlation coefficient in the plot title. Default is ``True``. + :type show_correlation: bool, optional + + :param xlim: Limits for the `x-axis` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + + :param ylim: Limits for the `y-axis` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set but no image paths are provided. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` or ``grid_figsize`` are not tuples/lists with two numeric values. + + :returns: ``None`` + This function does not return any value but generates and optionally saves scatter plots for the specified `x_vars` and `y_vars`. + + +Regression-Centric Scatter Plots Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this US census data [1]_ example, the ``scatter_fit_plot`` function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the ``show_correlation=True`` parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the ``add_best_fit_line=True`` parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="grid", + show_legend=True, + xlabel_rot=0, + show_plot="grid", + rotate_plot=False, + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid.png + :alt: Scatter Plot Comparisons (with Best Fit Lines) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Scatter Plots Grouped by Category Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of +scatter plots that examine the relationships between ``age`` and ``hours-per-week`` +as well as ``education-num`` and ``hours-per-week``. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots: + +1. **Hue and Hue Palette**: The ``hue`` parameter is set to ``"income"``, meaning that the + data points in the scatter plots are colored according to the values in the ``income`` + column. A custom color mapping is provided via the ``hue_palette`` parameter, where the + income categories ``"<=50K"`` and ``">50K"`` are assigned the colors ``"brown"`` and + ``"green"``, respectively. This change visually distinguishes the data points based on + income levels. + +2. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, which applies + a grey color to the scatter points when no ``hue`` is provided. However, since a ``hue`` + is specified in this example, the ``hue_palette`` takes precedence and overrides this color setting. + +3. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``False``, meaning that + no best fit line is added to the scatter plots. This differs from the previous example where + a best fit line was included. + +4. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``False``, so the + Pearson correlation coefficient will not be displayed in the plot titles. This is another + change from the previous example where the correlation coefficient was included. + +5. **Hue Legend**: The ``show_legend`` parameter remains set to ``True``, ensuring that the + legend displaying the hue categories (``"<=50K"`` and ``">50K"``) appears on the plots, + helping to interpret the color coding of the data points. + +These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths. + + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + hue_dict = {"<=50K": "brown", ">50K": "green"} + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + n_rows=3, + n_cols=4, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="grid", + show_legend=True, + xlabel_rot=0, + show_plot="grid", + rotate_plot=False, + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=False, + scatter_color="#808080", + hue="income", + hue_palette=hue_dict, + show_correlation=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid_grouped.png + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Correlation Matrices +===================== + +**Generate and Save Customizable Correlation Heatmaps** + +The ``flex_corr_matrix`` function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats. + +**Customizable Plot Appearance** + +The function provides extensive customization options for the heatmap's appearance: + +- **Colormap Selection**: Choose from a variety of colormaps to represent the strength of correlations. The default is ``"coolwarm"``, but this can be adjusted to fit the needs of the analysis. + +- **Annotation**: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance. + +- **Figure Size and Layout**: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards. + +**Triangular vs. Full Correlation Matrix** + + +A key feature of the ``flex_corr_matrix`` function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations. + +**Label and Axis Configuration** + + +The function offers flexibility in configuring axis labels and titles: + +- **Label Rotation**: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names. +- **Font Sizes**: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable. +- **Title Wrapping**: Control the wrapping of long titles to fit within the plot without overlapping other elements. + +**Plot Display and Saving Options** + + +The ``flex_corr_matrix`` function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images. + +.. function:: flex_corr_matrix(df, cols=None, annot=True, cmap="coolwarm", save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title="Cervical Cancer Data: Correlation Matrix", label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment="right", ylabel_alignment="center_baseline", text_wrap=50, vmin=-1, vmax=1, cbar_label="Correlation Index", triangular=True, **kwargs) + + Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param cols: List of column names to include in the correlation matrix. If None, all columns are included. + :type cols: list of str, optional + + :param annot: Whether to annotate the heatmap with correlation coefficients. Default is ``True``. + :type annot: bool, optional + + :param cmap: The colormap to use for the heatmap. Default is ``"coolwarm"``. + :type cmap: str, optional + + :param save_plots: Controls whether to save the plots. Default is ``False``. + :type save_plots: bool, optional + + :param image_path_png: Directory path to save PNG images of the heatmap. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the heatmap. + :type image_path_svg: str, optional + + :param figsize: Width and height of the figure for the heatmap. Default is ``(10, 10)``. + :type figsize: tuple, optional + + :param title: Title of the heatmap. Default is ``"Cervical Cancer Data: Correlation Matrix"``. + :type title: str, optional + + :param label_fontsize: Font size for tick labels and colorbar label. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param xlabel_rot: Rotation angle for x-axis labels. Default is ``45``. + :type xlabel_rot: int, optional + + :param ylabel_rot: Rotation angle for y-axis labels. Default is ``0``. + :type ylabel_rot: int, optional + + :param xlabel_alignment: Horizontal alignment for x-axis labels. Default is ``"right"``. + :type xlabel_alignment: str, optional + + :param ylabel_alignment: Vertical alignment for y-axis labels. Default is ``"center_baseline"``. + :type ylabel_alignment: str, optional + + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + + :param vmin: Minimum value for the heatmap color scale. Default is ``-1``. + :type vmin: float, optional + + :param vmax: Maximum value for the heatmap color scale. Default is ``1``. + :type vmax: float, optional + + :param cbar_label: Label for the colorbar. Default is ``"Correlation Index"``. + :type cbar_label: str, optional + + :param triangular: Whether to show only the upper triangle of the correlation matrix. Default is ``True``. + :type triangular: bool, optional + + :param kwargs: Additional keyword arguments to pass to ``seaborn.heatmap()``. + :type kwargs: dict, optional + + :raises ValueError: + - If ``annot`` is not a boolean. + - If ``cols`` is not a list. + - If ``save_plots`` is not a boolean. + - If ``triangular`` is not a boolean. + - If ``save_plots`` is True but no image paths are provided. + + :returns: ``None`` + This function does not return any value but generates and optionally saves a correlation heatmap. + +Triangular Correlation Matrix Example +-------------------------------------- + +The provided code filters the census [1]_ DataFrame ``df`` to include only numeric columns using +``select_dtypes(np.number)``. It then utilizes the ``flex_corr_matrix()`` function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options. + +.. note:: + + This triangular matrix format is particularly useful for avoiding + redundancy in correlation matrices, as it excludes the lower half, + making it easier to focus on unique pairwise correlations. + +The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations. + +.. code-block:: python + + # Select only numeric data to pass into the function + df_num = df.select_dtypes(np.number) + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="coolwarm", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Full Correlation Matrix Example +---------------------------------- + +In this modified census [1]_ example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting ``cmap="viridis"``, the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting ``triangular=False``, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset. + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="viridis", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix_full.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Partial Dependence Plots +========================= + +**Partial Dependence Plots (PDPs)** are a powerful tool in machine learning +interpretability, providing insights into how features influence the predicted +outcome of a model. PDPs can be generated in both 2D and 3D, depending on +whether you want to analyze the effect of one feature or the interaction between +two features on the model's predictions. + +Theoretical Foundation of PDPs +-------------------------------- + +Let :math:`\mathbf{X}` represent the complete set of input features for a machine +learning model, where :math:`\mathbf{X} = \{X_1, X_2, \dots, X_p\}`. Suppose we're +particularly interested in a subset of these features, denoted by :math:`\mathbf{X}_S`. +The complementary set, :math:`\mathbf{X}_C`, contains all the features in :math:`\mathbf{X}` +that are not in :math:`\mathbf{X}_S`. Mathematically, this relationship is expressed as: + +.. math:: + + \mathbf{X}_C = \mathbf{X} \setminus \mathbf{X}_S + +where :math:`\mathbf{X}_C` is the set of features in :math:`\mathbf{X}` after +removing the features in :math:`\mathbf{X}_S`. + +Partial Dependence Plots (PDPs) are used to illustrate the effect of the features +in :math:`\mathbf{X}_S` on the model's predictions, while averaging out the +influence of the features in :math:`\mathbf{X}_C`. This is mathematically defined as: + +.. math:: + \begin{align*} + \text{PD}_{\mathbf{X}_S}(x_S) &= \mathbb{E}_{\mathbf{X}_C} \left[ f(x_S, \mathbf{X}_C) \right] \\ + &= \int f(x_S, x_C) \, p(x_C) \, dx_C \\ + &= \int \left( \int f(x_S, x_C) \, p(x_C \mid x_S) \, dx_C \right) p(x_S) \, dx_S + \end{align*} + + +where: + +- :math:`\mathbb{E}_{\mathbf{X}_C} \left[ \cdot \right]` indicates that we are taking the expected value over the possible values of the features in the set :math:`\mathbf{X}_C`. +- :math:`p(x_C)` represents the probability density function of the features in :math:`\mathbf{X}_C`. + +This operation effectively summarizes the model's output over all potential values of the complementary features, providing a clear view of how the features in :math:`\mathbf{X}_S` alone impact the model's predictions. + + +**2D Partial Dependence Plots** + +Consider a trained machine learning model :math:`f(\mathbf{X})`, where :math:`\mathbf{X} = (X_1, X_2, \dots, X_p)` represents the vector of input features. The partial dependence of the predicted response :math:`\hat{y}` on a single feature :math:`X_j` is defined as: + +.. math:: + + \text{PD}(X_j) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, \mathbf{X}_{C_i}) + +where: + +- :math:`X_j` is the feature of interest. +- :math:`\mathbf{X}_{C_i}` represents the complement set of :math:`X_j`, meaning the remaining features in :math:`\mathbf{X}` not included in :math:`X_j` for the :math:`i`-th instance. +- :math:`n` is the number of observations in the dataset. + +For two features, :math:`X_j` and :math:`X_k`, the partial dependence is given by: + +.. math:: + + \text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i}) + +This results in a 2D surface plot (or contour plot) that shows how the predicted outcome changes as the values of :math:`X_j` and :math:`X_k` vary, while the effects of the other features are averaged out. + +- **Single Feature PDP:** When plotting :math:`\text{PD}(X_j)`, the result is a 2D line plot showing the marginal effect of feature :math:`X_j` on the predicted outcome, averaged over all possible values of the other features. +- **Two Features PDP:** When plotting :math:`\text{PD}(X_j, X_k)`, the result is a 3D surface plot (or a contour plot) that shows the combined marginal effect of :math:`X_j` and :math:`X_k` on the predicted outcome. The surface represents the expected value of the prediction as :math:`X_j` and :math:`X_k` vary, while all other features are averaged out. + + +**3D Partial Dependence Plots** + +For a more comprehensive analysis, especially when exploring interactions between two features, 3D Partial Dependence Plots are invaluable. The partial dependence function for two features in a 3D context is: + +.. math:: + + \text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i}) + +Here, the function :math:`f(X_j, X_k, \mathbf{X}_{C_i})` is evaluated across a grid of values for :math:`X_j` and :math:`X_k`. The resulting 3D surface plot represents how the model's prediction changes over the joint range of these two features. + +The 3D plot offers a more intuitive visualization of feature interactions compared to 2D contour plots, allowing for a better understanding of the combined effects of features on the model's predictions. The surface plot is particularly useful when you need to capture complex relationships that might not be apparent in 2D. + +- **Feature Interaction Visualization:** The 3D PDP provides a comprehensive view of the interaction between two features. The resulting surface plot allows for the visualization of how the model’s output changes when the values of two features are varied simultaneously, making it easier to understand complex interactions. +- **Enhanced Interpretation:** 3D PDPs offer enhanced interpretability in scenarios where feature interactions are not linear or where the effect of one feature depends on the value of another. The 3D visualization makes these dependencies more apparent. + + +2D Partial Dependence Plots +----------------------------- + +The ``plot_2d_pdp`` function generates 2D partial dependence plots for individual features or pairs of features. These plots are essential for examining the marginal effect of features on the predicted outcome. + +- **Grid and Individual Plots**: Generate all 2D partial dependence plots in a grid layout or as separate individual plots, offering flexibility in presentation. +- **Customization Options**: Control the figure size, font sizes for labels and ticks, and the wrapping of long titles to ensure the plots are clear and informative. +- **Saving Plots**: The function provides options to save the plots in PNG or SVG formats, and you can specify whether to save all plots, only individual plots, or just the grid plot. + +.. function:: plot_2d_pdp(model, X_train, feature_names, features, title="PDP of house value on CA non-location features", grid_resolution=50, plot_type="grid", grid_figsize=(12, 8), individual_figsize=(6, 4), label_fontsize=12, tick_fontsize=10, text_wrap=50, image_path_png=None, image_path_svg=None, save_plots=None, file_prefix="partial_dependence") + + Generate 2D partial dependence plots for specified features using the given machine learning model. The function allows for plotting in grid or individual layouts, with various customization options for figure size, font sizes, and title wrapping. Additionally, the plots can be saved in PNG or SVG formats with a customizable filename prefix. + + :param model: The trained machine learning model used to generate partial dependence plots. + :type model: estimator object + + :param X_train: The training data used to compute partial dependence. Should correspond to the features used to train the model. + :type X_train: pandas.DataFrame or numpy.ndarray + + :param feature_names: A list of feature names corresponding to the columns in ``X_train``. + :type feature_names: list of str + + :param features: A list of feature indices or tuples of feature indices for which to generate partial dependence plots. + :type features: list of int or tuple of int + + :param title: The title for the entire plot. Default is ``"PDP of house value on CA non-location features"``. + :type title: str, optional + + :param grid_resolution: The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is ``50``. + :type grid_resolution: int, optional + + :param plot_type: The type of plot to generate. Choose ``"grid"`` for a grid layout, ``"individual"`` for separate plots, or ``"both"`` to generate both layouts. Default is ``"grid"``. + :type plot_type: str, optional + + :param grid_figsize: Tuple specifying the width and height of the figure for the grid layout. Default is ``(12, 8)``. + :type grid_figsize: tuple, optional + + :param individual_figsize: Tuple specifying the width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple, optional + + :param label_fontsize: Font size for the axis labels and titles. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for the axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping. Useful for managing long titles. Default is ``50``. + :type text_wrap: int, optional + + :param image_path_png: The directory path where PNG images of the plots will be saved, if saving is enabled. + :type image_path_png: str, optional + + :param image_path_svg: The directory path where SVG images of the plots will be saved, if saving is enabled. + :type image_path_svg: str, optional + + :param save_plots: Controls whether to save the plots. Options include ``"all"``, ``"individual"``, ``"grid"``, or ``None`` (default). If saving is enabled, ensure ``image_path_png`` or ``image_path_svg`` are provided. + :type save_plots: str, optional + + :param file_prefix: Prefix for the filenames of the saved grid plots. Default is ``"partial_dependence"``. + :type file_prefix: str, optional + + :raises ValueError: + - If ``plot_type`` is not one of ``"grid"``, ``"individual"``, or ``"both"``. + - If ``save_plots`` is enabled but neither ``image_path_png`` nor ``image_path_svg`` is provided. + + :returns: ``None`` + This function generates partial dependence plots and displays them. It does not return any values. + + +2D Plots - CA Housing Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Consider a scenario where you have a machine learning model predicting median +house values in California. [4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (``AveOccup``) and the +age of the house (``HouseAge``) jointly influence house values. A 2D partial +dependence plot allows you to visualize this relationship in two ways: either as +individual plots for each feature or as a combined plot showing the interaction +between two features. + +For instance, the 2D partial dependence plot can help you analyze how the age of +the house impacts house values while holding the number of occupants constant, or +vice versa. This is particularly useful for identifying the most influential +features and understanding how changes in these features might affect the +predicted house value. + +If you extend this to two interacting features, such as ``AveOccup`` and ``HouseAge``, +you can explore their combined effect on house prices. The plot can reveal how +different combinations of occupancy levels and house age influence the value, +potentially uncovering non-linear relationships or interactions that might not be +immediately obvious from a simple 1D analysis. + +Here’s how you can generate and visualize these 2D partial dependence plots using +the California housing dataset: + +**Fetch The CA Housing Dataset and Prepare The DataFrame** + +.. code-block:: python + + from sklearn.datasets import fetch_california_housing + from sklearn.model_selection import train_test_split + from sklearn.ensemble import GradientBoostingRegressor + import pandas as pd + + # Load the dataset + data = fetch_california_housing() + df = pd.DataFrame(data.data, columns=data.feature_names) + +**Split The Data Into Training and Testing Sets** + +.. code-block:: python + + X_train, X_test, y_train, y_test = train_test_split( + df, data.target, test_size=0.2, random_state=42 + ) + +**Train a GradientBoostingRegressor Model** + +.. code-block:: python + + model = GradientBoostingRegressor( + n_estimators=100, + max_depth=4, + learning_rate=0.1, + loss="huber", + random_state=42, + ) + model.fit(X_train, y_train) + + +**Create 2D Partial Dependence Plot Grid** + +.. code-block:: python + + # import the plot_2d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_2d_pdp + + # Feature names + names = data.feature_names + + # Generate 2D partial dependence plots + plot_2d_pdp( + model=model, + X_train=X_train, + feature_names=names, + features=[ + "MedInc", + "AveOccup", + "HouseAge", + "AveRooms", + "Population", + ("AveOccup", "HouseAge"), + ], + title="PDP of house value on CA non-location features", + grid_figsize=(14, 10), + individual_figsize=(12, 4), + label_fontsize=14, + tick_fontsize=12, + text_wrap=120, + plot_type="grid", + image_path_png="path/to/save/png", + save_plots="all", + ) + +.. raw:: html + +
+ +.. image:: ../assets/2d_pdp_grid.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +3D Partial Dependence Plots +----------------------------- + +The ``plot_3d_pdp`` function extends the concept of partial dependence to three dimensions, allowing you to visualize the interaction between two features and their combined effect on the model’s predictions. + +- **Interactive and Static 3D Plots**: Generate static 3D plots using Matplotlib or interactive 3D plots using Plotly. The function also allows for generating both types simultaneously. +- **Colormap and Layout Customization**: Customize the colormaps for both Matplotlib and Plotly plots. Adjust figure size, camera angles, and zoom levels to create plots that fit perfectly within your presentation or report. +- **Axis and Title Configuration**: Customize axis labels for both Matplotlib and Plotly plots. Adjust font sizes and control the wrapping of long titles to maintain readability. + +.. function:: plot_3d_pdp(model, dataframe, feature_names_list, x_label=None, y_label=None, z_label=None, title, html_file_path=None, html_file_name=None, image_filename=None, plot_type="both", matplotlib_colormap=None, plotly_colormap="Viridis", zoom_out_factor=None, wireframe_color=None, view_angle=(22, 70), figsize=(7, 4.5), text_wrap=50, horizontal=-1.25, depth=1.25, vertical=1.25, cbar_x=1.05, cbar_thickness=25, title_x=0.5, title_y=0.95, top_margin=100, image_path_png=None, image_path_svg=None, show_cbar=True, grid_resolution=20, left_margin=20, right_margin=65, label_fontsize=8, tick_fontsize=6, enable_zoom=True, show_modebar=True) + + Generate 3D partial dependence plots for two features of a machine learning model. + + This function supports both static (Matplotlib) and interactive (Plotly) visualizations, allowing for flexible and comprehensive analysis of the relationship between two features and the target variable in a model. + + :param model: The trained machine learning model used to generate partial dependence plots. + :type model: estimator object + + :param dataframe: The dataset on which the model was trained or a representative sample. If a DataFrame is provided, ``feature_names_list`` should correspond to the column names. If a NumPy array is provided, ``feature_names_list`` should correspond to the indices of the columns. + :type dataframe: pandas.DataFrame or numpy.ndarray + + :param feature_names_list: A list of two feature names or indices corresponding to the features for which partial dependence plots are generated. + :type feature_names_list: list of str + + :param x_label: Label for the x-axis in the plots. Default is ``None``. + :type x_label: str, optional + + :param y_label: Label for the y-axis in the plots. Default is ``None``. + :type y_label: str, optional + + :param z_label: Label for the z-axis in the plots. Default is ``None``. + :type z_label: str, optional + + :param title: The title for the plots. + :type title: str + + :param html_file_path: Path to save the interactive Plotly HTML file. Required if ``plot_type`` is ``"interactive"`` or ``"both"``. Default is ``None``. + :type html_file_path: str, optional + + :param html_file_name: Name of the HTML file to save the interactive Plotly plot. Required if ``plot_type`` is ``"interactive"`` or ``"both"``. Default is ``None``. + :type html_file_name: str, optional + + :param image_filename: Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is ``None``. + :type image_filename: str, optional + + :param plot_type: The type of plots to generate. Options are: + - ``"static"``: Generate only static Matplotlib plots. + - ``"interactive"``: Generate only interactive Plotly plots. + - ``"both"``: Generate both static and interactive plots. Default is ``"both"``. + :type plot_type: str, optional + + :param matplotlib_colormap: Custom colormap for the Matplotlib plot. If not provided, a default colormap is used. + :type matplotlib_colormap: matplotlib.colors.Colormap, optional + + :param plotly_colormap: Colormap for the Plotly plot. Default is ``"Viridis"``. + :type plotly_colormap: str, optional + + :param zoom_out_factor: Factor to adjust the zoom level of the Plotly plot. Default is ``None``. + :type zoom_out_factor: float, optional + + :param wireframe_color: Color for the wireframe in the Matplotlib plot. If ``None``, no wireframe is plotted. Default is ``None``. + :type wireframe_color: str, optional + + :param view_angle: Elevation and azimuthal angles for the Matplotlib plot view. Default is ``(22, 70)``. + :type view_angle: tuple, optional + + :param figsize: Figure size for the Matplotlib plot. Default is ``(7, 4.5)``. + :type figsize: tuple, optional + + :param text_wrap: Maximum width of the title text before wrapping. Useful for managing long titles. Default is ``50``. + :type text_wrap: int, optional + + :param horizontal: Horizontal camera position for the Plotly plot. Default is ``-1.25``. + :type horizontal: float, optional + + :param depth: Depth camera position for the Plotly plot. Default is ``1.25``. + :type depth: float, optional + + :param vertical: Vertical camera position for the Plotly plot. Default is ``1.25``. + :type vertical: float, optional + + :param cbar_x: Position of the color bar along the x-axis in the Plotly plot. Default is ``1.05``. + :type cbar_x: float, optional + + :param cbar_thickness: Thickness of the color bar in the Plotly plot. Default is ``25``. + :type cbar_thickness: int, optional + + :param title_x: Horizontal position of the title in the Plotly plot. Default is ``0.5``. + :type title_x: float, optional + + :param title_y: Vertical position of the title in the Plotly plot. Default is ``0.95``. + :type title_y: float, optional + + :param top_margin: Top margin for the Plotly plot layout. Default is ``100``. + :type top_margin: int, optional + + :param image_path_png: Directory path to save the PNG file of the Matplotlib plot. Default is None. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save the SVG file of the Matplotlib plot. Default is None. + :type image_path_svg: str, optional + + :param show_cbar: Whether to display the color bar in the Matplotlib plot. Default is ``True``. + :type show_cbar: bool, optional + + :param grid_resolution: The resolution of the grid for computing partial dependence. Default is ``20``. + :type grid_resolution: int, optional + + :param left_margin: Left margin for the Plotly plot layout. Default is ``20``. + :type left_margin: int, optional + + :param right_margin: Right margin for the Plotly plot layout. Default is ``65``. + :type right_margin: int, optional + + :param label_fontsize: Font size for axis labels in the Matplotlib plot. Default is ``8``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for tick labels in the Matplotlib plot. Default is ``6``. + :type tick_fontsize: int, optional + + :param enable_zoom: Whether to enable zooming in the Plotly plot. Default is ``True``. + :type enable_zoom: bool, optional + + :param show_modebar: Whether to display the mode bar in the Plotly plot. Default is ``True``. + :type show_modebar: bool, optional + + :raises ValueError: + - If `plot_type` is not one of ``"static"``, ``"interactive"``, or ``"both"``. + - If `plot_type` is ``"interactive"`` or ``"both"`` and ``html_file_path`` or ``html_file_name`` are not provided. + + :returns: ``None`` + This function generates 3D partial dependence plots and displays or saves them. It does not return any values. + + :notes: + - This function handles warnings related to scikit-learn's ``partial_dependence`` function, specifically a ``FutureWarning`` related to non-tuple sequences for multidimensional indexing. This warning is suppressed as it stems from the internal workings of scikit-learn in Python versions like 3.7.4. + - To maintain compatibility with different versions of scikit-learn, the function attempts to use ``"values"`` for grid extraction in newer versions and falls back to ``"grid_values"`` for older versions. + + +3D Plots - CA Housing Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Consider a scenario where you have a machine learning model predicting median +house values in California.[4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (``AveOccup``) and the +age of the house (``HouseAge``) jointly influence house values. A 3D partial +dependence plot allows you to visualize this relationship in a more comprehensive +manner, providing a detailed view of how these two features interact to affect +the predicted house value. + +For instance, the 3D partial dependence plot can help you explore how different +combinations of house age and occupancy levels influence house values. By +visualizing the interaction between AveOccup and HouseAge in a 3D space, you can +uncover complex, non-linear relationships that might not be immediately apparent +in 2D plots. + +This type of plot is particularly useful when you need to understand the joint +effect of two features on the target variable, as it provides a more intuitive +and detailed view of how changes in both features impact predictions simultaneously. + +Here’s how you can generate and visualize these 3D partial dependence plots +using the California housing dataset: + +Static Plot +^^^^^^^^^^^^^^^^^ + +**Fetch The CA Housing Dataset and Prepare The DataFrame** + +.. code-block:: python + + from sklearn.ensemble import GradientBoostingRegressor + from sklearn.datasets import fetch_california_housing + from sklearn.model_selection import train_test_split + import pandas as pd + + # Load the dataset + data = fetch_california_housing() + df = pd.DataFrame(data.data, columns=data.feature_names) + +**Split The Data Into Training and Testing Sets** + +.. code-block:: python + + X_train, X_test, y_train, y_test = train_test_split( + df, data.target, test_size=0.2, random_state=42 + ) + +**Train a GradientBoostingRegressor Model** + +.. code-block:: python + + model = GradientBoostingRegressor( + n_estimators=100, + max_depth=4, + learning_rate=0.1, + loss="huber", + random_state=1, + ) + model.fit(X_train, y_train) + +**Create Static 3D Partial Dependence Plot** + +.. code-block:: python + + # import the plot_3d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_3d_pdp + + # Call the function to generate the plot + plot_3d_pdp( + model=model, + dataframe=X_test, # Use the test dataset + feature_names_list=["HouseAge", "AveOccup"], + x_label="House Age", + y_label="Average Occupancy", + z_label="Partial Dependence", + title="3D Partial Dependence Plot of House Age vs. Average Occupancy", + image_filename="3d_pdp", + plot_type="static", + figsize=[8, 5], + text_wrap=40, + wireframe_color="black", + image_path_png=image_path_png, + grid_resolution=30, + ) + +.. raw:: html + +
+ +.. image:: ../assets/3d_pdp.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Interactive Plot +^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # import the plot_3d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_3d_pdp + + # Call the function to generate the plot + plot_3d_pdp( + model=model, + dataframe=X_test, # Use the test dataset + feature_names_list=["HouseAge", "AveOccup"], + x_label="House Age", + y_label="Average Occupancy", + z_label="Partial Dependence", + title="3D Partial Dependence Plot of House Age vs. Average Occupancy", + html_file_path=image_path_png, + image_filename="3d_pdp", + html_file_name="3d_pdp.html", + plot_type="interactive", + text_wrap=40, + zoom_out_factor=0.5, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + grid_resolution=30, + label_fontsize=8, + tick_fontsize=6, + title_x=0.38, + top_margin=10, + right_margin=250, + cbar_x=0.9, + cbar_thickness=25, + show_modebar=False, + enable_zoom=True, + ) + +.. warning:: + + **Scrolling Notice:** + + While interacting with the interactive Plotly plot below, scrolling down the + page using the mouse wheel may be blocked when the mouse pointer is hovering + over the plot. To continue scrolling, either move the mouse pointer outside + the plot area or use the keyboard arrow keys to navigate down the page. + + +.. raw:: html + + + +
+ + +This interactive plot was generated using Plotly, which allows for rich, +interactive visualizations directly in the browser. The plot above is an example +of an interactive 3D Partial Dependence Plot. Here's how it differs from +generating a static plot using Matplotlib. + +**Key Differences** + +**Plot Type**: + +- The ``plot_type`` is set to ``"interactive"`` for the Plotly plot and ``"static"`` for the Matplotlib plot. + +**Interactive-Specific Parameters**: + +- **HTML File Path and Name**: The ``html_file_path`` and ``html_file_name`` parameters are required to save the interactive Plotly plot as an HTML file. These parameters are not needed for static plots. + +- **Zoom and Positioning**: The interactive plot includes parameters like ``zoom_out_factor``, ``title_x``, ``cbar_x``, and ``cbar_thickness`` to control the zoom level, title position, and color bar position in the Plotly plot. These parameters do not affect the static plot. + +- **Mode Bar and Zoom**: The ``show_modebar`` and ``enable_zoom`` parameters are specific to the interactive Plotly plot, allowing you to toggle the visibility of the mode bar and enable or disable zoom functionality. + +**Static-Specific Parameters**: + +- **Figure Size and Wireframe Color**: The static plot uses parameters like ``figsize`` to control the size of the Matplotlib plot and ``wireframe_color`` to define the color of the wireframe in the plot. These parameters are not applicable to the interactive Plotly plot. + +By adjusting these parameters, you can customize the behavior and appearance of your 3D Partial Dependence Plots according to your needs, whether for static or interactive visualization. + + + + +.. [#] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +.. [2] Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +.. [3] Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +.. [4] Pace, R. K., & Barry, R. (1997). *Sparse Spatial Autoregressions*. *Statistics & Probability Letters*, 33(3), 291-297. `https://doi.org/10.1016/S0167-7152(96)00140-X `_. diff --git a/_build/html/v0.0.8/_static/_sphinx_javascript_frameworks_compat.js b/_build/html/v0.0.8/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/_build/html/v0.0.8/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * 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/_build/html/v0.0.8/_static/basic.css b/_build/html/v0.0.8/_static/basic.css new file mode 100644 index 000000000..7ebbd6d07 --- /dev/null +++ b/_build/html/v0.0.8/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- 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: 230px; + 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-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +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; +} + +a:visited { + color: #551A8B; +} + +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; +} + +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; +} + +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 > 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; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +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; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- 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/_build/html/v0.0.8/_static/check-solid.svg b/_build/html/v0.0.8/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_build/html/v0.0.8/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_build/html/v0.0.8/_static/clipboard.min.js b/_build/html/v0.0.8/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_build/html/v0.0.8/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * 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/_build/html/v0.0.8/_static/copybutton.css b/_build/html/v0.0.8/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_build/html/v0.0.8/_static/copybutton.css @@ -0,0 +1,94 @@ +/* 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/_build/html/v0.0.8/_static/copybutton.js b/_build/html/v0.0.8/_static/copybutton.js new file mode 100644 index 000000000..0ea5f6c60 --- /dev/null +++ b/_build/html/v0.0.8/_static/copybutton.js @@ -0,0 +1,248 @@ +// 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, '>|\\$ ', true, 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/_build/html/v0.0.8/_static/copybutton_funcs.js b/_build/html/v0.0.8/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_build/html/v0.0.8/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +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/_build/html/v0.0.8/_static/css/badge_only.css b/_build/html/v0.0.8/_static/css/badge_only.css new file mode 100644 index 000000000..88ba55b96 --- /dev/null +++ b/_build/html/v0.0.8/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Bold.woff b/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Regular.woff b/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.eot b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.svg b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.ttf b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.woff b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.woff2 b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_build/html/v0.0.8/_static/css/fonts/lato-bold-italic.woff b/_build/html/v0.0.8/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_build/html/v0.0.8/_static/css/fonts/lato-bold-italic.woff2 b/_build/html/v0.0.8/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_build/html/v0.0.8/_static/css/fonts/lato-bold.woff b/_build/html/v0.0.8/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/lato-bold.woff differ diff --git a/_build/html/v0.0.8/_static/css/fonts/lato-bold.woff2 b/_build/html/v0.0.8/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/lato-bold.woff2 differ diff --git a/_build/html/v0.0.8/_static/css/fonts/lato-normal-italic.woff b/_build/html/v0.0.8/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_build/html/v0.0.8/_static/css/fonts/lato-normal-italic.woff2 b/_build/html/v0.0.8/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_build/html/v0.0.8/_static/css/fonts/lato-normal.woff b/_build/html/v0.0.8/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/lato-normal.woff differ diff --git a/_build/html/v0.0.8/_static/css/fonts/lato-normal.woff2 b/_build/html/v0.0.8/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.8/_static/css/fonts/lato-normal.woff2 differ diff --git a/_build/html/v0.0.8/_static/css/theme.css b/_build/html/v0.0.8/_static/css/theme.css new file mode 100644 index 000000000..0f14f1064 --- /dev/null +++ b/_build/html/v0.0.8/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_build/html/v0.0.8/_static/doctools.js b/_build/html/v0.0.8/_static/doctools.js new file mode 100644 index 000000000..0398ebb9f --- /dev/null +++ b/_build/html/v0.0.8/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + 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; + }, + + /** + * 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; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + 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; + } + } + + // 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/_build/html/v0.0.8/_static/documentation_options.js b/_build/html/v0.0.8/_static/documentation_options.js new file mode 100644 index 000000000..28cc46fe3 --- /dev/null +++ b/_build/html/v0.0.8/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.0.8', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_build/html/v0.0.8/_static/file.png b/_build/html/v0.0.8/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_build/html/v0.0.8/_static/file.png differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.eot b/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.eot differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.ttf b/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.ttf differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.woff b/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.woff differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.woff2 b/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.eot b/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.ttf b/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.woff b/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.woff2 b/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.eot b/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.eot differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.ttf b/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.ttf differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.woff b/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.woff differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.woff2 b/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.eot b/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.eot differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.ttf b/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.ttf differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.woff b/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.woff differ diff --git a/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.woff2 b/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.8/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/_build/html/v0.0.8/_static/jquery.js b/_build/html/v0.0.8/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/_build/html/v0.0.8/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/_build/html/v0.0.8/_static/language_data.js b/_build/html/v0.0.8/_static/language_data.js new file mode 100644 index 000000000..c7fe6c6fa --- /dev/null +++ b/_build/html/v0.0.8/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_build/html/v0.0.8/_static/minus.png b/_build/html/v0.0.8/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/_build/html/v0.0.8/_static/minus.png differ diff --git a/_build/html/v0.0.8/_static/plus.png b/_build/html/v0.0.8/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/_build/html/v0.0.8/_static/plus.png differ diff --git a/_build/html/v0.0.8/_static/pygments.css b/_build/html/v0.0.8/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/_build/html/v0.0.8/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_build/html/v0.0.8/_static/searchtools.js b/_build/html/v0.0.8/_static/searchtools.js new file mode 100644 index 000000000..2c774d17a --- /dev/null +++ b/_build/html/v0.0.8/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_build/html/v0.0.8/_static/sphinx_highlight.js b/_build/html/v0.0.8/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/_build/html/v0.0.8/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * 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))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + 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 SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + 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")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_build/html/v0.0.8/acknowledgements.html b/_build/html/v0.0.8/acknowledgements.html new file mode 100644 index 000000000..86825add2 --- /dev/null +++ b/_build/html/v0.0.8/acknowledgements.html @@ -0,0 +1,139 @@ + + + + + + + + + Acknowledgements — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Acknowledgements

+

We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists.

+

We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/changelog.html b/_build/html/v0.0.8/changelog.html new file mode 100644 index 000000000..a0d6c428c --- /dev/null +++ b/_build/html/v0.0.8/changelog.html @@ -0,0 +1,699 @@ + + + + + + + + + Changelog — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Changelog

+
+

Version 0.0.8

+

stacked_crosstab_plot

+
    +
  • Flexible `save_formats` Input: +- save_formats now accepts a string, tuple, or list for specifying formats (e.g., “png”, (“png”, “svg”), or [“png”, “svg”]). +- Single strings or tuples are automatically converted to lists for consistent processing.

  • +
  • Dynamic Error Handling: +- Added checks to ensure a valid path is provided for each format in save_formats. +- Raises a ValueError if a format is specified without a corresponding path, with a clear, dynamic error message.

  • +
  • Improved Plot Saving Logic: +- Updated logic allows saving plots in one format (e.g., only “png” or “svg”) without requiring the other. +- Simplified and more intuitive path handling for saving plots.

  • +
+

plot_3d_pdp

+

This update introduces several key changes to the plot_3d_pdp function, simplifying the function’s interface and improving usability, while maintaining the flexibility needed for diverse visualization needs.

+

1. Parameter Changes

+
    +
  • Removed Parameters:

    +
      +
    • The parameters x_label_plotly, y_label_plotly, and z_label_plotly have been removed. These parameters previously allowed custom axis labels specifically for the Plotly plot, defaulting to the general x_label, y_label, and z_label. Removing these parameters simplifies the function signature while maintaining flexibility.

    • +
    +
  • +
  • Default Values for Labels:

    +
      +
    • The parameters x_label, y_label, and z_label are now optional, with None as the default. If not provided, these labels will automatically default to the names of the features in the feature_names_list. This change makes the function more user-friendly, particularly for cases where default labels are sufficient.

    • +
    +
  • +
  • Changes in Default Values for View Angles:

    +
      +
    • The default values for camera positioning parameters have been updated: horizontal is now -1.25, depth is now 1.25, and vertical is now 1.25. These adjustments refine the default 3D view perspective for the Plotly plot, providing a more intuitive starting view.

    • +
    +
  • +
+

2. Plot Generation Logic

+
    +
  • Conditionally Checking Labels:

    +
      +
    • The function now checks whether x_label, y_label, and z_label are provided. If these are None, the function will automatically assign default labels based on the feature_names_list. This enhancement reduces the need for users to manually specify labels, making the function more adaptive.

    • +
    +
  • +
  • Camera Position Adjustments:

    +
      +
    • The camera positions for the Plotly plot are now adjusted by multiplying horizontal, depth, and vertical by zoom_out_factor. This change allows for more granular control over the 3D view, enhancing the interactivity and flexibility of the Plotly visualizations.

    • +
    +
  • +
  • Surface Plot Coordinates Adjustments:

    +
      +
    • The order of the coordinates for the Plotly plot’s surface has been changed from ZZ, XX, YY[::-1] to ZZ, XX, YY. This adjustment ensures the proper alignment of axes and grids, resulting in more accurate visual representations.

    • +
    +
  • +
+

3. Code Simplifications

+
    +
  • Removed Complexity:

    +
      +
    • By removing the x_label_plotly, y_label_plotly, and z_label_plotly parameters, the code is now simpler and easier to maintain. This change reduces potential confusion and streamlines the function for users who do not need distinct labels for Matplotlib and Plotly plots.

    • +
    +
  • +
  • Fallback Mechanism for Grid Values:

    +
      +
    • The function continues to implement a fallback mechanism when extracting grid values, ensuring compatibility with various versions of scikit-learn. This makes the function robust across different environments.

    • +
    +
  • +
+

4. Style Adjustments

+
    +
  • Label Formatting:

    +
      +
    • The new version consistently uses y_label, x_label, and z_label for axis labels in the Matplotlib plot, aligning the formatting across different plot types.

    • +
    +
  • +
  • Color Bar Adjustments:

    +
      +
    • The color bar configuration in the Matplotlib plot has been slightly adjusted with a shrink value of 0.6 and a pad value of 0.02. These adjustments result in a more refined visual appearance, particularly in cases where space is limited.

    • +
    +
  • +
+

5. Potential Use Case Differences

+
    +
  • Simplified Interface:

    +
      +
    • The updated function is more streamlined for users who prefer a simplified interface without the need for separate label customizations for Plotly and Matplotlib plots. This makes it easier to use in common scenarios.

    • +
    +
  • +
  • Less Granular Control:

    +
      +
    • Users who need more granular control, particularly for presentations or specific formatting, may find the older version more suitable. The removal of the *_plotly label parameters means that all plots now use the same labels across Matplotlib and Plotly.

    • +
    +
  • +
+

6. Matplotlib Plot Adjustments

+
    +
  • Wireframe and Surface Plot Enhancements:

    +
      +
    • The logic for plotting wireframes and surface plots in Matplotlib remains consistent with previous versions, with subtle enhancements to color and layout management to improve overall aesthetics.

    • +
    +
  • +
+

Summary

+
    +
  • Version 0.0.8d of the plot_3d_pdp function introduces simplifications that reduce the number of parameters and streamline the plotting process. While some customizability has been removed, the function remains flexible enough for most use cases and is easier to use.

  • +
  • Key updates include adjusted default camera views for 3D plots, removal of Plotly-specific label parameters, and improved automatic labeling and plotting logic.

  • +
+

Decision Point

+
    +
  • This update may be especially useful for users who prefer a cleaner and more straightforward interface. However, those requiring detailed customizations may want to continue using the older version, depending on their specific needs.

  • +
+
+
+

Version 0.0.8c

+

Version 0.0.8c is a follow-up release to version 0.0.8b. This update includes minor enhancements and refinements based on feedback and additional testing. It serves as an incremental step towards improving the stability and functionality of the toolkit.

+

Key Updates in 0.0.8c:

+
    +
  • Bug Fixes: Addressed minor issues identified in version 0.0.8b to ensure smoother performance and better user experience.

  • +
  • Additional Testing: Incorporated further tests to validate the changes introduced in previous versions and to prepare for future stable releases.

  • +
  • Refinements: Made small enhancements to existing features based on user feedback and internal testing results.

  • +
+

Summary of Changes

+
    +
  1. New Features & Enhancements

  2. +
+
    +
  • plot_3d_pdp Function:

    +
      +
    • Added show_modebar Parameter: Introduced a new boolean parameter, show_modebar, to allow users to toggle the visibility of the mode bar in Plotly interactive plots.

    • +
    • Custom Margins and Layout Adjustments:

      +
        +
      • Added parameters for left_margin, right_margin, and top_margin to provide users with more control over the plot layout in Plotly.

      • +
      • Adjusted default values and added options for better customization of the Plotly color bar (cbar_x, cbar_thickness) and title positioning (title_x, title_y).

      • +
      +
    • +
    • Plotly Configuration:

      +
        +
      • Enhanced the configuration options to allow users to enable or disable zoom functionality (enable_zoom) in the interactive Plotly plots.

      • +
      • Updated the code to reflect these new parameters, allowing for greater flexibility in the appearance and interaction with the Plotly plots.

      • +
      +
    • +
    • Error Handling:

      +
        +
      • Added input validation for html_file_path and html_file_name to ensure these are provided when necessary based on the selected plot_type.

      • +
      +
    • +
    +
  • +
  • plot_2d_pdp Function:

    +
      +
    • Introduced file_prefix Parameter:

      +
        +
      • Added a new file_prefix parameter to allow users to specify a prefix for filenames when saving grid plots. This change streamlines the naming process for saved plots and improves file organization.

      • +
      +
    • +
    • Enhanced Plot Type Flexibility:

      +
        +
      • The plot_type parameter now includes an option to generate both grid and individual plots (both). This feature allows users to create a combination of both layout styles in one function call.

      • +
      • Updated input validation and logic to handle this new option effectively.

      • +
      +
    • +
    • Added save_plots Parameter:

      +
        +
      • Introduced a new parameter, save_plots, to control the saving of plots. Users can specify whether to save all plots, only individual plots, only grid plots, or none.

      • +
      +
    • +
    • Custom Margins and Layout Adjustments:

      +
        +
      • Included the save_plots parameter in the validation process to ensure paths are provided when needed for saving the plots.

      • +
      +
    • +
    +
  • +
+
    +
  1. Documentation Updates

  2. +
+
    +
  • Docstrings:

    +
      +
    • Updated docstrings for both functions to reflect the new parameters and enhancements, providing clearer and more comprehensive guidance for users.

    • +
    • Detailed the use of new parameters such as show_modebar, file_prefix, save_plots, and others, ensuring that the function documentation is up-to-date with the latest changes.

    • +
    +
  • +
+
    +
  1. Refactoring & Code Cleanup

  2. +
+
    +
  • Code Structure:

    +
      +
    • Improved the code structure to maintain clarity and readability, particularly around the new functionality.

    • +
    • Consolidated the layout configuration settings for the Plotly plots into a more flexible and user-friendly format, making it easier for users to customize their plots.

    • +
    +
  • +
+
+
+

Version 0.0.8b

+

Version 0.0.8b is an exact replica of version 0.0.8a. The purpose of this +beta release was to test whether releasing it as the latest version would update +its status on PyPI to reflect it as the latest release. However, it continues to +be identified as a pre-release on PyPI.

+
+
+

Version 0.0.8a

+

Version 0.0.8a introduces significant enhancements and new features to improve +the usability and functionality of the EDA Toolkit.

+

New Features:

+
    +
  1. Optional file_prefix in stacked_crosstab_plot Function

    +
      +
    • The stacked_crosstab_plot function has been updated to make the file_prefix argument optional. If the user does not provide a file_prefix, the function will now automatically generate a default prefix based on the col and func_col parameters. This change streamlines the process of generating plots by reducing the number of required arguments.

    • +
    • Key Improvement:

      +
        +
      • Users can now omit the file_prefix argument, and the function will still produce appropriately named plot files, enhancing ease of use.

      • +
      • Backward compatibility is maintained, allowing users who prefer to specify a custom file_prefix to continue doing so without any issues.

      • +
      +
    • +
    +
  2. +
  3. Introduction of 3D and 2D Partial Dependence Plot Functions

    +
      +
    • Two new functions, plot_3d_pdp and plot_2d_pdp, have been added to the toolkit, expanding the visualization capabilities for machine learning models.

      +
        +
      • plot_3d_pdp: Generates 3D partial dependence plots for two features, supporting both static visualizations (using Matplotlib) and interactive plots (using Plotly). The function offers extensive customization options, including labels, color maps, and saving formats.

      • +
      • plot_2d_pdp: Creates 2D partial dependence plots for specified features with flexible layout options (grid or individual plots) and customization of figure size, font size, and saving formats.

      • +
      +
    • +
    • Key Features:

      +
        +
      • Compatibility: Both functions are compatible with various versions of scikit-learn, ensuring broad usability.

      • +
      • Customization: Extensive options for customizing visual elements, including figure size, font size, and color maps.

      • +
      • Interactive 3D Plots: The plot_3d_pdp function supports interactive visualizations, providing an enhanced user experience for exploring model predictions in 3D space.

      • +
      +
    • +
    +
  4. +
+

Impact:

+
    +
  • These updates improve the user experience by reducing the complexity of function calls and introducing powerful new tools for model interpretation.

  • +
  • The optional file_prefix enhancement simplifies plot generation while maintaining the flexibility to define custom filenames.

  • +
  • The new partial dependence plot functions offer robust visualization options, making it easier to analyze and interpret the influence of specific features in machine learning models.

  • +
+
+
+

Version 0.0.7

+

Added Function for Customizable Correlation Matrix Visualization

+

This release introduces a new function, flex_corr_matrix, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to seaborn.heatmap().

+

Summary of Changes

+
    +
  • New Function: flex_corr_matrix.

    +
      +
    • Functionality: +- Generates a correlation heatmap for a given DataFrame. +- Supports both full and upper triangular correlation matrices based on the triangular parameter. +- Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. +- Accepts additional keyword arguments via **kwargs to pass directly to seaborn.heatmap(). +- Includes validation to ensure the triangular, annot, and save_plots parameters are boolean values. +- Raises an exception if save_plots=True but neither image_path_png nor image_path_svg is specified.

    • +
    +
  • +
+

Usage

+
# Full correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True)
+
+# Upper triangular correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True)
+
+
+

Contingency table df to object type

+

Convert all columns in the DataFrame to object type to prevent issues with numerical columns.

+
df = df.astype(str).fillna("")
+
+
+
+
+

Version 0.0.6

+

Added validation for Plot Type Parameter in KDE Distributions Function

+

This release adds a validation step for the plot_type parameter in the kde_distributions function. The allowed values for plot_type are "hist", "kde", and "both". If an invalid value is provided, the function will now raise a ValueError with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values.

+
# Validate plot_type parameter
+valid_plot_types = ["hist", "kde", "both"]
+if plot_type.lower() not in valid_plot_types:
+    raise ValueError(
+        f"Invalid plot_type value. Expected one of {valid_plot_types}, "
+        f"got '{plot_type}' instead."
+    )
+
+
+
+
+

Version 0.0.5

+

Ensure Consistent Font Size and Text Wrapping Across Plot Elements

+

This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the stacked_crosstab_plot function. The following updates have been implemented to ensure uniformity and improve the readability of plots:

+
    +
  1. Title Font Size and Text Wrapping: +- Added a text_wrap parameter to control the wrapping of plot titles. +- Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ax.set_title() after plot generation.

  2. +
  3. Legend Font Size Consistency: +- Incorporated label_fontsize into the legend font size by directly setting the font size of the legend text using plt.setp(legend.get_texts(), fontsize=label_fontsize). +- This ensures that the legend labels are consistent with the title and axis labels.

  4. +
+

Testing

+
    +
  • Verified that titles now wrap correctly and match the specified label_fontsize.

  • +
  • Confirmed that legend text scales according to label_fontsize, ensuring consistent font sizes across all plot elements.

  • +
+
+
+

Version 0.0.4

+
    +
  • Stable release

    +
      +
    • No new updates to the codebase.

    • +
    • Updated the project description variable in setup.py to re-emphasize key elements of the library.

    • +
    • Minor README cleanup:

      +
        +
      • Added icons for sections that did not have them.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.3

+
    +
  • Stable release

    +
      +
    • Updated logo size, fixed citation title, and made minor README cleanup:

      +
        +
      • Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.2

+
    +
  • +
    First stable release
      +
    • No new updates to the codebase; minimal documentation updates to README and setup.py files.

    • +
    • Added logo, badges, and Zenodo-certified citation to README.

    • +
    +
    +
    +
  • +
+
+
+

Version 0.0.1rc0

+
    +
  • No new updates to the codebase; minimal documentation updates to README and setup.py files.

  • +
+
+
+

Version 0.0.1b0

+

New Scatter Fit Plot and Additional Updates

+
    +
  • Added new scatter_fit_plot(), removed unused data_types(), and added comment section headers.

  • +
+

Added xlim and ylim Inputs to KDE Distribution

+
    +
  • kde_distribution():

    +
    +
      +
    • Added xlim and ylim inputs to allow users to customize axes limits in kde_distribution().

    • +
    +
    +
  • +
+

Added xlim and ylim Params to Stacked Crosstab Plot

+
    +
  • stacked_crosstab_plot():

    +
    +
      +
    • Added xlim and ylim input parameters to stacked_crosstab_plot() to give users more flexibility in controlling axes limits.

    • +
    +
    +
  • +
+

Added x and y Limits to Box and Violin Plots

+
    +
  • box_violin_plot():

    +
    +
      +
    • Changed function name from metrics_box_violin() to box_violin_plot().

    • +
    • Added xlim and ylim inputs to control x and y-axis limits of box_violin_plot() (formerly metrics_box_violin).

    • +
    +
    +
  • +
+

Added Ability to Remove Stacks from Plots, Plot All or One at a Time

+

Key Changes

+
    +
  1. Plot Type Parameter +- plot_type: This parameter allows the user to choose between "regular", "normalized", or "both" plot types.

  2. +
  3. Remove Stacks Parameter +- remove_stacks: This parameter, when set to True, generates a regular bar plot using only the col parameter instead of a stacked bar plot. It only works when plot_type is set to “regular”. If remove_stacks is set to True while plot_type is anything other than “regular”, the function will raise an exception.

  4. +
+

Explanation of Changes

+
    +
  • Plot Type Parameter

    +
      +
    • Provides flexibility to the user, allowing specification of the type of plot to generate:

      +
        +
      • "regular": Standard bar plot.

      • +
      • "normalized": Normalized bar plot.

      • +
      • "both": Both regular and normalized bar plots.

      • +
      +
    • +
    +
  • +
  • Remove Stacks Parameter +- remove_stacks: Generates a regular bar plot using only the col parameter, removing the stacking of the bars. Applicable only when plot_type is set to “regular”. An exception is raised if used with any other plot_type.

  • +
+

These changes enhance the flexibility and functionality of the stacked_crosstab_plot function, allowing for more customizable and specific plot generation based on user requirements.

+
+
+

Version 0.0.1b0

+

Refined KDE Distributions

+

Key Changes

+
    +
  1. Alpha Transparency for Histogram Fill +- Added a fill_alpha parameter to control the transparency of the histogram bars’ fill color. +- Default value is 0.6. An exception is raised if fill=False and fill_alpha is specified.

  2. +
  3. Custom Font Sizes +- Introduced label_fontsize and tick_fontsize parameters to control font size of axis labels and tick marks independently.

  4. +
  5. Scientific Notation Toggle +- Added a disable_sci_notation parameter to enable or disable scientific notation on axes.

  6. +
  7. Improved Error Handling +- Added validation for the stat parameter to ensure valid options are accepted. +- Added checks for proper usage of fill_alpha and hist_edgecolor when fill is set to False.

  8. +
  9. General Enhancements +- Updated the function’s docstring to reflect new parameters and provide comprehensive guidance on usage.

  10. +
+
+
+

Version 0.0.1b0

+

Enhanced KDE Distributions Function

+

Added Parameters

+
    +
  1. Grid Figsize and Single Figsize +- Control the size of the overall grid figure and individual figures separately.

  2. +
  3. Hist Color and KDE Color` +- Allow customization of histogram and KDE plot colors.

  4. +
  5. Edge Color +- Allows customization of histogram bar edges.

  6. +
  7. Hue +- Allows grouping data by a column.

  8. +
  9. Fill +- Controls whether to fill histogram bars with color.

  10. +
  11. Y-axis Label` +- Customizable y-axis label.

  12. +
  13. Log-Scaling +- Specifies which variables to apply log scale.

  14. +
  15. Bins and Bin Width +- Control the number and width of bins.

  16. +
  17. ``stat``: +- Allows different statistics for the histogram (count, density, frequency, probability, proportion, percent).

  18. +
+

Improvements

+
    +
  1. Validation and Error Handling +- Checks for invalid log_scale_vars and throws a ValueError if any are found. +- Throws a ValueError if edgecolor is changed while fill is set to False. +- Issues a PerformanceWarning if both bins and binwidth are specified, warning of potential performance impacts.

  2. +
  3. Customizable Y-Axis Label +- Allows users to specify custom y-axis labels.

  4. +
  5. Warning for KDE with Count +- Issues a warning if KDE is used with stat='count', as it may produce misleading plots.

  6. +
+

Updated Function to Ensure Unique IDs and Index Check

+
    +
  • Ensured that each generated ID in add_ids starts with a non-zero digit.

  • +
  • Added a check to verify that the DataFrame index is unique.

  • +
  • Printed a warning message if duplicate index entries are found.

  • +
+

These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique.

+

Check for Unique Indices +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries.

+

Generate Non-Zero Starting IDs

+
    +
  • The ID generation process is updated to ensure that the first digit of each ID is always non-zero.

  • +
+

Ensure Unique IDs

+
    +
  • A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame.

  • +
+

Fix Int Conversion for Numeric Columns, Reset Decimal Places

+
    +
  • Fixed integer conversion issue for numeric columns when decimal_places=0 in the save_dataframes_to_excel function.

  • +
  • Reset decimal_places default value to 0.

  • +
+

These changes ensure correct formatting and avoid errors during conversion.

+

Contingency Table Updates

+
    +
  1. Error Handling for Columns +- Added a check to ensure at least one column is specified. +- Updated the function to accept a single column as a string or multiple columns as a list. +- Raised a ValueError if no columns are provided or if cols is not correctly specified.

  2. +
  3. Function Parameters +- Changed parameters from col1 and col2 to a single parameter cols which can be either a string or a list.

  4. +
  5. Error Handling +- Renamed SortBy to sort_by to standardize nomenclature. +- Added a check to ensure sort_by is either 0 or 1. +- Raised a ValueError if sort_by is not 0 or 1.

  6. +
+
    +
  1. Sorting Logic +- Updated the sorting logic to handle the new cols parameter structure.

  2. +
  3. Handling Categorical Data +- Modified code to convert categorical columns to strings to avoid issues with fillna("").

  4. +
  5. Handling Missing Values +- Added df = df.fillna('') to fill NA values within the function to account for missing data.

  6. +
  7. Improved Function Documentation +- Updated function documentation to reflect new parameters and error handling.

  8. +
+
+
+

Version 0.0.1b0

+

Contingency Table Updates

+
    +
  • fillna('') added to output so that null values come through, removed 'All' column name from output, sort options 0 and 1, updated docstring documentation. Tested successfully on Python 3.7.3.

  • +
+

Compatibility Enhancement

+
    +
  1. Added a version check for Python 3.7 and above.

    +
      +
    • Conditional import of datetime to handle different Python versions.

    • +
    +
  2. +
+
if sys.version_info >= (3, 7):
+    from datetime import datetime
+else:
+    import datetime
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/citations.html b/_build/html/v0.0.8/citations.html new file mode 100644 index 000000000..baf1f1e8e --- /dev/null +++ b/_build/html/v0.0.8/citations.html @@ -0,0 +1,151 @@ + + + + + + + + + Citing EDA Toolkit — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Citing EDA Toolkit

+

Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.8). Zenodo. https://doi.org/10.5281/zenodo.13163208

+
@software{shpaner_2024_13162633,
+author       = {Shpaner, Leonid and
+                Gil, Oscar},
+title        = {EDA Toolkit},
+month        = aug,
+year         = 2024,
+publisher    = {Zenodo},
+version      = {0.0.8},
+doi          = {10.5281/zenodo.13162633},
+url          = {https://doi.org/10.5281/zenodo.13162633}
+}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/contributors.html b/_build/html/v0.0.8/contributors.html new file mode 100644 index 000000000..c8dee2b26 --- /dev/null +++ b/_build/html/v0.0.8/contributors.html @@ -0,0 +1,143 @@ + + + + + + + + + Contributors/Maintainers — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Contributors/Maintainers

+
https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + +

Leonid Shpaner is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego’s M.S. Applied Artificial Intelligence program.

+


https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + +

Oscar Gil is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/genindex.html b/_build/html/v0.0.8/genindex.html new file mode 100644 index 000000000..f094db961 --- /dev/null +++ b/_build/html/v0.0.8/genindex.html @@ -0,0 +1,354 @@ + + + + + + + + Index — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | H + | K + | P + | S + +
+

A

+ + +
+ +

B

+ + +
+ +

C

+ + +
+ +

D

+ + +
+ +

E

+ + +
+ +

F

+ + +
+ +

H

+ + +
+ +

K

+ + +
+ +

P

+ + + +
+ +

S

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/getting_started.html b/_build/html/v0.0.8/getting_started.html new file mode 100644 index 000000000..29db2a46f --- /dev/null +++ b/_build/html/v0.0.8/getting_started.html @@ -0,0 +1,228 @@ + + + + + + + + + Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Welcome to the EDA Toolkit Python Library Documentation!

+
+

Note

+

This documentation is for eda_toolkit version 0.0.8.

+
+

The eda_toolkit is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data.

+ +
+

What is EDA?

+

Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data.

+
+
+

Purpose of EDA Toolkit

+

The eda_toolkit library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including:

+
    +
  • Data Management: Tools for managing directories, generating unique IDs, +standardizing dates, and handling common DataFrame manipulations.

  • +
  • Data Cleaning: Functions to address missing values, remove outliers, and +correct formatting issues, ensuring data is ready for analysis.

  • +
  • Data Visualization: A variety of plotting functions, including KDE +distribution plots, stacked bar plots, scatter plots with optional best fit +lines, and box/violin plots, to visually explore data distributions, +relationships, and trends.

  • +
  • Descriptive and Summary Statistics: Methods to generate comprehensive +reports on data types, summary statistics (mean, median, standard deviation, +etc.), and to summarize all possible combinations of specified variables.

  • +
  • Reporting and Export: Features to save DataFrames to Excel with +customizable formatting, create contingency tables, and export generated +plots in multiple formats.

  • +
+
+
+

Key Features

+
    +
  • Ease of Use: The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions.

  • +
  • Customizable: Users can customize various aspects of the toolkit to fit their specific needs.

  • +
  • Integration: Seamlessly integrates with popular data science libraries such as Pandas, NumPy, Matplotlib, and Seaborn.

  • +
  • Documentation and Examples: Comprehensive documentation and examples to help users get started quickly and effectively.

  • +
+
+
+

Prerequisites

+

Before you install eda_toolkit, ensure your system meets the following requirements:

+
    +
  • Python: version 3.7.4 or higher is required to run eda_toolkit.

  • +
+

Additionally, eda_toolkit depends on the following packages, which will be automatically installed when you install eda_toolkit:

+
    +
  • jinja2: version 3.1.4 or higher

  • +
  • matplotlib: version 3.5.3 or higher

  • +
  • nbformat: version 4.2.0 or higher

  • +
  • numpy: version 1.21.6 or higher

  • +
  • pandas: version 1.3.5 or higher

  • +
  • plotly: version 5.18.0 or higher

  • +
  • scikit-learn: version 1.0.2 or higher

  • +
  • seaborn: version 0.12.2 or higher

  • +
  • xlsxwriter: version 3.2.0 or higher

  • +
+
+
+

Installation

+

You can install eda_toolkit directly from PyPI:

+
pip install eda_toolkit
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/index.html b/_build/html/v0.0.8/index.html new file mode 100644 index 000000000..3063ad1cb --- /dev/null +++ b/_build/html/v0.0.8/index.html @@ -0,0 +1,283 @@ + + + + + + + + + Table of Contents — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Table of Contents

+ +
+

Usage Guide

+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/objects.inv b/_build/html/v0.0.8/objects.inv new file mode 100644 index 000000000..ad16705b8 --- /dev/null +++ b/_build/html/v0.0.8/objects.inv @@ -0,0 +1,8 @@ +# Sphinx inventory version 2 +# Project: EDA Toolkit +# Version: +# The remainder of this file is compressed using zlib. +xڕTMo0 Whh[0`,16Y$MG[Nb) O||1M~;M蝸}T5ȺGjͭ(3zNvSE{Gjp(IUrHFՂ +\H4p,X#* +x4X7?zOp{3DY,RBd"/H }^Fv6mTP%4,VD){")#u;;IA!l-;Mo[/He-wЩqοX05(Hx-;Ya^waUE~Izlf}=̐O +!vq[;%y%3pXڞ$}8% I@`7X50UP6^C r|*4'FY\rB4_8:fZ;grE.J cyH + O bv(f#;z`ΜŔ]y_j+JZnv Kn-StK^L%J׶bQ漭0e,3 \ No newline at end of file diff --git a/_build/html/v0.0.8/references.html b/_build/html/v0.0.8/references.html new file mode 100644 index 000000000..19edfb6d0 --- /dev/null +++ b/_build/html/v0.0.8/references.html @@ -0,0 +1,141 @@ + + + + + + + + + References — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

References

+
    +
  1. Hunter, J. D. (2007). Matplotlib: A 2D Graphics Environment. Computing in Science & Engineering, 9(3), 90-95. https://doi.org/10.1109/MCSE.2007.55.

  2. +
  3. Kohavi, R. (1996). Census Income. UCI Machine Learning Repository. https://doi.org/10.24432/C5GP7S.

  4. +
  5. Waskom, M. (2021). Seaborn: Statistical Data Visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021.

  6. +
  7. Pace, R. K., & Barry, R. (1997). Sparse Spatial Autoregressions. Statistics & Probability Letters, 33(3), 291-297. https://doi.org/10.1016/S0167-7152(96)00140-X.

  8. +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/search.html b/_build/html/v0.0.8/search.html new file mode 100644 index 000000000..b68c63c87 --- /dev/null +++ b/_build/html/v0.0.8/search.html @@ -0,0 +1,146 @@ + + + + + + + + Search — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/_build/html/v0.0.8/searchindex.js b/_build/html/v0.0.8/searchindex.js new file mode 100644 index 000000000..0fc755692 --- /dev/null +++ b/_build/html/v0.0.8/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[7, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[7, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[7, "id21"]], "3D Plots - CA Housing Example": [[7, "id22"]], "About EDA Toolkit": [[5, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[7, "adding-unique-identifiers"]], "Binning Numerical Columns": [[7, "binning-numerical-columns"]], "Box Plots Grid Example": [[7, "box-plots-grid-example"]], "Box and Violin Plots": [[7, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[7, "correlation-matrices"]], "Creating Contingency Tables": [[7, "creating-contingency-tables"]], "Data Preparation and Management": [[7, "data-preparation-and-management"]], "DataFrame Analysis": [[7, "dataframe-analysis"]], "Description": [[7, null]], "Full Correlation Matrix Example": [[7, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[7, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[7, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[5, null]], "Highlighting Specific Columns in a DataFrame": [[7, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[7, "histogram-example-count"]], "Histogram Example (Density)": [[7, "histogram-example-density"]], "Histograms and KDE": [[7, "histograms-and-kde"]], "Installation": [[4, "installation"]], "Interactive Plot": [[7, "interactive-plot"]], "KDE Distribution Function": [[7, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[7, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[7, "kde-and-histograms-example"]], "Key Features": [[4, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[7, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Plots": [[7, "partial-dependence-plots"]], "Path directories": [[7, "path-directories"]], "Pearson Correlation Coefficient": [[7, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[7, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[7, "pivoted-violin-plots-grid-example"]], "Prerequisites": [[4, "prerequisites"]], "Project Links": [[4, "project-links"]], "Purpose of EDA Toolkit": [[4, "purpose-of-eda-toolkit"]], "References": [[6, null]], "Regression-Centric Scatter Plots Example": [[7, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[7, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[7, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[7, "scatter-fit-plot"]], "Scatter Plots Grouped by Category Example": [[7, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[7, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[7, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[7, "stacked-crosstab-plots"]], "Standardized Dates": [[7, "standardized-dates"]], "Static Plot": [[7, "static-plot"]], "Table of Contents": [[5, null]], "Theoretical Foundation of PDPs": [[7, "theoretical-foundation-of-pdps"]], "Trailing Period Removal": [[7, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[7, "triangular-correlation-matrix-example"]], "Usage Guide": [[5, null]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id2"], [1, "id3"], [1, "id4"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Violin Plots Grid Example": [[7, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[4, null]], "What is EDA?": [[4, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "getting_started", "index", "references", "usage_guide"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "getting_started.rst", "index.rst", "references.rst", "usage_guide.rst"], "indexentries": {"add_ids()": [[7, "add_ids", false]], "box_violin_plot()": [[7, "box_violin_plot", false]], "built-in function": [[7, "add_ids", false], [7, "box_violin_plot", false], [7, "contingency_table", false], [7, "dataframe_columns", false], [7, "ensure_directory", false], [7, "flex_corr_matrix", false], [7, "highlight_columns", false], [7, "kde_distributions", false], [7, "parse_date_with_rule", false], [7, "plot_2d_pdp", false], [7, "plot_3d_pdp", false], [7, "save_dataframes_to_excel", false], [7, "scatter_fit_plot", false], [7, "stacked_crosstab_plot", false], [7, "strip_trailing_period", false], [7, "summarize_all_combinations", false]], "contingency_table()": [[7, "contingency_table", false]], "dataframe_columns()": [[7, "dataframe_columns", false]], "ensure_directory()": [[7, "ensure_directory", false]], "flex_corr_matrix()": [[7, "flex_corr_matrix", false]], "highlight_columns()": [[7, "highlight_columns", false]], "kde_distributions()": [[7, "kde_distributions", false]], "parse_date_with_rule()": [[7, "parse_date_with_rule", false]], "plot_2d_pdp()": [[7, "plot_2d_pdp", false]], "plot_3d_pdp()": [[7, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[7, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[7, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[7, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[7, "strip_trailing_period", false]], "summarize_all_combinations()": [[7, "summarize_all_combinations", false]]}, "objects": {"": [[7, 0, 1, "", "add_ids"], [7, 0, 1, "", "box_violin_plot"], [7, 0, 1, "", "contingency_table"], [7, 0, 1, "", "dataframe_columns"], [7, 0, 1, "", "ensure_directory"], [7, 0, 1, "", "flex_corr_matrix"], [7, 0, 1, "", "highlight_columns"], [7, 0, 1, "", "kde_distributions"], [7, 0, 1, "", "parse_date_with_rule"], [7, 0, 1, "", "plot_2d_pdp"], [7, 0, 1, "", "plot_3d_pdp"], [7, 0, 1, "", "save_dataframes_to_excel"], [7, 0, 1, "", "scatter_fit_plot"], [7, 0, 1, "", "stacked_crosstab_plot"], [7, 0, 1, "", "strip_trailing_period"], [7, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 7], "0": [2, 4, 5, 7], "00": 7, "000000": 7, "0000ff": 7, "00140": [6, 7], "00bfc4": 7, "01": 7, "02": [1, 7], "03021": [6, 7], "04": 7, "05": 7, "07": 7, "09": 7, "1": [1, 4, 7], "10": [2, 6, 7], "100": 7, "1016": [6, 7], "10724": 7, "11": 7, "1109": [6, 7], "111": 7, "115": 7, "11687": 7, "11th": 7, "12": [4, 7], "120": 7, "12202842": 7, "123": 7, "12929": 7, "13": 7, "131": 7, "13162633": 2, "13163208": 2, "13174": 7, "1348": 7, "13920": 7, "14": 7, "147": 7, "14x4": 7, "15": 7, "150": 7, "15784": 7, "16": 7, "16192": 7, "17": 7, "18": [4, 7], "1873": 7, "19716": 7, "1994": 7, "1996": [6, 7], "1997": [6, 7], "1b0": 5, "1d": 7, "1rc0": 5, "2": [4, 5, 7], "20": 7, "200": 7, "2007": [6, 7], "2020": 7, "2021": [6, 7], "2022": 7, "2024": 2, "203488": 7, "21": [4, 7], "21105": [6, 7], "2115": 7, "215646": 7, "22": 7, "22379": 7, "2245": 7, "22803": 7, "23": 7, "234721": 7, "24432": [6, 7], "24720": 7, "25": [1, 7], "250": 7, "2509": 7, "2565": 7, "26": 7, "27": 7, "274": 7, "28": 7, "280": 7, "28523": 7, "29": 7, "291": [6, 7], "295": 7, "297": [6, 7], "2d": [1, 5, 6], "3": [4, 5, 6, 7], "30": 7, "300": 7, "3021": [6, 7], "3054": 7, "31": 7, "3188": 7, "32": 7, "32650": 7, "33": [6, 7], "333333": 7, "338409": 7, "33906": 7, "34": 7, "3461": 7, "35130194": 7, "36": 7, "3680": 7, "37": 7, "37155": 7, "38": 7, "3853": 7, "39": 7, "3986": 7, "3d": [1, 5], "3d_pdp": 7, "4": [4, 5, 7], "40": 7, "41": 7, "4110": 7, "41762": 7, "42": 7, "42643227": 7, "4267": 7, "43832": 7, "44807": 7, "45": 7, "46": 7, "46560": 7, "467": 7, "468": 7, "469": 7, "47": 7, "470": 7, "471": 7, "472": 7, "4746": 7, "48842": 7, "49": 7, "5": [4, 5, 7], "50": 7, "50k": 7, "50k_": 7, "51": 7, "5281": 2, "53": 7, "535": 7, "55": [6, 7], "56": 7, "5623": 7, "5707": 7, "58": 7, "5856": 7, "59": 7, "595": 7, "6": [4, 5, 6, 7], "60": [6, 7], "61": 7, "6172": 7, "62": 7, "64": 7, "65": 7, "66": 7, "6619": 7, "668": 7, "6738": 7, "68": 7, "69": 7, "7": [4, 5, 7], "70": 7, "71": 7, "7152": [6, 7], "73": 7, "74": 7, "74130842": 7, "746": 7, "75": 7, "7536": 7, "76": 7, "77": 7, "77516": 7, "79": 7, "8": [2, 4, 5, 7], "80": 7, "808080": 7, "809": 7, "81": 7, "815": 7, "82": 7, "8213": 7, "82943611": 7, "83": 7, "83311": 7, "85": 7, "8601": 7, "861555": 7, "87": 7, "87104229": 7, "89": 7, "8a": 5, "8b": 5, "8c": 5, "8d": 1, "9": [6, 7], "90": [6, 7], "90069867": 7, "9076": 7, "91": 7, "93": 7, "93837254": 7, "939": 7, "94": 7, "9468": 7, "95": [6, 7], "96": [6, 7], "96078789": 7, "963": 7, "966": 7, "97": 7, "97751875": 7, "98": 7, "99": 7, "A": [1, 4, 6, 7], "As": 7, "By": [1, 7], "For": 7, "If": [1, 7], "In": 7, "Into": 7, "It": [1, 4, 7], "No": [1, 7], "Not": 7, "One": 1, "The": [1, 4, 7], "Then": 7, "There": 7, "These": [1, 7], "To": 7, "With": [3, 5], "_": 7, "_c": 7, "_plotli": 1, "abil": [1, 7], "abl": 7, "about": 7, "abov": [1, 7], "academ": 0, "accept": 1, "access": 7, "accord": [1, 7], "accordingli": 7, "account": 1, "accur": [1, 7], "acknowledg": [1, 5], "across": [1, 7], "actual": 7, "ad": [1, 5], "adapt": [1, 7], "add": [1, 7], "add_best_fit_lin": 7, "add_id": [1, 5, 7], "addit": [1, 7], "addition": [4, 7], "address": [1, 4], "adher": 7, "adjust": [1, 7], "adm": 7, "aesthet": [1, 7], "affect": 7, "after": [1, 7], "ag": 7, "against": 7, "age_boxplot_list": 7, "age_group": 7, "ages_18_to_40": 7, "aggreg": 7, "alic": 7, "align": [1, 7], "all": [1, 4, 7], "all_combin": 7, "allow": [1, 7], "alon": 7, "along": [1, 7], "alpha": [1, 7], "alreadi": 7, "also": [0, 7], "altern": 7, "alwai": [1, 7], "amount": 7, "an": [0, 1, 3, 7], "analysi": [4, 5], "analyst": 4, "analyt": 3, "analyz": [1, 7], "angl": [1, 7], "ani": [1, 4, 7], "annot": [1, 7], "anomali": 4, "anoth": 7, "anyth": 1, "appar": 7, "appear": [1, 7], "append": 7, "appli": [0, 1, 3, 4, 7], "applic": [1, 7], "approach": 7, "appropri": [1, 7], "approxim": 7, "ar": [1, 7], "area": 7, "argument": [1, 7], "around": [1, 7], "arrai": 7, "arrang": 7, "arrow": 7, "artifact": 7, "artifici": 3, "asian": 7, "aspect": [1, 4], "assess": 7, "assign": [1, 7], "associ": [4, 7], "assum": 7, "assumpt": 5, "astyp": 1, "attempt": 7, "attent": 7, "attract": 7, "attribut": 7, "aug": 2, "author": [2, 3], "auto": 7, "autofit": 7, "autom": [3, 4], "automat": [1, 4, 7], "autoregress": [6, 7], "avail": 7, "aveoccup": 7, "averag": 7, "averoom": 7, "avoid": [1, 7], "ax": [1, 7], "axi": [1, 7], "azimuth": 7, "bachelor": 7, "back": 7, "background": 7, "backward": 1, "badg": 1, "bandwidth": 7, "bar": [1, 4, 5], "barh": 7, "barri": [6, 7], "base": [1, 7], "base_path": 7, "bbox_inch": 7, "becaus": 7, "been": [1, 7], "befor": [1, 4, 7], "begin": 7, "behavior": 7, "being": 7, "bell": 7, "below": 7, "beneath": 7, "benefici": 7, "best": [4, 5], "best_fit_linecolor": 7, "best_fit_linestyl": 7, "beta": 1, "better": [1, 4, 7], "between": [1, 7], "bin": [1, 5], "bin_ag": 7, "binrang": 7, "binwidth": [1, 7], "black": 7, "block": 7, "bob": 7, "bold": 7, "bool": 7, "boolean": [1, 7], "border": 7, "both": [1, 7], "bound": 7, "boundari": 7, "box": [1, 4, 5], "box_violin_plot": [1, 5, 7], "boxplot": 7, "breakdown": 7, "bring": 3, "broad": [1, 4], "brown": 7, "browser": 7, "bug": 1, "built": 7, "c0": 7, "c5gp7": [6, 7], "c_i": 7, "ca": 5, "calcul": 7, "california": [3, 7], "call": [1, 7], "camera": [1, 7], "can": [1, 4, 7], "cancer": 7, "cannot": 7, "capabl": 1, "capit": 7, "captur": 7, "career": 0, "case": [1, 7], "categor": [1, 7], "categori": 5, "cbar_label": 7, "cbar_thick": [1, 7], "cbar_x": [1, 7], "cdot": 7, "cell": 7, "censu": [6, 7], "census_id": 7, "census_summary_t": 7, "center_baselin": 7, "centric": 5, "certain": 7, "certifi": 1, "cervic": 7, "chang": [1, 7], "changelog": 5, "charact": 7, "characterist": 4, "charli": 7, "check": [1, 7], "choos": [1, 7], "circl": 7, "citat": 1, "cite": 5, "civ": 7, "clariti": [1, 7], "clean": [1, 4, 7], "cleaner": [1, 7], "cleanup": 1, "clear": [1, 7], "clearer": 1, "cleric": 7, "closer": 7, "clutter": 7, "cmap": [1, 7], "code": [1, 7], "codebas": 1, "coeffici": 5, "cohes": 7, "col": [1, 7], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 7], "colorbar": 7, "colormap": [1, 7], "column": [1, 5], "column_nam": 7, "combin": [1, 4, 5], "come": 1, "comment": 1, "common": [1, 4, 7], "compar": 7, "comparison": 7, "compat": [1, 7], "complement": 7, "complementari": 7, "complet": 7, "complex": [1, 7], "comprehens": [1, 4, 7], "comput": [6, 7], "concept": 7, "condit": 1, "condition": 1, "configur": [1, 7], "confirm": 1, "confus": [1, 7], "consecut": 7, "consid": 7, "consist": [1, 7], "consolid": 1, "constant": 7, "contain": 7, "content": 7, "context": 7, "conting": [1, 4, 5], "contingency_t": [5, 7], "continu": [1, 7], "contour": 7, "contrast": 7, "contributor": 5, "control": [1, 7], "convers": [1, 7], "convert": [1, 7], "coolwarm": [1, 7], "coordin": 1, "cornel": 3, "correct": [1, 4, 7], "correctli": [1, 7], "correl": [1, 5], "correspond": [1, 7], "count": [1, 5], "countri": 7, "cours": 3, "cov": 7, "covari": 7, "creat": [1, 4, 5], "creation": 7, "crop": 7, "crosstab": [1, 5], "crosstab_age_incom": 7, "crosstab_age_sex": 7, "crosstabs_dict": 7, "crosstabs_onli": 7, "crucial": [4, 7], "current": 7, "curv": 7, "custom": [1, 4, 5], "custom_ord": 7, "customiz": [1, 4, 7], "cut": 7, "d": [6, 7], "dai": 7, "dark": 7, "dashboard": 7, "data": [0, 1, 3, 4, 5, 6], "data_nam": 7, "data_output": 7, "data_path": 7, "data_typ": 1, "datafram": [1, 4, 5], "dataframe_column": [5, 7], "dataset": [4, 7], "date": [1, 4, 5], "date_column": 7, "date_str": 7, "datetim": 1, "david": 7, "dd": 7, "deal": 7, "decad": 3, "decim": [1, 7], "decimal_plac": [1, 7], "decis": [1, 7], "decreas": 7, "dedic": 0, "deepest": 0, "default": [1, 7], "defin": [1, 7], "definit": 7, "degre": [1, 7], "demograph": 7, "demonstr": 7, "denot": 7, "densiti": [1, 5], "depend": [1, 4, 5], "depth": [1, 7], "descend": 7, "describ": 7, "descript": [1, 4, 5], "design": [4, 7], "detail": [1, 7], "develop": 3, "deviat": [4, 7], "df": [1, 7], "df_censu": 7, "df_dict": 7, "df_num": 7, "dict": 7, "dictionari": 7, "did": 1, "diego": [0, 3], "differ": [1, 7], "digit": [1, 7], "dimens": 7, "dimensionless": 7, "dir": 7, "direct": 7, "directli": [1, 4, 7], "directori": [4, 5], "disabl": [1, 7], "disable_sci_not": [1, 7], "discov": 4, "discret": 7, "dispers": 7, "displai": 7, "distinct": 1, "distinguish": 7, "distribut": [1, 4, 5], "divers": 1, "divid": 7, "divorc": 7, "do": [1, 7], "docstr": 1, "document": [1, 5], "doe": [1, 7], "doi": [2, 6, 7], "dot": 7, "doubl": 7, "down": 7, "dr": 0, "draw": 7, "dtype": 7, "due": [1, 7], "duplic": 1, "dure": [0, 1], "dx_": 7, "dx_c": 7, "dynam": 1, "e": [1, 7], "each": [1, 7], "eas": [1, 4], "easi": [4, 7], "easier": [1, 7], "easili": 7, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 7], "edg": [1, 7], "edgecolor": 1, "educ": [0, 3, 7], "effect": [1, 3, 4, 7], "either": [1, 7], "element": [1, 7], "elev": 7, "els": 1, "emp": 7, "emphas": 1, "emploi": 7, "empti": 7, "enabl": [1, 4, 7], "enable_zoom": [1, 7], "end": 7, "endeavor": 0, "endpoint": 7, "engin": [0, 6, 7], "enhanc": [1, 4, 7], "enough": 1, "ensembl": 7, "ensu": 7, "ensur": [1, 4, 7], "ensure_directori": [5, 7], "enter": 7, "entir": 7, "entri": [1, 7], "environ": [0, 1, 6, 7], "equal": 7, "equat": 7, "equival": 7, "error": [1, 7], "especi": [1, 7], "essenti": [4, 7], "estim": 7, "etc": 4, "ev": 7, "evalu": 7, "even": 7, "everyth": 7, "exact": 1, "examin": 7, "exampl": [1, 4, 5], "excel": [3, 4, 5], "except": [0, 1, 7], "excess": 7, "exclud": 7, "exclus": 7, "exec": 7, "execut": 7, "exist": [1, 7], "exp": 7, "expand": 1, "expect": [1, 7], "experi": [1, 3], "explain": 7, "explan": 1, "explicitli": 1, "explor": [1, 4, 7], "exploratori": 4, "export": [4, 7], "express": [0, 7], "extend": [0, 7], "extens": [1, 7], "extract": [1, 7], "f": [1, 7], "f8766d": 7, "f8c5c8": 7, "facilit": [3, 4, 7], "factor": 7, "fall": 7, "fallback": 1, "fals": [1, 7], "famili": 7, "fashion": 7, "featur": [1, 5, 7], "feature_nam": 7, "feature_names_list": [1, 7], "feder": 7, "feedback": 1, "femal": 7, "female_": 7, "fetch": 7, "fetch_california_h": 7, "few": 7, "ff0000": 7, "figsiz": [1, 7], "figur": [1, 7], "file": [1, 7], "file_nam": 7, "file_path": 7, "file_prefix": [1, 7], "filenam": [1, 7], "fill": [1, 7], "fill_alpha": [1, 7], "fillna": 1, "filter": 7, "filtered_df": 7, "financi": [3, 7], "find": 1, "first": [1, 7], "fit": [1, 4, 5], "fix": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 7], "flip": 7, "float": 7, "fnlwgt": 7, "focu": 7, "focus": 7, "folder": 7, "follow": [1, 4, 7], "font": [1, 7], "fontsiz": 1, "form": 4, "format": [1, 4, 5], "former": 7, "formerli": 1, "formula": 7, "found": 1, "foundat": 5, "four": 7, "frac": 7, "frequenc": [1, 7], "frequent": 7, "friendli": 1, "from": [0, 1, 3, 4, 7], "full": [1, 5], "fulli": 7, "func_col": [1, 7], "function": [1, 4, 5], "further": [1, 7], "futur": [1, 7], "futurewarn": 7, "g": [1, 7], "gain": [4, 7], "gaussian": 5, "gener": [1, 4, 5], "geq": 7, "get": 4, "get_text": 1, "gil": [2, 3], "github": 4, "give": 1, "given": [1, 7], "glanc": 7, "go": 7, "got": 1, "gov": 7, "grad": 7, "gradientboostingregressor": 7, "graduat": 0, "granular": 1, "graphic": [6, 7], "gratitud": 0, "greater": [1, 7], "green": 7, "grei": 7, "grid": [1, 5], "grid_figs": 7, "grid_resolut": 7, "grid_valu": 7, "ground": 7, "group": [1, 5], "gt": 7, "guid": [0, 7], "guidanc": 1, "guidelin": 7, "h": 7, "h_pad": 7, "ha": [1, 3, 7], "half": 7, "halv": 7, "handl": [1, 4, 7], "handler": 7, "hat": 7, "have": [1, 7], "he": 3, "header": [1, 7], "health": 3, "healthcar": 3, "heatmap": [1, 7], "height": 7, "help": [1, 4, 7], "here": 7, "hi": 0, "hidden": 7, "hide": 7, "high": [1, 7], "higher": [4, 7], "highli": 7, "highlight": 5, "highlight_column": [5, 7], "highlighted_df": 7, "hist": [1, 7], "hist_color": 7, "hist_edgecolor": [1, 7], "histogram": [1, 5], "hold": [3, 7], "horizont": [1, 7], "hour": 7, "hous": 5, "houseag": 7, "household": 7, "hover": 7, "how": 7, "howev": [1, 7], "html": 7, "html_file_nam": [1, 7], "html_file_path": [1, 7], "http": [2, 6, 7], "huber": 7, "hue": [1, 7], "hue_dict": 7, "hue_palett": 7, "hunter": [6, 7], "husband": 7, "hyperlink": 7, "hypothes": 4, "i": [1, 3, 5, 7], "icon": 1, "id": [1, 4, 7], "id_colnam": 7, "identifi": [1, 4, 5], "illustr": 7, "imag": 7, "image_filenam": 7, "image_path_png": [1, 7], "image_path_svg": [1, 7], "immedi": 7, "impact": [1, 7], "implement": 1, "import": [1, 7], "imposs": 7, "improv": 1, "inc": 7, "inch": 7, "includ": [1, 4, 7], "inclus": 7, "incom": [6, 7], "inconsist": [1, 7], "incorpor": 1, "incorrect": [1, 7], "increas": 7, "increment": 1, "independ": 1, "index": [1, 7], "indic": [1, 7], "individu": [1, 7], "individual_figs": 7, "industri": 3, "inf": 7, "infin": 7, "influenc": [1, 7], "influenti": 7, "inform": 7, "initi": 4, "inner": 7, "input": [1, 7], "insight": [4, 7], "instal": 5, "instanc": 7, "instead": [1, 7], "instruct": 7, "int": [1, 7], "int64": 7, "integ": 1, "integr": [4, 7], "intellig": 3, "interact": [1, 5], "interest": 7, "interfac": [1, 7], "intern": [1, 7], "interpret": [1, 7], "interv": 7, "introduc": 1, "introduct": 1, "intuit": [1, 4, 7], "invalid": 1, "invalu": 7, "investig": 4, "involv": [4, 7], "io": 7, "island": 7, "iso": 7, "issu": [1, 4], "item": 7, "its": [1, 7], "j": [6, 7], "jinja2": 4, "join": 7, "joint": 7, "jointli": 7, "joss": [6, 7], "journal": [6, 7], "journei": 0, "jupyt": 7, "just": 7, "k": [6, 7], "kde": [1, 4, 5], "kde_color": 7, "kde_density_single_distribut": 7, "kde_distribut": [1, 5, 7], "keep": 7, "kei": [1, 5, 7], "kernel": 7, "keyboard": 7, "keyerror": 7, "keyword": [1, 7], "kind": 7, "kohavi": [6, 7], "kwarg": [1, 7], "l": 2, "label": [1, 7], "label_ag": 7, "label_fonts": [1, 7], "larg": 7, "largest": 7, "last": 7, "latest": 1, "layout": [1, 7], "ldot": 7, "lead": 7, "learn": [0, 1, 3, 4, 6, 7], "learning_r": 7, "least": [1, 7], "lectur": 3, "left": 7, "left_margin": [1, 7], "legend": [1, 7], "legend_label": 7, "legend_labels_list": 7, "legibl": 7, "length": 7, "leonid": [2, 3], "leq": 7, "less": [1, 7], "let": 7, "letter": [6, 7], "level": 7, "leverag": 7, "librari": [1, 5, 7], "licens": 1, "like": [0, 7], "limit": [1, 7], "line": [4, 5], "linear": 7, "linestyl": 7, "link": 5, "list": [1, 7], "load": 7, "local": 7, "locat": 7, "log": [1, 7], "log_scale_var": [1, 7], "logarithm": 7, "logic": 1, "logo": 1, "logscal": 7, "long": 7, "longer": 7, "loop": 7, "loss": 7, "lower": [1, 7], "lt": 7, "m": [0, 3, 6, 7], "machin": [1, 3, 4, 6, 7], "made": 1, "magnitud": 7, "mai": [1, 7], "main": 4, "maintain": [1, 5, 7], "make": [1, 7], "male": 7, "male_": 7, "manag": [1, 3, 4, 5], "manageri": 7, "mani": [4, 7], "manipul": 4, "manner": 7, "manual": 1, "map": [1, 7], "marco": 0, "margin": [1, 7], "marit": 7, "mark": [1, 7], "marker": 7, "marri": 7, "master": 3, "match": [1, 7], "mathbb": 7, "mathbf": 7, "mathemat": 7, "matplotlib": [1, 4, 6, 7], "matplotlib_colormap": 7, "matric": [1, 5], "matrix": [1, 5], "max": 7, "max_depth": 7, "max_unique_valu": 7, "max_unique_value_pct": 7, "max_unique_value_tot": 7, "maximum": 7, "mcse": [6, 7], "mean": [1, 4, 7], "meaning": 7, "measur": 7, "mechan": 1, "median": [4, 7], "medinc": 7, "meet": 4, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 7], "metric": 7, "metrics_box_violin": 1, "metrics_boxplot_comp": 7, "metrics_list": 7, "mid": 7, "might": 7, "min": 7, "min_length": 7, "mind": 4, "minim": [1, 7], "minimum": 7, "minor": 1, "misalign": 7, "misinterpret": 7, "mislead": [1, 7], "miss": [1, 4, 7], "mm": 7, "mode": [1, 7], "model": [1, 4, 7], "model_select": 7, "modifi": [1, 7], "month": [2, 7], "more": [1, 7], "most": [1, 7], "mous": 7, "move": [1, 7], "mu": 7, "mu_i": 7, "mu_x": 7, "much": 7, "multidimension": 7, "multipl": [1, 4, 7], "multipli": 1, "must": 7, "my_datafram": 1, "n": 7, "n_col": 7, "n_estim": 7, "n_row": 7, "na": [1, 7], "name": [1, 7], "nativ": 7, "navig": 7, "nbformat": 4, "ndarrai": 7, "necessari": [1, 7], "need": [1, 4, 7], "neg": 7, "neither": [1, 7], "nest": 7, "never": 7, "new": [1, 7], "newer": 7, "next": 7, "nh": 7, "nomenclatur": 1, "non": [1, 5], "none": [1, 7], "nor": [1, 7], "normal": [1, 5], "notat": [1, 7], "note": 7, "notebook": 7, "noth": 7, "notic": 7, "now": 1, "np": 7, "null": [1, 7], "null_pct": 7, "null_tot": 7, "num": 7, "num_digit": 7, "number": [1, 7], "numer": [1, 5], "numpi": [4, 7], "o": [2, 7], "object": [1, 7], "observ": 7, "obviou": 7, "occup": 7, "occurr": 7, "offer": [1, 4, 7], "often": [4, 7], "older": [1, 7], "omit": 1, "one": [1, 7], "onli": [1, 7], "opaqu": 7, "open": [6, 7], "oper": 7, "option": [1, 4, 7], "orang": 7, "order": [1, 7], "org": [2, 6, 7], "organ": [1, 7], "orient": 7, "origin": 7, "original_df": 7, "oscar": [2, 3], "other": [1, 7], "otherwis": 7, "our": 0, "out": 7, "outcom": 7, "outlier": 4, "output": [1, 7], "outsid": 7, "over": [1, 3, 7], "overal": [1, 7], "overlai": 7, "overlaid": 7, "overlap": 7, "overrid": 7, "own": 7, "p": 7, "pac": 7, "pace": [6, 7], "packag": 4, "pad": [1, 7], "page": [4, 7], "pair": 7, "pairwis": 7, "palett": 7, "panda": [4, 7], "param": 1, "paramet": [1, 7], "parametr": 7, "pardir": 7, "parent": 7, "pars": 7, "parse_date_with_rul": [5, 7], "part": 7, "partial": [1, 5], "partial_depend": 7, "particular": 7, "particularli": [1, 7], "pass": [1, 7], "path": [1, 5], "patient": 7, "pattern": [4, 7], "pd": 7, "pdf": 7, "pdp": 5, "pearson": 5, "per": 7, "percent": [1, 7], "percentag": 7, "perfect": 7, "perfectli": 7, "perform": [1, 7], "performancewarn": 1, "period": 5, "person": 3, "perspect": [1, 7], "pi": 7, "pink": 7, "pip": 4, "pivot": [0, 5], "place": [1, 7], "plai": 0, "plot": [1, 4, 5], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_typ": [1, 7], "plotli": [1, 4, 7], "plotly_colormap": 7, "plots_onli": 7, "plt": 1, "pm": 7, "png": [1, 7], "png_imag": 7, "point": [1, 7], "pointer": 7, "popul": 7, "popular": 4, "posit": [1, 7], "possibl": [4, 7], "potenti": [1, 7], "power": [1, 7], "pr": 1, "pre": 1, "preced": 7, "predict": [1, 7], "prefer": [1, 7], "prefix": [1, 7], "prepar": [1, 5], "prerequisit": 5, "present": [1, 7], "preval": 7, "prevent": [1, 7], "previou": [1, 7], "previous": 1, "price": 7, "print": [1, 7], "prior": 7, "privat": 7, "probabl": [1, 6, 7], "process": [1, 4, 7], "produc": [1, 7], "product": 7, "prof": 7, "profession": 3, "program": [0, 3], "project": [1, 3, 5, 7], "proper": [1, 7], "properli": 7, "proport": [1, 7], "provid": [0, 1, 4, 7], "public": 7, "publish": 2, "purpos": [1, 5], "pursu": 0, "py": 1, "pypi": [1, 4], "python": [1, 3, 5, 7], "qualiti": [4, 7], "quantifi": 7, "quantit": 7, "quick": 7, "quickli": [4, 7], "r": [3, 6, 7], "r_": 7, "race": 7, "rais": [1, 7], "random": 7, "random_st": 7, "rang": [4, 7], "raw": 7, "re": [1, 7], "read": 7, "readabl": [1, 7], "readi": 4, "readm": 1, "record": 7, "red": 7, "reduc": [1, 7], "redund": 7, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 7], "regress": 5, "regular": [1, 5], "relat": 7, "relationship": [4, 7], "releas": 1, "relev": 4, "reli": 7, "remain": [1, 7], "remov": [1, 4, 5], "remove_stack": [1, 7], "renam": 1, "render": 7, "replac": 7, "replica": 1, "report": [3, 4, 7], "repositori": [4, 6, 7], "repres": 7, "represent": [1, 7], "reproduc": 7, "requir": [1, 4, 7], "research": 4, "reset": 1, "resolut": 7, "respect": 7, "respons": 7, "rest": 7, "result": [1, 7], "return": 7, "return_dict": 7, "reveal": 7, "rich": 7, "right": 7, "right_margin": [1, 7], "riversid": 3, "robust": 1, "role": 0, "rot": 7, "rotat": [1, 7], "rotate_plot": 7, "round": 7, "row": 7, "rule": 7, "run": 4, "s0167": [6, 7], "same": [1, 7], "sampl": 7, "san": [0, 3], "save": [1, 4, 5], "save_dataframes_to_excel": [1, 5, 7], "save_format": [1, 7], "save_plot": [1, 7], "scale": [1, 7], "scatter": [1, 4, 5], "scatter_color": 7, "scatter_fit_plot": [1, 5, 7], "scenario": [1, 7], "schema": 7, "scheme": 7, "school": 0, "scienc": [0, 3, 4, 6, 7], "scientif": [1, 7], "scientist": [0, 3, 4], "scikit": [1, 4, 7], "scroll": 7, "seaborn": [1, 4, 6, 7], "seamlessli": 4, "second": 7, "section": [1, 7], "see": 7, "seed": 7, "select": [1, 7], "select_dtyp": 7, "self": 7, "separ": [1, 7], "sequenc": 7, "seri": 7, "serv": [1, 3], "servic": 3, "set": [1, 7], "set_as_index": 7, "set_titl": 1, "setminu": 7, "setp": 1, "setup": [1, 7], "sever": [1, 7], "sex": 7, "shape": 7, "sheet": 7, "shilei": 0, "should": 7, "show": 7, "show_cbar": 7, "show_correl": 7, "show_legend": 7, "show_modebar": [1, 7], "show_plot": 7, "shown": 7, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 7, "sigma_i": 7, "sigma_x": 7, "signatur": 1, "signific": 1, "similarli": 7, "simpl": 7, "simpler": 1, "simplic": 4, "simplif": 1, "simplifi": [1, 7], "simultan": 7, "sinc": 7, "singl": [1, 7], "single_figs": 7, "single_var_image_filenam": 7, "single_var_image_path_png": 7, "single_var_image_path_svg": 7, "size": [1, 7], "sklearn": 7, "slightli": 1, "small": 1, "smallest": 7, "smooth": 7, "smoother": [1, 7], "snippet": 7, "so": [1, 7], "softwar": [2, 6, 7], "some": [1, 7], "sort": [1, 7], "sort_bi": [1, 7], "sortbi": 1, "sourc": [6, 7], "space": [1, 7], "span": 7, "spars": [6, 7], "spatial": [6, 7], "special": 7, "specialti": 7, "specif": [1, 4, 5], "specifi": [1, 4, 7], "split": 7, "spous": 7, "spread": 7, "sql": 3, "sqrt": 7, "squar": 7, "stabil": 1, "stabl": 1, "stack": [1, 4, 5], "stacked_crosstab": 7, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 4, 5], "standardized_d": 7, "start": [1, 4, 7], "stat": [1, 7], "state": 7, "static": [1, 5], "statist": [1, 3, 4, 6, 7], "statu": [1, 7], "stem": 7, "step": [1, 4], "still": [1, 7], "store": 1, "str": [1, 7], "straightforward": 1, "streamlin": [1, 4], "strength": 7, "string": [1, 7], "strip": 7, "strip_trailing_period": [5, 7], "stronger": 7, "structur": [1, 4], "style": [1, 7], "styler": 7, "subplot": 7, "subset": 7, "substitut": 7, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suit": 4, "suitabl": 1, "sum_": 7, "summar": [4, 7], "summari": [1, 4, 5], "summarize_all_combin": [5, 7], "summary_t": 7, "support": [0, 1, 7], "suppos": 7, "suppress": 7, "sure": 7, "surfac": [1, 7], "svg": [1, 7], "svg_imag": 7, "sy": 1, "system": [4, 7], "tab": 7, "tabl": [1, 4], "tailor": 7, "take": 7, "tall": 7, "target": 7, "tarshizi": 0, "task": [4, 7], "teach": 3, "techniqu": [4, 7], "ten": 3, "tend": 7, "test": [1, 7], "test_siz": 7, "text": [1, 7], "text_wrap": [1, 7], "th": 7, "than": [1, 7], "thank": 0, "thei": 7, "them": [1, 7], "theoret": 5, "therefor": 7, "thi": [1, 4, 7], "thick": 7, "those": 1, "three": 7, "through": 1, "throw": 1, "thu": 7, "tick": [1, 7], "tick_fonts": [1, 7], "tight": 7, "time": [0, 1, 7], "titl": [1, 2, 7], "title_i": [1, 7], "title_x": [1, 7], "to_list": 7, "togeth": 7, "toggl": [1, 7], "tool": [1, 4, 7], "toolkit": 1, "top": 7, "top_margin": [1, 7], "total": 7, "toward": 1, "trail": 5, "train": 7, "train_test_split": 7, "transpar": [1, 7], "trend": [4, 7], "triangl": 7, "triangular": [1, 5], "true": [1, 7], "truth": 7, "tupl": [1, 7], "two": [1, 7], "type": [1, 4, 7], "u": [0, 7], "uci": [6, 7], "ucla": 3, "unambigu": 7, "uncov": [4, 7], "underli": [4, 7], "understand": [4, 7], "uniform": 1, "uniqu": [1, 4, 5], "unique_values_tot": 7, "unique_var": 7, "unit": 7, "univers": [0, 3], "unrecogn": 7, "unstack": 7, "unus": 1, "unwav": 0, "up": [1, 7], "updat": [1, 7], "upper": [1, 7], "upright": 7, "url": 2, "us": [1, 4, 7], "usabl": 1, "usag": [1, 7], "user": [1, 4, 7], "userwarn": 7, "util": [4, 7], "v": 7, "valid": 1, "valid_plot_typ": 1, "valu": [1, 4, 7], "valueerror": [1, 7], "vari": 7, "variabl": [1, 4, 5], "varianc": 7, "varieti": [3, 4, 7], "variou": [1, 4, 7], "vars_of_interest": 7, "vdot": 7, "vector": 7, "verbiag": 1, "verifi": [1, 7], "versa": 7, "versatil": 7, "version": [2, 4, 5, 7], "version_info": 1, "vertic": [1, 7], "via": [1, 7], "vice": 7, "view": [1, 7], "view_angl": 7, "violin": [1, 4, 5], "violinplot": 7, "viridi": 7, "visibl": [1, 7], "visual": [1, 4, 6, 7], "vmax": 7, "vmin": 7, "vriabl": 7, "w_pad": 7, "wa": [1, 7], "wai": 7, "want": [1, 7], "wareh": 3, "warn": [1, 7], "waskom": [6, 7], "we": [0, 7], "week": 7, "welcom": 5, "well": 7, "were": 7, "what": 5, "wheel": 7, "when": [1, 4, 7], "where": [1, 7], "whether": [1, 7], "which": [1, 4, 7], "while": [1, 7], "white": 7, "whitespac": 7, "who": 1, "wide": [3, 7], "width": [1, 7], "wife": 7, "wirefram": [1, 7], "wireframe_color": 7, "wish": 7, "within": [1, 3, 7], "without": [1, 7], "work": [1, 7], "workclass": 7, "workflow": 4, "would": [0, 1, 7], "wrangl": 3, "wrap": [1, 7], "write": 7, "x": [1, 6, 7], "x_": 7, "x_1": 7, "x_2": 7, "x_c": 7, "x_i": 7, "x_j": 7, "x_k": 7, "x_label": [1, 7], "x_label_plotli": 1, "x_n": 7, "x_p": 7, "x_test": 7, "x_train": 7, "x_var": 7, "xlabel": 7, "xlabel_align": 7, "xlabel_rot": 7, "xlim": [1, 7], "xlsx": 7, "xlsxwriter": 4, "xx": 1, "xy": 7, "y": [1, 7], "y_axis_label": 7, "y_i": 7, "y_label": [1, 7], "y_label_plotli": 1, "y_test": 7, "y_train": 7, "y_var": 7, "year": [2, 3, 7], "yellow": 7, "ylabel": 7, "ylabel_align": 7, "ylabel_rot": 7, "ylim": [1, 7], "you": [4, 7], "your": [4, 7], "yy": 1, "yyyi": 7, "z": 7, "z_label": [1, 7], "z_label_plotli": 1, "zenodo": [1, 2], "zero": 1, "zoom": [1, 7], "zoom_out_factor": [1, 7], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References", "Description"], "titleterms": {"0": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 7, "3": 1, "3d": 7, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "With": 7, "about": 5, "acknowledg": 0, "ad": 7, "analysi": 7, "assumpt": 7, "bar": 7, "best": 7, "bin": 7, "box": 7, "ca": 7, "categori": 7, "centric": 7, "changelog": 1, "cite": 2, "coeffici": 7, "column": 7, "combin": 7, "content": 5, "conting": 7, "contributor": 3, "correl": 7, "count": 7, "creat": 7, "crosstab": 7, "custom": 7, "data": 7, "datafram": 7, "date": 7, "densiti": 7, "depend": 7, "descript": 7, "directori": 7, "distribut": 7, "document": 4, "eda": [2, 4, 5], "exampl": 7, "excel": 7, "featur": 4, "fit": 7, "format": 7, "foundat": 7, "full": 7, "function": 7, "gaussian": 7, "gener": 7, "get": 5, "grid": 7, "group": 7, "guid": 5, "highlight": 7, "histogram": 7, "hous": 7, "i": 4, "identifi": 7, "instal": 4, "interact": 7, "kde": 7, "kei": 4, "librari": 4, "line": 7, "link": 4, "maintain": 3, "manag": 7, "matric": 7, "matrix": 7, "non": 7, "normal": 7, "numer": 7, "partial": 7, "path": 7, "pdp": 7, "pearson": 7, "period": 7, "pivot": 7, "plot": 7, "prepar": 7, "prerequisit": 4, "project": 4, "purpos": 4, "python": 4, "refer": 6, "regress": 7, "regular": 7, "remov": 7, "save": 7, "scatter": 7, "specif": 7, "stack": 7, "standard": 7, "start": 5, "static": 7, "summari": 7, "tabl": [5, 7], "theoret": 7, "toolkit": [2, 4, 5], "trail": 7, "triangular": 7, "uniqu": 7, "usag": 5, "variabl": 7, "version": 1, "violin": 7, "welcom": 4, "what": 4}}) \ No newline at end of file diff --git a/_build/html/v0.0.8/usage_guide.html b/_build/html/v0.0.8/usage_guide.html new file mode 100644 index 000000000..e3efffcf5 --- /dev/null +++ b/_build/html/v0.0.8/usage_guide.html @@ -0,0 +1,3240 @@ + + + + + + + + + Description — EDA Toolkit 0.0.8 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Description

+

This guide provides detailed instructions and examples for using the functions +provided in the eda_toolkit library and how to use them effectively in your projects.

+

For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [1]. This dataset provides a rich source of +information for demonstrating the functionalities of the eda_toolkit.

+
+
+

Data Preparation and Management

+
+

Path directories

+

Ensure that the directory exists. If not, create it.

+
+
+ensure_directory(path)
+
+
Parameters:
+

path (str) – The path to the directory that needs to be ensured.

+
+
Returns:
+

None

+
+
+
+ +

The ensure_directory function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories.

+

Example Usage

+

In the example below, we demonstrate how to use the ensure_directory function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them.

+

First, we define the base path as the parent directory of the current directory. +The os.pardir constant, equivalent to ".."", is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory.

+

Next, we set paths for the PNG and SVG image directories, located within an +images folder in the parent directory. Using the ensure_directory +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them.

+
from eda_toolkit import ensure_directory
+
+import os # import operating system for dir
+
+
+base_path = os.path.join(os.pardir)
+
+# Go up one level from 'notebooks' to parent directory,
+# then into the 'data' folder
+data_path = os.path.join(os.pardir, "data")
+data_output = os.path.join(os.pardir, "data_output")
+
+# create image paths
+image_path_png = os.path.join(base_path, "images", "png_images")
+image_path_svg = os.path.join(base_path, "images", "svg_images")
+
+# Use the function to ensure'data' directory exists
+ensure_directory(data_path)
+ensure_directory(data_output)
+ensure_directory(image_path_png)
+ensure_directory(image_path_svg)
+
+
+

Output

+
Created directory: ../data
+Created directory: ../data_output
+Created directory: ../images/png_images
+Created directory: ../images/svg_images
+
+
+
+
+

Adding Unique Identifiers

+

Add a column of unique IDs with a specified number of digits to the dataframe.

+
+
+add_ids(df, id_colname='ID', num_digits=9, seed=None, set_as_index=True)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The dataframe to add IDs to.

  • +
  • id_colname (str) – The name of the new column for the IDs.

  • +
  • num_digits (int) – The number of digits for the unique IDs.

  • +
  • seed (int, optional) – The seed for the random number generator. Defaults to None.

  • +
  • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

  • +
+
+
Returns:
+

The updated dataframe with the new ID column.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +

The add_ids function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe.

+

Example Usage

+

In the example below, we demonstrate how to use the add_ids function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the add_ids function to generate +and append a column of unique IDs with a specified number of digits to the dataframe.

+

First, we import the pandas library and the add_ids function from the eda_toolkit. +Then, we create a sample dataframe with some data. We call the add_ids function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe.

+
from eda_toolkit import add_ids
+
+# Add a column of unique IDs with 9 digits and call it "census_id"
+df = add_ids(
+    df=df,
+    id_colname="census_id",
+    num_digits=9,
+    seed=111,
+    set_as_index=True,
+)
+
+
+

Output

+

First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
DataFrame index is unique.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+

+
+
+

Trailing Period Removal

+

Strip the trailing period from floats in a specified column of a DataFrame, if present.

+
+
+strip_trailing_period(df, column_name)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The DataFrame containing the column to be processed.

  • +
  • column_name (str) – The name of the column containing floats with potential trailing periods.

  • +
+
+
Returns:
+

The updated DataFrame with the trailing periods removed from the specified column.

+
+
Return type:
+

pd.DataFrame

+
+
+

The strip_trailing_period function is designed to remove trailing periods +from float values in a specified column of a DataFrame. This can be particularly +useful when dealing with data that has been inconsistently formatted, ensuring +that all float values are correctly represented.

+
+ +

Example Usage

+

In the example below, we demonstrate how to use the strip_trailing_period function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the strip_trailing_period function to remove any trailing periods from the specified column.

+
from eda_toolkit import strip_trailing_period
+
+# Create a sample dataframe with trailing periods in some values
+data = {
+    "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.],
+}
+df = pd.DataFrame(data)
+
+# Remove trailing periods from the 'values' column
+df = strip_trailing_period(df=df, column_name="values")
+
+
+

Output

+

First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)

+ + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +

+

Note: The last row shows 6 as an int with a trailing period with its conversion to float.

+

+
+
+

Standardized Dates

+

Parse and standardize date strings based on the provided rule.

+
+
+parse_date_with_rule(date_str)
+

This function takes a date string and standardizes it to the ISO 8601 format +(YYYY-MM-DD). It assumes dates are provided in either day/month/year or +month/day/year format. The function first checks if the first part of the +date string (day or month) is greater than 12, which unambiguously indicates +a day/month/year format. If the first part is 12 or less, the function +attempts to parse the date as month/day/year, falling back to day/month/year +if the former raises a ValueError due to an impossible date (e.g., month +being greater than 12).

+
+
Parameters:
+

date_str (str) – A date string to be standardized.

+
+
Returns:
+

A standardized date string in the format YYYY-MM-DD.

+
+
Return type:
+

str

+
+
Raises:
+

ValueError – If date_str is in an unrecognized format or if the function +cannot parse the date.

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the parse_date_with_rule +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the parse_date_with_rule +function to parse and standardize each date string to the ISO 8601 format.

+
from eda_toolkit import parse_date_with_rule
+
+# Sample date strings
+date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"]
+
+# Standardize the date strings
+standardized_dates = [parse_date_with_rule(date) for date in date_strings]
+
+print(standardized_dates)
+
+
+

Output

+
['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12']
+
+
+
+

Important

+

In the next example, we demonstrate how to apply the parse_date_with_rule +function to a DataFrame column containing date strings using the .apply() method. +This is particularly useful when you need to standardize date formats across an +entire column in a DataFrame.

+
+
# Creating the DataFrame
+data = {
+    "date_column": [
+        "31/12/2021",
+        "01/01/2022",
+        "12/31/2021",
+        "13/02/2022",
+        "07/04/2022",
+    ],
+    "name": ["Alice", "Bob", "Charlie", "David", "Eve"],
+    "amount": [100.0, 150.5, 200.75, 250.25, 300.0],
+}
+
+df = pd.DataFrame(data)
+
+# Apply the function to the DataFrame column
+df["standardized_date"] = df["date_column"].apply(parse_date_with_rule)
+
+print(df)
+
+
+

Output

+
   date_column     name  amount standardized_date
+0   31/12/2021    Alice  100.00        2021-12-31
+1   01/01/2022      Bob  150.50        2022-01-01
+2   12/31/2021  Charlie  200.75        2021-12-31
+3   13/02/2022    David  250.25        2022-02-13
+4   07/04/2022      Eve  300.00        2022-04-07
+
+
+
+
+

DataFrame Analysis

+

Analyze DataFrame columns, including dtype, null values, and unique value counts.

+
+
+dataframe_columns(df)
+

This function analyzes the columns of a DataFrame, providing details about the data type, +the number and percentage of null values, the total number of unique values, and the most +frequent unique value along with its count and percentage. It handles special cases such as +converting date columns and replacing empty strings with Pandas NA values.

+
+
Parameters:
+

df (pandas.DataFrame) – The DataFrame to analyze.

+
+
Returns:
+

A DataFrame with the analysis results for each column.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the dataframe_columns +function to analyze a DataFrame’s columns.

+
from eda_toolkit import dataframe_columns
+
+dataframe_columns(df=df)
+
+
+

Output

+

Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
Shape:  (48842, 16)
+
+Total seconds of processing time: 0.861555
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+

+
+
+

Generating Summary Tables for Variable Combinations

+

This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.

+
+
+summarize_all_combinations(df, variables, data_path, data_name, min_length=2)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The pandas DataFrame containing the data.

  • +
  • variables (list) – List of unique variables to generate combinations.

  • +
  • data_path (str) – Path where the output Excel file will be saved.

  • +
  • data_name (str) – Name of the output Excel file.

  • +
  • min_length (int) – Minimum length of combinations to generate. Defaults to 2.

  • +
+
+
Returns:
+

A dictionary of summary tables and a list of all generated combinations.

+
+
Return type:
+

tuple(dict, list)

+
+
+
+ +

The function returns two outputs:

+

1. summary_tables: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values.

+

2. all_combinations: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables.

+

Example Usage

+

Below, we use the summarize_all_combinations function to generate summary tables for the specified +variables from a DataFrame containing the census data [1].

+
from eda_toolkit import summarize_all_combinations
+
+# Define unique variables for the analysis
+unique_vars = [
+    "age_group",
+    "workclass",
+    "education",
+    "occupation",
+    "race",
+    "sex",
+    "income",
+]
+
+# Generate summary tables for all combinations of the specified variables
+summary_tables, all_combinations = summarize_all_combinations(
+    df=df,
+    data_path=data_output,
+    variables=unique_vars,
+    data_name="census_summary_tables.xlsx",
+)
+
+# Print all combinations of variables
+print(all_combinations)
+
+
+

Output

+
[('age_group', 'workclass'),
+('age_group', 'education'),
+('age_group', 'occupation'),
+('age_group', 'race'),
+('age_group', 'sex'),
+('age_group', 'income'),
+('workclass', 'education'),
+('workclass', 'occupation'),
+('workclass', 'race'),
+('workclass', 'sex'),
+('workclass', 'income'),
+('education', 'occupation'),
+('education', 'race'),
+('education', 'sex'),
+('education', 'income'),
+('occupation', 'race'),
+('occupation', 'sex'),
+('occupation', 'income'),
+('race', 'sex'),
+('race', 'income'),
+('sex', 'income'),
+('age_group', 'workclass', 'education'),
+('age_group', 'workclass', 'occupation'),
+('age_group', 'workclass', 'race'),
+('age_group', 'workclass', 'sex'),
+('age_group', 'workclass', 'income'),
+('age_group', 'education', 'occupation'),
+('age_group', 'education', 'race'),
+('age_group', 'education', 'sex'),
+('age_group', 'education', 'income'),
+('age_group', 'occupation', 'race'),
+('age_group', 'occupation', 'sex'),
+('age_group', 'occupation', 'income'),
+('age_group', 'race', 'sex'),
+('age_group', 'race', 'income'),
+('age_group', 'sex', 'income'),
+('workclass', 'education', 'occupation'),
+('workclass', 'education', 'race'),
+('workclass', 'education', 'sex'),
+('workclass', 'education', 'income'),
+('workclass', 'occupation', 'race'),
+('workclass', 'occupation', 'sex'),
+('workclass', 'occupation', 'income'),
+('workclass', 'race', 'sex'),
+('workclass', 'race', 'income'),
+('workclass', 'sex', 'income'),
+('education', 'occupation', 'race'),
+('education', 'occupation', 'sex'),
+('education', 'occupation', 'income'),
+('education', 'race', 'sex'),
+('education', 'race', 'income'),
+('education', 'sex', 'income'),
+('occupation', 'race', 'sex'),
+('occupation', 'race', 'income'),
+('occupation', 'sex', 'income'),
+('race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation'),
+('age_group', 'workclass', 'education', 'race'),
+('age_group', 'workclass', 'education', 'sex'),
+('age_group', 'workclass', 'education', 'income'),
+('age_group', 'workclass', 'occupation', 'race'),
+('age_group', 'workclass', 'occupation', 'sex'),
+('age_group', 'workclass', 'occupation', 'income'),
+('age_group', 'workclass', 'race', 'sex'),
+('age_group', 'workclass', 'race', 'income'),
+('age_group', 'workclass', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race'),
+('age_group', 'education', 'occupation', 'sex'),
+('age_group', 'education', 'occupation', 'income'),
+('age_group', 'education', 'race', 'sex'),
+('age_group', 'education', 'race', 'income'),
+('age_group', 'education', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex'),
+('age_group', 'occupation', 'race', 'income'),
+('age_group', 'occupation', 'sex', 'income'),
+('age_group', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race'),
+('workclass', 'education', 'occupation', 'sex'),
+('workclass', 'education', 'occupation', 'income'),
+('workclass', 'education', 'race', 'sex'),
+('workclass', 'education', 'race', 'income'),
+('workclass', 'education', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex'),
+('workclass', 'occupation', 'race', 'income'),
+('workclass', 'occupation', 'sex', 'income'),
+('workclass', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex'),
+('education', 'occupation', 'race', 'income'),
+('education', 'occupation', 'sex', 'income'),
+('education', 'race', 'sex', 'income'),
+('occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race'),
+('age_group', 'workclass', 'education', 'occupation', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'race', 'income'),
+('age_group', 'workclass', 'education', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'education', 'occupation', 'race', 'income'),
+('age_group', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'education', 'race', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex'),
+('workclass', 'education', 'occupation', 'race', 'income'),
+('workclass', 'education', 'occupation', 'sex', 'income'),
+('workclass', 'education', 'race', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex', 'income'),
+('age_group',
+'workclass',
+'education',
+'occupation',
+'race',
+'sex',
+'income')]
+
+
+

When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table.

+
EDA Toolkit Logo + +
+
+

Saving DataFrames to Excel with Customized Formatting

+

Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.

+

This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the save_dataframes_to_excel function.

+
+
+save_dataframes_to_excel(file_path, df_dict, decimal_places=0)
+
+
Parameters:
+
    +
  • file_path (str) – Full path to the output Excel file.

  • +
  • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

  • +
  • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

  • +
+
+
Notes:
+
    +
  • The function will autofit columns and left-align text.

  • +
  • Numeric columns will be formatted with the specified number of decimal places.

  • +
  • Headers will be bold and left-aligned without borders.

  • +
+
+
+
+ +

The function performs the following tasks:

+
    +
  • Writes each DataFrame to its respective sheet in the Excel file.

  • +
  • Rounds numeric columns to the specified number of decimal places.

  • +
  • Applies customized formatting to headers and cells.

  • +
  • Autofits columns based on the content length.

  • +
+

Example Usage

+

Below, we use the save_dataframes_to_excel function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between 18 and 40.

+
from eda_toolkit import save_dataframes_to_excel
+
+# Example usage
+file_name = "df_census.xlsx"  # Name of the output Excel file
+file_path = os.path.join(data_path, file_name)
+
+# filter DataFrame to Ages 18-40
+filtered_df = df[(df["age"] > 18) & (df["age"] < 40)]
+
+df_dict = {
+    "original_df": df,
+    "ages_18_to_40": filtered_df,
+}
+
+save_dataframes_to_excel(
+    file_path=file_path,
+    df_dict=df_dict,
+    decimal_places=0,
+)
+
+
+

Output

+

The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between 18 and 40, each on separate sheets with customized formatting.

+
+
+

Creating Contingency Tables

+

Create a contingency table from one or more columns in a DataFrame, with sorting options.

+

This section explains how to create contingency tables from one or more columns in a DataFrame using the contingency_table function.

+
+
+contingency_table(df, cols=None, sort_by=0)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • cols (str or list, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

  • +
  • sort_by (int) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order.

  • +
+
+
Raises:
+

ValueError – If no columns are specified or if sort_by is not 0 or 1.

+
+
Returns:
+

A DataFrame with the specified columns, 'Total', and 'Percentage'.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

Below, we use the contingency_table function to create a contingency table +from the specified columns in a DataFrame containing census data [1]

+
from eda_toolkit import contingency_table
+
+# Example usage
+contingency_table(
+    df=df,
+    cols=[
+        "age_group",
+        "workclass",
+        "race",
+        "sex",
+    ],
+    sort_by=1,
+)
+
+
+

Output

+

The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the 'Total' column in descending order because sort_by +is set to 1.

+
    age_group     workclass                race     sex  Total  Percentage
+0       30-39       Private               White    Male   5856       11.99
+1       18-29       Private               White    Male   5623       11.51
+2       40-49       Private               White    Male   4267        8.74
+3       18-29       Private               White  Female   3680        7.53
+4       50-59       Private               White    Male   2565        5.25
+..        ...           ...                 ...     ...    ...         ...
+467     50-59   Federal-gov               Other    Male      1        0.00
+468     50-59     Local-gov  Asian-Pac-Islander  Female      1        0.00
+469     70-79  Self-emp-inc               Black    Male      1        0.00
+470     80-89     Local-gov  Asian-Pac-Islander    Male      1        0.00
+471                                                      48842      100.00
+
+[472 rows x 6 columns]
+
+
+

+
+
+

Highlighting Specific Columns in a DataFrame

+

This section explains how to highlight specific columns in a DataFrame using the highlight_columns function.

+

Highlight specific columns in a DataFrame with a specified background color.

+
+
+highlight_columns(df, columns, color='yellow')
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to be styled.

  • +
  • columns (list of str) – List of column names to be highlighted.

  • +
  • color (str, optional) – The background color to be applied for highlighting (default is “yellow”).

  • +
+
+
Returns:
+

A Styler object with the specified columns highlighted.

+
+
Return type:
+

pandas.io.formats.style.Styler

+
+
+
+ +

Example Usage

+

Below, we use the highlight_columns function to highlight the age and education +columns in the first 5 rows of the census [1] DataFrame with a pink background color.

+
from eda_toolkit import highlight_columns
+
+# Applying the highlight function
+highlighted_df = highlight_columns(
+    df=df,
+    columns=["age", "education"],
+    color="#F8C5C8",
+)
+
+highlighted_df
+
+
+

Output

+

The output will be a DataFrame with the specified columns highlighted in the given background color. +The age and education columns will be highlighted in pink.

+

The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the .render() method of the Styler object.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife

+
+
+

Binning Numerical Columns

+

Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or “bins.” This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or “bins,” and +then assigning each value to one of these intervals.

+
+

Note

+

The code snippets below create age bins and assign a corresponding age group +label to each age in the DataFrame. The pd.cut function from pandas is used to +categorize the ages and assign them to a new column, age_group. Adjust the bins +and labels as needed for your specific data.

+
+

Below, we use the age column of the census data [1] from the UCI Machine Learning Repository as an example:

+
    +
  1. Bins Definition: +The bins are defined by specifying the boundaries of each interval. For example, +in the code snippet below, the bin_ages list specifies the boundaries for age groups:

    +
    bin_ages = [
    +    0,
    +    18,
    +    30,
    +    40,
    +    50,
    +    60,
    +    70,
    +    80,
    +    90,
    +    100,
    +    float("inf"),
    +]
    +
    +
    +

    Each pair of consecutive elements in bin_ages defines a bin. For example:

    +
      +
    • The first bin is [0, 18),

    • +
    • The second bin is [18, 30),

    • +
    • and so on.

    • +
    +
  2. +
+

+
    +
  1. Labels for Bins: +The label_ages list provides labels corresponding to each bin:

    +
    label_ages = [
    +    "< 18",
    +    "18-29",
    +    "30-39",
    +    "40-49",
    +    "50-59",
    +    "60-69",
    +    "70-79",
    +    "80-89",
    +    "90-99",
    +    "100 +",
    +]
    +
    +
    +

    These labels are used to categorize the numerical values into meaningful groups.

    +
  2. +
  3. Applying the Binning: +The pd.cut function +from Pandas is used to apply the binning process. For each value in the age +column of the DataFrame, it assigns a corresponding label based on which bin the +value falls into. Here, right=False indicates that each bin includes the +left endpoint but excludes the right endpoint. For example, if bin_ages = +[0, 10, 20, 30], then a value of 10 will fall into the bin [10, 20) and +be labeled accordingly.

    +
    df["age_group"] = pd.cut(
    +    df["age"],
    +    bins=bin_ages,
    +    labels=label_ages,
    +    right=False,
    +)
    +
    +
    +

    Mathematically, for a given value x in the age column:

    +
    +\[\begin{split}\text{age_group} = +\begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 +\end{cases}\end{split}\]
    +

    The parameter right=False in pd.cut means that the bins are left-inclusive +and right-exclusive, except for the last bin, which is always right-inclusive +when the upper bound is infinity (float(“inf”)).

    +
  4. +
+
+
+
+

KDE and Histogram Distribution Plots

+
+

Gaussian Assumption for Normality

+

The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF):

+
+\[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)\]
+

where:

+
    +
  • \(\mu\) is the mean

  • +
  • \(\sigma^2\) is the variance

  • +
+

In a normally distributed dataset:

+
    +
  • 68% of data falls within \(\mu \pm \sigma\)

  • +
  • 95% within \(\mu \pm 2\sigma\)

  • +
  • 99.7% within \(\mu \pm 3\sigma\)

  • +
+
KDE Distributions - KDE (+) Histograms (Density) + +
+

Histograms and KDE

+

Histograms:

+
    +
  • Visualize data distribution by binning values and counting frequencies.

  • +
  • If data is Gaussian, the histogram approximates a bell curve.

  • +
+

Kernel Density Estimation (KDE):

+
    +
  • A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function.

  • +
  • The KDE for a dataset \(X = \{x_1, x_2, \ldots, x_n\}\) is given by:

  • +
+
+\[\hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right)\]
+

where:

+
    +
  • \(K\) is the kernel function (often Gaussian)

  • +
  • \(h\) is the bandwidth (smoothing parameter)

  • +
+

Combined Use of Histograms and KDE

+
    +
  • Histograms offer a discrete, binned view of the data.

  • +
  • KDE provides a smooth, continuous estimate of the underlying distribution.

  • +
  • Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality.

  • +
+
+
+
+

KDE Distribution Function

+

Generate KDE or histogram distribution plots for specified columns in a DataFrame.

+

The kde_distributions function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2] for plotting, which is built on top of +matplotlib [3] and provides a high-level interface for drawing attractive and informative +statistical graphics.

+

Key Features and Parameters

+
    +
  • Flexible Plotting: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively.

  • +
  • Leverages Seaborn Library: The function is built on the seaborn library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code.

  • +
  • Customization: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs.

  • +
  • Scientific Notation Control: The function allows disabling scientific notation on the axes, providing better readability for certain types of data.

  • +
  • Log Scaling: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude.

  • +
  • Output Options: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations.

  • +
+
+
+kde_distributions(df, vars_of_interest=None, grid_figsize=(10, 8), single_figsize=(6, 4), kde=True, hist_color='#0000FF', kde_color='#FF0000', hist_edgecolor='#000000', hue=None, fill=True, fill_alpha=1, n_rows=1, n_cols=1, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_path_png=None, single_var_image_path_svg=None, single_var_image_filename=None, y_axis_label='Density', plot_type='both', log_scale_vars=None, bins='auto', binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat='density', xlim=None, ylim=None)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots.

  • +
  • grid_figsize (tuple, optional) – Size of the overall grid figure, default is (10, 8).

  • +
  • single_figsize (tuple, optional) – Size of individual figures for each variable, default is (6, 4).

  • +
  • kde (bool, optional) – Whether to include KDE plots on the histograms, default is True.

  • +
  • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

  • +
  • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

  • +
  • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

  • +
  • hue (str, optional) – Column name to group data by, adding different colors for each group.

  • +
  • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

  • +
  • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where +0 is fully transparent and 1 is fully opaque. Default is 1.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid, default is 1.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid, default is 1.

  • +
  • w_pad (float, optional) – Width padding between subplots, default is 1.0.

  • +
  • h_pad (float, optional) – Height padding between subplots, default is 1.0.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

  • +
  • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

  • +
  • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

  • +
  • single_var_image_path_png (str, optional) – Directory path to save the PNG images of the separate distribution plots.

  • +
  • single_var_image_path_svg (str, optional) – Directory path to save the SVG images of the separate distribution plots.

  • +
  • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. +The variable name will be appended to this filename.

  • +
  • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

  • +
  • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

  • +
  • log_scale_vars (list of str, optional) – List of variable names to apply log scaling.

  • +
  • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

  • +
  • binwidth (number or pair of numbers, optional) – Width of each bin, overrides bins but can be used with binrange.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels, default is 10.

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

  • +
  • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

  • +
  • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', +'probability', 'percent', 'density'), default is 'density'.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If plot_type is not one of 'hist', 'kde', or 'both'.

    • +
    • If stat is not one of 'count', 'density', 'frequency', 'probability', 'proportion', 'percent'.

    • +
    • If log_scale_vars contains variables that are not present in the DataFrame.

    • +
    • If fill is set to False and hist_edgecolor is not the default.

    • +
    +

  • +
  • UserWarning

      +
    • If stat is set to ‘count’ while kde is True, as it may produce misleading plots.

    • +
    • If both bins and binwidth are specified, which may affect performance.

    • +
    +

  • +
+
+
Returns:
+

None

+
+
+
+ +

+
+

KDE and Histograms Example

+

In the below example, the kde_distributions function is used to generate +histograms for several variables of interest: "age", "education-num", and +"hours-per-week". These variables represent different demographic and +financial attributes from the dataset. The kde=True parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data’s probability density.

+

The visualizations are arranged in a single row of four columns, as specified +by n_rows=1 and n_cols=3, respectively. The overall size of the grid +figure is set to 14 inches wide and 4 inches tall (grid_figsize=(14, 4)), +while each individual plot is configured to be 4 inches by 4 inches +(single_figsize=(4, 4)). The fill=True parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +w_pad=1 and h_pad=1, which add 1 inch of padding both horizontally and +vertically.

+

To handle longer titles, the text_wrap=50 parameter ensures that the title +text wraps to a new line after 50 characters. The bbox_inches="tight" setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in vars_of_interest are +passed directly to the function for visualization.

+

Each plot is saved individually with filenames that are prefixed by +"kde_density_single_distribution", followed by the variable name. The `y-axis` +for all plots is labeled as “Density” (y_axis_label="Density"), reflecting that +the height of the bars or KDE line represents the data’s density. The histograms +are divided into 10 bins (bins=10), offering a clear view of the distribution +of each variable.

+

The plot_type="hist" parameter indicates that only histograms will be generated +for each variable. Additionally, the font sizes for the axis labels and tick labels +are set to 16 points (label_fontsize=16) and 14 points (tick_fontsize=14), +respectively, ensuring that all text within the plots is legible and well-formatted.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=True,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    fill=True,
+    fill_alpha=0.60,
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - KDE (+) Histograms (Density) + +
+
+

Histogram Example (Density)

+

In this example, the kde_distributions function is used to generate histograms for +the variables "age", "education-num", and "hours-per-week" but with +kde=False, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (n_rows=1, n_cols=3), +with a grid size of 14x4 inches (grid_figsize=(14, 4)). The histograms are +divided into 10 bins (bins=10), and the y-axis is labeled “Density” (y_axis_label="Density"). +Font sizes for the axis labels and tick labels are set to 16 and 14 points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=False,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Density) + +
+
+

Histogram Example (Count)

+

In this example, the kde_distributions function is modified to generate histograms +with a few key changes. The hist_color is set to “orange”, changing the color of the +histogram bars. The `y-axis` label is updated to “Count” (y_axis_label="Count"), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to “Count” to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (n_rows=1, n_cols=4), +a grid size of 14x4 inches, and a bin count of 10. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    kde=False,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    single_figsize=(4, 4),  # Size of individual figures
+    w_pad=1,
+    h_pad=1,
+    text_wrap=50,
+    hist_color="orange",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Count",
+    bins=10,
+    plot_type="hist",
+    stat="Count",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+
+
+

Stacked Crosstab Plots

+

Generates stacked bar plots and crosstabs for specified columns in a DataFrame.

+

The stacked_crosstab_plot function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats.

+

The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis.

+
+
+stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind='bar', width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output='both', return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type='both', show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False)
+

Generates stacked or regular bar plots and crosstabs for specified columns.

+

This function allows users to create stacked bar plots (or regular bar plots +if stacks are removed) and corresponding crosstabs for specific columns +in a DataFrame. It provides options to customize the appearance, including +font sizes for axis labels, tick labels, and title text wrapping, and to +choose between regular or normalized plots.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • col (str) – The name of the column in the DataFrame to be analyzed.

  • +
  • func_col (list) – List of ground truth columns to be analyzed.

  • +
  • legend_labels_list (list) – List of legend labels for each ground truth column.

  • +
  • title (list) – List of titles for the plots.

  • +
  • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

  • +
  • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

  • +
  • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

  • +
  • custom_order (list, optional) – Specifies a custom order for the categories in the col.

  • +
  • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

  • +
  • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

  • +
  • save_formats (list, optional) – List of file formats to save the plot images in.

  • +
  • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

  • +
  • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

  • +
  • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

  • +
  • x (int, optional) – The width of the figure.

  • +
  • y (int, optional) – The height of the figure.

  • +
  • p (int, optional) – The padding between the subplots.

  • +
  • file_prefix (str, optional) – Prefix for the filename when output includes plots.

  • +
  • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

  • +
  • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

  • +
  • show_legend (bool, optional) – Specify whether to show the legend, default is True.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If output is not one of "both", "plots_only", or "crosstabs_only".

    • +
    • If plot_type is not one of "both", "regular", "normalized".

    • +
    • If remove_stacks is set to True and plot_type is not "regular".

    • +
    • If the lengths of title, func_col, and legend_labels_list are not equal.

    • +
    +

  • +
  • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

  • +
+
+
Returns:
+

Dictionary of crosstabs DataFrames if return_dict is True. Otherwise, returns None.

+
+
Return type:
+

dict or None

+
+
+
+ +
+

Stacked Bar Plots With Crosstabs Example

+

The provided code snippet demonstrates how to use the stacked_crosstab_plot +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here’s a detailed breakdown of the code using the census +dataset as an example [1].

+

First, the func_col list is defined, specifying the columns ["sex", "income"] +to be analyzed. These columns will be used in the loop to generate separate plots. +The legend_labels_list is then defined, with each entry corresponding to a +column in func_col. In this case, the labels for the sex column are +["Male", "Female"], and for the income column, they are ["<=50K", ">50K"]. +These labels will be used to annotate the legends of the plots.

+

Next, the title list is defined, providing titles for each plot corresponding +to the columns in func_col. The titles are set to ["Sex", "Income"], +which will be displayed on top of each respective plot.

+
+

Note

+

The legend_labels_list parameter should be a list of lists, where each +inner list corresponds to the ground truth labels for the respective item in +the func_col list. Each element in the func_col list represents a +column in your DataFrame that you wish to analyze, and the corresponding +inner list in legend_labels_list should contain the labels that will be +used in the legend of your plots.

+
+

For example:

+
# Define the func_col to use in the loop in order of usage
+func_col = ["sex", "income"]
+
+# Define the legend_labels to use in the loop
+legend_labels_list = [
+    ["Male", "Female"],  # Corresponds to "sex"
+    ["<=50K", ">50K"],   # Corresponds to "income"
+]
+
+# Define titles for the plots
+title = [
+    "Sex",
+    "Income",
+]
+
+
+
+

Important

+

Ensure that the number of elements in func_col, legend_labels_list, +and title are the same. Each item in func_col must have a corresponding +list of labels in legend_labels_list and a title in title. This +consistency is essential for the function to correctly generate the plots +with the appropriate labels and titles.

+
+

In this example:

+
    +
  • func_col contains two elements: "sex" and "income". Each corresponds to a specific column in your DataFrame.

  • +
  • legend_labels_list is a nested list containing two inner lists:

    +
    +
      +
    • The first inner list, ["Male", "Female"], corresponds to the "sex" column in func_col.

    • +
    • The second inner list, ["<=50K", ">50K"], corresponds to the "income" column in func_col.

    • +
    +
    +
  • +
  • title contains two elements: "Sex" and "Income", which will be used as the titles for the respective plots.

  • +
+
+

Note

+

If you assign the function to a variable, the dictionary returned when +return_dict=True will be suppressed in the output. However, the dictionary +is still available within the assigned variable for further use.

+
+
from eda_toolkit import stacked_crosstab_plot
+
+# Call the stacked_crosstab_plot function
+stacked_crosstabs = stacked_crosstab_plot(
+    df=df,
+    col="age_group",
+    func_col=func_col,
+    legend_labels_list=legend_labels_list,
+    title=title,
+    kind="bar",
+    width=0.8,
+    rot=45, # axis rotation angle
+    custom_order=None,
+    color=["#00BFC4", "#F8766D"], # default color schema
+    output="both",
+    return_dict=True,
+    x=14,
+    y=8,
+    p=10,
+    logscale=False,
+    plot_type="both",
+    show_legend=True,
+    label_fontsize=14,
+    tick_fontsize=12,
+)
+
+
+

The above example generates stacked bar plots for "sex" and "income" +grouped by "education". The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export.

+
+

Important

+

Importance of Correctly Aligning Labels

+

It is crucial to properly align the elements in the legend_labels_list, +title, and func_col parameters when using the stacked_crosstab_plot +function. Each of these lists must be ordered consistently because the function +relies on their alignment to correctly assign labels and titles to the +corresponding plots and legends.

+

For instance, in the example above:

+
    +
  • The first element in func_col is "sex", and it is aligned with the first set of labels ["Male", "Female"] in legend_labels_list and the first title "Sex" in the title list.

  • +
  • Similarly, the second element in func_col, "income", aligns with the labels ["<=50K", ">50K"] and the title "Income".

  • +
+

Misalignment between these lists would result in incorrect labels or titles being +applied to the plots, potentially leading to confusion or misinterpretation of the data. +Therefore, it’s important to ensure that each list is ordered appropriately and +consistently to accurately reflect the data being visualized.

+

Proper Setup of Lists

+

When setting up the legend_labels_list, title, and func_col, ensure +that each element in the lists corresponds to the correct variable in the DataFrame. +This involves:

+
    +
  • Ordering: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted.

  • +
  • Consistency: Double-checking that each label in legend_labels_list matches the categories present in the corresponding func_col, and that the title accurately describes the plot.

  • +
+

By adhering to these guidelines, you can ensure that the stacked_crosstab_plot +function produces accurate and meaningful visualizations that are easy to interpret and analyze.

+
+

Output

+
KDE Distributions + +
Stacked Bar Plot Age vs. Income + +
+

Note

+

When you set return_dict=True, you are able to see the crosstabs printed out +as shown below.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93

+

When you set return_dict=True, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example:

+
crosstab_age_sex = crosstabs_dict["sex"]
+crosstab_age_income = crosstabs_dict["income"]
+
+
+
+
+

Pivoted Stacked Bar Plots Example

+

Using the census dataset [1], to create horizontal stacked bar plots, set the kind parameter to +"barh" in the stacked_crosstab_plot function. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the y-axis.

+
Stacked Bar Plot Age vs. Income (Pivoted) + +
+
+

Non-Normalized Stacked Bar Plots Example

+

In the census data [1], to create stacked bar plots without the normalized versions, +set the plot_type parameter to "regular" in the stacked_crosstab_plot +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the plot_type to "normalized" will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age.

+
Stacked Bar Plot Age vs. Income (Regular) + +
+
+

Regular Non-Stacked Bar Plots Example

+

In the census data [1], to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the plot_type parameter to "regular" +in the stacked_crosstab_plot function and enable remove_stacks by setting +it to True. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +plot_type to "normalized" will display only the normalized plots.

+

When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories.

+

In the example below, the color of the bars has been set to a dark grey (#333333), +and the legend has been removed by setting show_legend=False. This illustrates +regular bar plots for income by age, without stacking.

+
Bar Plot Age vs. Income (Regular) + +
+
+
+

Box and Violin Plots

+

Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.

+

The box_violin_plot function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories.

+

With options to customize the plot type (boxplot or violinplot), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis.

+

Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures.

+

The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset.

+
+
+box_violin_plot(df, metrics_list, metrics_boxplot_comp, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type='boxplot', xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • metrics_list (list of str) – List of metric names (columns in df) to plot.

  • +
  • metrics_boxplot_comp (list of str) – List of comparison categories (columns in df).

  • +
  • n_rows (int) – Number of rows in the subplot grid.

  • +
  • n_cols (int) – Number of columns in the subplot grid.

  • +
  • image_path_png (str, optional) – Optional directory path to save .png images.

  • +
  • image_path_svg (str, optional) – Optional directory path to save .svg images.

  • +
  • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

  • +
  • show_legend (bool, optional) – Boolean, True if showing the legend in the plots.

  • +
  • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set without specifying image_path_png or image_path_svg.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize is not a tuple or list of two numbers.

  • +
  • If grid_figsize is specified but is not a tuple or list of two numbers.

  • +
+

+
+
Returns:
+

None

+
+
+
+ +

This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels.

+
+

Box Plots Grid Example

+

In this example with the US census data [1], the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the "age_group" column in the +DataFrame. The metrics_boxplot_comp parameter is set to ["age_group"], meaning +that the comparison will be based on different age groups. The metrics_list is +provided as age_boxplot_list, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid format with 3 rows and 4 +columns, using the n_rows=3 and n_cols=4 parameters. The image_path_png and +image_path_svg parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to "all", ensuring that both +individual and grid plots are saved.

+

The plots are displayed in a grid format, as indicated by the show_plot="grid" +parameter. The plot_type is set to "boxplot", so the function will generate +boxplots for each metric in the list. Additionally, the `x-axis` labels are rotated +by 90 degrees (xlabel_rot=90) to ensure that the labels are legible. The legend is +hidden by setting show_legend=False, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication.

+
age_boxplot_list = df[
+    [
+        "education-num",
+        "hours-per-week",
+    ]
+].columns.to_list()
+
+
+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="boxplot",
+    xlabel_rot=90,
+)
+
+
+
Box Plot Comparisons + +
+
+

Violin Plots Grid Example

+

In this example with the US census data [1], we keep everything the same as the prior example, but change the +plot_type to violinplot. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings.

+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=90,
+)
+
+
+
Violin Plot Comparisons + +
+
+

Pivoted Violin Plots Grid Example

+

In this example with the US census data [1], we set xlabel_rot=0 and rotate_plot=True +to pivot the plot, changing the orientation of the axes while keeping the `x-axis` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution.

+
from eda_toolkit import box_violin_plot
+
+metrics_boxplot_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_boxplot_comp,
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    rotate_plot=True,
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=0,
+)
+
+
+
Violin Plot Comparisons (Pivoted) + +
+
+
+

Scatter Plots and Best Fit Lines

+
+

Pearson Correlation Coefficient

+

The Pearson correlation coefficient, often denoted as \(r\), is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from \(-1\) to \(1\), where:

+
    +
  • \(r = 1\) indicates a perfect positive linear relationship.

  • +
  • \(r = -1\) indicates a perfect negative linear relationship.

  • +
  • \(r = 0\) indicates no linear relationship.

  • +
+

The Pearson correlation coefficient between two variables \(X\) and \(Y\) is defined as:

+
+\[r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y}\]
+

where:

+
    +
  • \(\text{Cov}(X, Y)\) is the covariance of \(X\) and \(Y\).

  • +
  • \(\sigma_X\) is the standard deviation of \(X\).

  • +
  • \(\sigma_Y\) is the standard deviation of \(Y\).

  • +
+

Covariance measures how much two variables change together. It is defined as:

+
+\[\text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)\]
+

where:

+
    +
  • \(n\) is the number of data points.

  • +
  • \(X_i\) and \(Y_i\) are the individual data points.

  • +
  • \(\mu_X\) and \(\mu_Y\) are the means of \(X\) and \(Y\).

  • +
+

The standard deviation measures the dispersion or spread of a set of values. For +a variable \(X\), the standard deviation \(\sigma_X\) is:

+
+\[\sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2}\]
+

Substituting the covariance and standard deviation into the Pearson correlation formula:

+
+\[r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}}\]
+

This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between \(X\) and \(Y\).

+
    +
  • \(r > 0\): Positive correlation. As \(X\) increases, \(Y\) tends to increase.

  • +
  • \(r < 0\): Negative correlation. As \(X\) increases, \(Y\) tends to decrease.

  • +
  • \(r = 0\): No linear correlation. There is no consistent linear relationship between \(X\) and \(Y\).

  • +
+

The closer the value of \(r\) is to \(\pm 1\), the stronger the linear relationship between the two variables.

+
+
+

Scatter Fit Plot

+

Create and Save Scatter Plots or a Grid of Scatter Plots

+

This function, scatter_fit_plot, is designed to generate scatter plots for +one or more pairs of variables (x_vars and y_vars) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view.

+

Optional Best Fit Line

+

An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s

+

Customizable Plot Aesthetics

+

The function offers a wide range of customization options to tailor the appearance +of the scatter plots:

+
    +
  • Point Color: You can specify a default color for the scatter points or use a hue parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data.

  • +
  • Point Size: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable.

  • +
  • Markers: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data.

  • +
+

Axis and Label Configuration

+

The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges.

+

Plot Display and Saving Options

+

The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations.

+

Correlation Coefficient Display

+

For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship.

+
+
+scatter_fit_plot(df, x_vars, y_vars, n_rows, n_cols, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color='C0', best_fit_linecolor='red', best_fit_linestyle='-', hue=None, hue_palette=None, size=None, sizes=None, marker='o', show_correlation=True, xlim=None, ylim=None)
+

Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • x_vars (list of str) – List of variable names to plot on the x-axis.

  • +
  • y_vars (list of str) – List of variable names to plot on the y-axis.

  • +
  • n_rows (int) – Number of rows in the subplot grid.

  • +
  • n_cols (int) – Number of columns in the subplot grid.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

  • +
  • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid".

  • +
  • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

  • +
  • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

  • +
  • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

  • +
  • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

  • +
  • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

  • +
  • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette.

  • +
  • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

  • +
  • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

  • +
  • marker (str, optional) – Marker style used for the scatter points. Default is "o".

  • +
  • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set but no image paths are provided.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize or grid_figsize are not tuples/lists with two numeric values.

  • +
+

+
+
Returns:
+

None +This function does not return any value but generates and optionally saves scatter plots for the specified x_vars and y_vars.

+
+
+
+ +
+

Regression-Centric Scatter Plots Example

+

In this US census data [1] example, the scatter_fit_plot function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the show_correlation=True parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the add_best_fit_line=True parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="grid",
+    show_legend=True,
+    xlabel_rot=0,
+    show_plot="grid",
+    rotate_plot=False,
+    grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (with Best Fit Lines) + +
+
+

Scatter Plots Grouped by Category Example

+

In this example, the scatter_fit_plot function is used to generate a grid of +scatter plots that examine the relationships between age and hours-per-week +as well as education-num and hours-per-week. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots:

+
    +
  1. Hue and Hue Palette: The hue parameter is set to "income", meaning that the +data points in the scatter plots are colored according to the values in the income +column. A custom color mapping is provided via the hue_palette parameter, where the +income categories "<=50K" and ">50K" are assigned the colors "brown" and +"green", respectively. This change visually distinguishes the data points based on +income levels.

  2. +
  3. Scatter Color: The scatter_color parameter is set to "#808080", which applies +a grey color to the scatter points when no hue is provided. However, since a hue +is specified in this example, the hue_palette takes precedence and overrides this color setting.

  4. +
  5. Best Fit Line: The add_best_fit_line parameter is set to False, meaning that +no best fit line is added to the scatter plots. This differs from the previous example where +a best fit line was included.

  6. +
  7. Correlation Coefficient: The show_correlation parameter is set to False, so the +Pearson correlation coefficient will not be displayed in the plot titles. This is another +change from the previous example where the correlation coefficient was included.

  8. +
  9. Hue Legend: The show_legend parameter remains set to True, ensuring that the +legend displaying the hue categories ("<=50K" and ">50K") appears on the plots, +helping to interpret the color coding of the data points.

  10. +
+

These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths.

+
from eda_toolkit import scatter_fit_plot
+
+hue_dict = {"<=50K": "brown", ">50K": "green"}
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    n_rows=3,
+    n_cols=4,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="grid",
+    show_legend=True,
+    xlabel_rot=0,
+    show_plot="grid",
+    rotate_plot=False,
+    grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=False,
+    scatter_color="#808080",
+    hue="income",
+    hue_palette=hue_dict,
+    show_correlation=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+
+

Correlation Matrices

+

Generate and Save Customizable Correlation Heatmaps

+

The flex_corr_matrix function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats.

+

Customizable Plot Appearance

+

The function provides extensive customization options for the heatmap’s appearance:

+
    +
  • Colormap Selection: Choose from a variety of colormaps to represent the strength of correlations. The default is "coolwarm", but this can be adjusted to fit the needs of the analysis.

  • +
  • Annotation: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance.

  • +
  • Figure Size and Layout: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards.

  • +
+

Triangular vs. Full Correlation Matrix

+

A key feature of the flex_corr_matrix function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations.

+

Label and Axis Configuration

+

The function offers flexibility in configuring axis labels and titles:

+
    +
  • Label Rotation: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names.

  • +
  • Font Sizes: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable.

  • +
  • Title Wrapping: Control the wrapping of long titles to fit within the plot without overlapping other elements.

  • +
+

Plot Display and Saving Options

+

The flex_corr_matrix function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images.

+
+
+flex_corr_matrix(df, cols=None, annot=True, cmap='coolwarm', save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title='Cervical Cancer Data: Correlation Matrix', label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment='right', ylabel_alignment='center_baseline', text_wrap=50, vmin=-1, vmax=1, cbar_label='Correlation Index', triangular=True, **kwargs)
+

Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

  • +
  • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

  • +
  • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

  • +
  • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

  • +
  • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

  • +
  • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

  • +
  • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

  • +
  • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

  • +
  • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

  • +
  • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

  • +
  • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

  • +
  • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

  • +
  • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

  • +
  • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

  • +
+
+
Raises:
+

ValueError

    +
  • If annot is not a boolean.

  • +
  • If cols is not a list.

  • +
  • If save_plots is not a boolean.

  • +
  • If triangular is not a boolean.

  • +
  • If save_plots is True but no image paths are provided.

  • +
+

+
+
Returns:
+

None +This function does not return any value but generates and optionally saves a correlation heatmap.

+
+
+
+ +
+

Triangular Correlation Matrix Example

+

The provided code filters the census [1] DataFrame df to include only numeric columns using +select_dtypes(np.number). It then utilizes the flex_corr_matrix() function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options.

+
+

Note

+

This triangular matrix format is particularly useful for avoiding +redundancy in correlation matrices, as it excludes the lower half, +making it easier to focus on unique pairwise correlations.

+
+

The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations.

+
# Select only numeric data to pass into the function
+df_num = df.select_dtypes(np.number)
+
+
+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="coolwarm",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=True,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Full Correlation Matrix Example

+

In this modified census [1] example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting cmap="viridis", the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting triangular=False, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset.

+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="viridis",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+

Partial Dependence Plots

+

Partial Dependence Plots (PDPs) are a powerful tool in machine learning +interpretability, providing insights into how features influence the predicted +outcome of a model. PDPs can be generated in both 2D and 3D, depending on +whether you want to analyze the effect of one feature or the interaction between +two features on the model’s predictions.

+
+

Theoretical Foundation of PDPs

+

Let \(\mathbf{X}\) represent the complete set of input features for a machine +learning model, where \(\mathbf{X} = \{X_1, X_2, \dots, X_p\}\). Suppose we’re +particularly interested in a subset of these features, denoted by \(\mathbf{X}_S\). +The complementary set, \(\mathbf{X}_C\), contains all the features in \(\mathbf{X}\) +that are not in \(\mathbf{X}_S\). Mathematically, this relationship is expressed as:

+
+\[\mathbf{X}_C = \mathbf{X} \setminus \mathbf{X}_S\]
+

where \(\mathbf{X}_C\) is the set of features in \(\mathbf{X}\) after +removing the features in \(\mathbf{X}_S\).

+

Partial Dependence Plots (PDPs) are used to illustrate the effect of the features +in \(\mathbf{X}_S\) on the model’s predictions, while averaging out the +influence of the features in \(\mathbf{X}_C\). This is mathematically defined as:

+
+\[\begin{split}\begin{align*} +\text{PD}_{\mathbf{X}_S}(x_S) &= \mathbb{E}_{\mathbf{X}_C} \left[ f(x_S, \mathbf{X}_C) \right] \\ +&= \int f(x_S, x_C) \, p(x_C) \, dx_C \\ +&= \int \left( \int f(x_S, x_C) \, p(x_C \mid x_S) \, dx_C \right) p(x_S) \, dx_S +\end{align*}\end{split}\]
+

where:

+
    +
  • \(\mathbb{E}_{\mathbf{X}_C} \left[ \cdot \right]\) indicates that we are taking the expected value over the possible values of the features in the set \(\mathbf{X}_C\).

  • +
  • \(p(x_C)\) represents the probability density function of the features in \(\mathbf{X}_C\).

  • +
+

This operation effectively summarizes the model’s output over all potential values of the complementary features, providing a clear view of how the features in \(\mathbf{X}_S\) alone impact the model’s predictions.

+

2D Partial Dependence Plots

+

Consider a trained machine learning model \(f(\mathbf{X})\), where \(\mathbf{X} = (X_1, X_2, \dots, X_p)\) represents the vector of input features. The partial dependence of the predicted response \(\hat{y}\) on a single feature \(X_j\) is defined as:

+
+\[\text{PD}(X_j) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, \mathbf{X}_{C_i})\]
+

where:

+
    +
  • \(X_j\) is the feature of interest.

  • +
  • \(\mathbf{X}_{C_i}\) represents the complement set of \(X_j\), meaning the remaining features in \(\mathbf{X}\) not included in \(X_j\) for the \(i\)-th instance.

  • +
  • \(n\) is the number of observations in the dataset.

  • +
+

For two features, \(X_j\) and \(X_k\), the partial dependence is given by:

+
+\[\text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i})\]
+

This results in a 2D surface plot (or contour plot) that shows how the predicted outcome changes as the values of \(X_j\) and \(X_k\) vary, while the effects of the other features are averaged out.

+
    +
  • Single Feature PDP: When plotting \(\text{PD}(X_j)\), the result is a 2D line plot showing the marginal effect of feature \(X_j\) on the predicted outcome, averaged over all possible values of the other features.

  • +
  • Two Features PDP: When plotting \(\text{PD}(X_j, X_k)\), the result is a 3D surface plot (or a contour plot) that shows the combined marginal effect of \(X_j\) and \(X_k\) on the predicted outcome. The surface represents the expected value of the prediction as \(X_j\) and \(X_k\) vary, while all other features are averaged out.

  • +
+

3D Partial Dependence Plots

+

For a more comprehensive analysis, especially when exploring interactions between two features, 3D Partial Dependence Plots are invaluable. The partial dependence function for two features in a 3D context is:

+
+\[\text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i})\]
+

Here, the function \(f(X_j, X_k, \mathbf{X}_{C_i})\) is evaluated across a grid of values for \(X_j\) and \(X_k\). The resulting 3D surface plot represents how the model’s prediction changes over the joint range of these two features.

+

The 3D plot offers a more intuitive visualization of feature interactions compared to 2D contour plots, allowing for a better understanding of the combined effects of features on the model’s predictions. The surface plot is particularly useful when you need to capture complex relationships that might not be apparent in 2D.

+
    +
  • Feature Interaction Visualization: The 3D PDP provides a comprehensive view of the interaction between two features. The resulting surface plot allows for the visualization of how the model’s output changes when the values of two features are varied simultaneously, making it easier to understand complex interactions.

  • +
  • Enhanced Interpretation: 3D PDPs offer enhanced interpretability in scenarios where feature interactions are not linear or where the effect of one feature depends on the value of another. The 3D visualization makes these dependencies more apparent.

  • +
+
+
+

2D Partial Dependence Plots

+

The plot_2d_pdp function generates 2D partial dependence plots for individual features or pairs of features. These plots are essential for examining the marginal effect of features on the predicted outcome.

+
    +
  • Grid and Individual Plots: Generate all 2D partial dependence plots in a grid layout or as separate individual plots, offering flexibility in presentation.

  • +
  • Customization Options: Control the figure size, font sizes for labels and ticks, and the wrapping of long titles to ensure the plots are clear and informative.

  • +
  • Saving Plots: The function provides options to save the plots in PNG or SVG formats, and you can specify whether to save all plots, only individual plots, or just the grid plot.

  • +
+
+
+plot_2d_pdp(model, X_train, feature_names, features, title='PDP of house value on CA non-location features', grid_resolution=50, plot_type='grid', grid_figsize=(12, 8), individual_figsize=(6, 4), label_fontsize=12, tick_fontsize=10, text_wrap=50, image_path_png=None, image_path_svg=None, save_plots=None, file_prefix='partial_dependence')
+

Generate 2D partial dependence plots for specified features using the given machine learning model. The function allows for plotting in grid or individual layouts, with various customization options for figure size, font sizes, and title wrapping. Additionally, the plots can be saved in PNG or SVG formats with a customizable filename prefix.

+
+
Parameters:
+
    +
  • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

  • +
  • X_train (pandas.DataFrame or numpy.ndarray) – The training data used to compute partial dependence. Should correspond to the features used to train the model.

  • +
  • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

  • +
  • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

  • +
  • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

  • +
  • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

  • +
  • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

  • +
  • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

  • +
  • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

  • +
  • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

  • +
  • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

  • +
  • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

  • +
  • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

  • +
  • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

  • +
+
+
Raises:
+

ValueError

    +
  • If plot_type is not one of "grid", "individual", or "both".

  • +
  • If save_plots is enabled but neither image_path_png nor image_path_svg is provided.

  • +
+

+
+
Returns:
+

None +This function generates partial dependence plots and displays them. It does not return any values.

+
+
+
+ +
+

2D Plots - CA Housing Example

+

Consider a scenario where you have a machine learning model predicting median +house values in California. [4] Suppose you want to understand how non-location +features like the average number of occupants per household (AveOccup) and the +age of the house (HouseAge) jointly influence house values. A 2D partial +dependence plot allows you to visualize this relationship in two ways: either as +individual plots for each feature or as a combined plot showing the interaction +between two features.

+

For instance, the 2D partial dependence plot can help you analyze how the age of +the house impacts house values while holding the number of occupants constant, or +vice versa. This is particularly useful for identifying the most influential +features and understanding how changes in these features might affect the +predicted house value.

+

If you extend this to two interacting features, such as AveOccup and HouseAge, +you can explore their combined effect on house prices. The plot can reveal how +different combinations of occupancy levels and house age influence the value, +potentially uncovering non-linear relationships or interactions that might not be +immediately obvious from a simple 1D analysis.

+

Here’s how you can generate and visualize these 2D partial dependence plots using +the California housing dataset:

+

Fetch The CA Housing Dataset and Prepare The DataFrame

+
from sklearn.datasets import fetch_california_housing
+from sklearn.model_selection import train_test_split
+from sklearn.ensemble import GradientBoostingRegressor
+import pandas as pd
+
+# Load the dataset
+data = fetch_california_housing()
+df = pd.DataFrame(data.data, columns=data.feature_names)
+
+
+

Split The Data Into Training and Testing Sets

+
X_train, X_test, y_train, y_test = train_test_split(
+    df, data.target, test_size=0.2, random_state=42
+)
+
+
+

Train a GradientBoostingRegressor Model

+
model = GradientBoostingRegressor(
+    n_estimators=100,
+    max_depth=4,
+    learning_rate=0.1,
+    loss="huber",
+    random_state=42,
+)
+model.fit(X_train, y_train)
+
+
+

Create 2D Partial Dependence Plot Grid

+
# import the plot_2d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_2d_pdp
+
+# Feature names
+names = data.feature_names
+
+# Generate 2D partial dependence plots
+plot_2d_pdp(
+    model=model,
+    X_train=X_train,
+    feature_names=names,
+    features=[
+        "MedInc",
+        "AveOccup",
+        "HouseAge",
+        "AveRooms",
+        "Population",
+        ("AveOccup", "HouseAge"),
+    ],
+    title="PDP of house value on CA non-location features",
+    grid_figsize=(14, 10),
+    individual_figsize=(12, 4),
+    label_fontsize=14,
+    tick_fontsize=12,
+    text_wrap=120,
+    plot_type="grid",
+    image_path_png="path/to/save/png",
+    save_plots="all",
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+

3D Partial Dependence Plots

+

The plot_3d_pdp function extends the concept of partial dependence to three dimensions, allowing you to visualize the interaction between two features and their combined effect on the model’s predictions.

+
    +
  • Interactive and Static 3D Plots: Generate static 3D plots using Matplotlib or interactive 3D plots using Plotly. The function also allows for generating both types simultaneously.

  • +
  • Colormap and Layout Customization: Customize the colormaps for both Matplotlib and Plotly plots. Adjust figure size, camera angles, and zoom levels to create plots that fit perfectly within your presentation or report.

  • +
  • Axis and Title Configuration: Customize axis labels for both Matplotlib and Plotly plots. Adjust font sizes and control the wrapping of long titles to maintain readability.

  • +
+
+
+plot_3d_pdp(model, dataframe, feature_names_list, x_label=None, y_label=None, z_label=None, title, html_file_path=None, html_file_name=None, image_filename=None, plot_type="both", matplotlib_colormap=None, plotly_colormap="Viridis", zoom_out_factor=None, wireframe_color=None, view_angle=(22, 70), figsize=(7, 4.5), text_wrap=50, horizontal=-1.25, depth=1.25, vertical=1.25, cbar_x=1.05, cbar_thickness=25, title_x=0.5, title_y=0.95, top_margin=100, image_path_png=None, image_path_svg=None, show_cbar=True, grid_resolution=20, left_margin=20, right_margin=65, label_fontsize=8, tick_fontsize=6, enable_zoom=True, show_modebar=True)
+

Generate 3D partial dependence plots for two features of a machine learning model.

+

This function supports both static (Matplotlib) and interactive (Plotly) visualizations, allowing for flexible and comprehensive analysis of the relationship between two features and the target variable in a model.

+
+
Parameters:
+
    +
  • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

  • +
  • dataframe (pandas.DataFrame or numpy.ndarray) – The dataset on which the model was trained or a representative sample. If a DataFrame is provided, feature_names_list should correspond to the column names. If a NumPy array is provided, feature_names_list should correspond to the indices of the columns.

  • +
  • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

  • +
  • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

  • +
  • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

  • +
  • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

  • +
  • title (str) – The title for the plots.

  • +
  • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

  • +
  • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

  • +
  • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

  • +
  • plot_type (str, optional) – The type of plots to generate. Options are: +- "static": Generate only static Matplotlib plots. +- "interactive": Generate only interactive Plotly plots. +- "both": Generate both static and interactive plots. Default is "both".

  • +
  • matplotlib_colormap (matplotlib.colors.Colormap, optional) – Custom colormap for the Matplotlib plot. If not provided, a default colormap is used.

  • +
  • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

  • +
  • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

  • +
  • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

  • +
  • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

  • +
  • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

  • +
  • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

  • +
  • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

  • +
  • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

  • +
  • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

  • +
  • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

  • +
  • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

  • +
  • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

  • +
  • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

  • +
  • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

  • +
  • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

  • +
  • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

  • +
  • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

  • +
  • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

  • +
  • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

  • +
  • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

  • +
+
+
Raises:
+

ValueError

    +
  • If plot_type is not one of "static", "interactive", or "both".

  • +
  • If plot_type is "interactive" or "both" and html_file_path or html_file_name are not provided.

  • +
+

+
+
Returns:
+

None +This function generates 3D partial dependence plots and displays or saves them. It does not return any values.

+
+
Notes:
+
    +
  • This function handles warnings related to scikit-learn’s partial_dependence function, specifically a FutureWarning related to non-tuple sequences for multidimensional indexing. This warning is suppressed as it stems from the internal workings of scikit-learn in Python versions like 3.7.4.

  • +
  • To maintain compatibility with different versions of scikit-learn, the function attempts to use "values" for grid extraction in newer versions and falls back to "grid_values" for older versions.

  • +
+
+
+
+ +
+

3D Plots - CA Housing Example

+

Consider a scenario where you have a machine learning model predicting median +house values in California.[4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (AveOccup) and the +age of the house (HouseAge) jointly influence house values. A 3D partial +dependence plot allows you to visualize this relationship in a more comprehensive +manner, providing a detailed view of how these two features interact to affect +the predicted house value.

+

For instance, the 3D partial dependence plot can help you explore how different +combinations of house age and occupancy levels influence house values. By +visualizing the interaction between AveOccup and HouseAge in a 3D space, you can +uncover complex, non-linear relationships that might not be immediately apparent +in 2D plots.

+

This type of plot is particularly useful when you need to understand the joint +effect of two features on the target variable, as it provides a more intuitive +and detailed view of how changes in both features impact predictions simultaneously.

+

Here’s how you can generate and visualize these 3D partial dependence plots +using the California housing dataset:

+
+
+

Static Plot

+

Fetch The CA Housing Dataset and Prepare The DataFrame

+
from sklearn.ensemble import GradientBoostingRegressor
+from sklearn.datasets import fetch_california_housing
+from sklearn.model_selection import train_test_split
+import pandas as pd
+
+# Load the dataset
+data = fetch_california_housing()
+df = pd.DataFrame(data.data, columns=data.feature_names)
+
+
+

Split The Data Into Training and Testing Sets

+
X_train, X_test, y_train, y_test = train_test_split(
+    df, data.target, test_size=0.2, random_state=42
+)
+
+
+

Train a GradientBoostingRegressor Model

+
model = GradientBoostingRegressor(
+    n_estimators=100,
+    max_depth=4,
+    learning_rate=0.1,
+    loss="huber",
+    random_state=1,
+)
+model.fit(X_train, y_train)
+
+
+

Create Static 3D Partial Dependence Plot

+
# import the plot_3d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_3d_pdp
+
+# Call the function to generate the plot
+plot_3d_pdp(
+    model=model,
+    dataframe=X_test,  # Use the test dataset
+    feature_names_list=["HouseAge", "AveOccup"],
+    x_label="House Age",
+    y_label="Average Occupancy",
+    z_label="Partial Dependence",
+    title="3D Partial Dependence Plot of House Age vs. Average Occupancy",
+    image_filename="3d_pdp",
+    plot_type="static",
+    figsize=[8, 5],
+    text_wrap=40,
+    wireframe_color="black",
+    image_path_png=image_path_png,
+    grid_resolution=30,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Interactive Plot

+
# import the plot_3d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_3d_pdp
+
+# Call the function to generate the plot
+plot_3d_pdp(
+    model=model,
+    dataframe=X_test,  # Use the test dataset
+    feature_names_list=["HouseAge", "AveOccup"],
+    x_label="House Age",
+    y_label="Average Occupancy",
+    z_label="Partial Dependence",
+    title="3D Partial Dependence Plot of House Age vs. Average Occupancy",
+    html_file_path=image_path_png,
+    image_filename="3d_pdp",
+    html_file_name="3d_pdp.html",
+    plot_type="interactive",
+    text_wrap=40,
+    zoom_out_factor=0.5,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    grid_resolution=30,
+    label_fontsize=8,
+    tick_fontsize=6,
+    title_x=0.38,
+    top_margin=10,
+    right_margin=250,
+    cbar_x=0.9,
+    cbar_thickness=25,
+    show_modebar=False,
+    enable_zoom=True,
+)
+
+
+
+

Warning

+

Scrolling Notice:

+

While interacting with the interactive Plotly plot below, scrolling down the +page using the mouse wheel may be blocked when the mouse pointer is hovering +over the plot. To continue scrolling, either move the mouse pointer outside +the plot area or use the keyboard arrow keys to navigate down the page.

+
+ + +

This interactive plot was generated using Plotly, which allows for rich, +interactive visualizations directly in the browser. The plot above is an example +of an interactive 3D Partial Dependence Plot. Here’s how it differs from +generating a static plot using Matplotlib.

+

Key Differences

+

Plot Type:

+
    +
  • The plot_type is set to "interactive" for the Plotly plot and "static" for the Matplotlib plot.

  • +
+

Interactive-Specific Parameters:

+
    +
  • HTML File Path and Name: The html_file_path and html_file_name parameters are required to save the interactive Plotly plot as an HTML file. These parameters are not needed for static plots.

  • +
  • Zoom and Positioning: The interactive plot includes parameters like zoom_out_factor, title_x, cbar_x, and cbar_thickness to control the zoom level, title position, and color bar position in the Plotly plot. These parameters do not affect the static plot.

  • +
  • Mode Bar and Zoom: The show_modebar and enable_zoom parameters are specific to the interactive Plotly plot, allowing you to toggle the visibility of the mode bar and enable or disable zoom functionality.

  • +
+

Static-Specific Parameters:

+
    +
  • Figure Size and Wireframe Color: The static plot uses parameters like figsize to control the size of the Matplotlib plot and wireframe_color to define the color of the wireframe in the plot. These parameters are not applicable to the interactive Plotly plot.

  • +
+

By adjusting these parameters, you can customize the behavior and appearance of your 3D Partial Dependence Plots according to your needs, whether for static or interactive visualization.

+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/.buildinfo b/_build/html/v0.0.9/.buildinfo new file mode 100644 index 000000000..68cfefe3c --- /dev/null +++ b/_build/html/v0.0.9/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 53f25e0512cf18061513877a6cf8fc9a +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/v0.0.9/.doctrees/acknowledgements.doctree b/_build/html/v0.0.9/.doctrees/acknowledgements.doctree new file mode 100644 index 000000000..53d706e39 Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/acknowledgements.doctree differ diff --git a/_build/html/v0.0.9/.doctrees/changelog.doctree b/_build/html/v0.0.9/.doctrees/changelog.doctree new file mode 100644 index 000000000..9209c73ef Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/changelog.doctree differ diff --git a/_build/html/v0.0.9/.doctrees/citations.doctree b/_build/html/v0.0.9/.doctrees/citations.doctree new file mode 100644 index 000000000..1bd9835a3 Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/citations.doctree differ diff --git a/_build/html/v0.0.9/.doctrees/contributors.doctree b/_build/html/v0.0.9/.doctrees/contributors.doctree new file mode 100644 index 000000000..d040ba2c6 Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/contributors.doctree differ diff --git a/_build/html/v0.0.9/.doctrees/data_management.doctree b/_build/html/v0.0.9/.doctrees/data_management.doctree new file mode 100644 index 000000000..20d1788c3 Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/data_management.doctree differ diff --git a/_build/html/v0.0.9/.doctrees/eda_plots.doctree b/_build/html/v0.0.9/.doctrees/eda_plots.doctree new file mode 100644 index 000000000..3c84d4491 Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/eda_plots.doctree differ diff --git a/_build/html/v0.0.9/.doctrees/environment.pickle b/_build/html/v0.0.9/.doctrees/environment.pickle new file mode 100644 index 000000000..52c523907 Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/environment.pickle differ diff --git a/_build/html/v0.0.9/.doctrees/getting_started.doctree b/_build/html/v0.0.9/.doctrees/getting_started.doctree new file mode 100644 index 000000000..991ec521c Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/getting_started.doctree differ diff --git a/_build/html/v0.0.9/.doctrees/index.doctree b/_build/html/v0.0.9/.doctrees/index.doctree new file mode 100644 index 000000000..52174dbd9 Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/index.doctree differ diff --git a/_build/html/v0.0.9/.doctrees/references.doctree b/_build/html/v0.0.9/.doctrees/references.doctree new file mode 100644 index 000000000..f8088f301 Binary files /dev/null and b/_build/html/v0.0.9/.doctrees/references.doctree differ diff --git a/_build/html/v0.0.9/_images/2d_pdp_grid.svg b/_build/html/v0.0.9/_images/2d_pdp_grid.svg new file mode 100644 index 000000000..641db4ba6 --- /dev/null +++ b/_build/html/v0.0.9/_images/2d_pdp_grid.svg @@ -0,0 +1,4405 @@ + + + + + + + + 2024-09-08T21:59:22.990207 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/3d_pdp.svg b/_build/html/v0.0.9/_images/3d_pdp.svg new file mode 100644 index 000000000..535371233 --- /dev/null +++ b/_build/html/v0.0.9/_images/3d_pdp.svg @@ -0,0 +1,8326 @@ + + + + + + + + 2024-09-12T22:36:25.786914 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/Bar_Age_regular_income.svg b/_build/html/v0.0.9/_images/Bar_Age_regular_income.svg new file mode 100644 index 000000000..6f8aa40d4 --- /dev/null +++ b/_build/html/v0.0.9/_images/Bar_Age_regular_income.svg @@ -0,0 +1,1201 @@ + + + + + + + + 2024-08-04T12:01:07.319833 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/Stacked_Bar_Age_income.svg b/_build/html/v0.0.9/_images/Stacked_Bar_Age_income.svg new file mode 100644 index 000000000..d5510308b --- /dev/null +++ b/_build/html/v0.0.9/_images/Stacked_Bar_Age_income.svg @@ -0,0 +1,1943 @@ + + + + + + + + 2024-08-04T11:47:19.816889 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/Stacked_Bar_Age_income_pivoted.svg b/_build/html/v0.0.9/_images/Stacked_Bar_Age_income_pivoted.svg new file mode 100644 index 000000000..2147fce1a --- /dev/null +++ b/_build/html/v0.0.9/_images/Stacked_Bar_Age_income_pivoted.svg @@ -0,0 +1,2043 @@ + + + + + + + + 2024-08-04T11:56:38.571027 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/Stacked_Bar_Age_income_regular.svg b/_build/html/v0.0.9/_images/Stacked_Bar_Age_income_regular.svg new file mode 100644 index 000000000..04478581f --- /dev/null +++ b/_build/html/v0.0.9/_images/Stacked_Bar_Age_income_regular.svg @@ -0,0 +1,1347 @@ + + + + + + + + 2024-08-04T11:54:36.826244 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/Stacked_Bar_Age_sex.svg b/_build/html/v0.0.9/_images/Stacked_Bar_Age_sex.svg new file mode 100644 index 000000000..7b2bcb137 --- /dev/null +++ b/_build/html/v0.0.9/_images/Stacked_Bar_Age_sex.svg @@ -0,0 +1,1970 @@ + + + + + + + + 2024-08-04T11:55:12.796551 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/all_plots_comparisons_boxplot.png b/_build/html/v0.0.9/_images/all_plots_comparisons_boxplot.png new file mode 100644 index 000000000..c4f54b520 Binary files /dev/null and b/_build/html/v0.0.9/_images/all_plots_comparisons_boxplot.png differ diff --git a/_build/html/v0.0.9/_images/all_plots_comparisons_violinplot.png b/_build/html/v0.0.9/_images/all_plots_comparisons_violinplot.png new file mode 100644 index 000000000..cc236e21c Binary files /dev/null and b/_build/html/v0.0.9/_images/all_plots_comparisons_violinplot.png differ diff --git a/_build/html/v0.0.9/_images/all_plots_comparisons_violinplot_pivoted.png b/_build/html/v0.0.9/_images/all_plots_comparisons_violinplot_pivoted.png new file mode 100644 index 000000000..b05150e06 Binary files /dev/null and b/_build/html/v0.0.9/_images/all_plots_comparisons_violinplot_pivoted.png differ diff --git a/_build/html/v0.0.9/_images/count_hist_distributions.svg b/_build/html/v0.0.9/_images/count_hist_distributions.svg new file mode 100644 index 000000000..f08328f86 --- /dev/null +++ b/_build/html/v0.0.9/_images/count_hist_distributions.svg @@ -0,0 +1,1719 @@ + + + + + + + + 2024-09-17T18:49:36.706975 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/density_hist_dist_age.svg b/_build/html/v0.0.9/_images/density_hist_dist_age.svg new file mode 100644 index 000000000..717ca6bf8 --- /dev/null +++ b/_build/html/v0.0.9/_images/density_hist_dist_age.svg @@ -0,0 +1,1375 @@ + + + + + + + + 2024-09-16T23:27:50.927548 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/density_hist_dist_mean_median.svg b/_build/html/v0.0.9/_images/density_hist_dist_mean_median.svg new file mode 100644 index 000000000..cd480f5ed --- /dev/null +++ b/_build/html/v0.0.9/_images/density_hist_dist_mean_median.svg @@ -0,0 +1,1935 @@ + + + + + + + + 2024-09-16T22:16:05.594049 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/eda_toolkit_logo.svg b/_build/html/v0.0.9/_images/eda_toolkit_logo.svg new file mode 100644 index 000000000..d039d6f79 --- /dev/null +++ b/_build/html/v0.0.9/_images/eda_toolkit_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_build/html/v0.0.9/_images/hist_density_distributions.svg b/_build/html/v0.0.9/_images/hist_density_distributions.svg new file mode 100644 index 000000000..5ce1a7191 --- /dev/null +++ b/_build/html/v0.0.9/_images/hist_density_distributions.svg @@ -0,0 +1,1744 @@ + + + + + + + + 2024-09-17T18:44:23.458508 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/kde_density_distributions.svg b/_build/html/v0.0.9/_images/kde_density_distributions.svg new file mode 100644 index 000000000..b42cfeb18 --- /dev/null +++ b/_build/html/v0.0.9/_images/kde_density_distributions.svg @@ -0,0 +1,2301 @@ + + + + + + + + 2024-09-16T21:17:44.672843 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/normal_distribution.png b/_build/html/v0.0.9/_images/normal_distribution.png new file mode 100644 index 000000000..837c60e0c Binary files /dev/null and b/_build/html/v0.0.9/_images/normal_distribution.png differ diff --git a/_build/html/v0.0.9/_images/scatter_plots_all_grid.png b/_build/html/v0.0.9/_images/scatter_plots_all_grid.png new file mode 100644 index 000000000..78652ac74 Binary files /dev/null and b/_build/html/v0.0.9/_images/scatter_plots_all_grid.png differ diff --git a/_build/html/v0.0.9/_images/scatter_plots_grid.png b/_build/html/v0.0.9/_images/scatter_plots_grid.png new file mode 100644 index 000000000..5a51facd8 Binary files /dev/null and b/_build/html/v0.0.9/_images/scatter_plots_grid.png differ diff --git a/_build/html/v0.0.9/_images/scatter_plots_grid_grouped.png b/_build/html/v0.0.9/_images/scatter_plots_grid_grouped.png new file mode 100644 index 000000000..02a3b3916 Binary files /dev/null and b/_build/html/v0.0.9/_images/scatter_plots_grid_grouped.png differ diff --git a/_build/html/v0.0.9/_images/summarize_combos.gif b/_build/html/v0.0.9/_images/summarize_combos.gif new file mode 100644 index 000000000..402ee1efc Binary files /dev/null and b/_build/html/v0.0.9/_images/summarize_combos.gif differ diff --git a/_build/html/v0.0.9/_images/us_census_correlation_matrix.svg b/_build/html/v0.0.9/_images/us_census_correlation_matrix.svg new file mode 100644 index 000000000..2a41e1afa --- /dev/null +++ b/_build/html/v0.0.9/_images/us_census_correlation_matrix.svg @@ -0,0 +1,1766 @@ + + + + + + + + 2024-08-09T18:12:33.390718 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_images/us_census_correlation_matrix_full.svg b/_build/html/v0.0.9/_images/us_census_correlation_matrix_full.svg new file mode 100644 index 000000000..d0df5da46 --- /dev/null +++ b/_build/html/v0.0.9/_images/us_census_correlation_matrix_full.svg @@ -0,0 +1,1907 @@ + + + + + + + + 2024-08-09T18:30:04.884359 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_sources/acknowledgements.rst.txt b/_build/html/v0.0.9/_sources/acknowledgements.rst.txt new file mode 100644 index 000000000..e62da5a10 --- /dev/null +++ b/_build/html/v0.0.9/_sources/acknowledgements.rst.txt @@ -0,0 +1,30 @@ +.. _acknowledgements: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Acknowledgements +================= + +We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists. + +We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors. diff --git a/_build/html/v0.0.9/_sources/changelog.rst.txt b/_build/html/v0.0.9/_sources/changelog.rst.txt new file mode 100644 index 000000000..3dc4db485 --- /dev/null +++ b/_build/html/v0.0.9/_sources/changelog.rst.txt @@ -0,0 +1,604 @@ +.. _changelog: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Changelog +========= + +`Version 0.0.9`_ +---------------------- + +.. _Version 0.0.9: https://lshpaner.github.io/eda_toolkit/v0.0.9/index.html + +**Bug Fixes and Minor Improvements** + +Improved error messages and validation checks across multiple functions to prevent common pitfalls and ensure smoother user experience. + +**Visualization Enhancements** + +**DataFrame Columns:** Added a ``background_color`` variable to ``dataframe_columns```, +allowing the user to enter a string representing a color name, or hex value. +Try/Except on the output, in case the end user has a deprecated version of Pandas, +where the styler would use ``hide()`` instead of ``hide_index()``. The highlighted +columns allow for easier null versus unique value analysis. + +The docstring now clearly describes the purpose of the function—analyzing +DataFrame columns to provide summary statistics. + +**Args:** + +- The ``df`` argument is specified as a ``pandas.DataFrame``. + +- The ``background_color`` argument is marked as optional, with a brief description of its role. + +- The ``return_df`` argument is also marked as optional, explaining what it controls. + + +**Returns:** The return type is specified as ``pandas.DataFrame``, with a clear explanation of the difference based on the ``return_df`` flag. + +**KDE Distribution Plots:** Improved ``kde_distributions()`` with enhanced options for log scaling, mean/median plotting, custom standard deviation lines, and better handling of legends and scientific notation. + +**Scatter Plots:** Enhanced ``scatter_fit_plot()`` with support for hue-based coloring, best fit lines, correlation display, and flexible grid plotting options. + + +`Version 0.0.8`_ +---------------------- + +.. _Version 0.0.8: https://lshpaner.github.io/eda_toolkit/v0.0.8/index.html + + +:class:`stacked_crosstab_plot` + +- **Flexible `save_formats` Input**: + - `save_formats` now accepts a string, tuple, or list for specifying formats (e.g., `"png"`, `("png", "svg")`, or `["png", "svg"]`). + - Single strings or tuples are automatically converted to lists for consistent processing. + +- **Dynamic Error Handling**: + - Added checks to ensure a valid path is provided for each format in `save_formats`. + - Raises a `ValueError` if a format is specified without a corresponding path, with a clear, dynamic error message. + +- **Improved Plot Saving Logic**: + - Updated logic allows saving plots in one format (e.g., only `"png"` or `"svg"`) without requiring the other. + - Simplified and more intuitive path handling for saving plots. + + +:class:`plot_3d_pdp` + +This update introduces several key changes to the `plot_3d_pdp` function, simplifying the function's interface and improving usability, while maintaining the flexibility needed for diverse visualization needs. + +**1. Parameter Changes** + + +- **Removed Parameters:** + + - The parameters ``x_label_plotly``, ``y_label_plotly``, and ``z_label_plotly`` have been removed. These parameters previously allowed custom axis labels specifically for the Plotly plot, defaulting to the general ``x_label``, ``y_label``, and ``z_label``. Removing these parameters simplifies the function signature while maintaining flexibility. + +- **Default Values for Labels:** + + - The parameters ``x_label``, ``y_label``, and ``z_label`` are now optional, with ``None`` as the default. If not provided, these labels will automatically default to the names of the features in the ``feature_names_list``. This change makes the function more user-friendly, particularly for cases where default labels are sufficient. + +- **Changes in Default Values for View Angles:** + + - The default values for camera positioning parameters have been updated: ``horizontal`` is now ``-1.25``, ``depth`` is now ``1.25``, and ``vertical`` is now ``1.25``. These adjustments refine the default 3D view perspective for the Plotly plot, providing a more intuitive starting view. + +**2. Plot Generation Logic** + +- **Conditionally Checking Labels:** + + - The function now checks whether ``x_label``, ``y_label``, and ``z_label`` are provided. If these are ``None``, the function will automatically assign default labels based on the ``feature_names_list``. This enhancement reduces the need for users to manually specify labels, making the function more adaptive. + +- **Camera Position Adjustments:** + + - The camera positions for the Plotly plot are now adjusted by multiplying ``horizontal``, ``depth``, and ``vertical`` by ``zoom_out_factor``. This change allows for more granular control over the 3D view, enhancing the interactivity and flexibility of the Plotly visualizations. + +- **Surface Plot Coordinates Adjustments:** + + - The order of the coordinates for the Plotly plot’s surface has been changed from ``ZZ, XX, YY[::-1]`` to ``ZZ, XX, YY``. This adjustment ensures the proper alignment of axes and grids, resulting in more accurate visual representations. + +**3. Code Simplifications** + +- **Removed Complexity:** + + - By removing the ``x_label_plotly``, ``y_label_plotly``, and ``z_label_plotly`` parameters, the code is now simpler and easier to maintain. This change reduces potential confusion and streamlines the function for users who do not need distinct labels for Matplotlib and Plotly plots. + +- **Fallback Mechanism for Grid Values:** + + - The function continues to implement a fallback mechanism when extracting grid values, ensuring compatibility with various versions of scikit-learn. This makes the function robust across different environments. + +**4. Style Adjustments** + +- **Label Formatting:** + + - The new version consistently uses ``y_label``, ``x_label``, and ``z_label`` for axis labels in the Matplotlib plot, aligning the formatting across different plot types. + +- **Color Bar Adjustments:** + + - The color bar configuration in the Matplotlib plot has been slightly adjusted with a shrink value of ``0.6`` and a pad value of ``0.02``. These adjustments result in a more refined visual appearance, particularly in cases where space is limited. + +**5. Potential Use Case Differences** + +- **Simplified Interface:** + + - The updated function is more streamlined for users who prefer a simplified interface without the need for separate label customizations for Plotly and Matplotlib plots. This makes it easier to use in common scenarios. + +- **Less Granular Control:** + + - Users who need more granular control, particularly for presentations or specific formatting, may find the older version more suitable. The removal of the ``*_plotly`` label parameters means that all plots now use the same labels across Matplotlib and Plotly. + +**6. Matplotlib Plot Adjustments** + +- **Wireframe and Surface Plot Enhancements:** + + - The logic for plotting wireframes and surface plots in Matplotlib remains consistent with previous versions, with subtle enhancements to color and layout management to improve overall aesthetics. + +**Summary** + +- Version ``0.0.8d`` of the `plot_3d_pdp` function introduces simplifications that reduce the number of parameters and streamline the plotting process. While some customizability has been removed, the function remains flexible enough for most use cases and is easier to use. +- Key updates include adjusted default camera views for 3D plots, removal of Plotly-specific label parameters, and improved automatic labeling and plotting logic. + +**Decision Point** + +- This update may be especially useful for users who prefer a cleaner and more straightforward interface. However, those requiring detailed customizations may want to continue using the older version, depending on their specific needs. + + +Version 0.0.8c +------------------------ + +Version 0.0.8c is a follow-up release to version 0.0.8b. This update includes minor enhancements and refinements based on feedback and additional testing. It serves as an incremental step towards improving the stability and functionality of the toolkit. + +**Key Updates in 0.0.8c:** + +- **Bug Fixes:** Addressed minor issues identified in version ``0.0.8b`` to ensure smoother performance and better user experience. +- **Additional Testing:** Incorporated further tests to validate the changes introduced in previous versions and to prepare for future stable releases. +- **Refinements:** Made small enhancements to existing features based on user feedback and internal testing results. + +**Summary of Changes** + +1. New Features & Enhancements + +- ``plot_3d_pdp`` Function: + + - Added ``show_modebar`` Parameter: Introduced a new boolean parameter, ``show_modebar``, to allow users to toggle the visibility of the mode bar in Plotly interactive plots. + + - Custom Margins and Layout Adjustments: + + - Added parameters for ``left_margin``, ``right_margin``, and ``top_margin`` to provide users with more control over the plot layout in Plotly. + + - Adjusted default values and added options for better customization of the Plotly color bar (``cbar_x``, ``cbar_thickness``) and title positioning (``title_x``, ``title_y``). + + - Plotly Configuration: + + - Enhanced the configuration options to allow users to enable or disable zoom functionality (``enable_zoom``) in the interactive Plotly plots. + + - Updated the code to reflect these new parameters, allowing for greater flexibility in the appearance and interaction with the Plotly plots. + + - Error Handling: + + - Added input validation for ``html_file_path`` and ``html_file_name`` to ensure these are provided when necessary based on the selected ``plot_type``. + +- ``plot_2d_pdp`` Function: + + - Introduced ``file_prefix`` Parameter: + + - Added a new ``file_prefix`` parameter to allow users to specify a prefix for filenames when saving grid plots. This change streamlines the naming process for saved plots and improves file organization. + + - Enhanced Plot Type Flexibility: + + - The ``plot_type`` parameter now includes an option to generate both grid and individual plots (``both``). This feature allows users to create a combination of both layout styles in one function call. + + - Updated input validation and logic to handle this new option effectively. + + - Added ``save_plots`` Parameter: + + - Introduced a new parameter, ``save_plots``, to control the saving of plots. Users can specify whether to save all plots, only individual plots, only grid plots, or none. + + - Custom Margins and Layout Adjustments: + + - Included the ``save_plots`` parameter in the validation process to ensure paths are provided when needed for saving the plots. + +2. Documentation Updates + +- Docstrings: + + - Updated docstrings for both functions to reflect the new parameters and enhancements, providing clearer and more comprehensive guidance for users. + + - Detailed the use of new parameters such as ``show_modebar``, ``file_prefix``, ``save_plots``, and others, ensuring that the function documentation is up-to-date with the latest changes. + +3. Refactoring & Code Cleanup + +- Code Structure: + + - Improved the code structure to maintain clarity and readability, particularly around the new functionality. + + - Consolidated the layout configuration settings for the Plotly plots into a more flexible and user-friendly format, making it easier for users to customize their plots. + + +Version 0.0.8b +-------------------------------- + +Version 0.0.8b is an exact replica of version ``0.0.8a``. The purpose of this +beta release was to test whether releasing it as the latest version would update +its status on PyPI to reflect it as the latest release. However, it continues to +be identified as a pre-release on PyPI. + + +Version 0.0.8a +-------------------------------- + +Version 0.0.8a introduces significant enhancements and new features to improve +the usability and functionality of the EDA Toolkit. + +**New Features:** + +1. Optional ``file_prefix`` in ``stacked_crosstab_plot`` Function + + - The ``stacked_crosstab_plot`` function has been updated to make the ``file_prefix`` argument optional. If the user does not provide a ``file_prefix``, the function will now automatically generate a default prefix based on the ``col`` and ``func_col`` parameters. This change streamlines the process of generating plots by reducing the number of required arguments. + + - **Key Improvement:** + + - Users can now omit the ``file_prefix`` argument, and the function will still produce appropriately named plot files, enhancing ease of use. + + - Backward compatibility is maintained, allowing users who prefer to specify a custom ``file_prefix`` to continue doing so without any issues. + +2. **Introduction of 3D and 2D Partial Dependence Plot Functions** + + - Two new functions, ``plot_3d_pdp`` and ``plot_2d_pdp``, have been added to the toolkit, expanding the visualization capabilities for machine learning models. + + - ``plot_3d_pdp``: Generates 3D partial dependence plots for two features, supporting both static visualizations (using Matplotlib) and interactive plots (using Plotly). The function offers extensive customization options, including labels, color maps, and saving formats. + + - ``plot_2d_pdp``: Creates 2D partial dependence plots for specified features with flexible layout options (grid or individual plots) and customization of figure size, font size, and saving formats. + + - **Key Features:** + + - **Compatibility:** Both functions are compatible with various versions of scikit-learn, ensuring broad usability. + + - **Customization:** Extensive options for customizing visual elements, including figure size, font size, and color maps. + + - **Interactive 3D Plots:** The ``plot_3d_pdp`` function supports interactive visualizations, providing an enhanced user experience for exploring model predictions in 3D space. + +**Impact:** + +- These updates improve the user experience by reducing the complexity of function calls and introducing powerful new tools for model interpretation. +- The optional ``file_prefix`` enhancement simplifies plot generation while maintaining the flexibility to define custom filenames. +- The new partial dependence plot functions offer robust visualization options, making it easier to analyze and interpret the influence of specific features in machine learning models. + + + +`Version 0.0.7`_ +---------------------- + +.. _Version 0.0.7: https://lshpaner.github.io/eda_toolkit/v0.0.7/index.html + +**Added Function for Customizable Correlation Matrix Visualization** + +This release introduces a new function, ``flex_corr_matrix``, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to ``seaborn.heatmap()``. + +**Summary of Changes** + +- **New Function**: ``flex_corr_matrix``. + + - **Functionality**: + - Generates a correlation heatmap for a given DataFrame. + - Supports both full and upper triangular correlation matrices based on the ``triangular`` parameter. + - Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. + - Accepts additional keyword arguments via ``**kwargs`` to pass directly to ``seaborn.heatmap()``. + - Includes validation to ensure the ``triangular``, ``annot``, and ``save_plots`` parameters are boolean values. + - Raises an exception if ``save_plots=True`` but neither ``image_path_png`` nor ``image_path_svg`` is specified. + +**Usage** + +.. code-block:: python + + # Full correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True) + + # Upper triangular correlation matrix example + flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True) + + +**Contingency table df to object type** + +Convert all columns in the DataFrame to object type to prevent issues with numerical columns. + +.. code-block:: python + + df = df.astype(str).fillna("") + + +`Version 0.0.6`_ +---------------------- + +.. _Version 0.0.6: https://lshpaner.github.io/eda_toolkit/v0.0.6/index.html + +**Added validation for Plot Type Parameter in KDE Distributions Function** + +This release adds a validation step for the ``plot_type`` parameter in the ``kde_distributions`` function. The allowed values for ``plot_type`` are ``"hist"``, ``"kde"``, and ``"both"``. If an invalid value is provided, the function will now raise a ``ValueError`` with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values. + +.. code-block:: python + + # Validate plot_type parameter + valid_plot_types = ["hist", "kde", "both"] + if plot_type.lower() not in valid_plot_types: + raise ValueError( + f"Invalid plot_type value. Expected one of {valid_plot_types}, " + f"got '{plot_type}' instead." + ) + +`Version 0.0.5`_ +---------------------- + +.. _Version 0.0.5: https://lshpaner.github.io/eda_toolkit/v0.0.5/index.html + + +**Ensure Consistent Font Size and Text Wrapping Across Plot Elements** + +This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the ``stacked_crosstab_plot`` function. The following updates have been implemented to ensure uniformity and improve the readability of plots: + +1. **Title Font Size and Text Wrapping:** + - Added a ``text_wrap`` parameter to control the wrapping of plot titles. + - Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ``ax.set_title()`` after plot generation. + +2. **Legend Font Size Consistency:** + - Incorporated ``label_fontsize`` into the legend font size by directly setting the font size of the legend text using ``plt.setp(legend.get_texts(), fontsize=label_fontsize)``. + - This ensures that the legend labels are consistent with the title and axis labels. + +**Testing** + +- Verified that titles now wrap correctly and match the specified ``label_fontsize``. +- Confirmed that legend text scales according to ``label_fontsize``, ensuring consistent font sizes across all plot elements. + + +Version 0.0.4 +--------------------------- + +- **Stable release** + + - No new updates to the codebase. + + - Updated the project ``description`` variable in ``setup.py`` to re-emphasize key elements of the library. + + - Minor README cleanup: + + - Added icons for sections that did not have them. + + +Version 0.0.3 +--------------------------- + +- **Stable release** + + - Updated logo size, fixed citation title, and made minor README cleanup: + + - Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support. + +Version 0.0.2 +--------------------------- + +- **First stable release** + - No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + - Added logo, badges, and Zenodo-certified citation to README. + +Version 0.0.1rc0 +------------------------------- + +- No new updates to the codebase; minimal documentation updates to README and ``setup.py`` files. + +Version 0.0.1b0 +----------------------------- + +**New Scatter Fit Plot and Additional Updates** + +- Added new ``scatter_fit_plot()``, removed unused ``data_types()``, and added comment section headers. + +**Added xlim and ylim Inputs to KDE Distribution** + +- ``kde_distribution()``: + + - Added ``xlim`` and ``ylim`` inputs to allow users to customize axes limits in ``kde_distribution()``. + +**Added xlim and ylim Params to Stacked Crosstab Plot** + +- ``stacked_crosstab_plot()``: + + - Added ``xlim`` and ``ylim`` input parameters to ``stacked_crosstab_plot()`` to give users more flexibility in controlling axes limits. + +**Added x and y Limits to Box and Violin Plots** + +- ``box_violin_plot()``: + + - Changed function name from ``metrics_box_violin()`` to ``box_violin_plot()``. + - Added ``xlim`` and ``ylim`` inputs to control x and y-axis limits of ``box_violin_plot()`` (formerly ``metrics_box_violin``). + +**Added Ability to Remove Stacks from Plots, Plot All or One at a Time** + +**Key Changes** + +1. **Plot Type Parameter** + - ``plot_type``: This parameter allows the user to choose between ``"regular"``, ``"normalized"``, or ``"both"`` plot types. + +2. **Remove Stacks Parameter** + - ``remove_stacks``: This parameter, when set to ``True``, generates a regular bar plot using only the ``col`` parameter instead of a stacked bar plot. It only works when ``plot_type`` is set to "regular". If ``remove_stacks`` is set to ``True`` while ``plot_type`` is anything other than "regular", the function will raise an exception. + +**Explanation of Changes** + +- **Plot Type Parameter** + + - Provides flexibility to the user, allowing specification of the type of plot to generate: + + - ``"regular"``: Standard bar plot. + + - ``"normalized"``: Normalized bar plot. + + - ``"both"``: Both regular and normalized bar plots. + +- **Remove Stacks Parameter** + - ``remove_stacks``: Generates a regular bar plot using only the ``col`` parameter, removing the stacking of the bars. Applicable only when ``plot_type`` is set to "regular". An exception is raised if used with any other ``plot_type``. + +These changes enhance the flexibility and functionality of the ``stacked_crosstab_plot`` function, allowing for more customizable and specific plot generation based on user requirements. + +Version 0.0.1b0 +----------------------------- + +**Refined KDE Distributions** + +**Key Changes** + +1. **Alpha Transparency for Histogram Fill** + - Added a ``fill_alpha`` parameter to control the transparency of the histogram bars' fill color. + - Default value is ``0.6``. An exception is raised if ``fill=False`` and ``fill_alpha`` is specified. + +2. **Custom Font Sizes** + - Introduced ``label_fontsize`` and ``tick_fontsize`` parameters to control font size of axis labels and tick marks independently. + +3. **Scientific Notation Toggle** + - Added a ``disable_sci_notation`` parameter to enable or disable scientific notation on axes. + +4. **Improved Error Handling** + - Added validation for the ``stat`` parameter to ensure valid options are accepted. + - Added checks for proper usage of ``fill_alpha`` and ``hist_edgecolor`` when ``fill`` is set to ``False``. + +5. **General Enhancements** + - Updated the function's docstring to reflect new parameters and provide comprehensive guidance on usage. + +Version 0.0.1b0 +----------------------------- + +**Enhanced KDE Distributions Function** + +**Added Parameters** + +1. **Grid Figsize and Single Figsize** + - Control the size of the overall grid figure and individual figures separately. + +2. **Hist Color and KDE Color`** + - Allow customization of histogram and KDE plot colors. + +3. **Edge Color** + - Allows customization of histogram bar edges. + +4. **Hue** + - Allows grouping data by a column. + +5. **Fill** + - Controls whether to fill histogram bars with color. + +6. **Y-axis Label`** + - Customizable y-axis label. + +7. **Log-Scaling** + - Specifies which variables to apply log scale. + +8. **Bins and Bin Width** + - Control the number and width of bins. + +9. **``stat``:** + - Allows different statistics for the histogram (``count``, ``density``, ``frequency``, ``probability``, ``proportion``, ``percent``). + +**Improvements** + +1. **Validation and Error Handling** + - Checks for invalid ``log_scale_vars`` and throws a ``ValueError`` if any are found. + - Throws a ``ValueError`` if ``edgecolor`` is changed while ``fill`` is set to ``False``. + - Issues a ``PerformanceWarning`` if both ``bins`` and ``binwidth`` are specified, warning of potential performance impacts. + +2. **Customizable Y-Axis Label** + - Allows users to specify custom y-axis labels. + +3. **Warning for KDE with Count** + - Issues a warning if KDE is used with ``stat='count'``, as it may produce misleading plots. + +**Updated Function to Ensure Unique IDs and Index Check** + +- Ensured that each generated ID in ``add_ids`` starts with a non-zero digit. +- Added a check to verify that the DataFrame index is unique. +- Printed a warning message if duplicate index entries are found. + +These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique. + +**Check for Unique Indices** +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries. + +**Generate Non-Zero Starting IDs** + +- The ID generation process is updated to ensure that the first digit of each ID is always non-zero. + +**Ensure Unique IDs** + +- A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame. + +**Fix Int Conversion for Numeric Columns, Reset Decimal Places** + +- Fixed integer conversion issue for numeric columns when ``decimal_places=0`` in the ``save_dataframes_to_excel`` function. +- Reset ``decimal_places`` default value to ``0``. + +These changes ensure correct formatting and avoid errors during conversion. + +**Contingency Table Updates** + +1. **Error Handling for Columns** + - Added a check to ensure at least one column is specified. + - Updated the function to accept a single column as a string or multiple columns as a list. + - Raised a ``ValueError`` if no columns are provided or if ``cols`` is not correctly specified. + +2. **Function Parameters** + - Changed parameters from ``col1`` and ``col2`` to a single parameter ``cols`` which can be either a string or a list. + +3. **Error Handling** + - Renamed ``SortBy`` to ``sort_by`` to standardize nomenclature. + - Added a check to ensure ``sort_by`` is either 0 or 1. + - Raised a ``ValueError`` if ``sort_by`` is not 0 or 1. + +5. **Sorting Logic** + - Updated the sorting logic to handle the new ``cols`` parameter structure. + +6. **Handling Categorical Data** + - Modified code to convert categorical columns to strings to avoid issues with ``fillna("")``. + +7. **Handling Missing Values** + - Added ``df = df.fillna('')`` to fill NA values within the function to account for missing data. + +8. **Improved Function Documentation** + - Updated function documentation to reflect new parameters and error handling. + +Version 0.0.1b0 +----------------------------- + +**Contingency Table Updates** + +- ``fillna('')`` added to output so that null values come through, removed ``'All'`` column name from output, sort options ``0`` and ``1``, updated docstring documentation. Tested successfully on ``Python 3.7.3``. + +**Compatibility Enhancement** + +1. Added a version check for ``Python 3.7`` and above. + + - Conditional import of ``datetime`` to handle different Python versions. + +.. code-block:: python + + if sys.version_info >= (3, 7): + from datetime import datetime + else: + import datetime diff --git a/_build/html/v0.0.9/_sources/citations.rst.txt b/_build/html/v0.0.9/_sources/citations.rst.txt new file mode 100644 index 000000000..33d5aa916 --- /dev/null +++ b/_build/html/v0.0.9/_sources/citations.rst.txt @@ -0,0 +1,42 @@ +.. _citations: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Citing EDA Toolkit +=================== + +Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.9). Zenodo. https://doi.org/10.5281/zenodo.13163208 + +.. code:: bash + + @software{shpaner_2024_13162633, + author = {Shpaner, Leonid and + Gil, Oscar}, + title = {EDA Toolkit}, + month = aug, + year = 2024, + publisher = {Zenodo}, + version = {0.0.9}, + doi = {10.5281/zenodo.13162633}, + url = {https://doi.org/10.5281/zenodo.13162633} + } + diff --git a/_build/html/v0.0.9/_sources/contributors.rst.txt b/_build/html/v0.0.9/_sources/contributors.rst.txt new file mode 100644 index 000000000..4da2fa18b --- /dev/null +++ b/_build/html/v0.0.9/_sources/contributors.rst.txt @@ -0,0 +1,59 @@ +.. _contributors: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +Contributors/Maintainers +========================= + +.. raw:: html + +
+ +.. image:: https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + :align: left + :width: 150 + :height: 150 + +.. raw:: html + +
+ +`Leonid Shpaner `_ is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego's M.S. Applied Artificial Intelligence program. + +.. raw:: html + +


+ +.. raw:: html + +
+ +.. image:: https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + :align: left + :width: 150 + :height: 150 + +.. raw:: html + +
+ +`Oscar Gil `_ is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego. diff --git a/_build/html/v0.0.9/_sources/data_management.rst.txt b/_build/html/v0.0.9/_sources/data_management.rst.txt new file mode 100644 index 000000000..3ee514b66 --- /dev/null +++ b/_build/html/v0.0.9/_sources/data_management.rst.txt @@ -0,0 +1,1384 @@ +.. _data_management: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Data Management Overview +=========================== + +In any data-driven project, effective management of data is crucial. This +section provides essential techniques for handling and preparing data to ensure +consistency, accuracy, and ease of analysis. From directory setup and data +cleaning to advanced data processing, these methods form the backbone of reliable +data management. Dive into the following topics to enhance your data handling +capabilities and streamline your workflow. + +Data Management Techniques +=============================== + +Path directories +---------------- + +**Ensure that the directory exists. If not, create it.** + +.. function:: ensure_directory(path) + + :param path: The path to the directory that needs to be ensured. + :type path: str + + :returns: None + + +The ``ensure_directory`` function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``ensure_directory`` function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them. + +First, we define the base path as the parent directory of the current directory. +The ``os.pardir`` constant, equivalent to ``"..""``, is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory. + + +Next, we set paths for the PNG and SVG image directories, located within an +``images`` folder in the parent directory. Using the ``ensure_directory`` +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them. + +.. code-block:: python + + from eda_toolkit import ensure_directory + + import os # import operating system for dir + + + base_path = os.path.join(os.pardir) + + # Go up one level from 'notebooks' to parent directory, + # then into the 'data' folder + data_path = os.path.join(os.pardir, "data") + data_output = os.path.join(os.pardir, "data_output") + + # create image paths + image_path_png = os.path.join(base_path, "images", "png_images") + image_path_svg = os.path.join(base_path, "images", "svg_images") + + # Use the function to ensure'data' directory exists + ensure_directory(data_path) + ensure_directory(data_output) + ensure_directory(image_path_png) + ensure_directory(image_path_svg) + +**Output** + +.. code-block:: python + + Created directory: ../data + Created directory: ../data_output + Created directory: ../images/png_images + Created directory: ../images/svg_images + + +Adding Unique Identifiers +-------------------------- + +**Add a column of unique IDs with a specified number of digits to the dataframe.** + +.. function:: add_ids(df, id_colname="ID", num_digits=9, seed=None, set_as_index=True) + + :param df: The dataframe to add IDs to. + :type df: pd.DataFrame + :param id_colname: The name of the new column for the IDs. Defaults to ``"ID"``. + :type id_colname: str, optional + :param num_digits: The number of digits for the unique IDs. Defaults to ``9``. + :type num_digits: int, optional + :param seed: The seed for the random number generator. Defaults to ``None``. + :type seed: int, optional + :param set_as_index: Whether to set the new ID column as the index. Defaults to ``False``. + :type set_as_index: bool, optional + + :returns: The updated dataframe with the new ID column. + :rtype: pd.DataFrame + +.. note:: + - If the dataframe index is not unique, a warning is printed. + - The function does not check if the number of rows exceeds the number of + unique IDs that can be generated with the specified number of digits. + - The first digit of the generated IDs is ensured to be non-zero. + +The ``add_ids`` function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe. + +**Example Usage** + +In the example below, we demonstrate how to use the ``add_ids`` function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the ``add_ids`` function to generate +and append a column of unique IDs with a specified number of digits to the dataframe. + +First, we import the pandas library and the ``add_ids`` function from the ``eda_toolkit``. +Then, we create a sample dataframe with some data. We call the ``add_ids`` function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe. + +.. code-block:: python + + from eda_toolkit import add_ids + + # Add a column of unique IDs with 9 digits and call it "census_id" + df = add_ids( + df=df, + id_colname="census_id", + num_digits=9, + seed=111, + set_as_index=True, + ) + +**Output** + +`First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: bash + + DataFrame index is unique. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+
+ + +\ + + +Trailing Period Removal +----------------------- + +**Strip the trailing period from floats in a specified column of a DataFrame, if present.** + +.. function:: strip_trailing_period(df, column_name) + + :param df: The DataFrame containing the column to be processed. + :type df: pd.DataFrame + :param column_name: The name of the column containing floats with potential trailing periods. + :type column_name: str + + :returns: The updated DataFrame with the trailing periods removed from the specified column. + :rtype: pd.DataFrame + + + The ``strip_trailing_period`` function is designed to remove trailing periods + from float values in a specified column of a DataFrame. This can be particularly + useful when dealing with data that has been inconsistently formatted, ensuring + that all float values are correctly represented. + +**Example Usage** + +In the example below, we demonstrate how to use the ``strip_trailing_period`` function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the ``strip_trailing_period`` function to remove any trailing periods from the specified column. + +.. code-block:: python + + from eda_toolkit import strip_trailing_period + + # Create a sample dataframe with trailing periods in some values + data = { + "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.], + } + df = pd.DataFrame(data) + + # Remove trailing periods from the 'values' column + df = strip_trailing_period(df=df, column_name="values") + + +**Output** + +`First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)` + +.. raw:: html + + + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +
+ + +\ + +`Note:` The last row shows 6 as an `int` with a trailing period with its conversion to `float`. + + +\ + +Standardized Dates +------------------- + +**Parse and standardize date strings based on the provided rule.** + +.. function:: parse_date_with_rule(date_str) + + This function takes a date string and standardizes it to the ``ISO 8601`` format + (``YYYY-MM-DD``). It assumes dates are provided in either `day/month/year` or + `month/day/year` format. The function first checks if the first part of the + date string (day or month) is greater than 12, which unambiguously indicates + a `day/month/year` format. If the first part is 12 or less, the function + attempts to parse the date as `month/day/year`, falling back to `day/month/year` + if the former raises a ``ValueError`` due to an impossible date (e.g., month + being greater than 12). + + :param date_str: A date string to be standardized. + :type date_str: str + + :returns: A standardized date string in the format ``YYYY-MM-DD``. + :rtype: str + + :raises ValueError: If ``date_str`` is in an unrecognized format or if the function + cannot parse the date. + + +**Example Usage** + +In the example below, we demonstrate how to use the ``parse_date_with_rule`` +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the ``parse_date_with_rule`` +function to parse and standardize each date string to the ``ISO 8601`` format. + +.. code-block:: python + + from eda_toolkit import parse_date_with_rule + + # Sample date strings + date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"] + + # Standardize the date strings + standardized_dates = [parse_date_with_rule(date) for date in date_strings] + + print(standardized_dates) + +**Output** + +.. code-block:: python + + ['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12'] + + + +.. important:: + + In the next example, we demonstrate how to apply the ``parse_date_with_rule`` + function to a DataFrame column containing date strings using the ``.apply()`` method. + This is particularly useful when you need to standardize date formats across an + entire column in a DataFrame. + +.. code-block:: python + + # Creating the DataFrame + data = { + "date_column": [ + "31/12/2021", + "01/01/2022", + "12/31/2021", + "13/02/2022", + "07/04/2022", + ], + "name": ["Alice", "Bob", "Charlie", "David", "Eve"], + "amount": [100.0, 150.5, 200.75, 250.25, 300.0], + } + + df = pd.DataFrame(data) + + # Apply the function to the DataFrame column + df["standardized_date"] = df["date_column"].apply(parse_date_with_rule) + + print(df) + +**Output** + +.. code-block:: python + + date_column name amount standardized_date + 0 31/12/2021 Alice 100.00 2021-12-31 + 1 01/01/2022 Bob 150.50 2022-01-01 + 2 12/31/2021 Charlie 200.75 2021-12-31 + 3 13/02/2022 David 250.25 2022-02-13 + 4 07/04/2022 Eve 300.00 2022-04-07 + + +DataFrame Analysis +------------------- + +**Analyze DataFrame columns, including dtype, null values, and unique value counts.** + +.. function:: dataframe_columns(df, background_color=None, return_df=False) + + Analyze DataFrame columns to provide summary statistics such as data type, + null counts, unique values, and most frequent values. + + This function analyzes the columns of a DataFrame, providing details about the data type, + the number and percentage of ``null`` values, the total number of unique values, and the most + frequent unique value along with its count and percentage. It handles special cases such as + converting date columns and replacing empty strings with Pandas ``NA`` values. + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param background_color: Hex color code or color name for background styling in the output + DataFrame. Defaults to ``None``. + :type background_color: str, optional + :param return_df: If ``True``, returns the plain DataFrame with the summary statistics. If + ``False``, returns a styled DataFrame for visual presentation. Defaults to ``False``. + :type return_df: bool, optional + + :returns: If `return_df` is ``True``, returns the plain DataFrame containing column summary + statistics. If `return_df` is ``False``, returns a styled DataFrame with optional + background color for specific columns. + :rtype: pandas.DataFrame + + +**Example Usage** + +In the example below, we demonstrate how to use the ``dataframe_columns`` +function to analyze a DataFrame's columns. + +.. code-block:: python + + from eda_toolkit import dataframe_columns + + dataframe_columns(df=df) + + +**Output** + +`Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository)` [1]_ + +.. code-block:: python + + Shape: (48842, 16) + + Total seconds of processing time: 0.861555 + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+
+ + + +\ + +Generating Summary Tables for Variable Combinations +----------------------------------------------------- + +**This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.** + + +.. function:: summarize_all_combinations(df, variables, data_path, data_name, min_length=2) + + :param df: The pandas DataFrame containing the data. + :type df: pandas.DataFrame + :param variables: List of column names from the DataFrame to generate combinations. + :type variables: list of str + :param data_path: Path where the output Excel file will be saved. + :type data_path: str + :param data_name: Name of the output Excel file. + :type data_name: str + :param min_length: Minimum size of the combinations to generate. Defaults to ``2``. + :type min_length: int, optional + + :returns: A tuple containing a dictionary of summary tables and a list of all generated combinations. + :rtype: tuple(dict, list) + +.. note:: + - The function will create an Excel file with a sheet for each combination + of the specified variables, as well as a "Table of Contents" sheet with + hyperlinks to each summary table. + - The sheet names are limited to 31 characters due to Excel's constraints. + +The function returns two outputs: + +1. ``summary_tables``: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values. + +2. ``all_combinations``: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables. + +**Example Usage** + +Below, we use the ``summarize_all_combinations`` function to generate summary tables for the specified +variables from a DataFrame containing the census data [1]_. + +.. code-block:: python + + from eda_toolkit import summarize_all_combinations + + # Define unique variables for the analysis + unique_vars = [ + "age_group", + "workclass", + "education", + "occupation", + "race", + "sex", + "income", + ] + + # Generate summary tables for all combinations of the specified variables + summary_tables, all_combinations = summarize_all_combinations( + df=df, + data_path=data_output, + variables=unique_vars, + data_name="census_summary_tables.xlsx", + ) + + # Print all combinations of variables + print(all_combinations) + +**Output** + +.. code-blocK:: python + + [('age_group', 'workclass'), + ('age_group', 'education'), + ('age_group', 'occupation'), + ('age_group', 'race'), + ('age_group', 'sex'), + ('age_group', 'income'), + ('workclass', 'education'), + ('workclass', 'occupation'), + ('workclass', 'race'), + ('workclass', 'sex'), + ('workclass', 'income'), + ('education', 'occupation'), + ('education', 'race'), + ('education', 'sex'), + ('education', 'income'), + ('occupation', 'race'), + ('occupation', 'sex'), + ('occupation', 'income'), + ('race', 'sex'), + ('race', 'income'), + ('sex', 'income'), + ('age_group', 'workclass', 'education'), + ('age_group', 'workclass', 'occupation'), + ('age_group', 'workclass', 'race'), + ('age_group', 'workclass', 'sex'), + ('age_group', 'workclass', 'income'), + ('age_group', 'education', 'occupation'), + ('age_group', 'education', 'race'), + ('age_group', 'education', 'sex'), + ('age_group', 'education', 'income'), + ('age_group', 'occupation', 'race'), + ('age_group', 'occupation', 'sex'), + ('age_group', 'occupation', 'income'), + ('age_group', 'race', 'sex'), + ('age_group', 'race', 'income'), + ('age_group', 'sex', 'income'), + ('workclass', 'education', 'occupation'), + ('workclass', 'education', 'race'), + ('workclass', 'education', 'sex'), + ('workclass', 'education', 'income'), + ('workclass', 'occupation', 'race'), + ('workclass', 'occupation', 'sex'), + ('workclass', 'occupation', 'income'), + ('workclass', 'race', 'sex'), + ('workclass', 'race', 'income'), + ('workclass', 'sex', 'income'), + ('education', 'occupation', 'race'), + ('education', 'occupation', 'sex'), + ('education', 'occupation', 'income'), + ('education', 'race', 'sex'), + ('education', 'race', 'income'), + ('education', 'sex', 'income'), + ('occupation', 'race', 'sex'), + ('occupation', 'race', 'income'), + ('occupation', 'sex', 'income'), + ('race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation'), + ('age_group', 'workclass', 'education', 'race'), + ('age_group', 'workclass', 'education', 'sex'), + ('age_group', 'workclass', 'education', 'income'), + ('age_group', 'workclass', 'occupation', 'race'), + ('age_group', 'workclass', 'occupation', 'sex'), + ('age_group', 'workclass', 'occupation', 'income'), + ('age_group', 'workclass', 'race', 'sex'), + ('age_group', 'workclass', 'race', 'income'), + ('age_group', 'workclass', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race'), + ('age_group', 'education', 'occupation', 'sex'), + ('age_group', 'education', 'occupation', 'income'), + ('age_group', 'education', 'race', 'sex'), + ('age_group', 'education', 'race', 'income'), + ('age_group', 'education', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex'), + ('age_group', 'occupation', 'race', 'income'), + ('age_group', 'occupation', 'sex', 'income'), + ('age_group', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race'), + ('workclass', 'education', 'occupation', 'sex'), + ('workclass', 'education', 'occupation', 'income'), + ('workclass', 'education', 'race', 'sex'), + ('workclass', 'education', 'race', 'income'), + ('workclass', 'education', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex'), + ('workclass', 'occupation', 'race', 'income'), + ('workclass', 'occupation', 'sex', 'income'), + ('workclass', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex'), + ('education', 'occupation', 'race', 'income'), + ('education', 'occupation', 'sex', 'income'), + ('education', 'race', 'sex', 'income'), + ('occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race'), + ('age_group', 'workclass', 'education', 'occupation', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'race', 'income'), + ('age_group', 'workclass', 'education', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'education', 'occupation', 'race', 'income'), + ('age_group', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'education', 'race', 'sex', 'income'), + ('age_group', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex'), + ('workclass', 'education', 'occupation', 'race', 'income'), + ('workclass', 'education', 'occupation', 'sex', 'income'), + ('workclass', 'education', 'race', 'sex', 'income'), + ('workclass', 'occupation', 'race', 'sex', 'income'), + ('education', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'), + ('age_group', 'workclass', 'education', 'occupation', 'race', 'income'), + ('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'), + ('age_group', 'workclass', 'education', 'race', 'sex', 'income'), + ('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'), + ('age_group', 'education', 'occupation', 'race', 'sex', 'income'), + ('workclass', 'education', 'occupation', 'race', 'sex', 'income'), + ('age_group', + 'workclass', + 'education', + 'occupation', + 'race', + 'sex', + 'income')] + + +When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table. + +.. raw:: html + +
+ +.. image:: ../assets/summarize_combos.gif + :alt: EDA Toolkit Logo + :align: left + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Saving DataFrames to Excel with Customized Formatting +------------------------------------------------------- +**Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.** + + +This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the ``save_dataframes_to_excel`` function. + + +.. function:: save_dataframes_to_excel(file_path, df_dict, decimal_places=0) + + :param file_path: Full path to the output Excel file. + :type file_path: str + :param df_dict: Dictionary where keys are sheet names and values are DataFrames to save. + :type df_dict: dict + :param decimal_places: Number of decimal places to round numeric columns. Default is 0. + :type decimal_places: int + +.. note:: + - The function will autofit columns and left-align text. + - Numeric columns will be formatted with the specified number of decimal places. + - Headers will be bold and left-aligned without borders. + +The function performs the following tasks: + +- Writes each DataFrame to its respective sheet in the Excel file. +- Rounds numeric columns to the specified number of decimal places. +- Applies customized formatting to headers and cells. +- Autofits columns based on the content length. + +**Example Usage** + +Below, we use the ``save_dataframes_to_excel`` function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between `18` and `40`. + +.. code-block:: python + + from eda_toolkit import save_dataframes_to_excel + + # Example usage + file_name = "df_census.xlsx" # Name of the output Excel file + file_path = os.path.join(data_path, file_name) + + # filter DataFrame to Ages 18-40 + filtered_df = df[(df["age"] > 18) & (df["age"] < 40)] + + df_dict = { + "original_df": df, + "ages_18_to_40": filtered_df, + } + + save_dataframes_to_excel( + file_path=file_path, + df_dict=df_dict, + decimal_places=0, + ) + + +**Output** + +The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between `18` and `40`, each on separate sheets with customized formatting. + + +Creating Contingency Tables +---------------------------- + +**Create a contingency table from one or more columns in a DataFrame, with sorting options.** + +This section explains how to create contingency tables from one or more columns in a DataFrame, with options to sort the results using the ``contingency_table`` function. + +.. function:: contingency_table(df, cols=None, sort_by=0) + + :param df: The DataFrame to analyze. + :type df: pandas.DataFrame + :param cols: Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column. + :type cols: str or list of str, optional + :param sort_by: Enter ``0`` to sort results by column groups; enter ``1`` to sort results by totals in descending order. Defaults to ``0``. + :type sort_by: int, optional + :raises ValueError: If no columns are specified or if ``sort_by`` is not ``0`` or ``1``. + :returns: A DataFrame containing the contingency table with the specified columns, a ``'Total'`` column representing the count of occurrences, and a ``'Percentage'`` column representing the percentage of the total count. + :rtype: pandas.DataFrame + +**Example Usage** + +Below, we use the ``contingency_table`` function to create a contingency table +from the specified columns in a DataFrame containing census data [1]_ + +.. code-block:: python + + from eda_toolkit import contingency_table + + # Example usage + contingency_table( + df=df, + cols=[ + "age_group", + "workclass", + "race", + "sex", + ], + sort_by=1, + ) + +**Output** + +The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the ``'Total'`` column in descending order because ``sort_by`` +is set to ``1``. + + +.. code-block:: python + + + age_group workclass race sex Total Percentage + 0 30-39 Private White Male 5856 11.99 + 1 18-29 Private White Male 5623 11.51 + 2 40-49 Private White Male 4267 8.74 + 3 18-29 Private White Female 3680 7.53 + 4 50-59 Private White Male 2565 5.25 + .. ... ... ... ... ... ... + 467 50-59 Federal-gov Other Male 1 0.00 + 468 50-59 Local-gov Asian-Pac-Islander Female 1 0.00 + 469 70-79 Self-emp-inc Black Male 1 0.00 + 470 80-89 Local-gov Asian-Pac-Islander Male 1 0.00 + 471 48842 100.00 + + [472 rows x 6 columns] + + +\ + +Highlighting Specific Columns in a DataFrame +--------------------------------------------- + +This section explains how to highlight specific columns in a DataFrame using the ``highlight_columns`` function. + +**Highlight specific columns in a DataFrame with a specified background color.** + +.. function:: highlight_columns(df, columns, color="yellow") + + :param df: The DataFrame to be styled. + :type df: pandas.DataFrame + :param columns: List of column names to be highlighted. + :type columns: list of str + :param color: The background color to be applied for highlighting (default is `"yellow"`). + :type color: str, optional + + :returns: A Styler object with the specified columns highlighted. + :rtype: pandas.io.formats.style.Styler + +**Example Usage** + +Below, we use the ``highlight_columns`` function to highlight the ``age`` and ``education`` +columns in the first 5 rows of the census [1]_ DataFrame with a pink background color. + +.. code-block:: python + + from eda_toolkit import highlight_columns + + # Applying the highlight function + highlighted_df = highlight_columns( + df=df, + columns=["age", "education"], + color="#F8C5C8", + ) + + highlighted_df + +**Output** + +The output will be a DataFrame with the specified columns highlighted in the given background color. +The ``age`` and ``education`` columns will be highlighted in pink. + +The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the ``.render()`` method of the Styler object. + + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+ +\ + +Binning Numerical Columns +--------------------------- + +Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or "bins." This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or "bins," and +then assigning each value to one of these intervals. + +.. note:: + + The code snippets below create age bins and assign a corresponding age group + label to each age in the DataFrame. The ``pd.cut`` function from pandas is used to + categorize the ages and assign them to a new column, ``age_group``. Adjust the bins + and labels as needed for your specific data. + + +Below, we use the ``age`` column of the census data [1]_ from the UCI Machine Learning Repository as an example: + +1. **Bins Definition**: + The bins are defined by specifying the boundaries of each interval. For example, + in the code snippet below, the ``bin_ages`` list specifies the boundaries for age groups: + + .. code-block:: python + + bin_ages = [ + 0, + 18, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + float("inf"), + ] + + + Each pair of consecutive elements in ``bin_ages`` defines a bin. For example: + + - The first bin is ``[0, 18)``, + - The second bin is ``[18, 30)``, + - and so on. + +\ + +2. **Labels for Bins**: + The `label_ages` list provides labels corresponding to each bin: + + .. code-block:: python + + label_ages = [ + "< 18", + "18-29", + "30-39", + "40-49", + "50-59", + "60-69", + "70-79", + "80-89", + "90-99", + "100 +", + ] + + These labels are used to categorize the numerical values into meaningful groups. + +3. **Applying the Binning**: + The `pd.cut `_ function + from Pandas is used to apply the binning process. For each value in the ``age`` + column of the DataFrame, it assigns a corresponding label based on which bin the + value falls into. Here, ``right=False`` indicates that each bin includes the + left endpoint but excludes the right endpoint. For example, if ``bin_ages = + [0, 10, 20, 30]``, then a value of ``10`` will fall into the bin ``[10, 20)`` and + be labeled accordingly. + + .. code-block:: python + + df["age_group"] = pd.cut( + df["age"], + bins=bin_ages, + labels=label_ages, + right=False, + ) + + **Mathematically**, for a given value `x` in the ``age`` column: + + .. math:: + + \text{age_group} = + \begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 + \end{cases} + + The parameter ``right=False`` in ``pd.cut`` means that the bins are left-inclusive + and right-exclusive, except for the last bin, which is always right-inclusive + when the upper bound is infinity (``float("inf")``). + + +.. [1] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + diff --git a/_build/html/v0.0.9/_sources/eda_plots.rst.txt b/_build/html/v0.0.9/_sources/eda_plots.rst.txt new file mode 100644 index 000000000..a6dba5284 --- /dev/null +++ b/_build/html/v0.0.9/_sources/eda_plots.rst.txt @@ -0,0 +1,2668 @@ +.. _eda_plots: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Plotting and Theoretical Overview +======================================= + +Gaussian Assumption for Normality +---------------------------------- + +The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF): + +.. math:: + + f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) + +where: + +- :math:`\mu` is the mean +- :math:`\sigma^2` is the variance + +In a normally distributed dataset: + +- 68% of data falls within :math:`\mu \pm \sigma` +- 95% within :math:`\mu \pm 2\sigma` +- 99.7% within :math:`\mu \pm 3\sigma` + +.. raw:: html + +
+ +.. image:: ../assets/normal_distribution.png + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histograms and Kernel Density Estimation (KDE) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Histograms**: + +- Visualize data distribution by binning values and counting frequencies. +- If data is Gaussian, the histogram approximates a bell curve. + +**KDE**: + +- A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function. +- The KDE for a dataset :math:`X = \{x_1, x_2, \ldots, x_n\}` is given by: + +.. math:: + + \hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right) + +where: + +- :math:`K` is the kernel function (often Gaussian) +- :math:`h` is the bandwidth (smoothing parameter) + +.. raw:: html + + Combined Use of Histograms and KDE + +\ + +- **Histograms** offer a discrete, binned view of the data. +- **KDE** provides a smooth, continuous estimate of the underlying distribution. +- Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality. + + +Pearson Correlation Coefficient +-------------------------------- + +The Pearson correlation coefficient, often denoted as :math:`r`, is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from :math:`-1` to :math:`1`, where: + +- :math:`r = 1` indicates a perfect positive linear relationship. +- :math:`r = -1` indicates a perfect negative linear relationship. +- :math:`r = 0` indicates no linear relationship. + +The Pearson correlation coefficient between two variables :math:`X` and :math:`Y` is defined as: + +.. math:: + + r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} + +where: + +- :math:`\text{Cov}(X, Y)` is the covariance of :math:`X` and :math:`Y`. +- :math:`\sigma_X` is the standard deviation of :math:`X`. +- :math:`\sigma_Y` is the standard deviation of :math:`Y`. + +Covariance measures how much two variables change together. It is defined as: + +.. math:: + + \text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y) + +where: + +- :math:`n` is the number of data points. +- :math:`X_i` and :math:`Y_i` are the individual data points. +- :math:`\mu_X` and :math:`\mu_Y` are the means of :math:`X` and :math:`Y`. + +The standard deviation measures the dispersion or spread of a set of values. For +a variable :math:`X`, the standard deviation :math:`\sigma_X` is: + +.. math:: + + \sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2} + +Substituting the covariance and standard deviation into the Pearson correlation formula: + +.. math:: + + r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}} + +This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between :math:`X` and :math:`Y`. + +- :math:`r > 0`: Positive correlation. As :math:`X` increases, :math:`Y` tends to increase. +- :math:`r < 0`: Negative correlation. As :math:`X` increases, :math:`Y` tends to decrease. +- :math:`r = 0`: No linear correlation. There is no consistent linear relationship between :math:`X` and :math:`Y`. + +The closer the value of :math:`r` is to :math:`\pm 1`, the stronger the linear relationship between the two variables. + + +Partial Dependence Foundations +-------------------------------- + +Let :math:`\mathbf{X}` represent the complete set of input features for a machine +learning model, where :math:`\mathbf{X} = \{X_1, X_2, \dots, X_p\}`. Suppose we're +particularly interested in a subset of these features, denoted by :math:`\mathbf{X}_S`. +The complementary set, :math:`\mathbf{X}_C`, contains all the features in :math:`\mathbf{X}` +that are not in :math:`\mathbf{X}_S`. Mathematically, this relationship is expressed as: + +.. math:: + + \mathbf{X}_C = \mathbf{X} \setminus \mathbf{X}_S + +where :math:`\mathbf{X}_C` is the set of features in :math:`\mathbf{X}` after +removing the features in :math:`\mathbf{X}_S`. + +Partial Dependence Plots (PDPs) are used to illustrate the effect of the features +in :math:`\mathbf{X}_S` on the model's predictions, while averaging out the +influence of the features in :math:`\mathbf{X}_C`. This is mathematically defined as: + +.. math:: + \begin{align*} + \text{PD}_{\mathbf{X}_S}(x_S) &= \mathbb{E}_{\mathbf{X}_C} \left[ f(x_S, \mathbf{X}_C) \right] \\ + &= \int f(x_S, x_C) \, p(x_C) \, dx_C \\ + &= \int \left( \int f(x_S, x_C) \, p(x_C \mid x_S) \, dx_C \right) p(x_S) \, dx_S + \end{align*} + + +where: + +- :math:`\mathbb{E}_{\mathbf{X}_C} \left[ \cdot \right]` indicates that we are taking the expected value over the possible values of the features in the set :math:`\mathbf{X}_C`. +- :math:`p(x_C)` represents the probability density function of the features in :math:`\mathbf{X}_C`. + +This operation effectively summarizes the model's output over all potential values of the complementary features, providing a clear view of how the features in :math:`\mathbf{X}_S` alone impact the model's predictions. + + +**2D Partial Dependence Plots** + +Consider a trained machine learning model `2D Partial Dependence Plots`_ :math:`f(\mathbf{X})`, where :math:`\mathbf{X} = (X_1, X_2, \dots, X_p)` represents the vector of input features. The partial dependence of the predicted response :math:`\hat{y}` on a single feature :math:`X_j` is defined as: + +.. math:: + + \text{PD}(X_j) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, \mathbf{X}_{C_i}) + +where: + +- :math:`X_j` is the feature of interest. +- :math:`\mathbf{X}_{C_i}` represents the complement set of :math:`X_j`, meaning the remaining features in :math:`\mathbf{X}` not included in :math:`X_j` for the :math:`i`-th instance. +- :math:`n` is the number of observations in the dataset. + +For two features, :math:`X_j` and :math:`X_k`, the partial dependence is given by: + +.. math:: + + \text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i}) + +This results in a 2D surface plot (or contour plot) that shows how the predicted outcome changes as the values of :math:`X_j` and :math:`X_k` vary, while the effects of the other features are averaged out. + +- **Single Feature PDP:** When plotting :math:`\text{PD}(X_j)`, the result is a 2D line plot showing the marginal effect of feature :math:`X_j` on the predicted outcome, averaged over all possible values of the other features. +- **Two Features PDP:** When plotting :math:`\text{PD}(X_j, X_k)`, the result is a 3D surface plot (or a contour plot) that shows the combined marginal effect of :math:`X_j` and :math:`X_k` on the predicted outcome. The surface represents the expected value of the prediction as :math:`X_j` and :math:`X_k` vary, while all other features are averaged out. + + +**3D Partial Dependence Plots** + +For a more comprehensive analysis, especially when exploring interactions between two features, `3D Partial Dependence Plots`_ are invaluable. The partial dependence function for two features in a 3D context is: + +.. math:: + + \text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i}) + +Here, the function :math:`f(X_j, X_k, \mathbf{X}_{C_i})` is evaluated across a grid of values for :math:`X_j` and :math:`X_k`. The resulting 3D surface plot represents how the model's prediction changes over the joint range of these two features. + +The 3D plot offers a more intuitive visualization of feature interactions compared to 2D contour plots, allowing for a better understanding of the combined effects of features on the model's predictions. The surface plot is particularly useful when you need to capture complex relationships that might not be apparent in 2D. + +- **Feature Interaction Visualization:** The 3D PDP provides a comprehensive view of the interaction between two features. The resulting surface plot allows for the visualization of how the model’s output changes when the values of two features are varied simultaneously, making it easier to understand complex interactions. +- **Enhanced Interpretation:** 3D PDPs offer enhanced interpretability in scenarios where feature interactions are not linear or where the effect of one feature depends on the value of another. The 3D visualization makes these dependencies more apparent. + + +KDE and Histogram Distribution Plots +======================================= + +.. raw:: html + + + +KDE Distribution Function +----------------------------- + +**Generate KDE or histogram distribution plots for specified columns in a DataFrame.** + +The ``kde_distributions`` function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2]_ for plotting, which is built on top of +matplotlib [3]_ and provides a high-level interface for drawing attractive and informative +statistical graphics. + + +**Key Features and Parameters** + +- **Flexible Plotting**: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively. +- **Leverages Seaborn Library**: The function is built on the `seaborn` library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code. +- **Customization**: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs. +- **Scientific Notation Control**: The function allows disabling scientific notation on the axes, providing better readability for certain types of data. +- **Log Scaling**: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude. +- **Output Options**: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations. + +.. function:: kde_distributions(df, vars_of_interest=None, figsize=(5, 5), grid_figsize=None, hist_color="#0000FF", kde_color="#FF0000", mean_color="#000000", median_color="#000000", hist_edgecolor="#000000", hue=None, fill=True, fill_alpha=1, n_rows=None, n_cols=None, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_filename=None, y_axis_label="Density", plot_type="both", log_scale_vars=None, bins="auto", binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat="density", xlim=None, ylim=None, plot_mean=False, plot_median=False, std_dev_levels=None, std_color="#808080", label_names=None, show_legend=True, **kwargs) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param vars_of_interest: List of column names for which to generate distribution plots. If 'all', plots will be generated for all numeric columns. + :type vars_of_interest: list of str, optional + :param figsize: Size of each individual plot, default is ``(5, 5)``. Used when only one plot is being generated or when saving individual plots. + :type figsize: tuple of int, optional + :param grid_figsize: Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on ``figsize``, ``n_rows``, and ``n_cols``. + :type grid_figsize: tuple of int, optional + :param hist_color: Color of the histogram bars, default is ``'#0000FF'``. + :type hist_color: str, optional + :param kde_color: Color of the KDE plot, default is ``'#FF0000'``. + :type kde_color: str, optional + :param mean_color: Color of the mean line if ``plot_mean`` is True, default is ``'#000000'``. + :type mean_color: str, optional + :param median_color: Color of the median line if ``plot_median`` is True, default is ``'#000000'``. + :type median_color: str, optional + :param hist_edgecolor: Color of the histogram bar edges, default is ``'#000000'``. + :type hist_edgecolor: str, optional + :param hue: Column name to group data by, adding different colors for each group. + :type hue: str, optional + :param fill: Whether to fill the histogram bars with color, default is ``True``. + :type fill: bool, optional + :param fill_alpha: Alpha transparency for the fill color of the histogram bars, where ``0`` is fully transparent and ``1`` is fully opaque. Default is ``1``. + :type fill_alpha: float, optional + :param n_rows: Number of rows in the subplot grid. If not provided, it will be calculated automatically. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid. If not provided, it will be calculated automatically. + :type n_cols: int, optional + :param w_pad: Width padding between subplots, default is ``1.0``. + :type w_pad: float, optional + :param h_pad: Height padding between subplots, default is ``1.0``. + :type h_pad: float, optional + :param image_path_png: Directory path to save the PNG image of the overall distribution plots. + :type image_path_png: str, optional + :param image_path_svg: Directory path to save the SVG image of the overall distribution plots. + :type image_path_svg: str, optional + :param image_filename: Filename to use when saving the overall distribution plots. + :type image_filename: str, optional + :param bbox_inches: Bounding box to use when saving the figure. For example, ``'tight'``. + :type bbox_inches: str, optional + :param single_var_image_filename: Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses ``figsize`` for determining the plot size, ignoring ``grid_figsize``. + :type single_var_image_filename: str, optional + :param y_axis_label: The label to display on the ``y-axis``, default is ``'Density'``. + :type y_axis_label: str, optional + :param plot_type: The type of plot to generate, options are ``'hist'``, ``'kde'``, or ``'both'``. Default is ``'both'``. + :type plot_type: str, optional + :param log_scale_vars: Variable name(s) to apply log scaling. Can be a single string or a list of strings. + :type log_scale_vars: str or list of str, optional + :param bins: Specification of histogram bins, default is ``'auto'``. + :type bins: int or sequence, optional + :param binwidth: Width of each bin, overrides bins but can be used with binrange. + :type binwidth: float, optional + :param label_fontsize: Font size for axis labels, including xlabel, ylabel, and tick marks, default is ``10``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: Maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param disable_sci_notation: Toggle to disable scientific notation on axes, default is ``False``. + :type disable_sci_notation: bool, optional + :param stat: Aggregate statistic to compute in each bin (e.g., ``'count'``, ``'frequency'``, ``'probability'``, ``'percent'``, ``'density'``), default is ``'density'``. + :type stat: str, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (``min``, ``max``). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (``min``, ``max``). + :type ylim: tuple or list, optional + :param plot_mean: Whether to plot the mean as a vertical line, default is ``False``. + :type plot_mean: bool, optional + :param plot_median: Whether to plot the median as a vertical line, default is ``False``. + :type plot_median: bool, optional + :param std_dev_levels: Levels of standard deviation to plot around the mean. + :type std_dev_levels: list of int, optional + :param std_color: Color(s) for the standard deviation lines, default is ``'#808080'``. + :type std_color: str or list of str, optional + :param label_names: Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display. + :type label_names: dict, optional + :param show_legend: Whether to show the legend on the plots, default is ``True``. + :type show_legend: bool, optional + :param kwargs: Additional keyword arguments passed to the Seaborn plotting function. + :type kwargs: additional keyword arguments + + :raises ValueError: + - If ``plot_type`` is not one of ``'hist'``, ``'kde'``, or ``'both'``. + - If ``stat`` is not one of ``'count'``, ``'density'``, ``'frequency'``, ``'probability'``, ``'proportion'``, ``'percent'``. + - If ``log_scale_vars`` contains variables that are not present in the DataFrame. + - If ``fill`` is set to ``False`` and ``hist_edgecolor`` is not the default. + - If ``grid_figsize`` is provided when only one plot is being created. + + :raises UserWarning: + - If both ``bins`` and ``binwidth`` are specified, which may affect performance. + + :returns: ``None`` + + +\ + +.. raw:: html + +
+ + + +KDE and Histograms Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the below example, the ``kde_distributions`` function is used to generate +histograms for several variables of interest: ``"age"``, ``"education-num"``, and +``"hours-per-week"``. These variables represent different demographic and +financial attributes from the dataset. The ``plot_type="both"`` parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data's probability density. + +The visualizations are arranged in a single row of four columns, as specified +by ``n_rows=1`` and ``n_cols=3``, respectively. The overall size of the grid +figure is set to `14 inches` wide and `4 inches tall` (``grid_figsize=(14, 4)``), +while each individual plot is configured to be `4 inches` by `4 inches` +(``single_figsize=(4, 4)``). The ``fill=True`` parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +``w_pad=1`` and ``h_pad=1``, which add `1 inch` of padding both horizontally and +vertically. + +.. note:: + If you do not set ``n_rows`` or ``n_cols`` to any values, the function will + automatically calculate and create a grid based on the number of variables being + plotted, ensuring an optimal arrangement of the plots. + +To handle longer titles, the ``text_wrap=50`` parameter ensures that the title +text wraps to a new line after `50 characters`. The ``bbox_inches="tight"`` setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in ``vars_of_interest`` are +passed directly to the function for visualization. + +Each plot is saved individually with filenames that are prefixed by +``"kde_density_single_distribution"``, followed by the variable name. The ```y-axis``` +for all plots is labeled as "Density" (``y_axis_label="Density"``), reflecting that +the height of the bars or KDE line represents the data's density. The histograms +are divided into `10 bins` (``bins=10``), offering a clear view of the distribution +of each variable. + +Additionally, the font sizes for the axis labels and tick labels +are set to `16 points` (``label_fontsize=16``) and `14 points` (``tick_fontsize=14``), +respectively, ensuring that all text within the plots is legible and well-formatted. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + fill=True, + fill_alpha=0.60, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="both", # Can also just plot KDE by itself by passing "kde" + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + ) + +.. raw:: html + +
+ +.. image:: ../assets/kde_density_distributions.svg + :alt: KDE Distributions - KDE (+) Histograms (Density) + :align: center + :width: 950px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Density) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is used to generate histograms for +the variables ``"age"``, ``"education-num"``, and ``"hours-per-week"`` but with +``plot_type="hist"``, meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (``n_rows=1, n_cols=3``), +with a grid size of `14x4 inches` (``grid_figsize=(14, 4)``). The histograms are +divided into `10 bins` (``bins=10``), and the ``y-axis`` is labeled "Density" (``y_axis_label="Density"``). +Font sizes for the axis labels and tick labels are set to `16` and `14` points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay. + + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + fill=True, + text_wrap=50, + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + plot_type="hist", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + show_legend=False, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/hist_density_distributions.svg + :alt: KDE Distributions - Histograms (Density) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Histogram Example (Count) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is modified to generate histograms +with a few key changes. The ``hist_color`` is set to `"orange"`, changing the color of the +histogram bars. The ``y-axis`` label is updated to "Count" (``y_axis_label="Count"``), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to ``"Count"`` to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (``n_rows=1, n_cols=3``), +a grid size of `14x4 inches`, and a bin count of `10`. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + text_wrap=50, + hist_color="orange", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Count", + bins=10, + plot_type="hist", + stat="Count", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + show_legend=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/count_hist_distributions.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Histogram Example - (Mean and Median) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is customized to generate +histograms that include mean and median lines. The ``mean_color`` is set to ``"blue"`` +and the ``median_color`` is set to ``"black"``, allowing for a clear distinction +between the two statistical measures. The function parameters are adjusted to +ensure that both the mean and median lines are plotted ``(plot_mean=True, plot_median=True)``. +The ``y_axis_label`` remains ``"Density"``, indicating that the histograms +represent the density of observations within each bin. The histogram bars are +colored using ``hist_color="brown"``, with a ``fill_alpha=0.60`` while the s +tatistical overlays enhance the interpretability of the data. The layout is +configured with a single row and multiple columns ``(n_rows=1, n_cols=3)``, and +the grid size is set to `15x5 inches`. This example highlights how to visualize +central tendencies within the data using a histogram that prominently displays +the mean and median. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + "education-num", + "hours-per-week", + ] + + kde_distributions( + df=df, + n_rows=1, + n_cols=3, + grid_figsize=(14, 4), # Size of the overall grid figure + text_wrap=50, + hist_color="brown", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + fill_alpha=0.60, + plot_type="hist", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + plot_mean=True, + plot_median=True, + mean_color="blue", + ) + +.. raw:: html + +
+ +.. image:: ../assets/density_hist_dist_mean_median.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Histogram Example - (Mean, Median, and Std. Deviation) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``kde_distributions()`` function is customized to generate +a histogram that include mean, median, and 3 standard deviation lines. The +``mean_color`` is set to ``"blue"`` and the median_color is set to ``"black"``, +allowing for a clear distinction between these two central tendency measures. +The function parameters are adjusted to ensure that both the mean and median lines +are plotted ``(plot_mean=True, plot_median=True)``. The ``y_axis_label`` remains +``"Density"``, indicating that the histograms represent the density of observations +within each bin. The histogram bars are colored using ``hist_color="brown"``, +with a ``fill_alpha=0.40``, which adjusts the transparency of the fill color. +Additionally, standard deviation bands are plotted using colors ``"purple"``, +``"green"``, and ``"silver"`` for one, two, and three standard deviations, respectively. + +The layout is configured with a single row and multiple columns ``(n_rows=1, n_cols=3)``, +and the grid size is set to `15x5 inches`. This setup is particularly useful for +visualizing the central tendencies within the data while also providing a clear +view of the distribution and spread through the standard deviation bands. The +configuration used in this example showcases how histograms can be enhanced with +statistical overlays to provide deeper insights into the data. + +.. note:: + + You have the freedom to choose whether to plot the mean, median, and + standard deviation lines. You can display one, none, or all of these simultaneously. + +.. code-block:: python + + from eda_toolkit import kde_distributions + + vars_of_interest = [ + "age", + ] + + kde_distributions( + df=df, + figsize=(10, 6), + text_wrap=50, + hist_color="brown", + bbox_inches="tight", + vars_of_interest=vars_of_interest, + y_axis_label="Density", + bins=10, + fill_alpha=0.40, + plot_type="both", + stat="Density", + label_fontsize=16, # Font size for axis labels + tick_fontsize=14, # Font size for tick labels + plot_mean=True, + plot_median=True, + mean_color="blue", + image_path_svg=image_path_svg, + image_path_png=image_path_png, + std_dev_levels=[ + 1, + 2, + 3, + ], + std_color=[ + "purple", + "green", + "silver", + ], + ) + +.. raw:: html + +
+ +.. image:: ../assets/density_hist_dist_age.svg + :alt: KDE Distributions - Histograms (Count) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Stacked Crosstab Plots +======================= + +**Generates stacked bar plots and crosstabs for specified columns in a DataFrame.** + +The ``stacked_crosstab_plot`` function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats. + +The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis. + +.. function:: stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind="bar", width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output="both", return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type="both", show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False) + + Generates stacked or regular bar plots and crosstabs for specified columns. + + This function allows users to create stacked bar plots (or regular bar plots + if stacks are removed) and corresponding crosstabs for specific columns + in a DataFrame. It provides options to customize the appearance, including + font sizes for axis labels, tick labels, and title text wrapping, and to + choose between regular or normalized plots. + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param col: The name of the column in the DataFrame to be analyzed. + :type col: str + :param func_col: List of ground truth columns to be analyzed. + :type func_col: list + :param legend_labels_list: List of legend labels for each ground truth column. + :type legend_labels_list: list + :param title: List of titles for the plots. + :type title: list + :param kind: The kind of plot to generate (``'bar'`` or ``'barh'`` for horizontal bars), default is ``'bar'``. + :type kind: str, optional + :param width: The width of the bars in the bar plot, default is ``0.9``. + :type width: float, optional + :param rot: The rotation angle of the ``x-axis`` labels, default is ``0``. + :type rot: int, optional + :param custom_order: Specifies a custom order for the categories in the ``col``. + :type custom_order: list, optional + :param image_path_png: Directory path where generated PNG plot images will be saved. + :type image_path_png: str, optional + :param image_path_svg: Directory path where generated SVG plot images will be saved. + :type image_path_svg: str, optional + :param save_formats: List of file formats to save the plot images in. + :type save_formats: list, optional + :param color: List of colors to use for the plots. If not provided, a default color scheme is used. + :type color: list, optional + :param output: Specify the output type: ``"plots_only"``, ``"crosstabs_only"``, or ``"both"``. Default is ``"both"``. + :type output: str, optional + :param return_dict: Specify whether to return the crosstabs dictionary, default is ``False``. + :type return_dict: bool, optional + :param x: The width of the figure. + :type x: int, optional + :param y: The height of the figure. + :type y: int, optional + :param p: The padding between the subplots. + :type p: int, optional + :param file_prefix: Prefix for the filename when output includes plots. + :type file_prefix: str, optional + :param logscale: Apply log scale to the ``y-axis``, default is ``False``. + :type logscale: bool, optional + :param plot_type: Specify the type of plot to generate: ``"both"``, ``"regular"``, ``"normalized"``. Default is ``"both"``. + :type plot_type: str, optional + :param show_legend: Specify whether to show the legend, default is ``True``. + :type show_legend: bool, optional + :param label_fontsize: Font size for axis labels, default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for tick labels on the axes, default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping, default is ``50``. + :type text_wrap: int, optional + :param remove_stacks: If ``True``, removes stacks and creates a regular bar plot using only the ``col`` parameter. Only works when ``plot_type`` is set to ``'regular'``. Default is ``False``. + :type remove_stacks: bool, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (`min, max`). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (`min, max`). + :type ylim: tuple or list, optional + + :raises ValueError: + - If ``output`` is not one of ``"both"``, ``"plots_only"``, or ``"crosstabs_only"``. + - If ``plot_type`` is not one of ``"both"``, ``"regular"``, ``"normalized"``. + - If ``remove_stacks`` is set to True and ``plot_type`` is not ``"regular"``. + - If the lengths of ``title``, ``func_col``, and ``legend_labels_list`` are not equal. + :raises KeyError: If any columns specified in ``col`` or ``func_col`` are missing in the DataFrame. + + :returns: Dictionary of crosstabs DataFrames if ``return_dict`` is ``True``. Otherwise, returns ``None``. + :rtype: ``dict`` or ``None`` + + + +Stacked Bar Plots With Crosstabs Example +----------------------------------------- + +The provided code snippet demonstrates how to use the ``stacked_crosstab_plot`` +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here's a detailed breakdown of the code using the census +dataset as an example [1]_. + +First, the ``func_col`` list is defined, specifying the columns ``["sex", "income"]`` +to be analyzed. These columns will be used in the loop to generate separate plots. +The ``legend_labels_list`` is then defined, with each entry corresponding to a +column in ``func_col``. In this case, the labels for the ``sex`` column are +``["Male", "Female"]``, and for the ``income`` column, they are ``["<=50K", ">50K"]``. +These labels will be used to annotate the legends of the plots. + +Next, the ``title`` list is defined, providing titles for each plot corresponding +to the columns in ``func_col``. The titles are set to ``["Sex", "Income"]``, +which will be displayed on top of each respective plot. + +.. note:: + + The ``legend_labels_list`` parameter should be a list of lists, where each + inner list corresponds to the ground truth labels for the respective item in + the ``func_col`` list. Each element in the ``func_col`` list represents a + column in your DataFrame that you wish to analyze, and the corresponding + inner list in ``legend_labels_list`` should contain the labels that will be + used in the legend of your plots. + +For example: + +.. code-block:: python + + # Define the func_col to use in the loop in order of usage + func_col = ["sex", "income"] + + # Define the legend_labels to use in the loop + legend_labels_list = [ + ["Male", "Female"], # Corresponds to "sex" + ["<=50K", ">50K"], # Corresponds to "income" + ] + + # Define titles for the plots + title = [ + "Sex", + "Income", + ] + +.. important:: + + Ensure that the number of elements in ``func_col``, ``legend_labels_list``, + and ``title`` are the same. Each item in ``func_col`` must have a corresponding + list of labels in ``legend_labels_list`` and a title in ``title``. This + consistency is essential for the function to correctly generate the plots + with the appropriate labels and titles. + + +In this example: + +- ``func_col`` contains two elements: ``"sex"`` and ``"income"``. Each corresponds to a specific column in your DataFrame. +- ``legend_labels_list`` is a nested list containing two inner lists: + + - The first inner list, ``["Male", "Female"]``, corresponds to the ``"sex"`` column in ``func_col``. + - The second inner list, ``["<=50K", ">50K"]``, corresponds to the ``"income"`` column in ``func_col``. + +- ``title`` contains two elements: ``"Sex"`` and ``"Income"``, which will be used as the titles for the respective plots. + +.. note:: + + If you assign the function to a variable, the dictionary returned when + ``return_dict=True`` will be suppressed in the output. However, the dictionary + is still available within the assigned variable for further use. + + +.. code-block:: python + + from eda_toolkit import stacked_crosstab_plot + + # Call the stacked_crosstab_plot function + stacked_crosstabs = stacked_crosstab_plot( + df=df, + col="age_group", + func_col=func_col, + legend_labels_list=legend_labels_list, + title=title, + kind="bar", + width=0.8, + rot=45, # axis rotation angle + custom_order=None, + color=["#00BFC4", "#F8766D"], # default color schema + output="both", + return_dict=True, + x=14, + y=8, + p=10, + logscale=False, + plot_type="both", + show_legend=True, + label_fontsize=14, + tick_fontsize=12, + ) + +The above example generates stacked bar plots for ``"sex"`` and ``"income"`` +grouped by ``"education"``. The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export. + +.. important:: + + **Importance of Correctly Aligning Labels** + + It is crucial to properly align the elements in the ``legend_labels_list``, + ``title``, and ``func_col`` parameters when using the ``stacked_crosstab_plot`` + function. Each of these lists must be ordered consistently because the function + relies on their alignment to correctly assign labels and titles to the + corresponding plots and legends. + + **For instance, in the example above:** + + - The first element in ``func_col`` is ``"sex"``, and it is aligned with the first set of labels ``["Male", "Female"]`` in ``legend_labels_list`` and the first title ``"Sex"`` in the ``title`` list. + - Similarly, the second element in ``func_col``, ``"income"``, aligns with the labels ``["<=50K", ">50K"]`` and the title ``"Income"``. + + **Misalignment between these lists would result in incorrect labels or titles being + applied to the plots, potentially leading to confusion or misinterpretation of the data. + Therefore, it's important to ensure that each list is ordered appropriately and + consistently to accurately reflect the data being visualized.** + + **Proper Setup of Lists** + + When setting up the ``legend_labels_list``, ``title``, and ``func_col``, ensure + that each element in the lists corresponds to the correct variable in the DataFrame. + This involves: + + - **Ordering**: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted. + - **Consistency**: Double-checking that each label in ``legend_labels_list`` matches the categories present in the corresponding ``func_col``, and that the ``title`` accurately describes the plot. + + By adhering to these guidelines, you can ensure that the ``stacked_crosstab_plot`` + function produces accurate and meaningful visualizations that are easy to interpret and analyze. + +**Output** + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_sex.svg + :alt: KDE Distributions + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income.svg + :alt: Stacked Bar Plot Age vs. Income + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +.. note:: + + When you set ``return_dict=True``, you are able to see the crosstabs printed out + as shown below. + +.. raw:: html + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93
+ +\ + +When you set ``return_dict=True``, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example: + +.. code-block:: python + + crosstab_age_sex = crosstabs_dict["sex"] + crosstab_age_income = crosstabs_dict["income"] + + +Pivoted Stacked Bar Plots Example +----------------------------------- + +Using the census dataset [1]_, to create horizontal stacked bar plots, set the ``kind`` parameter to +``"barh"`` in the ``stacked_crosstab_plot function``. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the ``y-axis``. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_pivoted.svg + :alt: Stacked Bar Plot Age vs. Income (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Non-Normalized Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to create stacked bar plots without the normalized versions, +set the ``plot_type`` parameter to ``"regular"`` in the ``stacked_crosstab_plot`` +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the ``plot_type`` to ``"normalized"`` will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age. + +.. raw:: html + +
+ +.. image:: ../assets/Stacked_Bar_Age_income_regular.svg + :alt: Stacked Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Regular Non-Stacked Bar Plots Example +---------------------------------------------------- + +In the census data [1]_, to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the ``plot_type`` parameter to ``"regular"`` +in the ``stacked_crosstab_plot`` function and enable ``remove_stacks`` by setting +it to ``True``. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +``plot_type`` to ``"normalized"`` will display only the normalized plots. + +When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories. + +In the example below, the color of the bars has been set to a dark grey (``#333333``), +and the legend has been removed by setting ``show_legend=False``. This illustrates +regular bar plots for income by age, without stacking. + + +.. raw:: html + +
+ +.. image:: ../assets/Bar_Age_regular_income.svg + :alt: Bar Plot Age vs. Income (Regular) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Box and Violin Plots +=========================== + +**Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.** + +The ``box_violin_plot`` function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories. + +With options to customize the plot type (``boxplot`` or ``violinplot``), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis. + +Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures. + +The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset. + +.. function:: box_violin_plot(df, metrics_list, metrics_comp, n_rows=None, n_cols=None, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type="boxplot", xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None, label_names=None, **kwargs) + + :param df: The DataFrame containing the data to plot. + :type df: pandas.DataFrame + :param metrics_list: List of metric names (columns in df) to plot. + :type metrics_list: list of str + :param metrics_comp: List of comparison categories (columns in df). + :type metrics_comp: list of str + :param n_rows: Number of rows in the subplot grid. Calculated automatically if not provided. + :type n_rows: int, optional + :param n_cols: Number of columns in the subplot grid. Calculated automatically if not provided. + :type n_cols: int, optional + :param image_path_png: Optional directory path to save ``.png`` images. + :type image_path_png: str, optional + :param image_path_svg: Optional directory path to save ``.svg`` images. + :type image_path_svg: str, optional + :param save_plots: String, ``"all"``, ``"individual"``, or ``"grid"`` to control saving plots. + :type save_plots: str, optional + :param show_legend: Boolean, True if showing the legend in the plots. Default is ``True``. + :type show_legend: bool, optional + :param plot_type: Specify the type of plot, either ``"boxplot"`` or ``"violinplot"``. Default is ``"boxplot"``. + :type plot_type: str, optional + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + :param show_plot: Specify the plot display mode: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + :param rotate_plot: Boolean, True if rotating (pivoting) the plots. Default is ``False``. + :type rotate_plot: bool, optional + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + :param grid_figsize: Width and height of the figure for grid plots. + :type grid_figsize: tuple or list, optional + :param label_fontsize: Font size for axis labels. Default is ``12``. + :type label_fontsize: int, optional + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + :param xlim: Limits for the ``x-axis`` as a tuple or list of (``min``, ``max``). + :type xlim: tuple or list, optional + :param ylim: Limits for the ``y-axis`` as a tuple or list of (``min``, ``max``). + :type ylim: tuple or list, optional + :param label_names: Dictionary mapping original column names to custom labels. Default is ``None``. + :type label_names: dict, optional + :param kwargs: Additional keyword arguments passed to the Seaborn plotting function. + :type kwargs: additional keyword arguments + + :raises ValueError: + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set without specifying ``image_path_png`` or ``image_path_svg``. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` is not a tuple or list of two numbers. + - If ``grid_figsize`` is provided and is not a tuple or list of two numbers. + + :returns: ``None`` + + + +This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels. + +Box Plots Grid Example +----------------------- + +In this example with the US census data [1]_, the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the ``"age_group"`` column in the +DataFrame. The ``metrics_comp`` parameter is set to [``"age_group"``], meaning +that the comparison will be based on different age groups. The ``metrics_list`` is +provided as ``age_boxplot_list``, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid formatThe ``image_path_png`` and +``image_path_svg`` parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to ``"all"``, ensuring that both +individual and grid plots are saved. + +The plots are displayed in a grid format, as indicated by the ``show_plot="grid"`` +parameter. The ``plot_type`` is set to ``"boxplot"``, so the function will generate +boxplots for each metric in the list. Additionally, the ```x-axis``` labels are rotated +by 90 degrees (``xlabel_rot=90``) to ensure that the labels are legible. The legend is +hidden by setting ``show_legend=False``, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication. + + +.. code-block:: python + + age_boxplot_list = df[ + [ + "education-num", + "hours-per-week", + ] + ].columns.to_list() + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_comp, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="boxplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_boxplot.png + :alt: Box Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Violin Plots Grid Example +-------------------------- + +In this example with the US census data [1]_, we keep everything the same as the prior example, but change the +``plot_type`` to ``violinplot``. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings. + + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_comp=metrics_comp, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + save_plots="all", + show_plot="both", + show_legend=False, + plot_type="violinplot", + xlabel_rot=90, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot.png + :alt: Violin Plot Comparisons + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Pivoted Violin Plots Grid Example +------------------------------------ + +In this example with the US census data [1]_, we set ``xlabel_rot=0`` and ``rotate_plot=True`` +to pivot the plot, changing the orientation of the axes while keeping the ``x-axis`` labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution. + +.. code-block:: python + + from eda_toolkit import box_violin_plot + + metrics_comp = ["age_group"] + + box_violin_plot( + df=df, + metrics_list=age_boxplot_list, + metrics_boxplot_comp=metrics_comp, + show_plot="both", + rotate_plot=True, + show_legend=False, + plot_type="violinplot", + xlabel_rot=0, + ) + +.. raw:: html + +
+ +.. image:: ../assets/all_plots_comparisons_violinplot_pivoted.png + :alt: Violin Plot Comparisons (Pivoted) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots and Best Fit Lines +================================== + +Scatter Fit Plot +------------------ + +**Create and Save Scatter Plots or a Grid of Scatter Plots** + +This function, ``scatter_fit_plot``, is designed to generate scatter plots for +one or more pairs of variables (``x_vars`` and ``y_vars``) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view. + +**Optional Best Fit Line** + +An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s + +**Customizable Plot Aesthetics** + +The function offers a wide range of customization options to tailor the appearance +of the scatter plots: + +- **Point Color**: You can specify a default color for the scatter points or use a ``hue`` parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data. + +- **Point Size**: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable. + +- **Markers**: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data. + +**Axis and Label Configuration** + +The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges. + +**Plot Display and Saving Options** + +The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations. + +**Correlation Coefficient Display** + +For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship. + +.. function:: scatter_fit_plot(df, x_vars=None, y_vars=None, n_rows=None, n_cols=None, max_cols=4, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot="both", rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color="C0", best_fit_linecolor="red", best_fit_linestyle="-", hue=None, hue_palette=None, size=None, sizes=None, marker="o", show_correlation=True, xlim=None, ylim=None, all_vars=None, label_names=None, **kwargs) + + Create and save scatter plots or a grid of scatter plots for given ``x_vars`` + and ``y_vars``, with an optional best fit line and customizable point color, + size, and markers. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param x_vars: List of variable names to plot on the ``x-axis``. + :type x_vars: list of str, optional + + :param y_vars: List of variable names to plot on the ``y-axis``. + :type y_vars: list of str, optional + + :param n_rows: Number of rows in the subplot grid. Calculated based on the number of plots and ``n_cols`` if not specified. + :type n_rows: int, optional + + :param n_cols: Number of columns in the subplot grid. Calculated based on the number of plots and ``max_cols`` if not specified. + :type n_cols: int, optional + + :param max_cols: Maximum number of columns in the subplot grid. Default is ``4``. + :type max_cols: int, optional + + :param image_path_png: Directory path to save PNG images of the scatter plots. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the scatter plots. + :type image_path_svg: str, optional + + :param save_plots: Controls which plots to save: ``"all"``, ``"individual"``, or ``"grid"``. If None, plots will not be saved. + :type save_plots: str, optional + + :param show_legend: Whether to display the legend on the plots. Default is ``True``. + :type show_legend: bool, optional + + :param xlabel_rot: Rotation angle for ``x-axis`` labels. Default is ``0``. + :type xlabel_rot: int, optional + + :param show_plot: Controls plot display: ``"individual"``, ``"grid"``, or ``"both"``. Default is ``"both"``. + :type show_plot: str, optional + + :param rotate_plot: Whether to rotate (pivot) the plots. Default is ``False``. + :type rotate_plot: bool, optional + + :param individual_figsize: Width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple or list, optional + + :param grid_figsize: Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified. + :type grid_figsize: tuple or list, optional + + :param label_fontsize: Font size for axis labels. Default is 12. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is 10. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + + :param add_best_fit_line: Whether to add a best fit line to the scatter plots. Default is ``False``. + :type add_best_fit_line: bool, optional + + :param scatter_color: Color code for the scattered points. Default is ``"C0"``. + :type scatter_color: str, optional + + :param best_fit_linecolor: Color code for the best fit line. Default is ``"red"``. + :type best_fit_linecolor: str, optional + + :param best_fit_linestyle: Linestyle for the best fit line. Default is ``"-"``. + :type best_fit_linestyle: str, optional + + :param hue: Column name for the grouping variable that will produce points with different colors. + :type hue: str, optional + + :param hue_palette: Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the ``hue`` parameter to be set. + :type hue_palette: dict, list, or str, optional + + :param size: Column name for the grouping variable that will produce points with different sizes. + :type size: str, optional + + :param sizes: Dictionary mapping sizes (smallest and largest) to min and max values. + :type sizes: dict, optional + + :param marker: Marker style used for the scatter points. Default is ``"o"``. + :type marker: str, optional + + :param show_correlation: Whether to display the Pearson correlation coefficient in the plot title. Default is ``True``. + :type show_correlation: bool, optional + + :param xlim: Limits for the ``x-axis`` as a tuple or list of (``min``, ``max``). + :type xlim: tuple or list, optional + + :param ylim: Limits for the ``y-axis`` as a tuple or list of (``min``, ``max``). + :type ylim: tuple or list, optional + + :param all_vars: If provided, automatically generates scatter plots for all combinations of variables in this list, overriding `x_vars` and `y_vars`. + :type all_vars: list of str, optional + + :param label_names: A dictionary to rename columns for display in the plot titles and labels. + :type label_names: dict, optional + + :param kwargs: Additional keyword arguments to pass to ``sns.scatterplot``. + :type kwargs: dict, optional + + :raises ValueError: + - If ``all_vars`` is provided and either ``x_vars`` or ``y_vars`` is also provided. + - If neither ``all_vars`` nor both ``x_vars`` and ``y_vars`` are provided. + - If ``hue_palette`` is specified without ``hue``. + - If ``show_plot`` is not one of ``"individual"``, ``"grid"``, or ``"both"``. + - If ``save_plots`` is not one of ``None``, ``"all"``, ``"individual"``, or ``"grid"``. + - If ``save_plots`` is set but no image paths are provided. + - If ``rotate_plot`` is not a boolean value. + - If ``individual_figsize`` or ``grid_figsize`` are not tuples/lists with two numeric values. + + :returns: ``None``. This function does not return any value but generates and optionally saves scatter plots for the specified ``x_vars`` and ``y_vars``, or for all combinations of variables in ``all_vars`` if it is provided. + + + +Regression-Centric Scatter Plots Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this US census data [1]_ example, the ``scatter_fit_plot`` function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the ``show_correlation=True`` parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the ``add_best_fit_line=True`` parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + show_legend=True, + show_plot="grid", + grid_figsize=None, + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid.png + :alt: Scatter Plot Comparisons (with Best Fit Lines) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Scatter Plots Grouped by Category Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of +scatter plots that examine the relationships between ``age`` and ``hours-per-week`` +as well as ``education-num`` and ``hours-per-week``. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots: + +1. **Hue and Hue Palette**: The ``hue`` parameter is set to ``"income"``, meaning that the + data points in the scatter plots are colored according to the values in the ``income`` + column. A custom color mapping is provided via the ``hue_palette`` parameter, where the + income categories ``"<=50K"`` and ``">50K"`` are assigned the colors ``"brown"`` and + ``"green"``, respectively. This change visually distinguishes the data points based on + income levels. + +2. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, which applies + a grey color to the scatter points when no ``hue`` is provided. However, since a ``hue`` + is specified in this example, the ``hue_palette`` takes precedence and overrides this color setting. + +3. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``False``, meaning that + no best fit line is added to the scatter plots. This differs from the previous example where + a best fit line was included. + +4. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``False``, so the + Pearson correlation coefficient will not be displayed in the plot titles. This is another + change from the previous example where the correlation coefficient was included. + +5. **Hue Legend**: The ``show_legend`` parameter remains set to ``True``, ensuring that the + legend displaying the hue categories (``"<=50K"`` and ``">50K"``) appears on the plots, + helping to interpret the color coding of the data points. + +These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths. + + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + hue_dict = {"<=50K": "brown", ">50K": "green"} + + scatter_fit_plot( + df=df, + x_vars=["age", "education-num"], + y_vars=["hours-per-week"], + show_legend=True, + show_plot="grid", + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=False, + scatter_color="#808080", + hue="income", + hue_palette=hue_dict, + show_correlation=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_grid_grouped.png + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Scatter Plots (All Combinations Example) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the ``scatter_fit_plot`` function is used to generate a grid of scatter plots that explore the relationships between all numeric variables in the ``df`` DataFrame. The function automatically identifies and plots all possible combinations of these variables. Below are key aspects of this example: + +1. **All Variables Combination**: The ``all_vars`` parameter is used to automatically generate scatter plots for all possible combinations of numerical variables in the DataFrame. This means you don't need to manually specify ``x_vars`` and ``y_vars``, as the function will iterate through each possible pair. + +2. **Grid Display**: The ``show_plot`` parameter is set to ``"grid"``, so the scatter plots are displayed in a grid format. This is useful for comparing multiple relationships simultaneously. + +3. **Font Sizes**: The ``label_fontsize`` and ``tick_fontsize`` parameters are set to ``14`` and ``12``, respectively. This increases the readability of axis labels and tick marks, making the plots more visually accessible. + +4. **Best Fit Line**: The ``add_best_fit_line`` parameter is set to ``True``, meaning that a best fit line is added to each scatter plot. This helps in visualizing the linear relationship between variables. + +5. **Scatter Color**: The ``scatter_color`` parameter is set to ``"#808080"``, applying a grey color to the scatter points. This provides a neutral color that does not distract from the data itself. + +6. **Correlation Coefficient**: The ``show_correlation`` parameter is set to ``True``, so the Pearson correlation coefficient will be displayed in the plot titles. This helps to quantify the strength of the relationship between the variables. + +These settings allow for the creation of scatter plots that comprehensively explore the relationships between all numeric variables in the DataFrame. The plots are saved in a grid format, with added best fit lines and correlation coefficients for deeper analysis. The resulting images can be stored in the specified directory for future reference. + +.. code-block:: python + + from eda_toolkit import scatter_fit_plot + + scatter_fit_plot( + df=df, + all_vars=df.select_dtypes(np.number).columns.to_list(), + show_legend=True, + show_plot="grid", + label_fontsize=14, + tick_fontsize=12, + add_best_fit_line=True, + scatter_color="#808080", + show_correlation=True, + ) + +.. raw:: html + +
+ +.. image:: ../assets/scatter_plots_all_grid.png + :alt: Scatter Plot Comparisons (Grouped2) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Correlation Matrices +===================== + +**Generate and Save Customizable Correlation Heatmaps** + +The ``flex_corr_matrix`` function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats. + +**Customizable Plot Appearance** + +The function provides extensive customization options for the heatmap's appearance: + +- **Colormap Selection**: Choose from a variety of colormaps to represent the strength of correlations. The default is ``"coolwarm"``, but this can be adjusted to fit the needs of the analysis. + +- **Annotation**: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance. + +- **Figure Size and Layout**: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards. + +**Triangular vs. Full Correlation Matrix** + + +A key feature of the ``flex_corr_matrix`` function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations. + +**Label and Axis Configuration** + + +The function offers flexibility in configuring axis labels and titles: + +- **Label Rotation**: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names. +- **Font Sizes**: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable. +- **Title Wrapping**: Control the wrapping of long titles to fit within the plot without overlapping other elements. + +**Plot Display and Saving Options** + + +The ``flex_corr_matrix`` function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images. + +.. function:: flex_corr_matrix(df, cols=None, annot=True, cmap="coolwarm", save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title="Cervical Cancer Data: Correlation Matrix", label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment="right", ylabel_alignment="center_baseline", text_wrap=50, vmin=-1, vmax=1, cbar_label="Correlation Index", triangular=True, **kwargs) + + Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot. + + :param df: The DataFrame containing the data. + :type df: pandas.DataFrame + + :param cols: List of column names to include in the correlation matrix. If None, all columns are included. + :type cols: list of str, optional + + :param annot: Whether to annotate the heatmap with correlation coefficients. Default is ``True``. + :type annot: bool, optional + + :param cmap: The colormap to use for the heatmap. Default is ``"coolwarm"``. + :type cmap: str, optional + + :param save_plots: Controls whether to save the plots. Default is ``False``. + :type save_plots: bool, optional + + :param image_path_png: Directory path to save PNG images of the heatmap. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save SVG images of the heatmap. + :type image_path_svg: str, optional + + :param figsize: Width and height of the figure for the heatmap. Default is ``(10, 10)``. + :type figsize: tuple, optional + + :param title: Title of the heatmap. Default is ``"Cervical Cancer Data: Correlation Matrix"``. + :type title: str, optional + + :param label_fontsize: Font size for tick labels and colorbar label. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param xlabel_rot: Rotation angle for x-axis labels. Default is ``45``. + :type xlabel_rot: int, optional + + :param ylabel_rot: Rotation angle for y-axis labels. Default is ``0``. + :type ylabel_rot: int, optional + + :param xlabel_alignment: Horizontal alignment for x-axis labels. Default is ``"right"``. + :type xlabel_alignment: str, optional + + :param ylabel_alignment: Vertical alignment for y-axis labels. Default is ``"center_baseline"``. + :type ylabel_alignment: str, optional + + :param text_wrap: The maximum width of the title text before wrapping. Default is ``50``. + :type text_wrap: int, optional + + :param vmin: Minimum value for the heatmap color scale. Default is ``-1``. + :type vmin: float, optional + + :param vmax: Maximum value for the heatmap color scale. Default is ``1``. + :type vmax: float, optional + + :param cbar_label: Label for the colorbar. Default is ``"Correlation Index"``. + :type cbar_label: str, optional + + :param triangular: Whether to show only the upper triangle of the correlation matrix. Default is ``True``. + :type triangular: bool, optional + + :param kwargs: Additional keyword arguments to pass to ``seaborn.heatmap()``. + :type kwargs: dict, optional + + :raises ValueError: + - If ``annot`` is not a boolean. + - If ``cols`` is not a list. + - If ``save_plots`` is not a boolean. + - If ``triangular`` is not a boolean. + - If ``save_plots`` is True but no image paths are provided. + + :returns: ``None`` + This function does not return any value but generates and optionally saves a correlation heatmap. + +Triangular Correlation Matrix Example +-------------------------------------- + +The provided code filters the census [1]_ DataFrame ``df`` to include only numeric columns using +``select_dtypes(np.number)``. It then utilizes the ``flex_corr_matrix()`` function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options. + +.. note:: + + This triangular matrix format is particularly useful for avoiding + redundancy in correlation matrices, as it excludes the lower half, + making it easier to focus on unique pairwise correlations. + +The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations. + +.. code-block:: python + + # Select only numeric data to pass into the function + df_num = df.select_dtypes(np.number) + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="coolwarm", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=True, + ) + + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Full Correlation Matrix Example +---------------------------------- + +In this modified census [1]_ example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting ``cmap="viridis"``, the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting ``triangular=False``, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset. + +.. code-block:: python + + from eda_toolkit import flex_corr_matrix + + flex_corr_matrix( + df=df, + cols=df_num.columns.to_list(), + annot=True, + cmap="viridis", + figsize=(10, 8), + title="US Census Correlation Matrix", + xlabel_alignment="right", + label_fontsize=14, + tick_fontsize=12, + xlabel_rot=45, + ylabel_rot=0, + text_wrap=50, + vmin=-1, + vmax=1, + cbar_label="Correlation Index", + triangular=False, + ) + +.. raw:: html + +
+ +.. image:: ../assets/us_census_correlation_matrix_full.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +Partial Dependence Plots +========================= + +**Partial Dependence Plots (PDPs)** are a powerful tool in machine learning +interpretability, providing insights into how features influence the predicted +outcome of a model. PDPs can be generated in both 2D and 3D, depending on +whether you want to analyze the effect of one feature or the interaction between +two features on the model's predictions. + +2D Partial Dependence Plots +----------------------------- + +The ``plot_2d_pdp`` function generates 2D partial dependence plots for individual features or pairs of features. These plots are essential for examining the marginal effect of features on the predicted outcome. + +- **Grid and Individual Plots**: Generate all 2D partial dependence plots in a grid layout or as separate individual plots, offering flexibility in presentation. +- **Customization Options**: Control the figure size, font sizes for labels and ticks, and the wrapping of long titles to ensure the plots are clear and informative. +- **Saving Plots**: The function provides options to save the plots in PNG or SVG formats, and you can specify whether to save all plots, only individual plots, or just the grid plot. + +.. function:: plot_2d_pdp(model, X_train, feature_names, features, title="PDP of house value on CA non-location features", grid_resolution=50, plot_type="grid", grid_figsize=(12, 8), individual_figsize=(6, 4), label_fontsize=12, tick_fontsize=10, text_wrap=50, image_path_png=None, image_path_svg=None, save_plots=None, file_prefix="partial_dependence") + + Generate 2D partial dependence plots for specified features using the given machine learning model. The function allows for plotting in grid or individual layouts, with various customization options for figure size, font sizes, and title wrapping. Additionally, the plots can be saved in PNG or SVG formats with a customizable filename prefix. + + :param model: The trained machine learning model used to generate partial dependence plots. + :type model: estimator object + + :param X_train: The training data used to compute partial dependence. Should correspond to the features used to train the model. + :type X_train: pandas.DataFrame or numpy.ndarray + + :param feature_names: A list of feature names corresponding to the columns in ``X_train``. + :type feature_names: list of str + + :param features: A list of feature indices or tuples of feature indices for which to generate partial dependence plots. + :type features: list of int or tuple of int + + :param title: The title for the entire plot. Default is ``"PDP of house value on CA non-location features"``. + :type title: str, optional + + :param grid_resolution: The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is ``50``. + :type grid_resolution: int, optional + + :param plot_type: The type of plot to generate. Choose ``"grid"`` for a grid layout, ``"individual"`` for separate plots, or ``"both"`` to generate both layouts. Default is ``"grid"``. + :type plot_type: str, optional + + :param grid_figsize: Tuple specifying the width and height of the figure for the grid layout. Default is ``(12, 8)``. + :type grid_figsize: tuple, optional + + :param individual_figsize: Tuple specifying the width and height of the figure for individual plots. Default is ``(6, 4)``. + :type individual_figsize: tuple, optional + + :param label_fontsize: Font size for the axis labels and titles. Default is ``12``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for the axis tick labels. Default is ``10``. + :type tick_fontsize: int, optional + + :param text_wrap: The maximum width of the title text before wrapping. Useful for managing long titles. Default is ``50``. + :type text_wrap: int, optional + + :param image_path_png: The directory path where PNG images of the plots will be saved, if saving is enabled. + :type image_path_png: str, optional + + :param image_path_svg: The directory path where SVG images of the plots will be saved, if saving is enabled. + :type image_path_svg: str, optional + + :param save_plots: Controls whether to save the plots. Options include ``"all"``, ``"individual"``, ``"grid"``, or ``None`` (default). If saving is enabled, ensure ``image_path_png`` or ``image_path_svg`` are provided. + :type save_plots: str, optional + + :param file_prefix: Prefix for the filenames of the saved grid plots. Default is ``"partial_dependence"``. + :type file_prefix: str, optional + + :raises ValueError: + - If ``plot_type`` is not one of ``"grid"``, ``"individual"``, or ``"both"``. + - If ``save_plots`` is enabled but neither ``image_path_png`` nor ``image_path_svg`` is provided. + + :returns: ``None`` + This function generates partial dependence plots and displays them. It does not return any values. + + +2D Plots - CA Housing Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Consider a scenario where you have a machine learning model predicting median +house values in California. [4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (``AveOccup``) and the +age of the house (``HouseAge``) jointly influence house values. A 2D partial +dependence plot allows you to visualize this relationship in two ways: either as +individual plots for each feature or as a combined plot showing the interaction +between two features. + +For instance, the 2D partial dependence plot can help you analyze how the age of +the house impacts house values while holding the number of occupants constant, or +vice versa. This is particularly useful for identifying the most influential +features and understanding how changes in these features might affect the +predicted house value. + +If you extend this to two interacting features, such as ``AveOccup`` and ``HouseAge``, +you can explore their combined effect on house prices. The plot can reveal how +different combinations of occupancy levels and house age influence the value, +potentially uncovering non-linear relationships or interactions that might not be +immediately obvious from a simple 1D analysis. + +Here’s how you can generate and visualize these 2D partial dependence plots using +the California housing dataset: + +**Fetch The CA Housing Dataset and Prepare The DataFrame** + +.. code-block:: python + + from sklearn.datasets import fetch_california_housing + from sklearn.model_selection import train_test_split + from sklearn.ensemble import GradientBoostingRegressor + import pandas as pd + + # Load the dataset + data = fetch_california_housing() + df = pd.DataFrame(data.data, columns=data.feature_names) + +**Split The Data Into Training and Testing Sets** + +.. code-block:: python + + X_train, X_test, y_train, y_test = train_test_split( + df, data.target, test_size=0.2, random_state=42 + ) + +**Train a GradientBoostingRegressor Model** + +.. code-block:: python + + model = GradientBoostingRegressor( + n_estimators=100, + max_depth=4, + learning_rate=0.1, + loss="huber", + random_state=42, + ) + model.fit(X_train, y_train) + + +**Create 2D Partial Dependence Plot Grid** + +.. code-block:: python + + # import the plot_2d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_2d_pdp + + # Feature names + names = data.feature_names + + # Generate 2D partial dependence plots + plot_2d_pdp( + model=model, + X_train=X_train, + feature_names=names, + features=[ + "MedInc", + "AveOccup", + "HouseAge", + "AveRooms", + "Population", + ("AveOccup", "HouseAge"), + ], + title="PDP of house value on CA non-location features", + grid_figsize=(14, 10), + individual_figsize=(12, 4), + label_fontsize=14, + tick_fontsize=12, + text_wrap=120, + plot_type="grid", + image_path_png="path/to/save/png", + save_plots="all", + ) + +.. raw:: html + +
+ +.. image:: ../assets/2d_pdp_grid.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + +3D Partial Dependence Plots +----------------------------- + +The ``plot_3d_pdp`` function extends the concept of partial dependence to three dimensions, allowing you to visualize the interaction between two features and their combined effect on the model’s predictions. + +- **Interactive and Static 3D Plots**: Generate static 3D plots using Matplotlib or interactive 3D plots using Plotly. The function also allows for generating both types simultaneously. +- **Colormap and Layout Customization**: Customize the colormaps for both Matplotlib and Plotly plots. Adjust figure size, camera angles, and zoom levels to create plots that fit perfectly within your presentation or report. +- **Axis and Title Configuration**: Customize axis labels for both Matplotlib and Plotly plots. Adjust font sizes and control the wrapping of long titles to maintain readability. + +.. function:: plot_3d_pdp(model, dataframe, feature_names_list, x_label=None, y_label=None, z_label=None, title, html_file_path=None, html_file_name=None, image_filename=None, plot_type="both", matplotlib_colormap=None, plotly_colormap="Viridis", zoom_out_factor=None, wireframe_color=None, view_angle=(22, 70), figsize=(7, 4.5), text_wrap=50, horizontal=-1.25, depth=1.25, vertical=1.25, cbar_x=1.05, cbar_thickness=25, title_x=0.5, title_y=0.95, top_margin=100, image_path_png=None, image_path_svg=None, show_cbar=True, grid_resolution=20, left_margin=20, right_margin=65, label_fontsize=8, tick_fontsize=6, enable_zoom=True, show_modebar=True) + + Generate 3D partial dependence plots for two features of a machine learning model. + + This function supports both static (Matplotlib) and interactive (Plotly) visualizations, allowing for flexible and comprehensive analysis of the relationship between two features and the target variable in a model. + + :param model: The trained machine learning model used to generate partial dependence plots. + :type model: estimator object + + :param dataframe: The dataset on which the model was trained or a representative sample. If a DataFrame is provided, ``feature_names_list`` should correspond to the column names. If a NumPy array is provided, ``feature_names_list`` should correspond to the indices of the columns. + :type dataframe: pandas.DataFrame or numpy.ndarray + + :param feature_names_list: A list of two feature names or indices corresponding to the features for which partial dependence plots are generated. + :type feature_names_list: list of str + + :param x_label: Label for the x-axis in the plots. Default is ``None``. + :type x_label: str, optional + + :param y_label: Label for the y-axis in the plots. Default is ``None``. + :type y_label: str, optional + + :param z_label: Label for the z-axis in the plots. Default is ``None``. + :type z_label: str, optional + + :param title: The title for the plots. + :type title: str + + :param html_file_path: Path to save the interactive Plotly HTML file. Required if ``plot_type`` is ``"interactive"`` or ``"both"``. Default is ``None``. + :type html_file_path: str, optional + + :param html_file_name: Name of the HTML file to save the interactive Plotly plot. Required if ``plot_type`` is ``"interactive"`` or ``"both"``. Default is ``None``. + :type html_file_name: str, optional + + :param image_filename: Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is ``None``. + :type image_filename: str, optional + + :param plot_type: The type of plots to generate. Options are: + - ``"static"``: Generate only static Matplotlib plots. + - ``"interactive"``: Generate only interactive Plotly plots. + - ``"both"``: Generate both static and interactive plots. Default is ``"both"``. + :type plot_type: str, optional + + :param matplotlib_colormap: Custom colormap for the Matplotlib plot. If not provided, a default colormap is used. + :type matplotlib_colormap: matplotlib.colors.Colormap, optional + + :param plotly_colormap: Colormap for the Plotly plot. Default is ``"Viridis"``. + :type plotly_colormap: str, optional + + :param zoom_out_factor: Factor to adjust the zoom level of the Plotly plot. Default is ``None``. + :type zoom_out_factor: float, optional + + :param wireframe_color: Color for the wireframe in the Matplotlib plot. If ``None``, no wireframe is plotted. Default is ``None``. + :type wireframe_color: str, optional + + :param view_angle: Elevation and azimuthal angles for the Matplotlib plot view. Default is ``(22, 70)``. + :type view_angle: tuple, optional + + :param figsize: Figure size for the Matplotlib plot. Default is ``(7, 4.5)``. + :type figsize: tuple, optional + + :param text_wrap: Maximum width of the title text before wrapping. Useful for managing long titles. Default is ``50``. + :type text_wrap: int, optional + + :param horizontal: Horizontal camera position for the Plotly plot. Default is ``-1.25``. + :type horizontal: float, optional + + :param depth: Depth camera position for the Plotly plot. Default is ``1.25``. + :type depth: float, optional + + :param vertical: Vertical camera position for the Plotly plot. Default is ``1.25``. + :type vertical: float, optional + + :param cbar_x: Position of the color bar along the x-axis in the Plotly plot. Default is ``1.05``. + :type cbar_x: float, optional + + :param cbar_thickness: Thickness of the color bar in the Plotly plot. Default is ``25``. + :type cbar_thickness: int, optional + + :param title_x: Horizontal position of the title in the Plotly plot. Default is ``0.5``. + :type title_x: float, optional + + :param title_y: Vertical position of the title in the Plotly plot. Default is ``0.95``. + :type title_y: float, optional + + :param top_margin: Top margin for the Plotly plot layout. Default is ``100``. + :type top_margin: int, optional + + :param image_path_png: Directory path to save the PNG file of the Matplotlib plot. Default is None. + :type image_path_png: str, optional + + :param image_path_svg: Directory path to save the SVG file of the Matplotlib plot. Default is None. + :type image_path_svg: str, optional + + :param show_cbar: Whether to display the color bar in the Matplotlib plot. Default is ``True``. + :type show_cbar: bool, optional + + :param grid_resolution: The resolution of the grid for computing partial dependence. Default is ``20``. + :type grid_resolution: int, optional + + :param left_margin: Left margin for the Plotly plot layout. Default is ``20``. + :type left_margin: int, optional + + :param right_margin: Right margin for the Plotly plot layout. Default is ``65``. + :type right_margin: int, optional + + :param label_fontsize: Font size for axis labels in the Matplotlib plot. Default is ``8``. + :type label_fontsize: int, optional + + :param tick_fontsize: Font size for tick labels in the Matplotlib plot. Default is ``6``. + :type tick_fontsize: int, optional + + :param enable_zoom: Whether to enable zooming in the Plotly plot. Default is ``True``. + :type enable_zoom: bool, optional + + :param show_modebar: Whether to display the mode bar in the Plotly plot. Default is ``True``. + :type show_modebar: bool, optional + + :raises ValueError: + - If `plot_type` is not one of ``"static"``, ``"interactive"``, or ``"both"``. + - If `plot_type` is ``"interactive"`` or ``"both"`` and ``html_file_path`` or ``html_file_name`` are not provided. + + :returns: ``None`` + This function generates 3D partial dependence plots and displays or saves them. It does not return any values. + + :notes: + - This function handles warnings related to scikit-learn's ``partial_dependence`` function, specifically a ``FutureWarning`` related to non-tuple sequences for multidimensional indexing. This warning is suppressed as it stems from the internal workings of scikit-learn in Python versions like 3.7.4. + - To maintain compatibility with different versions of scikit-learn, the function attempts to use ``"values"`` for grid extraction in newer versions and falls back to ``"grid_values"`` for older versions. + + +3D Plots - CA Housing Example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Consider a scenario where you have a machine learning model predicting median +house values in California.[4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (``AveOccup``) and the +age of the house (``HouseAge``) jointly influence house values. A 3D partial +dependence plot allows you to visualize this relationship in a more comprehensive +manner, providing a detailed view of how these two features interact to affect +the predicted house value. + +For instance, the 3D partial dependence plot can help you explore how different +combinations of house age and occupancy levels influence house values. By +visualizing the interaction between AveOccup and HouseAge in a 3D space, you can +uncover complex, non-linear relationships that might not be immediately apparent +in 2D plots. + +This type of plot is particularly useful when you need to understand the joint +effect of two features on the target variable, as it provides a more intuitive +and detailed view of how changes in both features impact predictions simultaneously. + +Here’s how you can generate and visualize these 3D partial dependence plots +using the California housing dataset: + +Static Plot +^^^^^^^^^^^^^^^^^ + +**Fetch The CA Housing Dataset and Prepare The DataFrame** + +.. code-block:: python + + from sklearn.ensemble import GradientBoostingRegressor + from sklearn.datasets import fetch_california_housing + from sklearn.model_selection import train_test_split + import pandas as pd + + # Load the dataset + data = fetch_california_housing() + df = pd.DataFrame(data.data, columns=data.feature_names) + +**Split The Data Into Training and Testing Sets** + +.. code-block:: python + + X_train, X_test, y_train, y_test = train_test_split( + df, data.target, test_size=0.2, random_state=42 + ) + +**Train a GradientBoostingRegressor Model** + +.. code-block:: python + + model = GradientBoostingRegressor( + n_estimators=100, + max_depth=4, + learning_rate=0.1, + loss="huber", + random_state=1, + ) + model.fit(X_train, y_train) + +**Create Static 3D Partial Dependence Plot** + +.. code-block:: python + + # import the plot_3d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_3d_pdp + + # Call the function to generate the plot + plot_3d_pdp( + model=model, + dataframe=X_test, # Use the test dataset + feature_names_list=["HouseAge", "AveOccup"], + x_label="House Age", + y_label="Average Occupancy", + z_label="Partial Dependence", + title="3D Partial Dependence Plot of House Age vs. Average Occupancy", + image_filename="3d_pdp", + plot_type="static", + figsize=[8, 5], + text_wrap=40, + wireframe_color="black", + image_path_png=image_path_png, + grid_resolution=30, + ) + +.. raw:: html + +
+ +.. image:: ../assets/3d_pdp.svg + :alt: Scatter Plot Comparisons (Grouped) + :align: center + :width: 900px + +.. raw:: html + +
+ +.. raw:: html + +
+ + + +Interactive Plot +^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # import the plot_3d_pdp function from + # the eda_toolkit library + from eda_toolkit import plot_3d_pdp + + # Call the function to generate the plot + plot_3d_pdp( + model=model, + dataframe=X_test, # Use the test dataset + feature_names_list=["HouseAge", "AveOccup"], + x_label="House Age", + y_label="Average Occupancy", + z_label="Partial Dependence", + title="3D Partial Dependence Plot of House Age vs. Average Occupancy", + html_file_path=image_path_png, + image_filename="3d_pdp", + html_file_name="3d_pdp.html", + plot_type="interactive", + text_wrap=40, + zoom_out_factor=0.5, + image_path_png=image_path_png, + image_path_svg=image_path_svg, + grid_resolution=30, + label_fontsize=8, + tick_fontsize=6, + title_x=0.38, + top_margin=10, + right_margin=250, + cbar_x=0.9, + cbar_thickness=25, + show_modebar=False, + enable_zoom=True, + ) + +.. warning:: + + **Scrolling Notice:** + + While interacting with the interactive Plotly plot below, scrolling down the + page using the mouse wheel may be blocked when the mouse pointer is hovering + over the plot. To continue scrolling, either move the mouse pointer outside + the plot area or use the keyboard arrow keys to navigate down the page. + + +.. raw:: html + + + +
+ + +This interactive plot was generated using Plotly, which allows for rich, +interactive visualizations directly in the browser. The plot above is an example +of an interactive 3D Partial Dependence Plot. Here's how it differs from +generating a static plot using Matplotlib. + +**Key Differences** + +**Plot Type**: + +- The ``plot_type`` is set to ``"interactive"`` for the Plotly plot and ``"static"`` for the Matplotlib plot. + +**Interactive-Specific Parameters**: + +- **HTML File Path and Name**: The ``html_file_path`` and ``html_file_name`` parameters are required to save the interactive Plotly plot as an HTML file. These parameters are not needed for static plots. + +- **Zoom and Positioning**: The interactive plot includes parameters like ``zoom_out_factor``, ``title_x``, ``cbar_x``, and ``cbar_thickness`` to control the zoom level, title position, and color bar position in the Plotly plot. These parameters do not affect the static plot. + +- **Mode Bar and Zoom**: The ``show_modebar`` and ``enable_zoom`` parameters are specific to the interactive Plotly plot, allowing you to toggle the visibility of the mode bar and enable or disable zoom functionality. + +**Static-Specific Parameters**: + +- **Figure Size and Wireframe Color**: The static plot uses parameters like ``figsize`` to control the size of the Matplotlib plot and ``wireframe_color`` to define the color of the wireframe in the plot. These parameters are not applicable to the interactive Plotly plot. + +By adjusting these parameters, you can customize the behavior and appearance of your 3D Partial Dependence Plots according to your needs, whether for static or interactive visualization. + + + + +.. [1] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +.. [2] Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +.. [3] Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +.. [4] Pace, R. K., & Barry, R. (1997). *Sparse Spatial Autoregressions*. *Statistics & Probability Letters*, 33(3), 291-297. `https://doi.org/10.1016/S0167-7152(96)00140-X `_. + diff --git a/_build/html/v0.0.9/_sources/getting_started.rst.txt b/_build/html/v0.0.9/_sources/getting_started.rst.txt new file mode 100644 index 000000000..17fc2cc84 --- /dev/null +++ b/_build/html/v0.0.9/_sources/getting_started.rst.txt @@ -0,0 +1,136 @@ +.. _getting_started: + +.. KFRE Python Library Documentation documentation master file, created by + sphinx-quickstart on Thu May 2 15:44:56 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + + +Welcome to the EDA Toolkit Python Library Documentation! +======================================================== +.. note:: + This documentation is for ``eda_toolkit`` version ``0.0.9``. + + +The ``eda_toolkit`` is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data. + +Project Links +--------------- + +1. `PyPI Page `_ + +2. `GitHub Repository `_ + + +What is EDA? +------------- + +Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data. + + +Purpose of EDA Toolkit +----------------------- +The ``eda_toolkit`` library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including: + +- **Data Management:** Tools for managing directories, generating unique IDs, + standardizing dates, and handling common DataFrame manipulations. +- **Data Cleaning:** Functions to address missing values, remove outliers, and + correct formatting issues, ensuring data is ready for analysis. +- **Data Visualization:** A variety of plotting functions, including KDE + distribution plots, stacked bar plots, scatter plots with optional best fit + lines, and box/violin plots, to visually explore data distributions, + relationships, and trends. +- **Descriptive and Summary Statistics:** Methods to generate comprehensive + reports on data types, summary statistics (mean, median, standard deviation, + etc.), and to summarize all possible combinations of specified variables. +- **Reporting and Export:** Features to save DataFrames to Excel with + customizable formatting, create contingency tables, and export generated + plots in multiple formats. + + + +Key Features +------------- + +- **Ease of Use:** The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions. +- **Customizable:** Users can customize various aspects of the toolkit to fit their specific needs. +- **Integration:** Seamlessly integrates with popular data science libraries such as ``Pandas``, ``NumPy``, ``Matplotlib``, and ``Seaborn``. +- **Documentation and Examples:** Comprehensive documentation and examples to help users get started quickly and effectively. + +.. _prerequisites: + +Prerequisites +------------- +Before you install ``eda_toolkit``, ensure your system meets the following requirements: + +- **Python**: version ``3.7.4`` or higher is required to run ``eda_toolkit``. + +Additionally, ``eda_toolkit`` depends on the following packages, which will be automatically installed when you install ``eda_toolkit``: + +- ``jinja2``: version ``3.1.4`` or higher +- ``matplotlib``: version ``3.5.3`` or higher +- ``nbformat``: version ``4.2.0`` or higher +- ``numpy``: version ``1.21.6`` or higher +- ``pandas``: version ``1.3.5`` or higher +- ``plotly``: version ``5.18.0`` or higher +- ``scikit-learn``: version ``1.0.2`` or higher +- ``seaborn``: version ``0.12.2`` or higher +- ``xlsxwriter``: version ``3.2.0`` or higher + +.. _installation: + +Installation +------------- + +You can install ``eda_toolkit`` directly from PyPI: + +.. code-block:: bash + + pip install eda_toolkit + + +Description +=============== + +This guide provides detailed instructions and examples for using the functions +provided in the ``eda_toolkit`` library and how to use them effectively in your projects. + +For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [#]_. This dataset provides a rich source of +information for demonstrating the functionalities of the ``eda_toolkit``. + +.. [#] Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + diff --git a/_build/html/v0.0.9/_sources/index.rst.txt b/_build/html/v0.0.9/_sources/index.rst.txt new file mode 100644 index 000000000..5f0dc6c56 --- /dev/null +++ b/_build/html/v0.0.9/_sources/index.rst.txt @@ -0,0 +1,57 @@ +.. EDA Toolkit documentation master file, created by + sphinx-quickstart on Mon Jul 29 08:15:33 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +Table of Contents +=================== + +.. toctree:: + :maxdepth: 4 + :caption: Getting Started + + getting_started + + +.. toctree:: + :maxdepth: 4 + :caption: Data Management + + data_management + +.. toctree:: + :maxdepth: 4 + :caption: Plotting Heuristics + + eda_plots + +.. toctree:: + :maxdepth: 4 + :caption: About EDA Toolkit + + acknowledgements + contributors + citations + changelog + references + + \ No newline at end of file diff --git a/_build/html/v0.0.9/_sources/references.rst.txt b/_build/html/v0.0.9/_sources/references.rst.txt new file mode 100644 index 000000000..335337c3a --- /dev/null +++ b/_build/html/v0.0.9/_sources/references.rst.txt @@ -0,0 +1,33 @@ +.. _references: + +.. _target-link: + +.. raw:: html + +
+ +.. image:: ../assets/eda_toolkit_logo.svg + :alt: EDA Toolkit Logo + :align: left + :width: 300px + +.. raw:: html + +
+ +.. raw:: html + +
+ +\ + +References +=========== + +1. Hunter, J. D. (2007). *Matplotlib: A 2D Graphics Environment*. *Computing in Science & Engineering*, 9(3), 90-95. `https://doi.org/10.1109/MCSE.2007.55 `_. + +2. Kohavi, R. (1996). *Census Income*. UCI Machine Learning Repository. `https://doi.org/10.24432/C5GP7S `_. + +3. Waskom, M. (2021). *Seaborn: Statistical Data Visualization*. *Journal of Open Source Software*, 6(60), 3021. `https://doi.org/10.21105/joss.03021 `_. + +4. Pace, R. K., & Barry, R. (1997). *Sparse Spatial Autoregressions*. *Statistics & Probability Letters*, 33(3), 291-297. `https://doi.org/10.1016/S0167-7152(96)00140-X `_. diff --git a/_build/html/v0.0.9/_static/_sphinx_javascript_frameworks_compat.js b/_build/html/v0.0.9/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/_build/html/v0.0.9/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * 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/_build/html/v0.0.9/_static/basic.css b/_build/html/v0.0.9/_static/basic.css new file mode 100644 index 000000000..7ebbd6d07 --- /dev/null +++ b/_build/html/v0.0.9/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- 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: 230px; + 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-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +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; +} + +a:visited { + color: #551A8B; +} + +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; +} + +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; +} + +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 > 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; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +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; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- 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/_build/html/v0.0.9/_static/check-solid.svg b/_build/html/v0.0.9/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_build/html/v0.0.9/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_build/html/v0.0.9/_static/clipboard.min.js b/_build/html/v0.0.9/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_build/html/v0.0.9/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * 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/_build/html/v0.0.9/_static/copybutton.css b/_build/html/v0.0.9/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_build/html/v0.0.9/_static/copybutton.css @@ -0,0 +1,94 @@ +/* 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/_build/html/v0.0.9/_static/copybutton.js b/_build/html/v0.0.9/_static/copybutton.js new file mode 100644 index 000000000..0ea5f6c60 --- /dev/null +++ b/_build/html/v0.0.9/_static/copybutton.js @@ -0,0 +1,248 @@ +// 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, '>|\\$ ', true, 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/_build/html/v0.0.9/_static/copybutton_funcs.js b/_build/html/v0.0.9/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_build/html/v0.0.9/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +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/_build/html/v0.0.9/_static/css/badge_only.css b/_build/html/v0.0.9/_static/css/badge_only.css new file mode 100644 index 000000000..88ba55b96 --- /dev/null +++ b/_build/html/v0.0.9/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Bold.woff b/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Regular.woff b/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.eot b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.svg b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.ttf b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.woff b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.woff2 b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_build/html/v0.0.9/_static/css/fonts/lato-bold-italic.woff b/_build/html/v0.0.9/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_build/html/v0.0.9/_static/css/fonts/lato-bold-italic.woff2 b/_build/html/v0.0.9/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_build/html/v0.0.9/_static/css/fonts/lato-bold.woff b/_build/html/v0.0.9/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/lato-bold.woff differ diff --git a/_build/html/v0.0.9/_static/css/fonts/lato-bold.woff2 b/_build/html/v0.0.9/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/lato-bold.woff2 differ diff --git a/_build/html/v0.0.9/_static/css/fonts/lato-normal-italic.woff b/_build/html/v0.0.9/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_build/html/v0.0.9/_static/css/fonts/lato-normal-italic.woff2 b/_build/html/v0.0.9/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_build/html/v0.0.9/_static/css/fonts/lato-normal.woff b/_build/html/v0.0.9/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/lato-normal.woff differ diff --git a/_build/html/v0.0.9/_static/css/fonts/lato-normal.woff2 b/_build/html/v0.0.9/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.9/_static/css/fonts/lato-normal.woff2 differ diff --git a/_build/html/v0.0.9/_static/css/theme.css b/_build/html/v0.0.9/_static/css/theme.css new file mode 100644 index 000000000..0f14f1064 --- /dev/null +++ b/_build/html/v0.0.9/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_build/html/v0.0.9/_static/doctools.js b/_build/html/v0.0.9/_static/doctools.js new file mode 100644 index 000000000..0398ebb9f --- /dev/null +++ b/_build/html/v0.0.9/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + 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; + }, + + /** + * 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; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + 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; + } + } + + // 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/_build/html/v0.0.9/_static/documentation_options.js b/_build/html/v0.0.9/_static/documentation_options.js new file mode 100644 index 000000000..ed7cf3c4f --- /dev/null +++ b/_build/html/v0.0.9/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.0.9', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_build/html/v0.0.9/_static/file.png b/_build/html/v0.0.9/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_build/html/v0.0.9/_static/file.png differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.eot b/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.eot differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.ttf b/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.ttf differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.woff b/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.woff differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.woff2 b/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.eot b/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.ttf b/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff b/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff2 b/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.eot b/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.eot differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.ttf b/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.ttf differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.woff b/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.woff differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.woff2 b/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.eot b/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.eot differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.ttf b/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.ttf differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.woff b/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.woff differ diff --git a/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.woff2 b/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/_build/html/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/_build/html/v0.0.9/_static/jquery.js b/_build/html/v0.0.9/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/_build/html/v0.0.9/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/_build/html/v0.0.9/_static/language_data.js b/_build/html/v0.0.9/_static/language_data.js new file mode 100644 index 000000000..c7fe6c6fa --- /dev/null +++ b/_build/html/v0.0.9/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_build/html/v0.0.9/_static/minus.png b/_build/html/v0.0.9/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/_build/html/v0.0.9/_static/minus.png differ diff --git a/_build/html/v0.0.9/_static/plus.png b/_build/html/v0.0.9/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/_build/html/v0.0.9/_static/plus.png differ diff --git a/_build/html/v0.0.9/_static/pygments.css b/_build/html/v0.0.9/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/_build/html/v0.0.9/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_build/html/v0.0.9/_static/searchtools.js b/_build/html/v0.0.9/_static/searchtools.js new file mode 100644 index 000000000..2c774d17a --- /dev/null +++ b/_build/html/v0.0.9/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_build/html/v0.0.9/_static/sphinx_highlight.js b/_build/html/v0.0.9/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/_build/html/v0.0.9/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * 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))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + 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 SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + 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")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_build/html/v0.0.9/acknowledgements.html b/_build/html/v0.0.9/acknowledgements.html new file mode 100644 index 000000000..48a4b6cbf --- /dev/null +++ b/_build/html/v0.0.9/acknowledgements.html @@ -0,0 +1,144 @@ + + + + + + + + + Acknowledgements — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Acknowledgements

+

We would like to express our deepest gratitude to Dr. Ebrahim Tarshizi, our mentor during our time in the University of San Diego M.S. Applied Data Science Program. His unwavering dedication and mentorship played a pivotal role in our academic journey, guiding us to successfully graduate from the program and pursue successful careers as data scientists.

+

We also extend our thanks to the Shiley-Marcos School of Engineering at the University of San Diego for providing an exceptional learning environment and supporting our educational endeavors.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/changelog.html b/_build/html/v0.0.9/changelog.html new file mode 100644 index 000000000..6d6aa4538 --- /dev/null +++ b/_build/html/v0.0.9/changelog.html @@ -0,0 +1,727 @@ + + + + + + + + + Changelog — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Changelog

+
+

Version 0.0.9

+

Bug Fixes and Minor Improvements

+

Improved error messages and validation checks across multiple functions to prevent common pitfalls and ensure smoother user experience.

+

Visualization Enhancements

+

DataFrame Columns: Added a background_color variable to dataframe_columns`, +allowing the user to enter a string representing a color name, or hex value. +Try/Except on the output, in case the end user has a deprecated version of Pandas, +where the styler would use hide() instead of hide_index(). The highlighted +columns allow for easier null versus unique value analysis.

+

The docstring now clearly describes the purpose of the function—analyzing +DataFrame columns to provide summary statistics.

+

Args:

+
    +
  • The df argument is specified as a pandas.DataFrame.

  • +
  • The background_color argument is marked as optional, with a brief description of its role.

  • +
  • The return_df argument is also marked as optional, explaining what it controls.

  • +
+

Returns: The return type is specified as pandas.DataFrame, with a clear explanation of the difference based on the return_df flag.

+

KDE Distribution Plots: Improved kde_distributions() with enhanced options for log scaling, mean/median plotting, custom standard deviation lines, and better handling of legends and scientific notation.

+

Scatter Plots: Enhanced scatter_fit_plot() with support for hue-based coloring, best fit lines, correlation display, and flexible grid plotting options.

+
+
+

Version 0.0.8

+

stacked_crosstab_plot

+
    +
  • Flexible `save_formats` Input: +- save_formats now accepts a string, tuple, or list for specifying formats (e.g., “png”, (“png”, “svg”), or [“png”, “svg”]). +- Single strings or tuples are automatically converted to lists for consistent processing.

  • +
  • Dynamic Error Handling: +- Added checks to ensure a valid path is provided for each format in save_formats. +- Raises a ValueError if a format is specified without a corresponding path, with a clear, dynamic error message.

  • +
  • Improved Plot Saving Logic: +- Updated logic allows saving plots in one format (e.g., only “png” or “svg”) without requiring the other. +- Simplified and more intuitive path handling for saving plots.

  • +
+

plot_3d_pdp

+

This update introduces several key changes to the plot_3d_pdp function, simplifying the function’s interface and improving usability, while maintaining the flexibility needed for diverse visualization needs.

+

1. Parameter Changes

+
    +
  • Removed Parameters:

    +
      +
    • The parameters x_label_plotly, y_label_plotly, and z_label_plotly have been removed. These parameters previously allowed custom axis labels specifically for the Plotly plot, defaulting to the general x_label, y_label, and z_label. Removing these parameters simplifies the function signature while maintaining flexibility.

    • +
    +
  • +
  • Default Values for Labels:

    +
      +
    • The parameters x_label, y_label, and z_label are now optional, with None as the default. If not provided, these labels will automatically default to the names of the features in the feature_names_list. This change makes the function more user-friendly, particularly for cases where default labels are sufficient.

    • +
    +
  • +
  • Changes in Default Values for View Angles:

    +
      +
    • The default values for camera positioning parameters have been updated: horizontal is now -1.25, depth is now 1.25, and vertical is now 1.25. These adjustments refine the default 3D view perspective for the Plotly plot, providing a more intuitive starting view.

    • +
    +
  • +
+

2. Plot Generation Logic

+
    +
  • Conditionally Checking Labels:

    +
      +
    • The function now checks whether x_label, y_label, and z_label are provided. If these are None, the function will automatically assign default labels based on the feature_names_list. This enhancement reduces the need for users to manually specify labels, making the function more adaptive.

    • +
    +
  • +
  • Camera Position Adjustments:

    +
      +
    • The camera positions for the Plotly plot are now adjusted by multiplying horizontal, depth, and vertical by zoom_out_factor. This change allows for more granular control over the 3D view, enhancing the interactivity and flexibility of the Plotly visualizations.

    • +
    +
  • +
  • Surface Plot Coordinates Adjustments:

    +
      +
    • The order of the coordinates for the Plotly plot’s surface has been changed from ZZ, XX, YY[::-1] to ZZ, XX, YY. This adjustment ensures the proper alignment of axes and grids, resulting in more accurate visual representations.

    • +
    +
  • +
+

3. Code Simplifications

+
    +
  • Removed Complexity:

    +
      +
    • By removing the x_label_plotly, y_label_plotly, and z_label_plotly parameters, the code is now simpler and easier to maintain. This change reduces potential confusion and streamlines the function for users who do not need distinct labels for Matplotlib and Plotly plots.

    • +
    +
  • +
  • Fallback Mechanism for Grid Values:

    +
      +
    • The function continues to implement a fallback mechanism when extracting grid values, ensuring compatibility with various versions of scikit-learn. This makes the function robust across different environments.

    • +
    +
  • +
+

4. Style Adjustments

+
    +
  • Label Formatting:

    +
      +
    • The new version consistently uses y_label, x_label, and z_label for axis labels in the Matplotlib plot, aligning the formatting across different plot types.

    • +
    +
  • +
  • Color Bar Adjustments:

    +
      +
    • The color bar configuration in the Matplotlib plot has been slightly adjusted with a shrink value of 0.6 and a pad value of 0.02. These adjustments result in a more refined visual appearance, particularly in cases where space is limited.

    • +
    +
  • +
+

5. Potential Use Case Differences

+
    +
  • Simplified Interface:

    +
      +
    • The updated function is more streamlined for users who prefer a simplified interface without the need for separate label customizations for Plotly and Matplotlib plots. This makes it easier to use in common scenarios.

    • +
    +
  • +
  • Less Granular Control:

    +
      +
    • Users who need more granular control, particularly for presentations or specific formatting, may find the older version more suitable. The removal of the *_plotly label parameters means that all plots now use the same labels across Matplotlib and Plotly.

    • +
    +
  • +
+

6. Matplotlib Plot Adjustments

+
    +
  • Wireframe and Surface Plot Enhancements:

    +
      +
    • The logic for plotting wireframes and surface plots in Matplotlib remains consistent with previous versions, with subtle enhancements to color and layout management to improve overall aesthetics.

    • +
    +
  • +
+

Summary

+
    +
  • Version 0.0.8d of the plot_3d_pdp function introduces simplifications that reduce the number of parameters and streamline the plotting process. While some customizability has been removed, the function remains flexible enough for most use cases and is easier to use.

  • +
  • Key updates include adjusted default camera views for 3D plots, removal of Plotly-specific label parameters, and improved automatic labeling and plotting logic.

  • +
+

Decision Point

+
    +
  • This update may be especially useful for users who prefer a cleaner and more straightforward interface. However, those requiring detailed customizations may want to continue using the older version, depending on their specific needs.

  • +
+
+
+

Version 0.0.8c

+

Version 0.0.8c is a follow-up release to version 0.0.8b. This update includes minor enhancements and refinements based on feedback and additional testing. It serves as an incremental step towards improving the stability and functionality of the toolkit.

+

Key Updates in 0.0.8c:

+
    +
  • Bug Fixes: Addressed minor issues identified in version 0.0.8b to ensure smoother performance and better user experience.

  • +
  • Additional Testing: Incorporated further tests to validate the changes introduced in previous versions and to prepare for future stable releases.

  • +
  • Refinements: Made small enhancements to existing features based on user feedback and internal testing results.

  • +
+

Summary of Changes

+
    +
  1. New Features & Enhancements

  2. +
+
    +
  • plot_3d_pdp Function:

    +
      +
    • Added show_modebar Parameter: Introduced a new boolean parameter, show_modebar, to allow users to toggle the visibility of the mode bar in Plotly interactive plots.

    • +
    • Custom Margins and Layout Adjustments:

      +
        +
      • Added parameters for left_margin, right_margin, and top_margin to provide users with more control over the plot layout in Plotly.

      • +
      • Adjusted default values and added options for better customization of the Plotly color bar (cbar_x, cbar_thickness) and title positioning (title_x, title_y).

      • +
      +
    • +
    • Plotly Configuration:

      +
        +
      • Enhanced the configuration options to allow users to enable or disable zoom functionality (enable_zoom) in the interactive Plotly plots.

      • +
      • Updated the code to reflect these new parameters, allowing for greater flexibility in the appearance and interaction with the Plotly plots.

      • +
      +
    • +
    • Error Handling:

      +
        +
      • Added input validation for html_file_path and html_file_name to ensure these are provided when necessary based on the selected plot_type.

      • +
      +
    • +
    +
  • +
  • plot_2d_pdp Function:

    +
      +
    • Introduced file_prefix Parameter:

      +
        +
      • Added a new file_prefix parameter to allow users to specify a prefix for filenames when saving grid plots. This change streamlines the naming process for saved plots and improves file organization.

      • +
      +
    • +
    • Enhanced Plot Type Flexibility:

      +
        +
      • The plot_type parameter now includes an option to generate both grid and individual plots (both). This feature allows users to create a combination of both layout styles in one function call.

      • +
      • Updated input validation and logic to handle this new option effectively.

      • +
      +
    • +
    • Added save_plots Parameter:

      +
        +
      • Introduced a new parameter, save_plots, to control the saving of plots. Users can specify whether to save all plots, only individual plots, only grid plots, or none.

      • +
      +
    • +
    • Custom Margins and Layout Adjustments:

      +
        +
      • Included the save_plots parameter in the validation process to ensure paths are provided when needed for saving the plots.

      • +
      +
    • +
    +
  • +
+
    +
  1. Documentation Updates

  2. +
+
    +
  • Docstrings:

    +
      +
    • Updated docstrings for both functions to reflect the new parameters and enhancements, providing clearer and more comprehensive guidance for users.

    • +
    • Detailed the use of new parameters such as show_modebar, file_prefix, save_plots, and others, ensuring that the function documentation is up-to-date with the latest changes.

    • +
    +
  • +
+
    +
  1. Refactoring & Code Cleanup

  2. +
+
    +
  • Code Structure:

    +
      +
    • Improved the code structure to maintain clarity and readability, particularly around the new functionality.

    • +
    • Consolidated the layout configuration settings for the Plotly plots into a more flexible and user-friendly format, making it easier for users to customize their plots.

    • +
    +
  • +
+
+
+

Version 0.0.8b

+

Version 0.0.8b is an exact replica of version 0.0.8a. The purpose of this +beta release was to test whether releasing it as the latest version would update +its status on PyPI to reflect it as the latest release. However, it continues to +be identified as a pre-release on PyPI.

+
+
+

Version 0.0.8a

+

Version 0.0.8a introduces significant enhancements and new features to improve +the usability and functionality of the EDA Toolkit.

+

New Features:

+
    +
  1. Optional file_prefix in stacked_crosstab_plot Function

    +
      +
    • The stacked_crosstab_plot function has been updated to make the file_prefix argument optional. If the user does not provide a file_prefix, the function will now automatically generate a default prefix based on the col and func_col parameters. This change streamlines the process of generating plots by reducing the number of required arguments.

    • +
    • Key Improvement:

      +
        +
      • Users can now omit the file_prefix argument, and the function will still produce appropriately named plot files, enhancing ease of use.

      • +
      • Backward compatibility is maintained, allowing users who prefer to specify a custom file_prefix to continue doing so without any issues.

      • +
      +
    • +
    +
  2. +
  3. Introduction of 3D and 2D Partial Dependence Plot Functions

    +
      +
    • Two new functions, plot_3d_pdp and plot_2d_pdp, have been added to the toolkit, expanding the visualization capabilities for machine learning models.

      +
        +
      • plot_3d_pdp: Generates 3D partial dependence plots for two features, supporting both static visualizations (using Matplotlib) and interactive plots (using Plotly). The function offers extensive customization options, including labels, color maps, and saving formats.

      • +
      • plot_2d_pdp: Creates 2D partial dependence plots for specified features with flexible layout options (grid or individual plots) and customization of figure size, font size, and saving formats.

      • +
      +
    • +
    • Key Features:

      +
        +
      • Compatibility: Both functions are compatible with various versions of scikit-learn, ensuring broad usability.

      • +
      • Customization: Extensive options for customizing visual elements, including figure size, font size, and color maps.

      • +
      • Interactive 3D Plots: The plot_3d_pdp function supports interactive visualizations, providing an enhanced user experience for exploring model predictions in 3D space.

      • +
      +
    • +
    +
  4. +
+

Impact:

+
    +
  • These updates improve the user experience by reducing the complexity of function calls and introducing powerful new tools for model interpretation.

  • +
  • The optional file_prefix enhancement simplifies plot generation while maintaining the flexibility to define custom filenames.

  • +
  • The new partial dependence plot functions offer robust visualization options, making it easier to analyze and interpret the influence of specific features in machine learning models.

  • +
+
+
+

Version 0.0.7

+

Added Function for Customizable Correlation Matrix Visualization

+

This release introduces a new function, flex_corr_matrix, which allows users to +generate both full and upper triangular correlation heatmaps with a high degree +of customization. The function includes options to annotate the heatmap, save the +plots, and pass additional parameters to seaborn.heatmap().

+

Summary of Changes

+
    +
  • New Function: flex_corr_matrix.

    +
      +
    • Functionality: +- Generates a correlation heatmap for a given DataFrame. +- Supports both full and upper triangular correlation matrices based on the triangular parameter. +- Allows users to customize various aspects of the plot, including colormap, figure size, axis label rotation, and more. +- Accepts additional keyword arguments via **kwargs to pass directly to seaborn.heatmap(). +- Includes validation to ensure the triangular, annot, and save_plots parameters are boolean values. +- Raises an exception if save_plots=True but neither image_path_png nor image_path_svg is specified.

    • +
    +
  • +
+

Usage

+
# Full correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=False, cmap="coolwarm", annot=True)
+
+# Upper triangular correlation matrix example
+flex_corr_matrix(df=my_dataframe, triangular=True, cmap="coolwarm", annot=True)
+
+
+

Contingency table df to object type

+

Convert all columns in the DataFrame to object type to prevent issues with numerical columns.

+
df = df.astype(str).fillna("")
+
+
+
+
+

Version 0.0.6

+

Added validation for Plot Type Parameter in KDE Distributions Function

+

This release adds a validation step for the plot_type parameter in the kde_distributions function. The allowed values for plot_type are "hist", "kde", and "both". If an invalid value is provided, the function will now raise a ValueError with a clear message indicating the accepted values. This change improves the robustness of the function and helps prevent potential errors due to incorrect parameter values.

+
# Validate plot_type parameter
+valid_plot_types = ["hist", "kde", "both"]
+if plot_type.lower() not in valid_plot_types:
+    raise ValueError(
+        f"Invalid plot_type value. Expected one of {valid_plot_types}, "
+        f"got '{plot_type}' instead."
+    )
+
+
+
+
+

Version 0.0.5

+

Ensure Consistent Font Size and Text Wrapping Across Plot Elements

+

This PR addresses inconsistencies in font sizes and text wrapping across various plot elements in the stacked_crosstab_plot function. The following updates have been implemented to ensure uniformity and improve the readability of plots:

+
    +
  1. Title Font Size and Text Wrapping: +- Added a text_wrap parameter to control the wrapping of plot titles. +- Ensured that title font sizes are consistent with axis label font sizes by explicitly setting the font size using ax.set_title() after plot generation.

  2. +
  3. Legend Font Size Consistency: +- Incorporated label_fontsize into the legend font size by directly setting the font size of the legend text using plt.setp(legend.get_texts(), fontsize=label_fontsize). +- This ensures that the legend labels are consistent with the title and axis labels.

  4. +
+

Testing

+
    +
  • Verified that titles now wrap correctly and match the specified label_fontsize.

  • +
  • Confirmed that legend text scales according to label_fontsize, ensuring consistent font sizes across all plot elements.

  • +
+
+
+

Version 0.0.4

+
    +
  • Stable release

    +
      +
    • No new updates to the codebase.

    • +
    • Updated the project description variable in setup.py to re-emphasize key elements of the library.

    • +
    • Minor README cleanup:

      +
        +
      • Added icons for sections that did not have them.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.3

+
    +
  • Stable release

    +
      +
    • Updated logo size, fixed citation title, and made minor README cleanup:

      +
        +
      • Added an additional section for documentation, cleaned up verbiage, moved acknowledgments section before licensing and support.

      • +
      +
    • +
    +
  • +
+
+
+

Version 0.0.2

+
    +
  • +
    First stable release
      +
    • No new updates to the codebase; minimal documentation updates to README and setup.py files.

    • +
    • Added logo, badges, and Zenodo-certified citation to README.

    • +
    +
    +
    +
  • +
+
+
+

Version 0.0.1rc0

+
    +
  • No new updates to the codebase; minimal documentation updates to README and setup.py files.

  • +
+
+
+

Version 0.0.1b0

+

New Scatter Fit Plot and Additional Updates

+
    +
  • Added new scatter_fit_plot(), removed unused data_types(), and added comment section headers.

  • +
+

Added xlim and ylim Inputs to KDE Distribution

+
    +
  • kde_distribution():

    +
    +
      +
    • Added xlim and ylim inputs to allow users to customize axes limits in kde_distribution().

    • +
    +
    +
  • +
+

Added xlim and ylim Params to Stacked Crosstab Plot

+
    +
  • stacked_crosstab_plot():

    +
    +
      +
    • Added xlim and ylim input parameters to stacked_crosstab_plot() to give users more flexibility in controlling axes limits.

    • +
    +
    +
  • +
+

Added x and y Limits to Box and Violin Plots

+
    +
  • box_violin_plot():

    +
    +
      +
    • Changed function name from metrics_box_violin() to box_violin_plot().

    • +
    • Added xlim and ylim inputs to control x and y-axis limits of box_violin_plot() (formerly metrics_box_violin).

    • +
    +
    +
  • +
+

Added Ability to Remove Stacks from Plots, Plot All or One at a Time

+

Key Changes

+
    +
  1. Plot Type Parameter +- plot_type: This parameter allows the user to choose between "regular", "normalized", or "both" plot types.

  2. +
  3. Remove Stacks Parameter +- remove_stacks: This parameter, when set to True, generates a regular bar plot using only the col parameter instead of a stacked bar plot. It only works when plot_type is set to “regular”. If remove_stacks is set to True while plot_type is anything other than “regular”, the function will raise an exception.

  4. +
+

Explanation of Changes

+
    +
  • Plot Type Parameter

    +
      +
    • Provides flexibility to the user, allowing specification of the type of plot to generate:

      +
        +
      • "regular": Standard bar plot.

      • +
      • "normalized": Normalized bar plot.

      • +
      • "both": Both regular and normalized bar plots.

      • +
      +
    • +
    +
  • +
  • Remove Stacks Parameter +- remove_stacks: Generates a regular bar plot using only the col parameter, removing the stacking of the bars. Applicable only when plot_type is set to “regular”. An exception is raised if used with any other plot_type.

  • +
+

These changes enhance the flexibility and functionality of the stacked_crosstab_plot function, allowing for more customizable and specific plot generation based on user requirements.

+
+
+

Version 0.0.1b0

+

Refined KDE Distributions

+

Key Changes

+
    +
  1. Alpha Transparency for Histogram Fill +- Added a fill_alpha parameter to control the transparency of the histogram bars’ fill color. +- Default value is 0.6. An exception is raised if fill=False and fill_alpha is specified.

  2. +
  3. Custom Font Sizes +- Introduced label_fontsize and tick_fontsize parameters to control font size of axis labels and tick marks independently.

  4. +
  5. Scientific Notation Toggle +- Added a disable_sci_notation parameter to enable or disable scientific notation on axes.

  6. +
  7. Improved Error Handling +- Added validation for the stat parameter to ensure valid options are accepted. +- Added checks for proper usage of fill_alpha and hist_edgecolor when fill is set to False.

  8. +
  9. General Enhancements +- Updated the function’s docstring to reflect new parameters and provide comprehensive guidance on usage.

  10. +
+
+
+

Version 0.0.1b0

+

Enhanced KDE Distributions Function

+

Added Parameters

+
    +
  1. Grid Figsize and Single Figsize +- Control the size of the overall grid figure and individual figures separately.

  2. +
  3. Hist Color and KDE Color` +- Allow customization of histogram and KDE plot colors.

  4. +
  5. Edge Color +- Allows customization of histogram bar edges.

  6. +
  7. Hue +- Allows grouping data by a column.

  8. +
  9. Fill +- Controls whether to fill histogram bars with color.

  10. +
  11. Y-axis Label` +- Customizable y-axis label.

  12. +
  13. Log-Scaling +- Specifies which variables to apply log scale.

  14. +
  15. Bins and Bin Width +- Control the number and width of bins.

  16. +
  17. ``stat``: +- Allows different statistics for the histogram (count, density, frequency, probability, proportion, percent).

  18. +
+

Improvements

+
    +
  1. Validation and Error Handling +- Checks for invalid log_scale_vars and throws a ValueError if any are found. +- Throws a ValueError if edgecolor is changed while fill is set to False. +- Issues a PerformanceWarning if both bins and binwidth are specified, warning of potential performance impacts.

  2. +
  3. Customizable Y-Axis Label +- Allows users to specify custom y-axis labels.

  4. +
  5. Warning for KDE with Count +- Issues a warning if KDE is used with stat='count', as it may produce misleading plots.

  6. +
+

Updated Function to Ensure Unique IDs and Index Check

+
    +
  • Ensured that each generated ID in add_ids starts with a non-zero digit.

  • +
  • Added a check to verify that the DataFrame index is unique.

  • +
  • Printed a warning message if duplicate index entries are found.

  • +
+

These changes improve the robustness of the function, ensuring that the IDs generated are always unique and valid, and provide necessary feedback when the DataFrame index is not unique.

+

Check for Unique Indices +- Before generating IDs, the function now checks if the DataFrame index is unique. +- If duplicates are found, a warning is printed along with the list of duplicate index entries.

+

Generate Non-Zero Starting IDs

+
    +
  • The ID generation process is updated to ensure that the first digit of each ID is always non-zero.

  • +
+

Ensure Unique IDs

+
    +
  • A set is used to store the generated IDs, ensuring all IDs are unique before adding them to the DataFrame.

  • +
+

Fix Int Conversion for Numeric Columns, Reset Decimal Places

+
    +
  • Fixed integer conversion issue for numeric columns when decimal_places=0 in the save_dataframes_to_excel function.

  • +
  • Reset decimal_places default value to 0.

  • +
+

These changes ensure correct formatting and avoid errors during conversion.

+

Contingency Table Updates

+
    +
  1. Error Handling for Columns +- Added a check to ensure at least one column is specified. +- Updated the function to accept a single column as a string or multiple columns as a list. +- Raised a ValueError if no columns are provided or if cols is not correctly specified.

  2. +
  3. Function Parameters +- Changed parameters from col1 and col2 to a single parameter cols which can be either a string or a list.

  4. +
  5. Error Handling +- Renamed SortBy to sort_by to standardize nomenclature. +- Added a check to ensure sort_by is either 0 or 1. +- Raised a ValueError if sort_by is not 0 or 1.

  6. +
+
    +
  1. Sorting Logic +- Updated the sorting logic to handle the new cols parameter structure.

  2. +
  3. Handling Categorical Data +- Modified code to convert categorical columns to strings to avoid issues with fillna("").

  4. +
  5. Handling Missing Values +- Added df = df.fillna('') to fill NA values within the function to account for missing data.

  6. +
  7. Improved Function Documentation +- Updated function documentation to reflect new parameters and error handling.

  8. +
+
+
+

Version 0.0.1b0

+

Contingency Table Updates

+
    +
  • fillna('') added to output so that null values come through, removed 'All' column name from output, sort options 0 and 1, updated docstring documentation. Tested successfully on Python 3.7.3.

  • +
+

Compatibility Enhancement

+
    +
  1. Added a version check for Python 3.7 and above.

    +
      +
    • Conditional import of datetime to handle different Python versions.

    • +
    +
  2. +
+
if sys.version_info >= (3, 7):
+    from datetime import datetime
+else:
+    import datetime
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/citations.html b/_build/html/v0.0.9/citations.html new file mode 100644 index 000000000..479c5e166 --- /dev/null +++ b/_build/html/v0.0.9/citations.html @@ -0,0 +1,156 @@ + + + + + + + + + Citing EDA Toolkit — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Citing EDA Toolkit

+

Shpaner, L., & Gil, O. (2024). EDA Toolkit (0.0.9). Zenodo. https://doi.org/10.5281/zenodo.13163208

+
@software{shpaner_2024_13162633,
+author       = {Shpaner, Leonid and
+                Gil, Oscar},
+title        = {EDA Toolkit},
+month        = aug,
+year         = 2024,
+publisher    = {Zenodo},
+version      = {0.0.9},
+doi          = {10.5281/zenodo.13162633},
+url          = {https://doi.org/10.5281/zenodo.13162633}
+}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/contributors.html b/_build/html/v0.0.9/contributors.html new file mode 100644 index 000000000..03136a13f --- /dev/null +++ b/_build/html/v0.0.9/contributors.html @@ -0,0 +1,148 @@ + + + + + + + + + Contributors/Maintainers — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Contributors/Maintainers

+
https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg + +

Leonid Shpaner is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego’s M.S. Applied Artificial Intelligence program.

+


https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg + +

Oscar Gil is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/data_management.html b/_build/html/v0.0.9/data_management.html new file mode 100644 index 000000000..4e61e7ac3 --- /dev/null +++ b/_build/html/v0.0.9/data_management.html @@ -0,0 +1,1474 @@ + + + + + + + + + Data Management Overview — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Data Management Overview

+

In any data-driven project, effective management of data is crucial. This +section provides essential techniques for handling and preparing data to ensure +consistency, accuracy, and ease of analysis. From directory setup and data +cleaning to advanced data processing, these methods form the backbone of reliable +data management. Dive into the following topics to enhance your data handling +capabilities and streamline your workflow.

+
+
+

Data Management Techniques

+
+

Path directories

+

Ensure that the directory exists. If not, create it.

+
+
+ensure_directory(path)
+
+
Parameters:
+

path (str) – The path to the directory that needs to be ensured.

+
+
Returns:
+

None

+
+
+
+ +

The ensure_directory function is a utility designed to facilitate the +management of directory paths within your project. When working with data +science projects, it is common to save and load data, images, and other +artifacts from specific directories. This function helps in making sure that +these directories exist before any read/write operations are performed. If +the specified directory does not exist, the function creates it. If it +already exists, it does nothing, thus preventing any errors related to +missing directories.

+

Example Usage

+

In the example below, we demonstrate how to use the ensure_directory function +to verify and create directories as needed. This example sets up paths for data and +image directories, ensuring they exist before performing any operations that depend on them.

+

First, we define the base path as the parent directory of the current directory. +The os.pardir constant, equivalent to ".."", is used to navigate up one +directory level. Then, we define paths for the data directory and data output +directory, both located one level up from the current directory.

+

Next, we set paths for the PNG and SVG image directories, located within an +images folder in the parent directory. Using the ensure_directory +function, we then verify that these directories exist. If any of the specified +directories do not exist, the function creates them.

+
from eda_toolkit import ensure_directory
+
+import os # import operating system for dir
+
+
+base_path = os.path.join(os.pardir)
+
+# Go up one level from 'notebooks' to parent directory,
+# then into the 'data' folder
+data_path = os.path.join(os.pardir, "data")
+data_output = os.path.join(os.pardir, "data_output")
+
+# create image paths
+image_path_png = os.path.join(base_path, "images", "png_images")
+image_path_svg = os.path.join(base_path, "images", "svg_images")
+
+# Use the function to ensure'data' directory exists
+ensure_directory(data_path)
+ensure_directory(data_output)
+ensure_directory(image_path_png)
+ensure_directory(image_path_svg)
+
+
+

Output

+
Created directory: ../data
+Created directory: ../data_output
+Created directory: ../images/png_images
+Created directory: ../images/svg_images
+
+
+
+
+

Adding Unique Identifiers

+

Add a column of unique IDs with a specified number of digits to the dataframe.

+
+
+add_ids(df, id_colname='ID', num_digits=9, seed=None, set_as_index=True)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The dataframe to add IDs to.

  • +
  • id_colname (str, optional) – The name of the new column for the IDs. Defaults to "ID".

  • +
  • num_digits (int, optional) – The number of digits for the unique IDs. Defaults to 9.

  • +
  • seed (int, optional) – The seed for the random number generator. Defaults to None.

  • +
  • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

  • +
+
+
Returns:
+

The updated dataframe with the new ID column.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+

Note

+
    +
  • If the dataframe index is not unique, a warning is printed.

  • +
  • +
    The function does not check if the number of rows exceeds the number of

    unique IDs that can be generated with the specified number of digits.

    +
    +
    +
  • +
  • The first digit of the generated IDs is ensured to be non-zero.

  • +
+
+

The add_ids function is used to append a column of unique identifiers with a +specified number of digits to a given dataframe. This is particularly useful for +creating unique patient or record IDs in datasets. The function allows you to +specify a custom column name for the IDs, the number of digits for each ID, and +optionally set a seed for the random number generator to ensure reproducibility. +Additionally, you can choose whether to set the new ID column as the index of the dataframe.

+

Example Usage

+

In the example below, we demonstrate how to use the add_ids function to add a +column of unique IDs to a dataframe. We start by importing the necessary libraries +and creating a sample dataframe. We then use the add_ids function to generate +and append a column of unique IDs with a specified number of digits to the dataframe.

+

First, we import the pandas library and the add_ids function from the eda_toolkit. +Then, we create a sample dataframe with some data. We call the add_ids function, +specifying the dataframe, the column name for the IDs, the number of digits for +each ID, a seed for reproducibility, and whether to set the new ID column as the +index. The function generates unique IDs for each row and adds them as the first +column in the dataframe.

+
from eda_toolkit import add_ids
+
+# Add a column of unique IDs with 9 digits and call it "census_id"
+df = add_ids(
+    df=df,
+    id_colname="census_id",
+    num_digits=9,
+    seed=111,
+    set_as_index=True,
+)
+
+
+

Output

+

First 5 Rows of Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
DataFrame index is unique.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
7413084239State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
9775187550Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
1220284238Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
9607878953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
3513019428Private338409Bachelors13Married-civ-spouseProf-specialtyWife
+

+
+
+

Trailing Period Removal

+

Strip the trailing period from floats in a specified column of a DataFrame, if present.

+
+
+strip_trailing_period(df, column_name)
+
+
Parameters:
+
    +
  • df (pd.DataFrame) – The DataFrame containing the column to be processed.

  • +
  • column_name (str) – The name of the column containing floats with potential trailing periods.

  • +
+
+
Returns:
+

The updated DataFrame with the trailing periods removed from the specified column.

+
+
Return type:
+

pd.DataFrame

+
+
+

The strip_trailing_period function is designed to remove trailing periods +from float values in a specified column of a DataFrame. This can be particularly +useful when dealing with data that has been inconsistently formatted, ensuring +that all float values are correctly represented.

+
+ +

Example Usage

+

In the example below, we demonstrate how to use the strip_trailing_period function to clean a +column in a DataFrame. We start by importing the necessary libraries and creating a sample DataFrame. +We then use the strip_trailing_period function to remove any trailing periods from the specified column.

+
from eda_toolkit import strip_trailing_period
+
+# Create a sample dataframe with trailing periods in some values
+data = {
+    "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.],
+}
+df = pd.DataFrame(data)
+
+# Remove trailing periods from the 'values' column
+df = strip_trailing_period(df=df, column_name="values")
+
+
+

Output

+

First 6 Rows of Data Before and After Removing Trailing Periods (Adapted from Example)

+ + + + + +
+ + Before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.
+ +
+ + After: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexValue
01.0
12.0
23.0
34.0
45.0
56.0
+ +

+

Note: The last row shows 6 as an int with a trailing period with its conversion to float.

+

+
+
+

Standardized Dates

+

Parse and standardize date strings based on the provided rule.

+
+
+parse_date_with_rule(date_str)
+

This function takes a date string and standardizes it to the ISO 8601 format +(YYYY-MM-DD). It assumes dates are provided in either day/month/year or +month/day/year format. The function first checks if the first part of the +date string (day or month) is greater than 12, which unambiguously indicates +a day/month/year format. If the first part is 12 or less, the function +attempts to parse the date as month/day/year, falling back to day/month/year +if the former raises a ValueError due to an impossible date (e.g., month +being greater than 12).

+
+
Parameters:
+

date_str (str) – A date string to be standardized.

+
+
Returns:
+

A standardized date string in the format YYYY-MM-DD.

+
+
Return type:
+

str

+
+
Raises:
+

ValueError – If date_str is in an unrecognized format or if the function +cannot parse the date.

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the parse_date_with_rule +function to standardize date strings. We start by importing the necessary library +and creating a sample list of date strings. We then use the parse_date_with_rule +function to parse and standardize each date string to the ISO 8601 format.

+
from eda_toolkit import parse_date_with_rule
+
+# Sample date strings
+date_strings = ["15/04/2021", "04/15/2021", "01/12/2020", "12/01/2020"]
+
+# Standardize the date strings
+standardized_dates = [parse_date_with_rule(date) for date in date_strings]
+
+print(standardized_dates)
+
+
+

Output

+
['2021-04-15', '2021-04-15', '2020-12-01', '2020-01-12']
+
+
+
+

Important

+

In the next example, we demonstrate how to apply the parse_date_with_rule +function to a DataFrame column containing date strings using the .apply() method. +This is particularly useful when you need to standardize date formats across an +entire column in a DataFrame.

+
+
# Creating the DataFrame
+data = {
+    "date_column": [
+        "31/12/2021",
+        "01/01/2022",
+        "12/31/2021",
+        "13/02/2022",
+        "07/04/2022",
+    ],
+    "name": ["Alice", "Bob", "Charlie", "David", "Eve"],
+    "amount": [100.0, 150.5, 200.75, 250.25, 300.0],
+}
+
+df = pd.DataFrame(data)
+
+# Apply the function to the DataFrame column
+df["standardized_date"] = df["date_column"].apply(parse_date_with_rule)
+
+print(df)
+
+
+

Output

+
   date_column     name  amount standardized_date
+0   31/12/2021    Alice  100.00        2021-12-31
+1   01/01/2022      Bob  150.50        2022-01-01
+2   12/31/2021  Charlie  200.75        2021-12-31
+3   13/02/2022    David  250.25        2022-02-13
+4   07/04/2022      Eve  300.00        2022-04-07
+
+
+
+
+

DataFrame Analysis

+

Analyze DataFrame columns, including dtype, null values, and unique value counts.

+
+
+dataframe_columns(df, background_color=None, return_df=False)
+

Analyze DataFrame columns to provide summary statistics such as data type, +null counts, unique values, and most frequent values.

+

This function analyzes the columns of a DataFrame, providing details about the data type, +the number and percentage of null values, the total number of unique values, and the most +frequent unique value along with its count and percentage. It handles special cases such as +converting date columns and replacing empty strings with Pandas NA values.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • background_color (str, optional) – Hex color code or color name for background styling in the output +DataFrame. Defaults to None.

  • +
  • return_df (bool, optional) – If True, returns the plain DataFrame with the summary statistics. If +False, returns a styled DataFrame for visual presentation. Defaults to False.

  • +
+
+
Returns:
+

If return_df is True, returns the plain DataFrame containing column summary +statistics. If return_df is False, returns a styled DataFrame with optional +background color for specific columns.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

In the example below, we demonstrate how to use the dataframe_columns +function to analyze a DataFrame’s columns.

+
from eda_toolkit import dataframe_columns
+
+dataframe_columns(df=df)
+
+
+

Output

+

Result on Census Income Data (Adapted from Kohavi, 1996, UCI Machine Learning Repository) [1]

+
Shape:  (48842, 16)
+
+Total seconds of processing time: 0.861555
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columndtypenull_totalnull_pctunique_values_totalmax_unique_valuemax_unique_value_totalmax_unique_value_pct
0ageint6400743613482.76
1workclassobject9631.979Private3390669.42
2fnlwgtint640028523203488210.04
3educationobject0016HS-grad1578432.32
4education-numint64001691578432.32
5marital-statusobject007Married-civ-spouse2237945.82
6occupationobject9661.9815Prof-specialty617212.64
7relationshipobject006Husband1971640.37
8raceobject005White4176285.5
9sexobject002Male3265066.85
10capital-gainint640012304480791.74
11capital-lossint64009904656095.33
12hours-per-weekint640096402280346.69
13native-countryobject2740.5642United-States4383289.74
14incomeobject004<=50K2472050.61
15age_groupcategory00918-291392028.5
+

+
+
+

Generating Summary Tables for Variable Combinations

+

This function generates summary tables for all possible combinations of specified variables +in a DataFrame and save them to an Excel file.

+
+
+summarize_all_combinations(df, variables, data_path, data_name, min_length=2)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The pandas DataFrame containing the data.

  • +
  • variables (list of str) – List of column names from the DataFrame to generate combinations.

  • +
  • data_path (str) – Path where the output Excel file will be saved.

  • +
  • data_name (str) – Name of the output Excel file.

  • +
  • min_length (int, optional) – Minimum size of the combinations to generate. Defaults to 2.

  • +
+
+
Returns:
+

A tuple containing a dictionary of summary tables and a list of all generated combinations.

+
+
Return type:
+

tuple(dict, list)

+
+
+
+ +
+

Note

+
    +
  • +
    The function will create an Excel file with a sheet for each combination

    of the specified variables, as well as a “Table of Contents” sheet with +hyperlinks to each summary table.

    +
    +
    +
  • +
  • The sheet names are limited to 31 characters due to Excel’s constraints.

  • +
+
+

The function returns two outputs:

+

1. summary_tables: A dictionary where each key is a tuple representing a combination +of variables, and each value is a DataFrame containing the summary table for that combination. +Each summary table includes the count and proportion of occurrences for each unique combination of values.

+

2. all_combinations: A list of all generated combinations of the specified variables. +This is useful for understanding which combinations were analyzed and included in the summary tables.

+

Example Usage

+

Below, we use the summarize_all_combinations function to generate summary tables for the specified +variables from a DataFrame containing the census data [1].

+
from eda_toolkit import summarize_all_combinations
+
+# Define unique variables for the analysis
+unique_vars = [
+    "age_group",
+    "workclass",
+    "education",
+    "occupation",
+    "race",
+    "sex",
+    "income",
+]
+
+# Generate summary tables for all combinations of the specified variables
+summary_tables, all_combinations = summarize_all_combinations(
+    df=df,
+    data_path=data_output,
+    variables=unique_vars,
+    data_name="census_summary_tables.xlsx",
+)
+
+# Print all combinations of variables
+print(all_combinations)
+
+
+

Output

+
[('age_group', 'workclass'),
+('age_group', 'education'),
+('age_group', 'occupation'),
+('age_group', 'race'),
+('age_group', 'sex'),
+('age_group', 'income'),
+('workclass', 'education'),
+('workclass', 'occupation'),
+('workclass', 'race'),
+('workclass', 'sex'),
+('workclass', 'income'),
+('education', 'occupation'),
+('education', 'race'),
+('education', 'sex'),
+('education', 'income'),
+('occupation', 'race'),
+('occupation', 'sex'),
+('occupation', 'income'),
+('race', 'sex'),
+('race', 'income'),
+('sex', 'income'),
+('age_group', 'workclass', 'education'),
+('age_group', 'workclass', 'occupation'),
+('age_group', 'workclass', 'race'),
+('age_group', 'workclass', 'sex'),
+('age_group', 'workclass', 'income'),
+('age_group', 'education', 'occupation'),
+('age_group', 'education', 'race'),
+('age_group', 'education', 'sex'),
+('age_group', 'education', 'income'),
+('age_group', 'occupation', 'race'),
+('age_group', 'occupation', 'sex'),
+('age_group', 'occupation', 'income'),
+('age_group', 'race', 'sex'),
+('age_group', 'race', 'income'),
+('age_group', 'sex', 'income'),
+('workclass', 'education', 'occupation'),
+('workclass', 'education', 'race'),
+('workclass', 'education', 'sex'),
+('workclass', 'education', 'income'),
+('workclass', 'occupation', 'race'),
+('workclass', 'occupation', 'sex'),
+('workclass', 'occupation', 'income'),
+('workclass', 'race', 'sex'),
+('workclass', 'race', 'income'),
+('workclass', 'sex', 'income'),
+('education', 'occupation', 'race'),
+('education', 'occupation', 'sex'),
+('education', 'occupation', 'income'),
+('education', 'race', 'sex'),
+('education', 'race', 'income'),
+('education', 'sex', 'income'),
+('occupation', 'race', 'sex'),
+('occupation', 'race', 'income'),
+('occupation', 'sex', 'income'),
+('race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation'),
+('age_group', 'workclass', 'education', 'race'),
+('age_group', 'workclass', 'education', 'sex'),
+('age_group', 'workclass', 'education', 'income'),
+('age_group', 'workclass', 'occupation', 'race'),
+('age_group', 'workclass', 'occupation', 'sex'),
+('age_group', 'workclass', 'occupation', 'income'),
+('age_group', 'workclass', 'race', 'sex'),
+('age_group', 'workclass', 'race', 'income'),
+('age_group', 'workclass', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race'),
+('age_group', 'education', 'occupation', 'sex'),
+('age_group', 'education', 'occupation', 'income'),
+('age_group', 'education', 'race', 'sex'),
+('age_group', 'education', 'race', 'income'),
+('age_group', 'education', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex'),
+('age_group', 'occupation', 'race', 'income'),
+('age_group', 'occupation', 'sex', 'income'),
+('age_group', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race'),
+('workclass', 'education', 'occupation', 'sex'),
+('workclass', 'education', 'occupation', 'income'),
+('workclass', 'education', 'race', 'sex'),
+('workclass', 'education', 'race', 'income'),
+('workclass', 'education', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex'),
+('workclass', 'occupation', 'race', 'income'),
+('workclass', 'occupation', 'sex', 'income'),
+('workclass', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex'),
+('education', 'occupation', 'race', 'income'),
+('education', 'occupation', 'sex', 'income'),
+('education', 'race', 'sex', 'income'),
+('occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race'),
+('age_group', 'workclass', 'education', 'occupation', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'race', 'income'),
+('age_group', 'workclass', 'education', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'education', 'occupation', 'race', 'income'),
+('age_group', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'education', 'race', 'sex', 'income'),
+('age_group', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex'),
+('workclass', 'education', 'occupation', 'race', 'income'),
+('workclass', 'education', 'occupation', 'sex', 'income'),
+('workclass', 'education', 'race', 'sex', 'income'),
+('workclass', 'occupation', 'race', 'sex', 'income'),
+('education', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'sex'),
+('age_group', 'workclass', 'education', 'occupation', 'race', 'income'),
+('age_group', 'workclass', 'education', 'occupation', 'sex', 'income'),
+('age_group', 'workclass', 'education', 'race', 'sex', 'income'),
+('age_group', 'workclass', 'occupation', 'race', 'sex', 'income'),
+('age_group', 'education', 'occupation', 'race', 'sex', 'income'),
+('workclass', 'education', 'occupation', 'race', 'sex', 'income'),
+('age_group',
+'workclass',
+'education',
+'occupation',
+'race',
+'sex',
+'income')]
+
+
+

When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. +The first sheet will be a Table of Contents with hyperlinks to each summary table.

+
EDA Toolkit Logo + +
+
+

Saving DataFrames to Excel with Customized Formatting

+

Save multiple DataFrames to separate sheets in an Excel file with customized +formatting.

+

This section explains how to save multiple DataFrames to separate sheets in an Excel file with customized formatting using the save_dataframes_to_excel function.

+
+
+save_dataframes_to_excel(file_path, df_dict, decimal_places=0)
+
+
Parameters:
+
    +
  • file_path (str) – Full path to the output Excel file.

  • +
  • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

  • +
  • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

  • +
+
+
+
+ +
+

Note

+
    +
  • The function will autofit columns and left-align text.

  • +
  • Numeric columns will be formatted with the specified number of decimal places.

  • +
  • Headers will be bold and left-aligned without borders.

  • +
+
+

The function performs the following tasks:

+
    +
  • Writes each DataFrame to its respective sheet in the Excel file.

  • +
  • Rounds numeric columns to the specified number of decimal places.

  • +
  • Applies customized formatting to headers and cells.

  • +
  • Autofits columns based on the content length.

  • +
+

Example Usage

+

Below, we use the save_dataframes_to_excel function to save two DataFrames: +the original DataFrame and a filtered DataFrame with ages between 18 and 40.

+
from eda_toolkit import save_dataframes_to_excel
+
+# Example usage
+file_name = "df_census.xlsx"  # Name of the output Excel file
+file_path = os.path.join(data_path, file_name)
+
+# filter DataFrame to Ages 18-40
+filtered_df = df[(df["age"] > 18) & (df["age"] < 40)]
+
+df_dict = {
+    "original_df": df,
+    "ages_18_to_40": filtered_df,
+}
+
+save_dataframes_to_excel(
+    file_path=file_path,
+    df_dict=df_dict,
+    decimal_places=0,
+)
+
+
+

Output

+

The output Excel file will contain the original DataFrame and a filtered DataFrame as a separate tab with ages +between 18 and 40, each on separate sheets with customized formatting.

+
+
+

Creating Contingency Tables

+

Create a contingency table from one or more columns in a DataFrame, with sorting options.

+

This section explains how to create contingency tables from one or more columns in a DataFrame, with options to sort the results using the contingency_table function.

+
+
+contingency_table(df, cols=None, sort_by=0)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • +
  • cols (str or list of str, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

  • +
  • sort_by (int, optional) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order. Defaults to 0.

  • +
+
+
Raises:
+

ValueError – If no columns are specified or if sort_by is not 0 or 1.

+
+
Returns:
+

A DataFrame containing the contingency table with the specified columns, a 'Total' column representing the count of occurrences, and a 'Percentage' column representing the percentage of the total count.

+
+
Return type:
+

pandas.DataFrame

+
+
+
+ +

Example Usage

+

Below, we use the contingency_table function to create a contingency table +from the specified columns in a DataFrame containing census data [1]

+
from eda_toolkit import contingency_table
+
+# Example usage
+contingency_table(
+    df=df,
+    cols=[
+        "age_group",
+        "workclass",
+        "race",
+        "sex",
+    ],
+    sort_by=1,
+)
+
+
+

Output

+

The output will be a contingency table with the specified columns, showing the +total counts and percentages of occurrences for each combination of values. The +table will be sorted by the 'Total' column in descending order because sort_by +is set to 1.

+
    age_group     workclass                race     sex  Total  Percentage
+0       30-39       Private               White    Male   5856       11.99
+1       18-29       Private               White    Male   5623       11.51
+2       40-49       Private               White    Male   4267        8.74
+3       18-29       Private               White  Female   3680        7.53
+4       50-59       Private               White    Male   2565        5.25
+..        ...           ...                 ...     ...    ...         ...
+467     50-59   Federal-gov               Other    Male      1        0.00
+468     50-59     Local-gov  Asian-Pac-Islander  Female      1        0.00
+469     70-79  Self-emp-inc               Black    Male      1        0.00
+470     80-89     Local-gov  Asian-Pac-Islander    Male      1        0.00
+471                                                      48842      100.00
+
+[472 rows x 6 columns]
+
+
+

+
+
+

Highlighting Specific Columns in a DataFrame

+

This section explains how to highlight specific columns in a DataFrame using the highlight_columns function.

+

Highlight specific columns in a DataFrame with a specified background color.

+
+
+highlight_columns(df, columns, color='yellow')
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame to be styled.

  • +
  • columns (list of str) – List of column names to be highlighted.

  • +
  • color (str, optional) – The background color to be applied for highlighting (default is “yellow”).

  • +
+
+
Returns:
+

A Styler object with the specified columns highlighted.

+
+
Return type:
+

pandas.io.formats.style.Styler

+
+
+
+ +

Example Usage

+

Below, we use the highlight_columns function to highlight the age and education +columns in the first 5 rows of the census [1] DataFrame with a pink background color.

+
from eda_toolkit import highlight_columns
+
+# Applying the highlight function
+highlighted_df = highlight_columns(
+    df=df,
+    columns=["age", "education"],
+    color="#F8C5C8",
+)
+
+highlighted_df
+
+
+

Output

+

The output will be a DataFrame with the specified columns highlighted in the given background color. +The age and education columns will be highlighted in pink.

+

The resulting styled DataFrame can be displayed in a Jupyter Notebook or saved to an +HTML file using the .render() method of the Styler object.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationship
census_id
8294361139State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-family
4264322750Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusband
9383725438Private215646HS-grad9DivorcedHandlers-cleanersNot-in-family
8710422953Private23472111th7Married-civ-spouseHandlers-cleanersHusband
9006986728Private338409Bachelors13Married-civ-spouseProf-specialtyWife

+
+
+

Binning Numerical Columns

+

Binning numerical columns is a technique used to convert continuous numerical +data into discrete categories or “bins.” This is especially useful for simplifying +analysis, creating categorical features from numerical data, or visualizing the +distribution of data within specific ranges. The process of binning involves +dividing a continuous range of values into a series of intervals, or “bins,” and +then assigning each value to one of these intervals.

+
+

Note

+

The code snippets below create age bins and assign a corresponding age group +label to each age in the DataFrame. The pd.cut function from pandas is used to +categorize the ages and assign them to a new column, age_group. Adjust the bins +and labels as needed for your specific data.

+
+

Below, we use the age column of the census data [1] from the UCI Machine Learning Repository as an example:

+
    +
  1. Bins Definition: +The bins are defined by specifying the boundaries of each interval. For example, +in the code snippet below, the bin_ages list specifies the boundaries for age groups:

    +
    bin_ages = [
    +    0,
    +    18,
    +    30,
    +    40,
    +    50,
    +    60,
    +    70,
    +    80,
    +    90,
    +    100,
    +    float("inf"),
    +]
    +
    +
    +

    Each pair of consecutive elements in bin_ages defines a bin. For example:

    +
      +
    • The first bin is [0, 18),

    • +
    • The second bin is [18, 30),

    • +
    • and so on.

    • +
    +
  2. +
+

+
    +
  1. Labels for Bins: +The label_ages list provides labels corresponding to each bin:

    +
    label_ages = [
    +    "< 18",
    +    "18-29",
    +    "30-39",
    +    "40-49",
    +    "50-59",
    +    "60-69",
    +    "70-79",
    +    "80-89",
    +    "90-99",
    +    "100 +",
    +]
    +
    +
    +

    These labels are used to categorize the numerical values into meaningful groups.

    +
  2. +
  3. Applying the Binning: +The pd.cut function +from Pandas is used to apply the binning process. For each value in the age +column of the DataFrame, it assigns a corresponding label based on which bin the +value falls into. Here, right=False indicates that each bin includes the +left endpoint but excludes the right endpoint. For example, if bin_ages = +[0, 10, 20, 30], then a value of 10 will fall into the bin [10, 20) and +be labeled accordingly.

    +
    df["age_group"] = pd.cut(
    +    df["age"],
    +    bins=bin_ages,
    +    labels=label_ages,
    +    right=False,
    +)
    +
    +
    +

    Mathematically, for a given value x in the age column:

    +
    +\[\begin{split}\text{age_group} = +\begin{cases} + < 18 & \text{if } 0 \leq x < 18 \\ + 18-29 & \text{if } 18 \leq x < 30 \\ + \vdots \\ + 100 + & \text{if } x \geq 100 +\end{cases}\end{split}\]
    +

    The parameter right=False in pd.cut means that the bins are left-inclusive +and right-exclusive, except for the last bin, which is always right-inclusive +when the upper bound is infinity (float("inf")).

    +
  4. +
+ +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/eda_plots.html b/_build/html/v0.0.9/eda_plots.html new file mode 100644 index 000000000..fe16e0833 --- /dev/null +++ b/_build/html/v0.0.9/eda_plots.html @@ -0,0 +1,2086 @@ + + + + + + + + + Plotting and Theoretical Overview — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Plotting and Theoretical Overview

+
+

Gaussian Assumption for Normality

+

The Gaussian (normal) distribution is a key assumption in many statistical methods. It is mathematically represented by the probability density function (PDF):

+
+\[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)\]
+

where:

+
    +
  • \(\mu\) is the mean

  • +
  • \(\sigma^2\) is the variance

  • +
+

In a normally distributed dataset:

+
    +
  • 68% of data falls within \(\mu \pm \sigma\)

  • +
  • 95% within \(\mu \pm 2\sigma\)

  • +
  • 99.7% within \(\mu \pm 3\sigma\)

  • +
+
KDE Distributions - KDE (+) Histograms (Density) + +
+

Histograms and Kernel Density Estimation (KDE)

+

Histograms:

+
    +
  • Visualize data distribution by binning values and counting frequencies.

  • +
  • If data is Gaussian, the histogram approximates a bell curve.

  • +
+

KDE:

+
    +
  • A non-parametric way to estimate the PDF by smoothing individual data points with a kernel function.

  • +
  • The KDE for a dataset \(X = \{x_1, x_2, \ldots, x_n\}\) is given by:

  • +
+
+\[\hat{f}(x) = \frac{1}{nh} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right)\]
+

where:

+
    +
  • \(K\) is the kernel function (often Gaussian)

  • +
  • \(h\) is the bandwidth (smoothing parameter)

  • +
+Combined Use of Histograms and KDE

+
    +
  • Histograms offer a discrete, binned view of the data.

  • +
  • KDE provides a smooth, continuous estimate of the underlying distribution.

  • +
  • Together, they effectively illustrate how well the data aligns with the Gaussian assumption, highlighting any deviations from normality.

  • +
+
+
+
+

Pearson Correlation Coefficient

+

The Pearson correlation coefficient, often denoted as \(r\), is a measure of +the linear relationship between two variables. It quantifies the degree to which +a change in one variable is associated with a change in another variable. The +Pearson correlation ranges from \(-1\) to \(1\), where:

+
    +
  • \(r = 1\) indicates a perfect positive linear relationship.

  • +
  • \(r = -1\) indicates a perfect negative linear relationship.

  • +
  • \(r = 0\) indicates no linear relationship.

  • +
+

The Pearson correlation coefficient between two variables \(X\) and \(Y\) is defined as:

+
+\[r_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y}\]
+

where:

+
    +
  • \(\text{Cov}(X, Y)\) is the covariance of \(X\) and \(Y\).

  • +
  • \(\sigma_X\) is the standard deviation of \(X\).

  • +
  • \(\sigma_Y\) is the standard deviation of \(Y\).

  • +
+

Covariance measures how much two variables change together. It is defined as:

+
+\[\text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)\]
+

where:

+
    +
  • \(n\) is the number of data points.

  • +
  • \(X_i\) and \(Y_i\) are the individual data points.

  • +
  • \(\mu_X\) and \(\mu_Y\) are the means of \(X\) and \(Y\).

  • +
+

The standard deviation measures the dispersion or spread of a set of values. For +a variable \(X\), the standard deviation \(\sigma_X\) is:

+
+\[\sigma_X = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (X_i - \mu_X)^2}\]
+

Substituting the covariance and standard deviation into the Pearson correlation formula:

+
+\[r_{XY} = \frac{\sum_{i=1}^{n} (X_i - \mu_X)(Y_i - \mu_Y)}{\sqrt{\sum_{i=1}^{n} (X_i - \mu_X)^2} \sqrt{\sum_{i=1}^{n} (Y_i - \mu_Y)^2}}\]
+

This formula normalizes the covariance by the product of the standard deviations of the two variables, resulting in a dimensionless coefficient that indicates the strength and direction of the linear relationship between \(X\) and \(Y\).

+
    +
  • \(r > 0\): Positive correlation. As \(X\) increases, \(Y\) tends to increase.

  • +
  • \(r < 0\): Negative correlation. As \(X\) increases, \(Y\) tends to decrease.

  • +
  • \(r = 0\): No linear correlation. There is no consistent linear relationship between \(X\) and \(Y\).

  • +
+

The closer the value of \(r\) is to \(\pm 1\), the stronger the linear relationship between the two variables.

+
+
+

Partial Dependence Foundations

+

Let \(\mathbf{X}\) represent the complete set of input features for a machine +learning model, where \(\mathbf{X} = \{X_1, X_2, \dots, X_p\}\). Suppose we’re +particularly interested in a subset of these features, denoted by \(\mathbf{X}_S\). +The complementary set, \(\mathbf{X}_C\), contains all the features in \(\mathbf{X}\) +that are not in \(\mathbf{X}_S\). Mathematically, this relationship is expressed as:

+
+\[\mathbf{X}_C = \mathbf{X} \setminus \mathbf{X}_S\]
+

where \(\mathbf{X}_C\) is the set of features in \(\mathbf{X}\) after +removing the features in \(\mathbf{X}_S\).

+

Partial Dependence Plots (PDPs) are used to illustrate the effect of the features +in \(\mathbf{X}_S\) on the model’s predictions, while averaging out the +influence of the features in \(\mathbf{X}_C\). This is mathematically defined as:

+
+\[\begin{split}\begin{align*} +\text{PD}_{\mathbf{X}_S}(x_S) &= \mathbb{E}_{\mathbf{X}_C} \left[ f(x_S, \mathbf{X}_C) \right] \\ +&= \int f(x_S, x_C) \, p(x_C) \, dx_C \\ +&= \int \left( \int f(x_S, x_C) \, p(x_C \mid x_S) \, dx_C \right) p(x_S) \, dx_S +\end{align*}\end{split}\]
+

where:

+
    +
  • \(\mathbb{E}_{\mathbf{X}_C} \left[ \cdot \right]\) indicates that we are taking the expected value over the possible values of the features in the set \(\mathbf{X}_C\).

  • +
  • \(p(x_C)\) represents the probability density function of the features in \(\mathbf{X}_C\).

  • +
+

This operation effectively summarizes the model’s output over all potential values of the complementary features, providing a clear view of how the features in \(\mathbf{X}_S\) alone impact the model’s predictions.

+

2D Partial Dependence Plots

+

Consider a trained machine learning model 2D Partial Dependence Plots \(f(\mathbf{X})\), where \(\mathbf{X} = (X_1, X_2, \dots, X_p)\) represents the vector of input features. The partial dependence of the predicted response \(\hat{y}\) on a single feature \(X_j\) is defined as:

+
+\[\text{PD}(X_j) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, \mathbf{X}_{C_i})\]
+

where:

+
    +
  • \(X_j\) is the feature of interest.

  • +
  • \(\mathbf{X}_{C_i}\) represents the complement set of \(X_j\), meaning the remaining features in \(\mathbf{X}\) not included in \(X_j\) for the \(i\)-th instance.

  • +
  • \(n\) is the number of observations in the dataset.

  • +
+

For two features, \(X_j\) and \(X_k\), the partial dependence is given by:

+
+\[\text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i})\]
+

This results in a 2D surface plot (or contour plot) that shows how the predicted outcome changes as the values of \(X_j\) and \(X_k\) vary, while the effects of the other features are averaged out.

+
    +
  • Single Feature PDP: When plotting \(\text{PD}(X_j)\), the result is a 2D line plot showing the marginal effect of feature \(X_j\) on the predicted outcome, averaged over all possible values of the other features.

  • +
  • Two Features PDP: When plotting \(\text{PD}(X_j, X_k)\), the result is a 3D surface plot (or a contour plot) that shows the combined marginal effect of \(X_j\) and \(X_k\) on the predicted outcome. The surface represents the expected value of the prediction as \(X_j\) and \(X_k\) vary, while all other features are averaged out.

  • +
+

3D Partial Dependence Plots

+

For a more comprehensive analysis, especially when exploring interactions between two features, 3D Partial Dependence Plots are invaluable. The partial dependence function for two features in a 3D context is:

+
+\[\text{PD}(X_j, X_k) = \frac{1}{n} \sum_{i=1}^{n} f(X_j, X_k, \mathbf{X}_{C_i})\]
+

Here, the function \(f(X_j, X_k, \mathbf{X}_{C_i})\) is evaluated across a grid of values for \(X_j\) and \(X_k\). The resulting 3D surface plot represents how the model’s prediction changes over the joint range of these two features.

+

The 3D plot offers a more intuitive visualization of feature interactions compared to 2D contour plots, allowing for a better understanding of the combined effects of features on the model’s predictions. The surface plot is particularly useful when you need to capture complex relationships that might not be apparent in 2D.

+
    +
  • Feature Interaction Visualization: The 3D PDP provides a comprehensive view of the interaction between two features. The resulting surface plot allows for the visualization of how the model’s output changes when the values of two features are varied simultaneously, making it easier to understand complex interactions.

  • +
  • Enhanced Interpretation: 3D PDPs offer enhanced interpretability in scenarios where feature interactions are not linear or where the effect of one feature depends on the value of another. The 3D visualization makes these dependencies more apparent.

  • +
+
+
+
+

KDE and Histogram Distribution Plots

+
+

KDE Distribution Function

+

Generate KDE or histogram distribution plots for specified columns in a DataFrame.

+

The kde_distributions function is a versatile tool designed for generating +Kernel Density Estimate (KDE) plots, histograms, or a combination of both for +specified columns within a DataFrame. This function is particularly useful for +visualizing the distribution of numerical data across various categories or groups. +It leverages the powerful seaborn library [2] for plotting, which is built on top of +matplotlib [3] and provides a high-level interface for drawing attractive and informative +statistical graphics.

+

Key Features and Parameters

+
    +
  • Flexible Plotting: The function supports creating histograms, KDE plots, or a combination of both for specified columns, allowing users to visualize data distributions effectively.

  • +
  • Leverages Seaborn Library: The function is built on the seaborn library, which provides high-level, attractive visualizations, making it easy to create complex plots with minimal code.

  • +
  • Customization: Users have control over plot aesthetics, such as colors, fill options, grid sizes, axis labels, tick marks, and more, allowing them to tailor the visualizations to their needs.

  • +
  • Scientific Notation Control: The function allows disabling scientific notation on the axes, providing better readability for certain types of data.

  • +
  • Log Scaling: The function includes an option to apply logarithmic scaling to specific variables, which is useful when dealing with data that spans several orders of magnitude.

  • +
  • Output Options: The function supports saving plots as PNG or SVG files, with customizable filenames and output directories, making it easy to integrate the plots into reports or presentations.

  • +
+
+
+kde_distributions(df, vars_of_interest=None, figsize=(5, 5), grid_figsize=None, hist_color='#0000FF', kde_color='#FF0000', mean_color='#000000', median_color='#000000', hist_edgecolor='#000000', hue=None, fill=True, fill_alpha=1, n_rows=None, n_cols=None, w_pad=1.0, h_pad=1.0, image_path_png=None, image_path_svg=None, image_filename=None, bbox_inches=None, single_var_image_filename=None, y_axis_label='Density', plot_type='both', log_scale_vars=None, bins='auto', binwidth=None, label_fontsize=10, tick_fontsize=10, text_wrap=50, disable_sci_notation=False, stat='density', xlim=None, ylim=None, plot_mean=False, plot_median=False, std_dev_levels=None, std_color='#808080', label_names=None, show_legend=True, **kwargs)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots. If ‘all’, plots will be generated for all numeric columns.

  • +
  • figsize (tuple of int, optional) – Size of each individual plot, default is (5, 5). Used when only one plot is being generated or when saving individual plots.

  • +
  • grid_figsize (tuple of int, optional) – Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on figsize, n_rows, and n_cols.

  • +
  • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

  • +
  • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

  • +
  • mean_color (str, optional) – Color of the mean line if plot_mean is True, default is '#000000'.

  • +
  • median_color (str, optional) – Color of the median line if plot_median is True, default is '#000000'.

  • +
  • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

  • +
  • hue (str, optional) – Column name to group data by, adding different colors for each group.

  • +
  • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

  • +
  • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid. If not provided, it will be calculated automatically.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid. If not provided, it will be calculated automatically.

  • +
  • w_pad (float, optional) – Width padding between subplots, default is 1.0.

  • +
  • h_pad (float, optional) – Height padding between subplots, default is 1.0.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

  • +
  • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

  • +
  • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

  • +
  • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses figsize for determining the plot size, ignoring grid_figsize.

  • +
  • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

  • +
  • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

  • +
  • log_scale_vars (str or list of str, optional) – Variable name(s) to apply log scaling. Can be a single string or a list of strings.

  • +
  • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

  • +
  • binwidth (float, optional) – Width of each bin, overrides bins but can be used with binrange.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

  • +
  • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

  • +
  • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
  • plot_mean (bool, optional) – Whether to plot the mean as a vertical line, default is False.

  • +
  • plot_median (bool, optional) – Whether to plot the median as a vertical line, default is False.

  • +
  • std_dev_levels (list of int, optional) – Levels of standard deviation to plot around the mean.

  • +
  • std_color (str or list of str, optional) – Color(s) for the standard deviation lines, default is '#808080'.

  • +
  • label_names (dict, optional) – Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display.

  • +
  • show_legend (bool, optional) – Whether to show the legend on the plots, default is True.

  • +
  • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If plot_type is not one of 'hist', 'kde', or 'both'.

    • +
    • If stat is not one of 'count', 'density', 'frequency', 'probability', 'proportion', 'percent'.

    • +
    • If log_scale_vars contains variables that are not present in the DataFrame.

    • +
    • If fill is set to False and hist_edgecolor is not the default.

    • +
    • If grid_figsize is provided when only one plot is being created.

    • +
    +

  • +
  • UserWarning

      +
    • If both bins and binwidth are specified, which may affect performance.

    • +
    +

  • +
+
+
Returns:
+

None

+
+
+
+ +

+
+

KDE and Histograms Example

+

In the below example, the kde_distributions function is used to generate +histograms for several variables of interest: "age", "education-num", and +"hours-per-week". These variables represent different demographic and +financial attributes from the dataset. The plot_type="both" parameter ensures that a +Kernel Density Estimate (KDE) plot is overlaid on the histograms, providing a +smoothed representation of the data’s probability density.

+

The visualizations are arranged in a single row of four columns, as specified +by n_rows=1 and n_cols=3, respectively. The overall size of the grid +figure is set to 14 inches wide and 4 inches tall (grid_figsize=(14, 4)), +while each individual plot is configured to be 4 inches by 4 inches +(single_figsize=(4, 4)). The fill=True parameter fills the histogram +bars with color, and the spacing between the subplots is managed using +w_pad=1 and h_pad=1, which add 1 inch of padding both horizontally and +vertically.

+
+

Note

+

If you do not set n_rows or n_cols to any values, the function will +automatically calculate and create a grid based on the number of variables being +plotted, ensuring an optimal arrangement of the plots.

+
+

To handle longer titles, the text_wrap=50 parameter ensures that the title +text wraps to a new line after 50 characters. The bbox_inches="tight" setting +is used when saving the figure, ensuring that it is cropped to remove any excess +whitespace around the edges. The variables specified in vars_of_interest are +passed directly to the function for visualization.

+

Each plot is saved individually with filenames that are prefixed by +"kde_density_single_distribution", followed by the variable name. The `y-axis` +for all plots is labeled as “Density” (y_axis_label="Density"), reflecting that +the height of the bars or KDE line represents the data’s density. The histograms +are divided into 10 bins (bins=10), offering a clear view of the distribution +of each variable.

+

Additionally, the font sizes for the axis labels and tick labels +are set to 16 points (label_fontsize=16) and 14 points (tick_fontsize=14), +respectively, ensuring that all text within the plots is legible and well-formatted.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    fill=True,
+    fill_alpha=0.60,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="both", # Can also just plot KDE by itself by passing "kde"
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+)
+
+
+
KDE Distributions - KDE (+) Histograms (Density) + +
+
+

Histogram Example (Density)

+

In this example, the kde_distributions() function is used to generate histograms for +the variables "age", "education-num", and "hours-per-week" but with +plot_type="hist", meaning no KDE plots are included—only histograms are displayed. +The plots are arranged in a single row of four columns (n_rows=1, n_cols=3), +with a grid size of 14x4 inches (grid_figsize=(14, 4)). The histograms are +divided into 10 bins (bins=10), and the y-axis is labeled “Density” (y_axis_label="Density"). +Font sizes for the axis labels and tick labels are set to 16 and 14 points, +respectively, ensuring clarity in the visualizations. This setup focuses on the +histogram representation without the KDE overlay.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    fill=True,
+    text_wrap=50,
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    plot_type="hist",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+    show_legend=False,
+)
+
+
+
KDE Distributions - Histograms (Density) + +
+
+

Histogram Example (Count)

+

In this example, the kde_distributions() function is modified to generate histograms +with a few key changes. The hist_color is set to “orange”, changing the color of the +histogram bars. The y-axis label is updated to “Count” (y_axis_label="Count"), +reflecting that the histograms display the count of observations within each bin. +Additionally, the stat parameter is set to "Count" to show the actual counts instead of +densities. The rest of the parameters remain the same as in the previous example, +with the plots arranged in a single row of four columns (n_rows=1, n_cols=3), +a grid size of 14x4 inches, and a bin count of 10. This setup focuses on +visualizing the raw counts in the dataset using orange-colored histograms.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    text_wrap=50,
+    hist_color="orange",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Count",
+    bins=10,
+    plot_type="hist",
+    stat="Count",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+    show_legend=False,
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+

Histogram Example - (Mean and Median)

+

In this example, the kde_distributions() function is customized to generate +histograms that include mean and median lines. The mean_color is set to "blue" +and the median_color is set to "black", allowing for a clear distinction +between the two statistical measures. The function parameters are adjusted to +ensure that both the mean and median lines are plotted (plot_mean=True, plot_median=True). +The y_axis_label remains "Density", indicating that the histograms +represent the density of observations within each bin. The histogram bars are +colored using hist_color="brown", with a fill_alpha=0.60 while the s +tatistical overlays enhance the interpretability of the data. The layout is +configured with a single row and multiple columns (n_rows=1, n_cols=3), and +the grid size is set to 15x5 inches. This example highlights how to visualize +central tendencies within the data using a histogram that prominently displays +the mean and median.

+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+    "education-num",
+    "hours-per-week",
+]
+
+kde_distributions(
+    df=df,
+    n_rows=1,
+    n_cols=3,
+    grid_figsize=(14, 4),  # Size of the overall grid figure
+    text_wrap=50,
+    hist_color="brown",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    fill_alpha=0.60,
+    plot_type="hist",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+    plot_mean=True,
+    plot_median=True,
+    mean_color="blue",
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+

Histogram Example - (Mean, Median, and Std. Deviation)

+

In this example, the kde_distributions() function is customized to generate +a histogram that include mean, median, and 3 standard deviation lines. The +mean_color is set to "blue" and the median_color is set to "black", +allowing for a clear distinction between these two central tendency measures. +The function parameters are adjusted to ensure that both the mean and median lines +are plotted (plot_mean=True, plot_median=True). The y_axis_label remains +"Density", indicating that the histograms represent the density of observations +within each bin. The histogram bars are colored using hist_color="brown", +with a fill_alpha=0.40, which adjusts the transparency of the fill color. +Additionally, standard deviation bands are plotted using colors "purple", +"green", and "silver" for one, two, and three standard deviations, respectively.

+

The layout is configured with a single row and multiple columns (n_rows=1, n_cols=3), +and the grid size is set to 15x5 inches. This setup is particularly useful for +visualizing the central tendencies within the data while also providing a clear +view of the distribution and spread through the standard deviation bands. The +configuration used in this example showcases how histograms can be enhanced with +statistical overlays to provide deeper insights into the data.

+
+

Note

+

You have the freedom to choose whether to plot the mean, median, and +standard deviation lines. You can display one, none, or all of these simultaneously.

+
+
from eda_toolkit import kde_distributions
+
+vars_of_interest = [
+    "age",
+]
+
+kde_distributions(
+    df=df,
+    figsize=(10, 6),
+    text_wrap=50,
+    hist_color="brown",
+    bbox_inches="tight",
+    vars_of_interest=vars_of_interest,
+    y_axis_label="Density",
+    bins=10,
+    fill_alpha=0.40,
+    plot_type="both",
+    stat="Density",
+    label_fontsize=16,  # Font size for axis labels
+    tick_fontsize=14,  # Font size for tick labels
+    plot_mean=True,
+    plot_median=True,
+    mean_color="blue",
+    image_path_svg=image_path_svg,
+    image_path_png=image_path_png,
+    std_dev_levels=[
+        1,
+        2,
+        3,
+    ],
+    std_color=[
+        "purple",
+        "green",
+        "silver",
+    ],
+)
+
+
+
KDE Distributions - Histograms (Count) + +
+
+
+
+

Stacked Crosstab Plots

+

Generates stacked bar plots and crosstabs for specified columns in a DataFrame.

+

The stacked_crosstab_plot function is a versatile tool for generating stacked bar plots and contingency tables (crosstabs) from a pandas DataFrame. This function is particularly useful for visualizing categorical data across multiple columns, allowing users to easily compare distributions and relationships between variables. It offers extensive customization options, including control over plot appearance, color schemes, and the ability to save plots in multiple formats.

+

The function also supports generating both regular and normalized stacked bar plots, with the option to return the generated crosstabs as a dictionary for further analysis.

+
+
+stacked_crosstab_plot(df, col, func_col, legend_labels_list, title, kind='bar', width=0.9, rot=0, custom_order=None, image_path_png=None, image_path_svg=None, save_formats=None, color=None, output='both', return_dict=False, x=None, y=None, p=None, file_prefix=None, logscale=False, plot_type='both', show_legend=True, label_fontsize=12, tick_fontsize=10, text_wrap=50, remove_stacks=False)
+

Generates stacked or regular bar plots and crosstabs for specified columns.

+

This function allows users to create stacked bar plots (or regular bar plots +if stacks are removed) and corresponding crosstabs for specific columns +in a DataFrame. It provides options to customize the appearance, including +font sizes for axis labels, tick labels, and title text wrapping, and to +choose between regular or normalized plots.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • col (str) – The name of the column in the DataFrame to be analyzed.

  • +
  • func_col (list) – List of ground truth columns to be analyzed.

  • +
  • legend_labels_list (list) – List of legend labels for each ground truth column.

  • +
  • title (list) – List of titles for the plots.

  • +
  • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

  • +
  • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

  • +
  • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

  • +
  • custom_order (list, optional) – Specifies a custom order for the categories in the col.

  • +
  • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

  • +
  • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

  • +
  • save_formats (list, optional) – List of file formats to save the plot images in.

  • +
  • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

  • +
  • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

  • +
  • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

  • +
  • x (int, optional) – The width of the figure.

  • +
  • y (int, optional) – The height of the figure.

  • +
  • p (int, optional) – The padding between the subplots.

  • +
  • file_prefix (str, optional) – Prefix for the filename when output includes plots.

  • +
  • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

  • +
  • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

  • +
  • show_legend (bool, optional) – Specify whether to show the legend, default is True.

  • +
  • label_fontsize (int, optional) – Font size for axis labels, default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

  • +
  • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
+
+
Raises:
+
    +
  • ValueError

      +
    • If output is not one of "both", "plots_only", or "crosstabs_only".

    • +
    • If plot_type is not one of "both", "regular", "normalized".

    • +
    • If remove_stacks is set to True and plot_type is not "regular".

    • +
    • If the lengths of title, func_col, and legend_labels_list are not equal.

    • +
    +

  • +
  • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

  • +
+
+
Returns:
+

Dictionary of crosstabs DataFrames if return_dict is True. Otherwise, returns None.

+
+
Return type:
+

dict or None

+
+
+
+ +
+

Stacked Bar Plots With Crosstabs Example

+

The provided code snippet demonstrates how to use the stacked_crosstab_plot +function to generate stacked bar plots and corresponding crosstabs for different +columns in a DataFrame. Here’s a detailed breakdown of the code using the census +dataset as an example [1].

+

First, the func_col list is defined, specifying the columns ["sex", "income"] +to be analyzed. These columns will be used in the loop to generate separate plots. +The legend_labels_list is then defined, with each entry corresponding to a +column in func_col. In this case, the labels for the sex column are +["Male", "Female"], and for the income column, they are ["<=50K", ">50K"]. +These labels will be used to annotate the legends of the plots.

+

Next, the title list is defined, providing titles for each plot corresponding +to the columns in func_col. The titles are set to ["Sex", "Income"], +which will be displayed on top of each respective plot.

+
+

Note

+

The legend_labels_list parameter should be a list of lists, where each +inner list corresponds to the ground truth labels for the respective item in +the func_col list. Each element in the func_col list represents a +column in your DataFrame that you wish to analyze, and the corresponding +inner list in legend_labels_list should contain the labels that will be +used in the legend of your plots.

+
+

For example:

+
# Define the func_col to use in the loop in order of usage
+func_col = ["sex", "income"]
+
+# Define the legend_labels to use in the loop
+legend_labels_list = [
+    ["Male", "Female"],  # Corresponds to "sex"
+    ["<=50K", ">50K"],   # Corresponds to "income"
+]
+
+# Define titles for the plots
+title = [
+    "Sex",
+    "Income",
+]
+
+
+
+

Important

+

Ensure that the number of elements in func_col, legend_labels_list, +and title are the same. Each item in func_col must have a corresponding +list of labels in legend_labels_list and a title in title. This +consistency is essential for the function to correctly generate the plots +with the appropriate labels and titles.

+
+

In this example:

+
    +
  • func_col contains two elements: "sex" and "income". Each corresponds to a specific column in your DataFrame.

  • +
  • legend_labels_list is a nested list containing two inner lists:

    +
    +
      +
    • The first inner list, ["Male", "Female"], corresponds to the "sex" column in func_col.

    • +
    • The second inner list, ["<=50K", ">50K"], corresponds to the "income" column in func_col.

    • +
    +
    +
  • +
  • title contains two elements: "Sex" and "Income", which will be used as the titles for the respective plots.

  • +
+
+

Note

+

If you assign the function to a variable, the dictionary returned when +return_dict=True will be suppressed in the output. However, the dictionary +is still available within the assigned variable for further use.

+
+
from eda_toolkit import stacked_crosstab_plot
+
+# Call the stacked_crosstab_plot function
+stacked_crosstabs = stacked_crosstab_plot(
+    df=df,
+    col="age_group",
+    func_col=func_col,
+    legend_labels_list=legend_labels_list,
+    title=title,
+    kind="bar",
+    width=0.8,
+    rot=45, # axis rotation angle
+    custom_order=None,
+    color=["#00BFC4", "#F8766D"], # default color schema
+    output="both",
+    return_dict=True,
+    x=14,
+    y=8,
+    p=10,
+    logscale=False,
+    plot_type="both",
+    show_legend=True,
+    label_fontsize=14,
+    tick_fontsize=12,
+)
+
+
+

The above example generates stacked bar plots for "sex" and "income" +grouped by "education". The plots are executed with legends, labels, and +tick sizes customized for clarity. The function returns a dictionary of +crosstabs for further analysis or export.

+
+

Important

+

Importance of Correctly Aligning Labels

+

It is crucial to properly align the elements in the legend_labels_list, +title, and func_col parameters when using the stacked_crosstab_plot +function. Each of these lists must be ordered consistently because the function +relies on their alignment to correctly assign labels and titles to the +corresponding plots and legends.

+

For instance, in the example above:

+
    +
  • The first element in func_col is "sex", and it is aligned with the first set of labels ["Male", "Female"] in legend_labels_list and the first title "Sex" in the title list.

  • +
  • Similarly, the second element in func_col, "income", aligns with the labels ["<=50K", ">50K"] and the title "Income".

  • +
+

Misalignment between these lists would result in incorrect labels or titles being +applied to the plots, potentially leading to confusion or misinterpretation of the data. +Therefore, it’s important to ensure that each list is ordered appropriately and +consistently to accurately reflect the data being visualized.

+

Proper Setup of Lists

+

When setting up the legend_labels_list, title, and func_col, ensure +that each element in the lists corresponds to the correct variable in the DataFrame. +This involves:

+
    +
  • Ordering: Maintaining the same order across all three lists to ensure that labels and titles correspond correctly to the data being plotted.

  • +
  • Consistency: Double-checking that each label in legend_labels_list matches the categories present in the corresponding func_col, and that the title accurately describes the plot.

  • +
+

By adhering to these guidelines, you can ensure that the stacked_crosstab_plot +function produces accurate and meaningful visualizations that are easy to interpret and analyze.

+
+

Output

+
KDE Distributions + +
Stacked Bar Plot Age vs. Income + +
+

Note

+

When you set return_dict=True, you are able to see the crosstabs printed out +as shown below.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Crosstab for sex
sexFemaleMaleTotalFemale_%Male_%
age_group
< 1829530059549.5850.42
18-2957078213139204159
30-39385390761292929.870.2
40-49318875361072429.7370.27
50-5918734746661928.371.7
60-699392115305430.7569.25
70-7928053581534.3665.64
80-89409113130.5369.47
90-9917385530.9169.09
Total16192326504884233.1566.85
Crosstab for income
income<=50K>50KTotal<=50K_%>50K_%
age_group
< 1859505951000
18-29131747461392094.645.36
30-39946834611292973.2326.77
40-49673839861072462.8337.17
50-5941102509661962.0937.91
60-692245809305473.5126.49
70-7966814781581.9618.04
80-891151613187.7912.21
90-9942135576.3623.64
Total37155116874884276.0723.93

+

When you set return_dict=True, you can access these crosstabs as +DataFrames by assigning them to their own vriables. For example:

+
crosstab_age_sex = crosstabs_dict["sex"]
+crosstab_age_income = crosstabs_dict["income"]
+
+
+
+
+

Pivoted Stacked Bar Plots Example

+

Using the census dataset [1], to create horizontal stacked bar plots, set the kind parameter to +"barh" in the stacked_crosstab_plot function. This option pivots the +standard vertical stacked bar plot into a horizontal orientation, making it easier +to compare categories when there are many labels on the y-axis.

+
Stacked Bar Plot Age vs. Income (Pivoted) + +
+
+

Non-Normalized Stacked Bar Plots Example

+

In the census data [1], to create stacked bar plots without the normalized versions, +set the plot_type parameter to "regular" in the stacked_crosstab_plot +function. This option removes the display of normalized plots beneath the regular +versions. Alternatively, setting the plot_type to "normalized" will display +only the normalized plots. The example below demonstrates regular stacked bar plots +for income by age.

+
Stacked Bar Plot Age vs. Income (Regular) + +
+
+

Regular Non-Stacked Bar Plots Example

+

In the census data [1], to generate regular (non-stacked) bar plots without +displaying their normalized versions, set the plot_type parameter to "regular" +in the stacked_crosstab_plot function and enable remove_stacks by setting +it to True. This configuration removes any stacked elements and prevents the +display of normalized plots beneath the regular versions. Alternatively, setting +plot_type to "normalized" will display only the normalized plots.

+

When unstacking bar plots in this fashion, the distribution is aligned in descending +order, making it easier to visualize the most prevalent categories.

+

In the example below, the color of the bars has been set to a dark grey (#333333), +and the legend has been removed by setting show_legend=False. This illustrates +regular bar plots for income by age, without stacking.

+
Bar Plot Age vs. Income (Regular) + +
+
+
+

Box and Violin Plots

+

Create and save individual boxplots or violin plots, an entire grid of plots, +or both for given metrics and comparisons.

+

The box_violin_plot function is designed to generate both individual and grid +plots of boxplots or violin plots for a set of specified metrics against comparison +categories within a DataFrame. This function offers flexibility in how the plots are +presented and saved, allowing users to create detailed visualizations that highlight +the distribution of metrics across different categories.

+

With options to customize the plot type (boxplot or violinplot), +axis label rotation, figure size, and whether to display or save the plots, this +function can be adapted for a wide range of data visualization needs. Users can +choose to display individual plots, a grid of plots, or both, depending on the +requirements of their analysis.

+

Additionally, the function includes features for rotating the plots, adjusting +the font sizes of labels, and selectively showing or hiding legends. It also +supports the automatic saving of plots in either PNG or SVG format, depending on +the specified paths, making it a powerful tool for producing publication-quality +figures.

+

The function is particularly useful in scenarios where the user needs to compare +the distribution of multiple metrics across different categories, enabling a +clear visual analysis of how these metrics vary within the dataset.

+
+
+box_violin_plot(df, metrics_list, metrics_comp, n_rows=None, n_cols=None, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, plot_type='boxplot', xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, xlim=None, ylim=None, label_names=None, **kwargs)
+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data to plot.

  • +
  • metrics_list (list of str) – List of metric names (columns in df) to plot.

  • +
  • metrics_comp (list of str) – List of comparison categories (columns in df).

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid. Calculated automatically if not provided.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid. Calculated automatically if not provided.

  • +
  • image_path_png (str, optional) – Optional directory path to save .png images.

  • +
  • image_path_svg (str, optional) – Optional directory path to save .svg images.

  • +
  • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

  • +
  • show_legend (bool, optional) – Boolean, True if showing the legend in the plots. Default is True.

  • +
  • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
  • label_names (dict, optional) – Dictionary mapping original column names to custom labels. Default is None.

  • +
  • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

  • +
+
+
Raises:
+

ValueError

    +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set without specifying image_path_png or image_path_svg.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize is not a tuple or list of two numbers.

  • +
  • If grid_figsize is provided and is not a tuple or list of two numbers.

  • +
+

+
+
Returns:
+

None

+
+
+
+ +

This function provides the ability to create and save boxplots or violin plots for specified metrics and comparison categories. It supports the generation of individual plots, a grid of plots, or both. Users can customize the appearance, save the plots to specified directories, and control the display of legends and labels.

+
+

Box Plots Grid Example

+

In this example with the US census data [1], the box_violin_plot function is employed to create a grid of +boxplots, comparing different metrics against the "age_group" column in the +DataFrame. The metrics_comp parameter is set to ["age_group"], meaning +that the comparison will be based on different age groups. The metrics_list is +provided as age_boxplot_list, which contains the specific metrics to be visualized. +The function is configured to arrange the plots in a grid formatThe image_path_png and +image_path_svg parameters are specified to save the plots in both PNG and +SVG formats, and the save_plots option is set to "all", ensuring that both +individual and grid plots are saved.

+

The plots are displayed in a grid format, as indicated by the show_plot="grid" +parameter. The plot_type is set to "boxplot", so the function will generate +boxplots for each metric in the list. Additionally, the `x-axis` labels are rotated +by 90 degrees (xlabel_rot=90) to ensure that the labels are legible. The legend is +hidden by setting show_legend=False, keeping the plots clean and focused on the data. +This configuration provides a comprehensive visual comparison of the specified +metrics across different age groups, with all plots saved for future reference or publication.

+
age_boxplot_list = df[
+    [
+        "education-num",
+        "hours-per-week",
+    ]
+].columns.to_list()
+
+
+
from eda_toolkit import box_violin_plot
+
+metrics_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_comp,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="boxplot",
+    xlabel_rot=90,
+)
+
+
+
Box Plot Comparisons + +
+
+

Violin Plots Grid Example

+

In this example with the US census data [1], we keep everything the same as the prior example, but change the +plot_type to violinplot. This adjustment will generate violin plots instead +of boxplots while maintaining all other settings.

+
from eda_toolkit import box_violin_plot
+
+metrics_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_comp=metrics_comp,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    save_plots="all",
+    show_plot="both",
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=90,
+)
+
+
+
Violin Plot Comparisons + +
+
+

Pivoted Violin Plots Grid Example

+

In this example with the US census data [1], we set xlabel_rot=0 and rotate_plot=True +to pivot the plot, changing the orientation of the axes while keeping the x-axis labels upright. +This adjustment flips the axes, providing a different perspective on the data distribution.

+
from eda_toolkit import box_violin_plot
+
+metrics_comp = ["age_group"]
+
+box_violin_plot(
+    df=df,
+    metrics_list=age_boxplot_list,
+    metrics_boxplot_comp=metrics_comp,
+    show_plot="both",
+    rotate_plot=True,
+    show_legend=False,
+    plot_type="violinplot",
+    xlabel_rot=0,
+)
+
+
+
Violin Plot Comparisons (Pivoted) + +
+
+
+

Scatter Plots and Best Fit Lines

+
+

Scatter Fit Plot

+

Create and Save Scatter Plots or a Grid of Scatter Plots

+

This function, scatter_fit_plot, is designed to generate scatter plots for +one or more pairs of variables (x_vars and y_vars) from a given DataFrame. +The function can produce either individual scatter plots or organize multiple +scatter plots into a grid layout, making it easy to visualize relationships between +different pairs of variables in one cohesive view.

+

Optional Best Fit Line

+

An optional feature of this function is the ability to add a best fit line to the +scatter plots. This line, often called a regression line, is calculated using a +linear regression model and represents the trend in the data. By adding this line, +you can visually assess the linear relationship between the variables, and the +function can also display the equation of this line in the plot’s legend.s

+

Customizable Plot Aesthetics

+

The function offers a wide range of customization options to tailor the appearance +of the scatter plots:

+
    +
  • Point Color: You can specify a default color for the scatter points or use a hue parameter to color the points based on a categorical variable. This allows for easy comparison across different groups within the data.

  • +
  • Point Size: The size of the scatter points can be controlled and scaled based on another variable, which can help highlight differences or patterns related to that variable.

  • +
  • Markers: The shape or style of the scatter points can also be customized. Whether you prefer circles, squares, or other marker types, the function allows you to choose the best representation for your data.

  • +
+

Axis and Label Configuration

+

The function also provides flexibility in setting axis labels, tick marks, and grid sizes. You can rotate axis labels for better readability, adjust font sizes, and even specify limits for the x and y axes to focus on particular data ranges.

+

Plot Display and Saving Options

+

The function allows you to display plots individually, as a grid, or both. Additionally, you can save the generated plots as PNG or SVG files, making it easy to include them in reports or presentations.

+

Correlation Coefficient Display

+

For users interested in understanding the strength of the relationship between variables, the function can also display the Pearson correlation coefficient directly in the plot title. This numeric value provides a quick reference to the linear correlation between the variables, offering further insight into their relationship.

+
+
+scatter_fit_plot(df, x_vars=None, y_vars=None, n_rows=None, n_cols=None, max_cols=4, image_path_png=None, image_path_svg=None, save_plots=None, show_legend=True, xlabel_rot=0, show_plot='both', rotate_plot=False, individual_figsize=(6, 4), grid_figsize=None, label_fontsize=12, tick_fontsize=10, text_wrap=50, add_best_fit_line=False, scatter_color='C0', best_fit_linecolor='red', best_fit_linestyle='-', hue=None, hue_palette=None, size=None, sizes=None, marker='o', show_correlation=True, xlim=None, ylim=None, all_vars=None, label_names=None, **kwargs)
+

Create and save scatter plots or a grid of scatter plots for given x_vars +and y_vars, with an optional best fit line and customizable point color, +size, and markers.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • x_vars (list of str, optional) – List of variable names to plot on the x-axis.

  • +
  • y_vars (list of str, optional) – List of variable names to plot on the y-axis.

  • +
  • n_rows (int, optional) – Number of rows in the subplot grid. Calculated based on the number of plots and n_cols if not specified.

  • +
  • n_cols (int, optional) – Number of columns in the subplot grid. Calculated based on the number of plots and max_cols if not specified.

  • +
  • max_cols (int, optional) – Maximum number of columns in the subplot grid. Default is 4.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

  • +
  • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid". If None, plots will not be saved.

  • +
  • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

  • +
  • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

  • +
  • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

  • +
  • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

  • +
  • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified.

  • +
  • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

  • +
  • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

  • +
  • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

  • +
  • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

  • +
  • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

  • +
  • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the hue parameter to be set.

  • +
  • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

  • +
  • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

  • +
  • marker (str, optional) – Marker style used for the scatter points. Default is "o".

  • +
  • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

  • +
  • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

  • +
  • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

  • +
  • all_vars (list of str, optional) – If provided, automatically generates scatter plots for all combinations of variables in this list, overriding x_vars and y_vars.

  • +
  • label_names (dict, optional) – A dictionary to rename columns for display in the plot titles and labels.

  • +
  • kwargs (dict, optional) – Additional keyword arguments to pass to sns.scatterplot.

  • +
+
+
Raises:
+

ValueError

    +
  • If all_vars is provided and either x_vars or y_vars is also provided.

  • +
  • If neither all_vars nor both x_vars and y_vars are provided.

  • +
  • If hue_palette is specified without hue.

  • +
  • If show_plot is not one of "individual", "grid", or "both".

  • +
  • If save_plots is not one of None, "all", "individual", or "grid".

  • +
  • If save_plots is set but no image paths are provided.

  • +
  • If rotate_plot is not a boolean value.

  • +
  • If individual_figsize or grid_figsize are not tuples/lists with two numeric values.

  • +
+

+
+
Returns:
+

None. This function does not return any value but generates and optionally saves scatter plots for the specified x_vars and y_vars, or for all combinations of variables in all_vars if it is provided.

+
+
+
+ +
+

Regression-Centric Scatter Plots Example

+

In this US census data [1] example, the scatter_fit_plot function is +configured to display the Pearson correlation coefficient and a best fit line +on each scatter plot. The correlation coefficient is shown in the plot title, +controlled by the show_correlation=True parameter, which provides a measure +of the strength and direction of the linear relationship between the variables. +Additionally, the add_best_fit_line=True parameter adds a best fit line to +each plot, with the equation for the line displayed in the legend. This equation, +along with the best fit line, helps to visually assess the relationship between +the variables, making it easier to identify trends and patterns in the data. The +combination of the correlation coefficient and the best fit line offers both +a quantitative and visual representation of the relationships, enhancing the +interpretability of the scatter plots.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    show_legend=True,
+    show_plot="grid",
+    grid_figsize=None,
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (with Best Fit Lines) + +
+
+

Scatter Plots Grouped by Category Example

+

In this example, the scatter_fit_plot function is used to generate a grid of +scatter plots that examine the relationships between age and hours-per-week +as well as education-num and hours-per-week. Compared to the previous +example, a few key inputs have been changed to adjust the appearance and functionality +of the plots:

+
    +
  1. Hue and Hue Palette: The hue parameter is set to "income", meaning that the +data points in the scatter plots are colored according to the values in the income +column. A custom color mapping is provided via the hue_palette parameter, where the +income categories "<=50K" and ">50K" are assigned the colors "brown" and +"green", respectively. This change visually distinguishes the data points based on +income levels.

  2. +
  3. Scatter Color: The scatter_color parameter is set to "#808080", which applies +a grey color to the scatter points when no hue is provided. However, since a hue +is specified in this example, the hue_palette takes precedence and overrides this color setting.

  4. +
  5. Best Fit Line: The add_best_fit_line parameter is set to False, meaning that +no best fit line is added to the scatter plots. This differs from the previous example where +a best fit line was included.

  6. +
  7. Correlation Coefficient: The show_correlation parameter is set to False, so the +Pearson correlation coefficient will not be displayed in the plot titles. This is another +change from the previous example where the correlation coefficient was included.

  8. +
  9. Hue Legend: The show_legend parameter remains set to True, ensuring that the +legend displaying the hue categories ("<=50K" and ">50K") appears on the plots, +helping to interpret the color coding of the data points.

  10. +
+

These changes allow for the creation of scatter plots that highlight the income levels +of individuals, with custom color coding and without additional elements like a best +fit line or correlation coefficient. The resulting grid of plots is then saved as +images in the specified paths.

+
from eda_toolkit import scatter_fit_plot
+
+hue_dict = {"<=50K": "brown", ">50K": "green"}
+
+scatter_fit_plot(
+    df=df,
+    x_vars=["age", "education-num"],
+    y_vars=["hours-per-week"],
+    show_legend=True,
+    show_plot="grid",
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=False,
+    scatter_color="#808080",
+    hue="income",
+    hue_palette=hue_dict,
+    show_correlation=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Scatter Plots (All Combinations Example)

+

In this example, the scatter_fit_plot function is used to generate a grid of scatter plots that explore the relationships between all numeric variables in the df DataFrame. The function automatically identifies and plots all possible combinations of these variables. Below are key aspects of this example:

+
    +
  1. All Variables Combination: The all_vars parameter is used to automatically generate scatter plots for all possible combinations of numerical variables in the DataFrame. This means you don’t need to manually specify x_vars and y_vars, as the function will iterate through each possible pair.

  2. +
  3. Grid Display: The show_plot parameter is set to "grid", so the scatter plots are displayed in a grid format. This is useful for comparing multiple relationships simultaneously.

  4. +
  5. Font Sizes: The label_fontsize and tick_fontsize parameters are set to 14 and 12, respectively. This increases the readability of axis labels and tick marks, making the plots more visually accessible.

  6. +
  7. Best Fit Line: The add_best_fit_line parameter is set to True, meaning that a best fit line is added to each scatter plot. This helps in visualizing the linear relationship between variables.

  8. +
  9. Scatter Color: The scatter_color parameter is set to "#808080", applying a grey color to the scatter points. This provides a neutral color that does not distract from the data itself.

  10. +
  11. Correlation Coefficient: The show_correlation parameter is set to True, so the Pearson correlation coefficient will be displayed in the plot titles. This helps to quantify the strength of the relationship between the variables.

  12. +
+

These settings allow for the creation of scatter plots that comprehensively explore the relationships between all numeric variables in the DataFrame. The plots are saved in a grid format, with added best fit lines and correlation coefficients for deeper analysis. The resulting images can be stored in the specified directory for future reference.

+
from eda_toolkit import scatter_fit_plot
+
+scatter_fit_plot(
+    df=df,
+    all_vars=df.select_dtypes(np.number).columns.to_list(),
+    show_legend=True,
+    show_plot="grid",
+    label_fontsize=14,
+    tick_fontsize=12,
+    add_best_fit_line=True,
+    scatter_color="#808080",
+    show_correlation=True,
+)
+
+
+
Scatter Plot Comparisons (Grouped2) + +
+
+
+
+

Correlation Matrices

+

Generate and Save Customizable Correlation Heatmaps

+

The flex_corr_matrix function is designed to create highly customizable correlation heatmaps for visualizing the relationships between variables in a DataFrame. This function allows users to generate either a full or triangular correlation matrix, with options for annotation, color mapping, and saving the plot in multiple formats.

+

Customizable Plot Appearance

+

The function provides extensive customization options for the heatmap’s appearance:

+
    +
  • Colormap Selection: Choose from a variety of colormaps to represent the strength of correlations. The default is "coolwarm", but this can be adjusted to fit the needs of the analysis.

  • +
  • Annotation: Optionally annotate the heatmap with correlation coefficients, making it easier to interpret the strength of relationships at a glance.

  • +
  • Figure Size and Layout: Customize the dimensions of the heatmap to ensure it fits well within reports, presentations, or dashboards.

  • +
+

Triangular vs. Full Correlation Matrix

+

A key feature of the flex_corr_matrix function is the ability to generate either a full correlation matrix or only the upper triangle. This option is particularly useful when the matrix is large, as it reduces visual clutter and focuses attention on the unique correlations.

+

Label and Axis Configuration

+

The function offers flexibility in configuring axis labels and titles:

+
    +
  • Label Rotation: Rotate x-axis and y-axis labels for better readability, especially when working with long variable names.

  • +
  • Font Sizes: Adjust the font sizes of labels and tick marks to ensure the plot is clear and readable.

  • +
  • Title Wrapping: Control the wrapping of long titles to fit within the plot without overlapping other elements.

  • +
+

Plot Display and Saving Options

+

The flex_corr_matrix function allows you to display the heatmap directly or save it as PNG or SVG files for use in reports or presentations. If saving is enabled, you can specify file paths and names for the images.

+
+
+flex_corr_matrix(df, cols=None, annot=True, cmap='coolwarm', save_plots=False, image_path_png=None, image_path_svg=None, figsize=(10, 10), title='Cervical Cancer Data: Correlation Matrix', label_fontsize=12, tick_fontsize=10, xlabel_rot=45, ylabel_rot=0, xlabel_alignment='right', ylabel_alignment='center_baseline', text_wrap=50, vmin=-1, vmax=1, cbar_label='Correlation Index', triangular=True, **kwargs)
+

Create a customizable correlation heatmap with options for annotation, color mapping, figure size, and saving the plot.

+
+
Parameters:
+
    +
  • df (pandas.DataFrame) – The DataFrame containing the data.

  • +
  • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

  • +
  • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

  • +
  • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

  • +
  • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

  • +
  • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

  • +
  • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

  • +
  • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

  • +
  • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

  • +
  • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

  • +
  • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

  • +
  • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

  • +
  • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

  • +
  • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

  • +
  • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

  • +
  • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

  • +
  • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

  • +
  • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

  • +
  • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

  • +
+
+
Raises:
+

ValueError

    +
  • If annot is not a boolean.

  • +
  • If cols is not a list.

  • +
  • If save_plots is not a boolean.

  • +
  • If triangular is not a boolean.

  • +
  • If save_plots is True but no image paths are provided.

  • +
+

+
+
Returns:
+

None +This function does not return any value but generates and optionally saves a correlation heatmap.

+
+
+
+ +
+

Triangular Correlation Matrix Example

+

The provided code filters the census [1] DataFrame df to include only numeric columns using +select_dtypes(np.number). It then utilizes the flex_corr_matrix() function +to generate a right triangular correlation matrix, which only displays the +upper half of the correlation matrix. The heatmap is customized with specific +colormap settings, title, label sizes, axis label rotations, and other formatting +options.

+
+

Note

+

This triangular matrix format is particularly useful for avoiding +redundancy in correlation matrices, as it excludes the lower half, +making it easier to focus on unique pairwise correlations.

+
+

The function also includes a labeled color bar, helping users quickly interpret +the strength and direction of the correlations.

+
# Select only numeric data to pass into the function
+df_num = df.select_dtypes(np.number)
+
+
+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="coolwarm",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=True,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Full Correlation Matrix Example

+

In this modified census [1] example, the key changes are the use of the viridis colormap +and the decision to plot the full correlation matrix instead of just the upper +triangle. By setting cmap="viridis", the heatmap will use a different color +scheme, which can provide better visual contrast or align with specific aesthetic +preferences. Additionally, by setting triangular=False, the full correlation +matrix is displayed, allowing users to view all pairwise correlations, including +both upper and lower halves of the matrix. This approach is beneficial when you +want a comprehensive view of all correlations in the dataset.

+
from eda_toolkit import flex_corr_matrix
+
+flex_corr_matrix(
+    df=df,
+    cols=df_num.columns.to_list(),
+    annot=True,
+    cmap="viridis",
+    figsize=(10, 8),
+    title="US Census Correlation Matrix",
+    xlabel_alignment="right",
+    label_fontsize=14,
+    tick_fontsize=12,
+    xlabel_rot=45,
+    ylabel_rot=0,
+    text_wrap=50,
+    vmin=-1,
+    vmax=1,
+    cbar_label="Correlation Index",
+    triangular=False,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+

Partial Dependence Plots

+

Partial Dependence Plots (PDPs) are a powerful tool in machine learning +interpretability, providing insights into how features influence the predicted +outcome of a model. PDPs can be generated in both 2D and 3D, depending on +whether you want to analyze the effect of one feature or the interaction between +two features on the model’s predictions.

+
+

2D Partial Dependence Plots

+

The plot_2d_pdp function generates 2D partial dependence plots for individual features or pairs of features. These plots are essential for examining the marginal effect of features on the predicted outcome.

+
    +
  • Grid and Individual Plots: Generate all 2D partial dependence plots in a grid layout or as separate individual plots, offering flexibility in presentation.

  • +
  • Customization Options: Control the figure size, font sizes for labels and ticks, and the wrapping of long titles to ensure the plots are clear and informative.

  • +
  • Saving Plots: The function provides options to save the plots in PNG or SVG formats, and you can specify whether to save all plots, only individual plots, or just the grid plot.

  • +
+
+
+plot_2d_pdp(model, X_train, feature_names, features, title='PDP of house value on CA non-location features', grid_resolution=50, plot_type='grid', grid_figsize=(12, 8), individual_figsize=(6, 4), label_fontsize=12, tick_fontsize=10, text_wrap=50, image_path_png=None, image_path_svg=None, save_plots=None, file_prefix='partial_dependence')
+

Generate 2D partial dependence plots for specified features using the given machine learning model. The function allows for plotting in grid or individual layouts, with various customization options for figure size, font sizes, and title wrapping. Additionally, the plots can be saved in PNG or SVG formats with a customizable filename prefix.

+
+
Parameters:
+
    +
  • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

  • +
  • X_train (pandas.DataFrame or numpy.ndarray) – The training data used to compute partial dependence. Should correspond to the features used to train the model.

  • +
  • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

  • +
  • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

  • +
  • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

  • +
  • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

  • +
  • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

  • +
  • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

  • +
  • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

  • +
  • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

  • +
  • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

  • +
  • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

  • +
  • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

  • +
  • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

  • +
  • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

  • +
  • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

  • +
+
+
Raises:
+

ValueError

    +
  • If plot_type is not one of "grid", "individual", or "both".

  • +
  • If save_plots is enabled but neither image_path_png nor image_path_svg is provided.

  • +
+

+
+
Returns:
+

None +This function generates partial dependence plots and displays them. It does not return any values.

+
+
+
+ +
+

2D Plots - CA Housing Example

+

Consider a scenario where you have a machine learning model predicting median +house values in California. [4] Suppose you want to understand how non-location +features like the average number of occupants per household (AveOccup) and the +age of the house (HouseAge) jointly influence house values. A 2D partial +dependence plot allows you to visualize this relationship in two ways: either as +individual plots for each feature or as a combined plot showing the interaction +between two features.

+

For instance, the 2D partial dependence plot can help you analyze how the age of +the house impacts house values while holding the number of occupants constant, or +vice versa. This is particularly useful for identifying the most influential +features and understanding how changes in these features might affect the +predicted house value.

+

If you extend this to two interacting features, such as AveOccup and HouseAge, +you can explore their combined effect on house prices. The plot can reveal how +different combinations of occupancy levels and house age influence the value, +potentially uncovering non-linear relationships or interactions that might not be +immediately obvious from a simple 1D analysis.

+

Here’s how you can generate and visualize these 2D partial dependence plots using +the California housing dataset:

+

Fetch The CA Housing Dataset and Prepare The DataFrame

+
from sklearn.datasets import fetch_california_housing
+from sklearn.model_selection import train_test_split
+from sklearn.ensemble import GradientBoostingRegressor
+import pandas as pd
+
+# Load the dataset
+data = fetch_california_housing()
+df = pd.DataFrame(data.data, columns=data.feature_names)
+
+
+

Split The Data Into Training and Testing Sets

+
X_train, X_test, y_train, y_test = train_test_split(
+    df, data.target, test_size=0.2, random_state=42
+)
+
+
+

Train a GradientBoostingRegressor Model

+
model = GradientBoostingRegressor(
+    n_estimators=100,
+    max_depth=4,
+    learning_rate=0.1,
+    loss="huber",
+    random_state=42,
+)
+model.fit(X_train, y_train)
+
+
+

Create 2D Partial Dependence Plot Grid

+
# import the plot_2d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_2d_pdp
+
+# Feature names
+names = data.feature_names
+
+# Generate 2D partial dependence plots
+plot_2d_pdp(
+    model=model,
+    X_train=X_train,
+    feature_names=names,
+    features=[
+        "MedInc",
+        "AveOccup",
+        "HouseAge",
+        "AveRooms",
+        "Population",
+        ("AveOccup", "HouseAge"),
+    ],
+    title="PDP of house value on CA non-location features",
+    grid_figsize=(14, 10),
+    individual_figsize=(12, 4),
+    label_fontsize=14,
+    tick_fontsize=12,
+    text_wrap=120,
+    plot_type="grid",
+    image_path_png="path/to/save/png",
+    save_plots="all",
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+
+

3D Partial Dependence Plots

+

The plot_3d_pdp function extends the concept of partial dependence to three dimensions, allowing you to visualize the interaction between two features and their combined effect on the model’s predictions.

+
    +
  • Interactive and Static 3D Plots: Generate static 3D plots using Matplotlib or interactive 3D plots using Plotly. The function also allows for generating both types simultaneously.

  • +
  • Colormap and Layout Customization: Customize the colormaps for both Matplotlib and Plotly plots. Adjust figure size, camera angles, and zoom levels to create plots that fit perfectly within your presentation or report.

  • +
  • Axis and Title Configuration: Customize axis labels for both Matplotlib and Plotly plots. Adjust font sizes and control the wrapping of long titles to maintain readability.

  • +
+
+
+plot_3d_pdp(model, dataframe, feature_names_list, x_label=None, y_label=None, z_label=None, title, html_file_path=None, html_file_name=None, image_filename=None, plot_type="both", matplotlib_colormap=None, plotly_colormap="Viridis", zoom_out_factor=None, wireframe_color=None, view_angle=(22, 70), figsize=(7, 4.5), text_wrap=50, horizontal=-1.25, depth=1.25, vertical=1.25, cbar_x=1.05, cbar_thickness=25, title_x=0.5, title_y=0.95, top_margin=100, image_path_png=None, image_path_svg=None, show_cbar=True, grid_resolution=20, left_margin=20, right_margin=65, label_fontsize=8, tick_fontsize=6, enable_zoom=True, show_modebar=True)
+

Generate 3D partial dependence plots for two features of a machine learning model.

+

This function supports both static (Matplotlib) and interactive (Plotly) visualizations, allowing for flexible and comprehensive analysis of the relationship between two features and the target variable in a model.

+
+
Parameters:
+
    +
  • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

  • +
  • dataframe (pandas.DataFrame or numpy.ndarray) – The dataset on which the model was trained or a representative sample. If a DataFrame is provided, feature_names_list should correspond to the column names. If a NumPy array is provided, feature_names_list should correspond to the indices of the columns.

  • +
  • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

  • +
  • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

  • +
  • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

  • +
  • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

  • +
  • title (str) – The title for the plots.

  • +
  • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

  • +
  • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

  • +
  • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

  • +
  • plot_type (str, optional) – The type of plots to generate. Options are: +- "static": Generate only static Matplotlib plots. +- "interactive": Generate only interactive Plotly plots. +- "both": Generate both static and interactive plots. Default is "both".

  • +
  • matplotlib_colormap (matplotlib.colors.Colormap, optional) – Custom colormap for the Matplotlib plot. If not provided, a default colormap is used.

  • +
  • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

  • +
  • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

  • +
  • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

  • +
  • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

  • +
  • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

  • +
  • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

  • +
  • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

  • +
  • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

  • +
  • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

  • +
  • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

  • +
  • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

  • +
  • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

  • +
  • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

  • +
  • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

  • +
  • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

  • +
  • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

  • +
  • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

  • +
  • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

  • +
  • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

  • +
  • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

  • +
  • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

  • +
  • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

  • +
  • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

  • +
  • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

  • +
+
+
Raises:
+

ValueError

    +
  • If plot_type is not one of "static", "interactive", or "both".

  • +
  • If plot_type is "interactive" or "both" and html_file_path or html_file_name are not provided.

  • +
+

+
+
Returns:
+

None +This function generates 3D partial dependence plots and displays or saves them. It does not return any values.

+
+
Notes:
+
    +
  • This function handles warnings related to scikit-learn’s partial_dependence function, specifically a FutureWarning related to non-tuple sequences for multidimensional indexing. This warning is suppressed as it stems from the internal workings of scikit-learn in Python versions like 3.7.4.

  • +
  • To maintain compatibility with different versions of scikit-learn, the function attempts to use "values" for grid extraction in newer versions and falls back to "grid_values" for older versions.

  • +
+
+
+
+ +
+

3D Plots - CA Housing Example

+

Consider a scenario where you have a machine learning model predicting median +house values in California.[4]_ Suppose you want to understand how non-location +features like the average number of occupants per household (AveOccup) and the +age of the house (HouseAge) jointly influence house values. A 3D partial +dependence plot allows you to visualize this relationship in a more comprehensive +manner, providing a detailed view of how these two features interact to affect +the predicted house value.

+

For instance, the 3D partial dependence plot can help you explore how different +combinations of house age and occupancy levels influence house values. By +visualizing the interaction between AveOccup and HouseAge in a 3D space, you can +uncover complex, non-linear relationships that might not be immediately apparent +in 2D plots.

+

This type of plot is particularly useful when you need to understand the joint +effect of two features on the target variable, as it provides a more intuitive +and detailed view of how changes in both features impact predictions simultaneously.

+

Here’s how you can generate and visualize these 3D partial dependence plots +using the California housing dataset:

+
+
+

Static Plot

+

Fetch The CA Housing Dataset and Prepare The DataFrame

+
from sklearn.ensemble import GradientBoostingRegressor
+from sklearn.datasets import fetch_california_housing
+from sklearn.model_selection import train_test_split
+import pandas as pd
+
+# Load the dataset
+data = fetch_california_housing()
+df = pd.DataFrame(data.data, columns=data.feature_names)
+
+
+

Split The Data Into Training and Testing Sets

+
X_train, X_test, y_train, y_test = train_test_split(
+    df, data.target, test_size=0.2, random_state=42
+)
+
+
+

Train a GradientBoostingRegressor Model

+
model = GradientBoostingRegressor(
+    n_estimators=100,
+    max_depth=4,
+    learning_rate=0.1,
+    loss="huber",
+    random_state=1,
+)
+model.fit(X_train, y_train)
+
+
+

Create Static 3D Partial Dependence Plot

+
# import the plot_3d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_3d_pdp
+
+# Call the function to generate the plot
+plot_3d_pdp(
+    model=model,
+    dataframe=X_test,  # Use the test dataset
+    feature_names_list=["HouseAge", "AveOccup"],
+    x_label="House Age",
+    y_label="Average Occupancy",
+    z_label="Partial Dependence",
+    title="3D Partial Dependence Plot of House Age vs. Average Occupancy",
+    image_filename="3d_pdp",
+    plot_type="static",
+    figsize=[8, 5],
+    text_wrap=40,
+    wireframe_color="black",
+    image_path_png=image_path_png,
+    grid_resolution=30,
+)
+
+
+
Scatter Plot Comparisons (Grouped) + +
+
+

Interactive Plot

+
# import the plot_3d_pdp function from
+# the eda_toolkit library
+from eda_toolkit import plot_3d_pdp
+
+# Call the function to generate the plot
+plot_3d_pdp(
+    model=model,
+    dataframe=X_test,  # Use the test dataset
+    feature_names_list=["HouseAge", "AveOccup"],
+    x_label="House Age",
+    y_label="Average Occupancy",
+    z_label="Partial Dependence",
+    title="3D Partial Dependence Plot of House Age vs. Average Occupancy",
+    html_file_path=image_path_png,
+    image_filename="3d_pdp",
+    html_file_name="3d_pdp.html",
+    plot_type="interactive",
+    text_wrap=40,
+    zoom_out_factor=0.5,
+    image_path_png=image_path_png,
+    image_path_svg=image_path_svg,
+    grid_resolution=30,
+    label_fontsize=8,
+    tick_fontsize=6,
+    title_x=0.38,
+    top_margin=10,
+    right_margin=250,
+    cbar_x=0.9,
+    cbar_thickness=25,
+    show_modebar=False,
+    enable_zoom=True,
+)
+
+
+
+

Warning

+

Scrolling Notice:

+

While interacting with the interactive Plotly plot below, scrolling down the +page using the mouse wheel may be blocked when the mouse pointer is hovering +over the plot. To continue scrolling, either move the mouse pointer outside +the plot area or use the keyboard arrow keys to navigate down the page.

+
+ + +

This interactive plot was generated using Plotly, which allows for rich, +interactive visualizations directly in the browser. The plot above is an example +of an interactive 3D Partial Dependence Plot. Here’s how it differs from +generating a static plot using Matplotlib.

+

Key Differences

+

Plot Type:

+
    +
  • The plot_type is set to "interactive" for the Plotly plot and "static" for the Matplotlib plot.

  • +
+

Interactive-Specific Parameters:

+
    +
  • HTML File Path and Name: The html_file_path and html_file_name parameters are required to save the interactive Plotly plot as an HTML file. These parameters are not needed for static plots.

  • +
  • Zoom and Positioning: The interactive plot includes parameters like zoom_out_factor, title_x, cbar_x, and cbar_thickness to control the zoom level, title position, and color bar position in the Plotly plot. These parameters do not affect the static plot.

  • +
  • Mode Bar and Zoom: The show_modebar and enable_zoom parameters are specific to the interactive Plotly plot, allowing you to toggle the visibility of the mode bar and enable or disable zoom functionality.

  • +
+

Static-Specific Parameters:

+
    +
  • Figure Size and Wireframe Color: The static plot uses parameters like figsize to control the size of the Matplotlib plot and wireframe_color to define the color of the wireframe in the plot. These parameters are not applicable to the interactive Plotly plot.

  • +
+

By adjusting these parameters, you can customize the behavior and appearance of your 3D Partial Dependence Plots according to your needs, whether for static or interactive visualization.

+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/genindex.html b/_build/html/v0.0.9/genindex.html new file mode 100644 index 000000000..2ece69c96 --- /dev/null +++ b/_build/html/v0.0.9/genindex.html @@ -0,0 +1,359 @@ + + + + + + + + Index — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | H + | K + | P + | S + +
+

A

+ + +
+ +

B

+ + +
+ +

C

+ + +
+ +

D

+ + +
+ +

E

+ + +
+ +

F

+ + +
+ +

H

+ + +
+ +

K

+ + +
+ +

P

+ + + +
+ +

S

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/getting_started.html b/_build/html/v0.0.9/getting_started.html new file mode 100644 index 000000000..1113a7f74 --- /dev/null +++ b/_build/html/v0.0.9/getting_started.html @@ -0,0 +1,247 @@ + + + + + + + + + Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

Welcome to the EDA Toolkit Python Library Documentation!

+
+

Note

+

This documentation is for eda_toolkit version 0.0.9.

+
+

The eda_toolkit is a comprehensive library designed to streamline and +enhance the process of Exploratory Data Analysis (EDA) for data scientists, +analysts, and researchers. This toolkit provides a suite of functions and +utilities that facilitate the initial investigation of datasets, enabling users +to quickly gain insights, identify patterns, and uncover underlying structures +in their data.

+ +
+

What is EDA?

+

Exploratory Data Analysis (EDA) is a crucial step in the data science workflow. +It involves various techniques to summarize the main characteristics of the data, +often with visual methods. EDA helps in understanding the data better, identifying +anomalies, discovering patterns, and forming hypotheses. This process is essential +before applying any machine learning models, as it ensures the quality and relevance +of the data.

+
+
+

Purpose of EDA Toolkit

+

The eda_toolkit library is a comprehensive suite of tools designed to +streamline and automate many of the tasks associated with Exploratory Data +Analysis (EDA). It offers a broad range of functionalities, including:

+
    +
  • Data Management: Tools for managing directories, generating unique IDs, +standardizing dates, and handling common DataFrame manipulations.

  • +
  • Data Cleaning: Functions to address missing values, remove outliers, and +correct formatting issues, ensuring data is ready for analysis.

  • +
  • Data Visualization: A variety of plotting functions, including KDE +distribution plots, stacked bar plots, scatter plots with optional best fit +lines, and box/violin plots, to visually explore data distributions, +relationships, and trends.

  • +
  • Descriptive and Summary Statistics: Methods to generate comprehensive +reports on data types, summary statistics (mean, median, standard deviation, +etc.), and to summarize all possible combinations of specified variables.

  • +
  • Reporting and Export: Features to save DataFrames to Excel with +customizable formatting, create contingency tables, and export generated +plots in multiple formats.

  • +
+
+
+

Key Features

+
    +
  • Ease of Use: The toolkit is designed with simplicity in mind, offering intuitive and easy-to-use functions.

  • +
  • Customizable: Users can customize various aspects of the toolkit to fit their specific needs.

  • +
  • Integration: Seamlessly integrates with popular data science libraries such as Pandas, NumPy, Matplotlib, and Seaborn.

  • +
  • Documentation and Examples: Comprehensive documentation and examples to help users get started quickly and effectively.

  • +
+
+
+

Prerequisites

+

Before you install eda_toolkit, ensure your system meets the following requirements:

+
    +
  • Python: version 3.7.4 or higher is required to run eda_toolkit.

  • +
+

Additionally, eda_toolkit depends on the following packages, which will be automatically installed when you install eda_toolkit:

+
    +
  • jinja2: version 3.1.4 or higher

  • +
  • matplotlib: version 3.5.3 or higher

  • +
  • nbformat: version 4.2.0 or higher

  • +
  • numpy: version 1.21.6 or higher

  • +
  • pandas: version 1.3.5 or higher

  • +
  • plotly: version 5.18.0 or higher

  • +
  • scikit-learn: version 1.0.2 or higher

  • +
  • seaborn: version 0.12.2 or higher

  • +
  • xlsxwriter: version 3.2.0 or higher

  • +
+
+
+

Installation

+

You can install eda_toolkit directly from PyPI:

+
pip install eda_toolkit
+
+
+
+
+
+

Description

+

This guide provides detailed instructions and examples for using the functions +provided in the eda_toolkit library and how to use them effectively in your projects.

+

For most of the ensuing examples, we will leverage the Census Income Data (1994) from +the UCI Machine Learning Repository [1]. This dataset provides a rich source of +information for demonstrating the functionalities of the eda_toolkit.

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/index.html b/_build/html/v0.0.9/index.html new file mode 100644 index 000000000..70255dc14 --- /dev/null +++ b/_build/html/v0.0.9/index.html @@ -0,0 +1,301 @@ + + + + + + + + + Table of Contents — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +
+

Table of Contents

+ + + + +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/objects.inv b/_build/html/v0.0.9/objects.inv new file mode 100644 index 000000000..b0208d461 Binary files /dev/null and b/_build/html/v0.0.9/objects.inv differ diff --git a/_build/html/v0.0.9/references.html b/_build/html/v0.0.9/references.html new file mode 100644 index 000000000..e2b31494c --- /dev/null +++ b/_build/html/v0.0.9/references.html @@ -0,0 +1,146 @@ + + + + + + + + + References — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
EDA Toolkit Logo + +

+
+

References

+
    +
  1. Hunter, J. D. (2007). Matplotlib: A 2D Graphics Environment. Computing in Science & Engineering, 9(3), 90-95. https://doi.org/10.1109/MCSE.2007.55.

  2. +
  3. Kohavi, R. (1996). Census Income. UCI Machine Learning Repository. https://doi.org/10.24432/C5GP7S.

  4. +
  5. Waskom, M. (2021). Seaborn: Statistical Data Visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021.

  6. +
  7. Pace, R. K., & Barry, R. (1997). Sparse Spatial Autoregressions. Statistics & Probability Letters, 33(3), 291-297. https://doi.org/10.1016/S0167-7152(96)00140-X.

  8. +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/search.html b/_build/html/v0.0.9/search.html new file mode 100644 index 000000000..56df2a139 --- /dev/null +++ b/_build/html/v0.0.9/search.html @@ -0,0 +1,151 @@ + + + + + + + + Search — EDA Toolkit 0.0.9 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, Leonid Shpaner, Oscar Gil.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/_build/html/v0.0.9/searchindex.js b/_build/html/v0.0.9/searchindex.js new file mode 100644 index 000000000..9569ec2b9 --- /dev/null +++ b/_build/html/v0.0.9/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[5, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[5, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[5, "id14"]], "3D Plots - CA Housing Example": [[5, "id15"]], "About EDA Toolkit": [[7, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[4, "adding-unique-identifiers"]], "Binning Numerical Columns": [[4, "binning-numerical-columns"]], "Box Plots Grid Example": [[5, "box-plots-grid-example"]], "Box and Violin Plots": [[5, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[5, "correlation-matrices"]], "Creating Contingency Tables": [[4, "creating-contingency-tables"]], "Data Management": [[7, null]], "Data Management Overview": [[4, null]], "Data Management Techniques": [[4, "data-management-techniques"]], "DataFrame Analysis": [[4, "dataframe-analysis"]], "Description": [[6, "description"]], "Full Correlation Matrix Example": [[5, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[5, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[4, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[7, null]], "Highlighting Specific Columns in a DataFrame": [[4, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[5, "histogram-example-count"]], "Histogram Example (Density)": [[5, "histogram-example-density"]], "Histogram Example - (Mean and Median)": [[5, "histogram-example-mean-and-median"]], "Histogram Example - (Mean, Median, and Std. Deviation)": [[5, "histogram-example-mean-median-and-std-deviation"]], "Histograms and Kernel Density Estimation (KDE)": [[5, "histograms-and-kernel-density-estimation-kde"]], "Installation": [[6, "installation"]], "Interactive Plot": [[5, "interactive-plot"]], "KDE Distribution Function": [[5, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[5, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[5, "kde-and-histograms-example"]], "Key Features": [[6, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[5, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Foundations": [[5, "partial-dependence-foundations"]], "Partial Dependence Plots": [[5, "partial-dependence-plots"]], "Path directories": [[4, "path-directories"]], "Pearson Correlation Coefficient": [[5, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[5, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[5, "pivoted-violin-plots-grid-example"]], "Plotting Heuristics": [[7, null]], "Plotting and Theoretical Overview": [[5, null]], "Prerequisites": [[6, "prerequisites"]], "Project Links": [[6, "project-links"]], "Purpose of EDA Toolkit": [[6, "purpose-of-eda-toolkit"]], "References": [[8, null]], "Regression-Centric Scatter Plots Example": [[5, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[5, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[4, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[5, "scatter-fit-plot"]], "Scatter Plots (All Combinations Example)": [[5, "scatter-plots-all-combinations-example"]], "Scatter Plots Grouped by Category Example": [[5, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[5, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[5, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[5, "stacked-crosstab-plots"]], "Standardized Dates": [[4, "standardized-dates"]], "Static Plot": [[5, "static-plot"]], "Table of Contents": [[7, null]], "Trailing Period Removal": [[4, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[5, "triangular-correlation-matrix-example"]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id7"], [1, "id8"], [1, "id9"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Version 0.0.9": [[1, "version-0-0-9"]], "Violin Plots Grid Example": [[5, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[6, null]], "What is EDA?": [[6, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "data_management", "eda_plots", "getting_started", "index", "references"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "data_management.rst", "eda_plots.rst", "getting_started.rst", "index.rst", "references.rst"], "indexentries": {"add_ids()": [[4, "add_ids", false]], "box_violin_plot()": [[5, "box_violin_plot", false]], "built-in function": [[4, "add_ids", false], [4, "contingency_table", false], [4, "dataframe_columns", false], [4, "ensure_directory", false], [4, "highlight_columns", false], [4, "parse_date_with_rule", false], [4, "save_dataframes_to_excel", false], [4, "strip_trailing_period", false], [4, "summarize_all_combinations", false], [5, "box_violin_plot", false], [5, "flex_corr_matrix", false], [5, "kde_distributions", false], [5, "plot_2d_pdp", false], [5, "plot_3d_pdp", false], [5, "scatter_fit_plot", false], [5, "stacked_crosstab_plot", false]], "contingency_table()": [[4, "contingency_table", false]], "dataframe_columns()": [[4, "dataframe_columns", false]], "ensure_directory()": [[4, "ensure_directory", false]], "flex_corr_matrix()": [[5, "flex_corr_matrix", false]], "highlight_columns()": [[4, "highlight_columns", false]], "kde_distributions()": [[5, "kde_distributions", false]], "parse_date_with_rule()": [[4, "parse_date_with_rule", false]], "plot_2d_pdp()": [[5, "plot_2d_pdp", false]], "plot_3d_pdp()": [[5, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[4, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[5, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[5, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[4, "strip_trailing_period", false]], "summarize_all_combinations()": [[4, "summarize_all_combinations", false]]}, "objects": {"": [[4, 0, 1, "", "add_ids"], [5, 0, 1, "", "box_violin_plot"], [4, 0, 1, "", "contingency_table"], [4, 0, 1, "", "dataframe_columns"], [4, 0, 1, "", "ensure_directory"], [5, 0, 1, "", "flex_corr_matrix"], [4, 0, 1, "", "highlight_columns"], [5, 0, 1, "", "kde_distributions"], [4, 0, 1, "", "parse_date_with_rule"], [5, 0, 1, "", "plot_2d_pdp"], [5, 0, 1, "", "plot_3d_pdp"], [4, 0, 1, "", "save_dataframes_to_excel"], [5, 0, 1, "", "scatter_fit_plot"], [5, 0, 1, "", "stacked_crosstab_plot"], [4, 0, 1, "", "strip_trailing_period"], [4, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 4, 5], "0": [2, 4, 5, 6, 7], "00": 4, "000000": 5, "0000ff": 5, "00140": [5, 8], "00bfc4": 5, "01": 4, "02": [1, 4], "03021": [5, 8], "04": [4, 5], "05": 5, "07": [4, 5], "09": 5, "1": [1, 4, 5, 6], "10": [2, 4, 5, 6, 8], "100": [4, 5], "1016": [5, 8], "10724": 5, "11": 4, "1109": [5, 8], "111": 4, "115": 5, "11687": 5, "11th": 4, "12": [4, 5, 6], "120": 5, "12202842": 4, "123": 4, "12929": 5, "13": [4, 5], "131": 5, "13162633": 2, "13163208": 2, "13174": 5, "1348": 4, "13920": [4, 5], "14": [4, 5], "147": 5, "14x4": 5, "15": [4, 5], "150": 4, "15784": 4, "15x5": 5, "16": [4, 5], "16192": 5, "17": 5, "18": [4, 5, 6], "1873": 5, "19716": 4, "1994": 6, "1996": [4, 5, 6, 8], "1997": [5, 8], "1b0": 7, "1d": 5, "1rc0": 7, "2": [4, 5, 6, 7], "20": [4, 5], "200": 4, "2007": [5, 8], "2020": 4, "2021": [4, 5, 8], "2022": 4, "2024": 2, "203488": 4, "21": [4, 5, 6], "21105": [5, 8], "2115": 5, "215646": 4, "22": 5, "22379": 4, "2245": 5, "22803": 4, "23": 5, "234721": 4, "24432": [4, 5, 6, 8], "24720": 4, "25": [1, 4, 5], "250": [4, 5], "2509": 5, "2565": 4, "26": 5, "27": 5, "274": 4, "28": [4, 5], "280": 5, "28523": 4, "29": [4, 5], "291": [5, 8], "295": 5, "297": [5, 8], "2d": [1, 7, 8], "3": [4, 5, 6, 7, 8], "30": [4, 5], "300": [4, 5], "3021": [5, 8], "3054": 5, "31": 4, "3188": 5, "32": 4, "32650": [4, 5], "33": [4, 5, 8], "333333": 5, "338409": 4, "33906": 4, "34": 5, "3461": 5, "35130194": 4, "36": [4, 5], "3680": 4, "37": [4, 5], "37155": 5, "38": [4, 5], "3853": 5, "39": [4, 5], "3986": 5, "3d": [1, 7], "3d_pdp": 5, "4": [4, 5, 6, 7], "40": [4, 5], "41": 5, "4110": 5, "41762": 4, "42": [4, 5], "42643227": 4, "4267": 4, "43832": 4, "44807": 4, "45": [4, 5], "46": 4, "46560": 4, "467": 4, "468": 4, "469": 4, "47": 5, "470": 4, "471": 4, "472": 4, "4746": 5, "48842": [4, 5], "49": [4, 5], "5": [4, 5, 6, 7], "50": [4, 5], "50k": [4, 5], "50k_": 5, "51": [4, 5], "5281": 2, "53": [4, 5], "535": 5, "55": [5, 8], "56": 4, "5623": 4, "5707": 5, "58": 5, "5856": 4, "59": [4, 5], "595": 5, "6": [4, 5, 6, 7, 8], "60": [4, 5, 8], "61": 4, "6172": 4, "62": 5, "64": [4, 5], "65": 5, "66": [4, 5], "6619": 5, "668": 5, "6738": 5, "68": 5, "69": [4, 5], "7": [4, 5, 6, 7], "70": [4, 5], "71": 5, "7152": [5, 8], "73": 5, "74": 4, "74130842": 4, "746": 5, "75": [4, 5], "7536": 5, "76": [4, 5], "77": 5, "77516": 4, "79": [4, 5], "8": [4, 5, 7], "80": [4, 5], "808080": 5, "809": 5, "81": 5, "815": 5, "82": 4, "8213": 5, "82943611": 4, "83": 5, "83311": 4, "85": [4, 5], "8601": 4, "861555": 4, "87": 5, "87104229": 4, "89": [4, 5], "8a": 7, "8b": 7, "8c": 7, "8d": 1, "9": [2, 4, 5, 6, 7, 8], "90": [4, 5, 8], "90069867": 4, "9076": 5, "91": [4, 5], "93": 5, "93837254": 4, "939": 5, "94": 5, "9468": 5, "95": [4, 5, 8], "96": [4, 5, 8], "96078789": 4, "963": 4, "966": 4, "97": 4, "97751875": 4, "98": 4, "99": [4, 5], "A": [1, 4, 5, 6, 8], "As": 5, "By": [1, 5], "For": [4, 5, 6], "If": [1, 4, 5], "In": [4, 5], "Into": 5, "It": [1, 4, 5, 6], "No": [1, 5], "Not": 4, "One": 1, "The": [1, 4, 5, 6], "Then": 4, "There": 5, "These": [1, 4, 5], "To": 5, "With": [3, 7], "_": 5, "_c": 5, "_plotli": 1, "abil": [1, 5], "abl": 5, "about": 4, "abov": [1, 5], "academ": 0, "accept": 1, "access": 5, "accord": [1, 5], "accordingli": 4, "account": 1, "accur": [1, 5], "accuraci": 4, "acknowledg": [1, 7], "across": [1, 4, 5], "actual": 5, "ad": [1, 5, 7], "adapt": [1, 4, 5], "add": [1, 4, 5], "add_best_fit_lin": 5, "add_id": [1, 4, 7], "addit": [1, 5], "addition": [4, 5, 6], "address": [1, 6], "adher": 5, "adjust": [1, 4, 5], "adm": 4, "advanc": 4, "aesthet": [1, 5], "affect": 5, "after": [1, 4, 5], "ag": [4, 5], "against": 5, "age_boxplot_list": 5, "age_group": [4, 5], "ages_18_to_40": 4, "aggreg": 5, "alic": 4, "align": [1, 4, 5], "all": [1, 4, 6, 7], "all_combin": 4, "all_var": 5, "allow": [1, 4, 5], "alon": 5, "along": [1, 4, 5], "alpha": [1, 5], "alreadi": 4, "also": [0, 1, 5], "altern": 5, "alwai": [1, 4], "amount": 4, "an": [0, 1, 3, 4, 5], "analysi": [1, 5, 6, 7], "analyst": 6, "analyt": 3, "analyz": [1, 4, 5], "angl": [1, 5], "ani": [1, 4, 5, 6], "annot": [1, 5], "anomali": 6, "anoth": 5, "anyth": 1, "appar": 5, "appear": [1, 5], "append": [4, 5], "appli": [0, 1, 3, 4, 5, 6], "applic": [1, 5], "approach": 5, "appropri": [1, 5], "approxim": 5, "ar": [1, 4, 5], "area": 5, "arg": 1, "argument": [1, 5], "around": [1, 5], "arrai": 5, "arrang": 5, "arrow": 5, "artifact": 4, "artifici": 3, "asian": 4, "aspect": [1, 5, 6], "assess": 5, "assign": [1, 4, 5], "associ": [5, 6], "assum": 4, "assumpt": 7, "astyp": 1, "attempt": [4, 5], "attent": 5, "attract": 5, "attribut": 5, "aug": 2, "author": [2, 3], "auto": 5, "autofit": 4, "autom": [3, 6], "automat": [1, 5, 6], "autoregress": [5, 8], "avail": 5, "aveoccup": 5, "averag": 5, "averoom": 5, "avoid": [1, 5], "ax": [1, 5], "axi": [1, 5], "azimuth": 5, "bachelor": 4, "back": [4, 5], "backbon": 4, "background": 4, "background_color": [1, 4], "backward": 1, "badg": 1, "band": 5, "bandwidth": 5, "bar": [1, 6, 7], "barh": 5, "barri": [5, 8], "base": [1, 4, 5], "base_path": 4, "bbox_inch": 5, "becaus": [4, 5], "been": [1, 4, 5], "befor": [1, 4, 5, 6], "begin": [4, 5], "behavior": 5, "being": [4, 5], "bell": 5, "below": [4, 5], "beneath": 5, "benefici": 5, "best": [1, 6, 7], "best_fit_linecolor": 5, "best_fit_linestyl": 5, "beta": 1, "better": [1, 5, 6], "between": [1, 4, 5], "bin": [1, 5, 7], "bin_ag": 4, "binrang": 5, "binwidth": [1, 5], "black": [4, 5], "block": 5, "blue": 5, "bob": 4, "bold": 4, "bool": [4, 5], "boolean": [1, 5], "border": 4, "both": [1, 4, 5], "bound": [4, 5], "boundari": 4, "box": [1, 6, 7], "box_violin_plot": [1, 5, 7], "boxplot": 5, "breakdown": 5, "brief": 1, "bring": 3, "broad": [1, 6], "brown": 5, "browser": 5, "bug": 1, "built": 5, "c0": 5, "c5gp7": [4, 5, 6, 8], "c_i": 5, "ca": 7, "calcul": 5, "california": [3, 5], "call": [1, 4, 5], "camera": [1, 5], "can": [1, 4, 5, 6], "cancer": 5, "cannot": 4, "capabl": [1, 4], "capit": 4, "captur": 5, "career": 0, "case": [1, 4, 5], "categor": [1, 4, 5], "categori": [4, 7], "cbar_label": 5, "cbar_thick": [1, 5], "cbar_x": [1, 5], "cdot": 5, "cell": 4, "censu": [4, 5, 6, 8], "census_id": 4, "census_summary_t": 4, "center_baselin": 5, "central": 5, "centric": 7, "certain": 5, "certifi": 1, "cervic": 5, "chang": [1, 5], "changelog": 7, "charact": [4, 5], "characterist": 6, "charli": 4, "check": [1, 4, 5], "choos": [1, 4, 5], "circl": 5, "citat": 1, "cite": 7, "civ": 4, "clariti": [1, 5], "clean": [1, 4, 5, 6], "cleaner": [1, 4], "cleanup": 1, "clear": [1, 5], "clearer": 1, "clearli": 1, "cleric": 4, "closer": 5, "clutter": 5, "cmap": [1, 5], "code": [1, 4, 5], "codebas": 1, "coeffici": 7, "cohes": 5, "col": [1, 4, 5], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 4, 5], "colorbar": 5, "colormap": [1, 5], "column": [1, 5, 7], "column_nam": 4, "combin": [1, 6, 7], "come": 1, "comment": 1, "common": [1, 4, 6], "compar": 5, "comparison": 5, "compat": [1, 5], "complement": 5, "complementari": 5, "complet": 5, "complex": [1, 5], "comprehens": [1, 5, 6], "comput": [5, 8], "concept": 5, "condit": 1, "condition": 1, "configur": [1, 5], "confirm": 1, "confus": [1, 5], "consecut": 4, "consid": 5, "consist": [1, 4, 5], "consolid": 1, "constant": [4, 5], "constraint": 4, "contain": [4, 5], "content": 4, "context": 5, "conting": [1, 5, 6, 7], "contingency_t": [4, 7], "continu": [1, 4, 5], "contour": 5, "contrast": 5, "contributor": 7, "control": [1, 5], "convers": [1, 4], "convert": [1, 4], "coolwarm": [1, 5], "coordin": 1, "cornel": 3, "correct": [1, 5, 6], "correctli": [1, 4, 5], "correl": [1, 7], "correspond": [1, 4, 5], "count": [1, 4, 7], "countri": 4, "cours": 3, "cov": 5, "covari": 5, "creat": [1, 5, 6, 7], "creation": 5, "crop": 5, "crosstab": [1, 7], "crosstab_age_incom": 5, "crosstab_age_sex": 5, "crosstabs_dict": 5, "crosstabs_onli": 5, "crucial": [4, 5, 6], "current": 4, "curv": 5, "custom": [1, 5, 6, 7], "custom_ord": 5, "customiz": [1, 5, 6], "cut": 4, "d": [5, 8], "dai": 4, "dark": 5, "dashboard": 5, "data": [0, 1, 3, 5, 6, 8], "data_nam": 4, "data_output": 4, "data_path": 4, "data_typ": 1, "datafram": [1, 5, 6, 7], "dataframe_column": [1, 4, 7], "dataset": [4, 5, 6], "date": [1, 6, 7], "date_column": 4, "date_str": 4, "datetim": 1, "david": 4, "dd": 4, "deal": [4, 5], "decad": 3, "decim": [1, 4], "decimal_plac": [1, 4], "decis": [1, 5], "decreas": 5, "dedic": 0, "deeper": 5, "deepest": 0, "default": [1, 4, 5], "defin": [1, 4, 5], "definit": 4, "degre": [1, 5], "demograph": 5, "demonstr": [4, 5, 6], "denot": 5, "densiti": [1, 7], "depend": [1, 4, 6, 7], "deprec": 1, "depth": [1, 5], "descend": [4, 5], "describ": [1, 5], "descript": [1, 7], "design": [4, 5, 6], "detail": [1, 4, 5, 6], "determin": 5, "develop": 3, "deviat": [1, 6, 7], "df": [1, 4, 5], "df_censu": 4, "df_dict": 4, "df_num": 5, "dict": [4, 5], "dictionari": [4, 5], "did": 1, "diego": [0, 3], "differ": [1, 5], "digit": [1, 4], "dimens": 5, "dimensionless": 5, "dir": 4, "direct": 5, "directli": [1, 5, 6], "directori": [5, 6, 7], "disabl": [1, 5], "disable_sci_not": [1, 5], "discov": 6, "discret": [4, 5], "dispers": 5, "displai": [1, 4, 5], "distinct": [1, 5], "distinguish": 5, "distract": 5, "distribut": [1, 4, 6, 7], "dive": 4, "divers": 1, "divid": [4, 5], "divorc": 4, "do": [1, 4, 5], "docstr": 1, "document": [1, 7], "doe": [1, 4, 5], "doi": [2, 4, 5, 6, 8], "don": 5, "dot": 5, "doubl": 5, "down": 5, "dr": 0, "draw": 5, "driven": 4, "dtype": 4, "due": [1, 4], "duplic": 1, "dure": [0, 1], "dx_": 5, "dx_c": 5, "dynam": 1, "e": [1, 4, 5], "each": [1, 4, 5], "eas": [1, 4, 6], "easi": [5, 6], "easier": [1, 5], "easili": 5, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 5, 6], "edg": [1, 5], "edgecolor": 1, "educ": [0, 3, 4, 5], "effect": [1, 3, 4, 5, 6], "either": [1, 4, 5], "element": [1, 4, 5], "elev": 5, "els": 1, "emp": 4, "emphas": 1, "emploi": 5, "empti": 4, "enabl": [1, 5, 6], "enable_zoom": [1, 5], "end": [1, 4, 5], "endeavor": 0, "endpoint": 4, "engin": [0, 5, 8], "enhanc": [1, 4, 5, 6], "enough": 1, "ensembl": 5, "ensu": 6, "ensur": [1, 4, 5, 6], "ensure_directori": [4, 7], "enter": [1, 4], "entir": [4, 5], "entri": [1, 5], "environ": [0, 1, 5, 8], "equal": 5, "equat": 5, "equival": 4, "error": [1, 4], "especi": [1, 4, 5], "essenti": [4, 5, 6], "estim": 7, "etc": 6, "ev": 4, "evalu": 5, "even": 5, "everyth": 5, "exact": 1, "examin": 5, "exampl": [1, 4, 6, 7], "exce": 4, "excel": [3, 6, 7], "except": [0, 1, 4], "excess": 5, "exclud": [4, 5], "exclus": 4, "exec": 4, "execut": 5, "exist": [1, 4], "exp": 5, "expand": 1, "expect": [1, 5], "experi": [1, 3], "explain": [1, 4], "explan": 1, "explicitli": 1, "explor": [1, 5, 6], "exploratori": 6, "export": [5, 6], "express": [0, 5], "extend": [0, 5], "extens": [1, 5], "extract": [1, 5], "f": [1, 5], "f8766d": 5, "f8c5c8": 4, "facilit": [3, 4, 6], "factor": 5, "fall": [4, 5], "fallback": 1, "fals": [1, 4, 5], "famili": 4, "fashion": 5, "featur": [1, 4, 5, 7], "feature_nam": 5, "feature_names_list": [1, 5], "feder": 4, "feedback": 1, "femal": [4, 5], "female_": 5, "fetch": 5, "fetch_california_h": 5, "few": 5, "ff0000": 5, "figsiz": [1, 5], "figur": [1, 5], "file": [1, 4, 5], "file_nam": 4, "file_path": 4, "file_prefix": [1, 5], "filenam": [1, 5], "fill": [1, 5], "fill_alpha": [1, 5], "fillna": 1, "filter": [4, 5], "filtered_df": 4, "financi": [3, 5], "find": 1, "first": [1, 4, 5], "fit": [1, 6, 7], "fix": 1, "flag": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 5], "flip": 5, "float": [4, 5], "fnlwgt": 4, "focu": 5, "focus": 5, "folder": 4, "follow": [1, 4, 5, 6], "font": [1, 5], "fontsiz": 1, "form": [4, 6], "format": [1, 5, 6, 7], "formatth": 5, "former": 4, "formerli": 1, "formula": 5, "found": 1, "foundat": 7, "four": 5, "frac": 5, "freedom": 5, "frequenc": [1, 5], "frequent": 4, "friendli": 1, "from": [0, 1, 3, 4, 5, 6], "full": [1, 4, 7], "fulli": 5, "func_col": [1, 5], "function": [1, 4, 6, 7], "further": [1, 5], "futur": [1, 5], "futurewarn": 5, "g": [1, 4, 5], "gain": [4, 6], "gaussian": 7, "gener": [1, 5, 6, 7], "geq": 4, "get": 6, "get_text": 1, "gil": [2, 3], "github": 6, "give": 1, "given": [1, 4, 5], "glanc": 5, "go": 4, "got": 1, "gov": 4, "grad": 4, "gradientboostingregressor": 5, "graduat": 0, "granular": 1, "graphic": [5, 8], "gratitud": 0, "greater": [1, 4], "green": 5, "grei": 5, "grid": [1, 7], "grid_figs": 5, "grid_resolut": 5, "grid_valu": 5, "ground": 5, "group": [1, 4, 7], "gt": 5, "guid": [0, 6], "guidanc": 1, "guidelin": 5, "h": [4, 5], "h_pad": 5, "ha": [1, 3, 4, 5], "half": 5, "halv": 5, "handl": [1, 4, 5, 6], "handler": 4, "hat": 5, "have": [1, 5], "he": 3, "header": [1, 4], "health": 3, "healthcar": 3, "heatmap": [1, 5], "height": 5, "help": [1, 4, 5, 6], "here": [4, 5], "hex": [1, 4], "hi": 0, "hidden": 5, "hide": [1, 5], "hide_index": 1, "high": [1, 5], "higher": [5, 6], "highli": 5, "highlight": [1, 5, 7], "highlight_column": [4, 7], "highlighted_df": 4, "hist": [1, 5], "hist_color": 5, "hist_edgecolor": [1, 5], "histogram": [1, 7], "hold": [3, 5], "horizont": [1, 5], "hour": [4, 5], "hous": 7, "houseag": 5, "household": 5, "hover": 5, "how": [4, 5, 6], "howev": [1, 5], "html": [4, 5], "html_file_nam": [1, 5], "html_file_path": [1, 5], "http": [2, 4, 5, 6, 8], "huber": 5, "hue": [1, 5], "hue_dict": 5, "hue_palett": 5, "hunter": [5, 8], "husband": 4, "hyperlink": 4, "hypothes": 6, "i": [1, 3, 4, 5, 7], "icon": 1, "id": [1, 4, 6], "id_colnam": 4, "identifi": [1, 5, 6, 7], "ignor": 5, "illustr": 5, "imag": [4, 5], "image_filenam": 5, "image_path_png": [1, 4, 5], "image_path_svg": [1, 4, 5], "immedi": 5, "impact": [1, 5], "implement": 1, "import": [1, 4, 5], "imposs": 4, "improv": 1, "inc": 4, "inch": 5, "includ": [1, 4, 5, 6], "inclus": 4, "incom": [4, 5, 6, 8], "inconsist": [1, 4], "incorpor": 1, "incorrect": [1, 5], "increas": 5, "increment": 1, "independ": 1, "index": [1, 4, 5], "indic": [1, 4, 5], "individu": [1, 5], "individual_figs": 5, "industri": 3, "inf": 4, "infin": 4, "influenc": [1, 5], "influenti": 5, "inform": [5, 6], "initi": 6, "inner": 5, "input": [1, 5], "insight": [5, 6], "instal": 7, "instanc": 5, "instead": [1, 5], "instruct": 6, "int": [1, 4, 5], "int64": 4, "integ": 1, "integr": [5, 6], "intellig": 3, "interact": [1, 7], "interest": 5, "interfac": [1, 5], "intern": [1, 5], "interpret": [1, 5], "interv": 4, "introduc": 1, "introduct": 1, "intuit": [1, 5, 6], "invalid": 1, "invalu": 5, "investig": 6, "involv": [4, 5, 6], "io": 4, "island": 4, "iso": 4, "issu": [1, 6], "item": 5, "iter": 5, "its": [1, 4], "itself": 5, "j": [5, 8], "jinja2": 6, "join": 4, "joint": 5, "jointli": 5, "joss": [5, 8], "journal": [5, 8], "journei": 0, "jupyt": 4, "just": 5, "k": [5, 8], "kde": [1, 6, 7], "kde_color": 5, "kde_density_single_distribut": 5, "kde_distribut": [1, 5, 7], "keep": 5, "kei": [1, 4, 5, 7], "kernel": 7, "keyboard": 5, "keyerror": 5, "keyword": [1, 5], "kind": 5, "kohavi": [4, 5, 6, 8], "kwarg": [1, 5], "l": 2, "label": [1, 4, 5], "label_ag": 4, "label_fonts": [1, 5], "label_nam": 5, "larg": 5, "largest": 5, "last": 4, "latest": 1, "layout": [1, 5], "ldot": 5, "lead": 5, "learn": [0, 1, 3, 4, 5, 6, 8], "learning_r": 5, "least": [1, 4], "lectur": 3, "left": [4, 5], "left_margin": [1, 5], "legend": [1, 5], "legend_label": 5, "legend_labels_list": 5, "legibl": 5, "length": [4, 5], "leonid": [2, 3], "leq": 4, "less": [1, 4], "let": 5, "letter": [5, 8], "level": [4, 5], "leverag": [5, 6], "librari": [1, 4, 5, 7], "licens": 1, "like": [0, 5], "limit": [1, 4, 5], "line": [1, 6, 7], "linear": 5, "linestyl": 5, "link": 7, "list": [1, 4, 5], "load": [4, 5], "local": 4, "locat": [4, 5], "log": [1, 5], "log_scale_var": [1, 5], "logarithm": 5, "logic": 1, "logo": 1, "logscal": 5, "long": 5, "longer": 5, "loop": 5, "loss": [4, 5], "lower": [1, 5], "lt": [4, 5], "m": [0, 3, 5, 8], "machin": [1, 3, 4, 5, 6, 8], "made": 1, "magnitud": 5, "mai": [1, 5], "main": 6, "maintain": [1, 5, 7], "make": [1, 4, 5], "male": [4, 5], "male_": 5, "manag": [1, 3, 5, 6], "manageri": 4, "mani": [5, 6], "manipul": 6, "manner": 5, "manual": [1, 5], "map": [1, 5], "marco": 0, "margin": [1, 5], "marit": 4, "mark": [1, 5], "marker": 5, "marri": 4, "master": 3, "match": [1, 5], "mathbb": 5, "mathbf": 5, "mathemat": [4, 5], "matplotlib": [1, 5, 6, 8], "matplotlib_colormap": 5, "matric": [1, 7], "matrix": [1, 7], "max": 5, "max_col": 5, "max_depth": 5, "max_unique_valu": 4, "max_unique_value_pct": 4, "max_unique_value_tot": 4, "maximum": 5, "mcse": [5, 8], "mean": [1, 4, 6, 7], "mean_color": 5, "meaning": [4, 5], "measur": 5, "mechan": 1, "median": [1, 6, 7], "median_color": 5, "medinc": 5, "meet": 6, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 5, 6], "metric": 5, "metrics_box_violin": 1, "metrics_boxplot_comp": 5, "metrics_comp": 5, "metrics_list": 5, "mid": 5, "might": 5, "min": 5, "min_length": 4, "mind": 6, "minim": [1, 5], "minimum": [4, 5], "minor": 1, "misalign": 5, "misinterpret": 5, "mislead": 1, "miss": [1, 4, 5, 6], "mm": 4, "mode": [1, 5], "model": [1, 5, 6], "model_select": 5, "modifi": [1, 5], "month": [2, 4], "more": [1, 4, 5], "most": [1, 4, 5, 6], "mous": 5, "move": [1, 5], "mu": 5, "mu_i": 5, "mu_x": 5, "much": 5, "multidimension": 5, "multipl": [1, 4, 5, 6], "multipli": 1, "must": [4, 5], "my_datafram": 1, "n": 5, "n_col": 5, "n_estim": 5, "n_row": 5, "na": [1, 4], "name": [1, 4, 5], "nativ": 4, "navig": [4, 5], "nbformat": 6, "ndarrai": 5, "necessari": [1, 4], "need": [1, 4, 5, 6], "neg": 5, "neither": [1, 5], "nest": 5, "neutral": 5, "never": 4, "new": [1, 4, 5], "newer": 5, "next": [4, 5], "nh": 5, "nomenclatur": 1, "non": [1, 4, 7], "none": [1, 4, 5], "nor": [1, 5], "normal": [1, 7], "notat": [1, 5], "note": [4, 5], "notebook": 4, "noth": 4, "notic": 5, "now": 1, "np": 5, "null": [1, 4], "null_pct": 4, "null_tot": 4, "num": [4, 5], "num_digit": 4, "number": [1, 4, 5], "numer": [1, 5, 7], "numpi": [5, 6], "o": [2, 4, 5], "object": [1, 4, 5], "observ": 5, "obviou": 5, "occup": [4, 5], "occurr": 4, "offer": [1, 5, 6], "often": [5, 6], "older": [1, 5], "omit": 1, "one": [1, 4, 5], "onli": [1, 5], "opaqu": 5, "open": [5, 8], "oper": [4, 5], "optim": 5, "option": [1, 4, 5, 6], "orang": 5, "order": [1, 4, 5], "org": [2, 4, 5, 6, 8], "organ": [1, 5], "orient": 5, "origin": [4, 5], "original_df": 4, "oscar": [2, 3], "other": [1, 4, 5], "otherwis": 5, "our": 0, "out": 5, "outcom": 5, "outlier": 6, "output": [1, 4, 5], "outsid": 5, "over": [1, 3, 5], "overal": [1, 5], "overlai": 5, "overlaid": 5, "overlap": 5, "overrid": 5, "overview": 7, "own": 5, "p": 5, "pac": 4, "pace": [5, 8], "packag": 6, "pad": [1, 5], "page": [5, 6], "pair": [4, 5], "pairwis": 5, "palett": 5, "panda": [1, 4, 5, 6], "param": 1, "paramet": [1, 4, 5], "parametr": 5, "pardir": 4, "parent": 4, "pars": 4, "parse_date_with_rul": [4, 7], "part": 4, "partial": [1, 7], "partial_depend": 5, "particular": 5, "particularli": [1, 4, 5], "pass": [1, 5], "path": [1, 5, 7], "patient": 4, "pattern": [5, 6], "pd": [4, 5], "pdf": 5, "pdp": 5, "pearson": 7, "per": [4, 5], "percent": [1, 5], "percentag": 4, "perfect": 5, "perfectli": 5, "perform": [1, 4, 5], "performancewarn": 1, "period": 7, "person": 3, "perspect": [1, 5], "pi": 5, "pink": 4, "pip": 6, "pitfal": 1, "pivot": [0, 7], "place": [1, 4], "plai": 0, "plain": 4, "plot": [1, 6], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_mean": 5, "plot_median": 5, "plot_typ": [1, 5], "plotli": [1, 5, 6], "plotly_colormap": 5, "plots_onli": 5, "plt": 1, "pm": 5, "png": [1, 4, 5], "png_imag": 4, "point": [1, 5], "pointer": 5, "popul": 5, "popular": 6, "posit": [1, 5], "possibl": [4, 5, 6], "potenti": [1, 4, 5], "power": [1, 5], "pr": 1, "pre": 1, "preced": 5, "predict": [1, 5], "prefer": [1, 5], "prefix": [1, 5], "prepar": [1, 4, 5], "prerequisit": 7, "present": [1, 4, 5], "preval": 5, "prevent": [1, 4, 5], "previou": [1, 5], "previous": 1, "price": 5, "print": [1, 4, 5], "prior": 5, "privat": 4, "probabl": [1, 5, 8], "process": [1, 4, 6], "produc": [1, 5], "product": 5, "prof": 4, "profession": 3, "program": [0, 3], "project": [1, 3, 4, 7], "promin": 5, "proper": [1, 5], "properli": 5, "proport": [1, 4, 5], "provid": [0, 1, 4, 5, 6], "public": 5, "publish": 2, "purpl": 5, "purpos": [1, 7], "pursu": 0, "py": 1, "pypi": [1, 6], "python": [1, 3, 5, 7], "qualiti": [5, 6], "quantifi": 5, "quantit": 5, "quick": 5, "quickli": [5, 6], "r": [3, 4, 5, 6, 8], "r_": 5, "race": 4, "rais": [1, 4, 5], "random": 4, "random_st": 5, "rang": [4, 5, 6], "raw": 5, "re": [1, 5], "read": 4, "readabl": [1, 5], "readi": 6, "readm": 1, "record": 4, "red": 5, "reduc": [1, 5], "redund": 5, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 5], "regress": 7, "regular": [1, 7], "relat": [4, 5], "relationship": [4, 5, 6], "releas": 1, "relev": 6, "reli": 5, "reliabl": 4, "remain": [1, 5], "remov": [1, 5, 6, 7], "remove_stack": [1, 5], "renam": [1, 5], "render": 4, "replac": 4, "replica": 1, "report": [3, 5, 6], "repositori": [4, 5, 6, 8], "repres": [1, 4, 5], "represent": [1, 5], "reproduc": 4, "requir": [1, 5, 6], "research": 6, "reset": 1, "resolut": 5, "respect": [4, 5], "respons": 5, "rest": 5, "result": [1, 4, 5], "return": [1, 4, 5], "return_df": [1, 4], "return_dict": 5, "reveal": 5, "rich": [5, 6], "right": [4, 5], "right_margin": [1, 5], "riversid": 3, "robust": 1, "role": [0, 1], "rot": 5, "rotat": [1, 5], "rotate_plot": 5, "round": 4, "row": [4, 5], "rule": 4, "run": 6, "s0167": [5, 8], "same": [1, 5], "sampl": [4, 5], "san": [0, 3], "save": [1, 5, 6, 7], "save_dataframes_to_excel": [1, 4, 7], "save_format": [1, 5], "save_plot": [1, 5], "scale": [1, 5], "scatter": [1, 6, 7], "scatter_color": 5, "scatter_fit_plot": [1, 5, 7], "scatterplot": 5, "scenario": [1, 5], "schema": 5, "scheme": 5, "school": 0, "scienc": [0, 3, 4, 5, 6, 8], "scientif": [1, 5], "scientist": [0, 3, 6], "scikit": [1, 5, 6], "scroll": 5, "seaborn": [1, 5, 6, 8], "seamlessli": 6, "second": [4, 5], "section": [1, 4], "see": 5, "seed": 4, "select": [1, 5], "select_dtyp": 5, "self": 4, "separ": [1, 4, 5], "sequenc": 5, "seri": 4, "serv": [1, 3], "servic": 3, "set": [1, 4, 5], "set_as_index": 4, "set_titl": 1, "setminu": 5, "setp": 1, "setup": [1, 4, 5], "sever": [1, 5], "sex": [4, 5], "shape": [4, 5], "sheet": 4, "shilei": 0, "should": 5, "show": [4, 5], "show_cbar": 5, "show_correl": 5, "show_legend": 5, "show_modebar": [1, 5], "show_plot": 5, "showcas": 5, "shown": 5, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 5, "sigma_i": 5, "sigma_x": 5, "signatur": 1, "signific": 1, "silver": 5, "similarli": 5, "simpl": 5, "simpler": 1, "simplic": 6, "simplif": 1, "simplifi": [1, 4], "simultan": 5, "sinc": 5, "singl": [1, 4, 5], "single_figs": 5, "single_var_image_filenam": 5, "size": [1, 4, 5], "sklearn": 5, "slightli": 1, "small": 1, "smallest": 5, "smooth": 5, "smoother": [1, 5], "sn": 5, "snippet": [4, 5], "so": [1, 4, 5], "softwar": [2, 5, 8], "some": [1, 4], "sort": [1, 4], "sort_bi": [1, 4], "sortbi": 1, "sourc": [5, 6, 8], "space": [1, 5], "span": 5, "spars": [5, 8], "spatial": [5, 8], "special": 4, "specialti": 4, "specif": [1, 5, 6, 7], "specifi": [1, 4, 5, 6], "split": 5, "spous": 4, "spread": 5, "sql": 3, "sqrt": 5, "squar": 5, "stabil": 1, "stabl": 1, "stack": [1, 6, 7], "stacked_crosstab": 5, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 5, 6, 7], "standardized_d": 4, "start": [1, 4, 6], "stat": [1, 5], "state": 4, "static": [1, 7], "statist": [1, 3, 4, 5, 6, 8], "statu": [1, 4], "std": 7, "std_color": 5, "std_dev_level": 5, "stem": 5, "step": [1, 6], "still": [1, 5], "store": [1, 5], "str": [1, 4, 5], "straightforward": 1, "streamlin": [1, 4, 6], "strength": 5, "string": [1, 4, 5], "strip": 4, "strip_trailing_period": [4, 7], "stronger": 5, "structur": [1, 6], "style": [1, 4, 5], "styler": [1, 4], "subplot": 5, "subset": 5, "substitut": 5, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suit": 6, "suitabl": 1, "sum_": 5, "summar": [5, 6], "summari": [1, 6, 7], "summarize_all_combin": [4, 7], "summary_t": 4, "support": [0, 1, 5], "suppos": 5, "suppress": 5, "sure": 4, "surfac": [1, 5], "svg": [1, 4, 5], "svg_imag": 4, "sy": 1, "system": [4, 6], "t": 5, "tab": 4, "tabl": [1, 5, 6], "tailor": 5, "take": [4, 5], "tall": 5, "target": 5, "tarshizi": 0, "task": [4, 6], "tatist": 5, "teach": 3, "techniqu": [6, 7], "ten": 3, "tend": 5, "tendenc": 5, "test": [1, 5], "test_siz": 5, "text": [1, 4, 5], "text_wrap": [1, 5], "th": 5, "than": [1, 4], "thank": 0, "thei": [4, 5], "them": [1, 4, 5, 6], "theoret": 7, "therefor": 5, "thi": [1, 4, 5, 6], "thick": 5, "those": 1, "three": 5, "through": [1, 5], "throw": 1, "thu": 4, "tick": [1, 5], "tick_fonts": [1, 5], "tight": 5, "time": [0, 1, 4, 5], "titl": [1, 2, 5], "title_i": [1, 5], "title_x": [1, 5], "to_list": 5, "togeth": 5, "toggl": [1, 5], "tool": [1, 5, 6], "toolkit": 1, "top": 5, "top_margin": [1, 5], "topic": 4, "total": [4, 5], "toward": 1, "trail": 7, "train": 5, "train_test_split": 5, "transpar": [1, 5], "trend": [5, 6], "triangl": 5, "triangular": [1, 7], "true": [1, 4, 5], "truth": 5, "try": 1, "tupl": [1, 4, 5], "two": [1, 4, 5], "type": [1, 4, 5, 6], "u": [0, 4, 5], "uci": [4, 5, 6, 8], "ucla": 3, "unambigu": 4, "uncov": [5, 6], "underli": [5, 6], "understand": [4, 5, 6], "uniform": 1, "uniqu": [1, 5, 6, 7], "unique_values_tot": 4, "unique_var": 4, "unit": 4, "univers": [0, 3], "unrecogn": 4, "unstack": 5, "unus": 1, "unwav": 0, "up": [1, 4, 5], "updat": [1, 4, 5], "upper": [1, 4, 5], "upright": 5, "url": 2, "us": [1, 4, 5, 6], "usabl": 1, "usag": [1, 4, 5], "user": [1, 5, 6], "userwarn": 5, "util": [4, 5, 6], "v": 5, "valid": 1, "valid_plot_typ": 1, "valu": [1, 4, 5, 6], "valueerror": [1, 4, 5], "vari": 5, "variabl": [1, 5, 6, 7], "varianc": 5, "varieti": [3, 5, 6], "variou": [1, 5, 6], "vars_of_interest": 5, "vdot": 4, "vector": 5, "verbiag": 1, "verifi": [1, 4], "versa": 5, "versatil": 5, "version": [2, 5, 6, 7], "version_info": 1, "versu": 1, "vertic": [1, 5], "via": [1, 5], "vice": 5, "view": [1, 5], "view_angl": 5, "violin": [1, 6, 7], "violinplot": 5, "viridi": 5, "visibl": [1, 5], "visual": [1, 4, 5, 6, 8], "vmax": 5, "vmin": 5, "vriabl": 5, "w_pad": 5, "wa": [1, 5], "wai": 5, "want": [1, 5], "wareh": 3, "warn": [1, 4, 5], "waskom": [5, 8], "we": [0, 4, 5, 6], "week": [4, 5], "welcom": 7, "well": [4, 5], "were": 4, "what": [1, 7], "wheel": 5, "when": [1, 4, 5, 6], "where": [1, 4, 5], "whether": [1, 4, 5], "which": [1, 4, 5, 6], "while": [1, 5], "white": 4, "whitespac": 5, "who": 1, "wide": [3, 5], "width": [1, 5], "wife": 4, "wirefram": [1, 5], "wireframe_color": 5, "wish": 5, "within": [1, 3, 4, 5], "without": [1, 4, 5], "work": [1, 4, 5], "workclass": 4, "workflow": [4, 6], "would": [0, 1, 5], "wrangl": 3, "wrap": [1, 5], "write": 4, "x": [1, 4, 5, 8], "x_": 5, "x_1": 5, "x_2": 5, "x_c": 5, "x_i": 5, "x_j": 5, "x_k": 5, "x_label": [1, 5], "x_label_plotli": 1, "x_n": 5, "x_p": 5, "x_test": 5, "x_train": 5, "x_var": 5, "xlabel": 5, "xlabel_align": 5, "xlabel_rot": 5, "xlim": [1, 5], "xlsx": 4, "xlsxwriter": 6, "xx": 1, "xy": 5, "y": [1, 5], "y_axis_label": 5, "y_i": 5, "y_label": [1, 5], "y_label_plotli": 1, "y_test": 5, "y_train": 5, "y_var": 5, "year": [2, 3, 4], "yellow": 4, "ylabel": 5, "ylabel_align": 5, "ylabel_rot": 5, "ylim": [1, 5], "you": [4, 5, 6], "your": [4, 5, 6], "yy": 1, "yyyi": 4, "z": 5, "z_label": [1, 5], "z_label_plotli": 1, "zenodo": [1, 2], "zero": [1, 4], "zoom": [1, 5], "zoom_out_factor": [1, 5], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Data Management Overview", "Plotting and Theoretical Overview", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References"], "titleterms": {"0": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 5, "3": 1, "3d": 5, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "9": 1, "With": 5, "about": 7, "acknowledg": 0, "ad": 4, "all": 5, "analysi": 4, "assumpt": 5, "bar": 5, "best": 5, "bin": 4, "box": 5, "ca": 5, "categori": 5, "centric": 5, "changelog": 1, "cite": 2, "coeffici": 5, "column": 4, "combin": [4, 5], "content": 7, "conting": 4, "contributor": 3, "correl": 5, "count": 5, "creat": 4, "crosstab": 5, "custom": 4, "data": [4, 7], "datafram": 4, "date": 4, "densiti": 5, "depend": 5, "descript": 6, "deviat": 5, "directori": 4, "distribut": 5, "document": 6, "eda": [2, 6, 7], "estim": 5, "exampl": 5, "excel": 4, "featur": 6, "fit": 5, "format": 4, "foundat": 5, "full": 5, "function": 5, "gaussian": 5, "gener": 4, "get": 7, "grid": 5, "group": 5, "heurist": 7, "highlight": 4, "histogram": 5, "hous": 5, "i": 6, "identifi": 4, "instal": 6, "interact": 5, "kde": 5, "kei": 6, "kernel": 5, "librari": 6, "line": 5, "link": 6, "maintain": 3, "manag": [4, 7], "matric": 5, "matrix": 5, "mean": 5, "median": 5, "non": 5, "normal": 5, "numer": 4, "overview": [4, 5], "partial": 5, "path": 4, "pearson": 5, "period": 4, "pivot": 5, "plot": [5, 7], "prerequisit": 6, "project": 6, "purpos": 6, "python": 6, "refer": 8, "regress": 5, "regular": 5, "remov": 4, "save": 4, "scatter": 5, "specif": 4, "stack": 5, "standard": 4, "start": 7, "static": 5, "std": 5, "summari": 4, "tabl": [4, 7], "techniqu": 4, "theoret": 5, "toolkit": [2, 6, 7], "trail": 4, "triangular": 5, "uniqu": 4, "variabl": 4, "version": 1, "violin": 5, "welcom": 6, "what": 6}}) \ No newline at end of file diff --git a/docs/v0.0.10/.buildinfo b/docs/v0.0.10/.buildinfo index a9d0efc33..b4bd49c81 100644 --- a/docs/v0.0.10/.buildinfo +++ b/docs/v0.0.10/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 867faa015f632e2b5dc8e4d9c606e800 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 145f4246349a5d6a969a9da15d748271 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/v0.0.10/.buildinfo.bak b/docs/v0.0.10/.buildinfo.bak new file mode 100644 index 000000000..a9d0efc33 --- /dev/null +++ b/docs/v0.0.10/.buildinfo.bak @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 867faa015f632e2b5dc8e4d9c606e800 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/v0.0.10/.doctrees/acknowledgements.doctree b/docs/v0.0.10/.doctrees/acknowledgements.doctree index bfc38f0cf..aff0de499 100644 Binary files a/docs/v0.0.10/.doctrees/acknowledgements.doctree and b/docs/v0.0.10/.doctrees/acknowledgements.doctree differ diff --git a/docs/v0.0.10/.doctrees/changelog.doctree b/docs/v0.0.10/.doctrees/changelog.doctree index c5ef64555..474f769f3 100644 Binary files a/docs/v0.0.10/.doctrees/changelog.doctree and b/docs/v0.0.10/.doctrees/changelog.doctree differ diff --git a/docs/v0.0.10/.doctrees/citations.doctree b/docs/v0.0.10/.doctrees/citations.doctree index ed778a7e1..6f3bc473f 100644 Binary files a/docs/v0.0.10/.doctrees/citations.doctree and b/docs/v0.0.10/.doctrees/citations.doctree differ diff --git a/docs/v0.0.10/.doctrees/contributors.doctree b/docs/v0.0.10/.doctrees/contributors.doctree index 12fd78500..061d60a0b 100644 Binary files a/docs/v0.0.10/.doctrees/contributors.doctree and b/docs/v0.0.10/.doctrees/contributors.doctree differ diff --git a/docs/v0.0.10/.doctrees/data_management.doctree b/docs/v0.0.10/.doctrees/data_management.doctree index 82f1d254a..94b2af7c5 100644 Binary files a/docs/v0.0.10/.doctrees/data_management.doctree and b/docs/v0.0.10/.doctrees/data_management.doctree differ diff --git a/docs/v0.0.10/.doctrees/eda_plots.doctree b/docs/v0.0.10/.doctrees/eda_plots.doctree index 3fd25e1fc..9f07c78ed 100644 Binary files a/docs/v0.0.10/.doctrees/eda_plots.doctree and b/docs/v0.0.10/.doctrees/eda_plots.doctree differ diff --git a/docs/v0.0.10/.doctrees/environment.pickle b/docs/v0.0.10/.doctrees/environment.pickle index aff9310f4..7f6cac20b 100644 Binary files a/docs/v0.0.10/.doctrees/environment.pickle and b/docs/v0.0.10/.doctrees/environment.pickle differ diff --git a/docs/v0.0.10/.doctrees/getting_started.doctree b/docs/v0.0.10/.doctrees/getting_started.doctree index 9d112dba6..232e6be2a 100644 Binary files a/docs/v0.0.10/.doctrees/getting_started.doctree and b/docs/v0.0.10/.doctrees/getting_started.doctree differ diff --git a/docs/v0.0.10/.doctrees/index.doctree b/docs/v0.0.10/.doctrees/index.doctree index e7ef7d84a..a33541adf 100644 Binary files a/docs/v0.0.10/.doctrees/index.doctree and b/docs/v0.0.10/.doctrees/index.doctree differ diff --git a/docs/v0.0.10/.doctrees/references.doctree b/docs/v0.0.10/.doctrees/references.doctree index 330261c64..32d137ee4 100644 Binary files a/docs/v0.0.10/.doctrees/references.doctree and b/docs/v0.0.10/.doctrees/references.doctree differ diff --git a/docs/v0.0.10/_static/basic.css b/docs/v0.0.10/_static/basic.css index f316efcb4..7ebbd6d07 100644 --- a/docs/v0.0.10/_static/basic.css +++ b/docs/v0.0.10/_static/basic.css @@ -1,12 +1,5 @@ /* - * basic.css - * ~~~~~~~~~ - * * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ /* -- main layout ----------------------------------------------------------- */ @@ -115,15 +108,11 @@ img { /* -- search page ----------------------------------------------------------- */ ul.search { - margin: 10px 0 0 20px; - padding: 0; + margin-top: 10px; } ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; + padding: 5px 0; } ul.search li a { diff --git a/docs/v0.0.10/_static/css/badge_only.css b/docs/v0.0.10/_static/css/badge_only.css index c718cee44..88ba55b96 100644 --- a/docs/v0.0.10/_static/css/badge_only.css +++ b/docs/v0.0.10/_static/css/badge_only.css @@ -1 +1 @@ -.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/docs/v0.0.10/_static/css/theme.css b/docs/v0.0.10/_static/css/theme.css index 19a446a0e..0f14f1064 100644 --- a/docs/v0.0.10/_static/css/theme.css +++ b/docs/v0.0.10/_static/css/theme.css @@ -1,4 +1,4 @@ html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/v0.0.10/_static/doctools.js b/docs/v0.0.10/_static/doctools.js index 4d67807d1..0398ebb9f 100644 --- a/docs/v0.0.10/_static/doctools.js +++ b/docs/v0.0.10/_static/doctools.js @@ -1,12 +1,5 @@ /* - * doctools.js - * ~~~~~~~~~~~ - * * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-bold.eot b/docs/v0.0.10/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-bold.eot differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-bold.ttf b/docs/v0.0.10/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-bold.ttf differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-bold.woff b/docs/v0.0.10/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-bold.woff differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-bold.woff2 b/docs/v0.0.10/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.eot b/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.ttf b/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff b/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-italic.eot b/docs/v0.0.10/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-italic.eot differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-italic.ttf b/docs/v0.0.10/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-italic.ttf differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-italic.woff b/docs/v0.0.10/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-italic.woff differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-italic.woff2 b/docs/v0.0.10/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-regular.eot b/docs/v0.0.10/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-regular.eot differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-regular.ttf b/docs/v0.0.10/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-regular.ttf differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-regular.woff b/docs/v0.0.10/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-regular.woff differ diff --git a/docs/v0.0.10/_static/fonts/Lato/lato-regular.woff2 b/docs/v0.0.10/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/docs/v0.0.10/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/docs/v0.0.10/_static/js/versions.js b/docs/v0.0.10/_static/js/versions.js new file mode 100644 index 000000000..818bc9969 --- /dev/null +++ b/docs/v0.0.10/_static/js/versions.js @@ -0,0 +1,224 @@ +const themeFlyoutDisplay = "hidden"; +const themeVersionSelector = "True"; +const themeLanguageSelector = "True"; + +if (themeFlyoutDisplay === "attached") { + function renderLanguages(config) { + if (!config.projects.translations.length) { + return ""; + } + + const languagesHTML = ` +
+
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} +
+ `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/docs/v0.0.10/_static/language_data.js b/docs/v0.0.10/_static/language_data.js index 367b8ed81..c7fe6c6fa 100644 --- a/docs/v0.0.10/_static/language_data.js +++ b/docs/v0.0.10/_static/language_data.js @@ -1,13 +1,6 @@ /* - * language_data.js - * ~~~~~~~~~~~~~~~~ - * * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; diff --git a/docs/v0.0.10/_static/searchtools.js b/docs/v0.0.10/_static/searchtools.js index b08d58c9b..2c774d17a 100644 --- a/docs/v0.0.10/_static/searchtools.js +++ b/docs/v0.0.10/_static/searchtools.js @@ -1,12 +1,5 @@ /* - * searchtools.js - * ~~~~~~~~~~~~~~~~ - * * Sphinx JavaScript utilities for the full-text search. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; @@ -20,7 +13,7 @@ if (typeof Scorer === "undefined") { // and returns the new score. /* score: result => { - const [docname, title, anchor, descr, score, filename] = result + const [docname, title, anchor, descr, score, filename, kind] = result return score }, */ @@ -47,6 +40,14 @@ if (typeof Scorer === "undefined") { }; } +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + const _removeChildren = (element) => { while (element && element.lastChild) element.removeChild(element.lastChild); }; @@ -64,9 +65,13 @@ const _displayItem = (item, searchTerms, highlightTerms) => { const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; const contentRoot = document.documentElement.dataset.content_root; - const [docName, title, anchor, descr, score, _filename] = item; + const [docName, title, anchor, descr, score, _filename, kind] = item; let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); let requestUrl; let linkUrl; if (docBuilder === "dirhtml") { @@ -115,8 +120,10 @@ const _finishSearch = (resultCount) => { "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." ); else - Search.status.innerText = _( - "Search finished, found ${resultCount} page(s) matching the search query." + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, ).replace('${resultCount}', resultCount); }; const _displayNextItem = ( @@ -138,7 +145,7 @@ const _displayNextItem = ( else _finishSearch(resultCount); }; // Helper function used by query() to order search results. -// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. // Order the results by score (in opposite order of appearance, since the // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. const _orderResultsByScoreThenName = (a, b) => { @@ -248,6 +255,7 @@ const Search = { searchSummary.classList.add("search-summary"); searchSummary.innerText = ""; const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); searchList.classList.add("search"); const out = document.getElementById("search-results"); @@ -318,7 +326,7 @@ const Search = { const indexEntries = Search._index.indexentries; // Collect multiple result groups to be sorted separately and then ordered. - // Each is an array of [docname, title, anchor, descr, score, filename]. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. const normalResults = []; const nonMainIndexResults = []; @@ -337,6 +345,7 @@ const Search = { null, score + boost, filenames[file], + SearchResultKind.title, ]); } } @@ -354,6 +363,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.index, ]; if (isMain) { normalResults.push(result); @@ -475,6 +485,7 @@ const Search = { descr, score, filenames[match[0]], + SearchResultKind.object, ]); }; Object.keys(objects).forEach((prefix) => @@ -585,6 +596,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.text, ]); } return results; diff --git a/docs/v0.0.10/acknowledgements.html b/docs/v0.0.10/acknowledgements.html index 0b56cbc26..9b2522f40 100644 --- a/docs/v0.0.10/acknowledgements.html +++ b/docs/v0.0.10/acknowledgements.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Acknowledgements — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,7 +101,8 @@
-
EDA Toolkit Logo +

Acknowledgements

diff --git a/docs/v0.0.10/changelog.html b/docs/v0.0.10/changelog.html index 72f7ea685..629e0af07 100644 --- a/docs/v0.0.10/changelog.html +++ b/docs/v0.0.10/changelog.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Changelog — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - + + + + + + + + @@ -122,7 +120,8 @@
-
EDA Toolkit Logo +

Changelog

diff --git a/docs/v0.0.10/citations.html b/docs/v0.0.10/citations.html index 0a1d4111a..1bf4bca08 100644 --- a/docs/v0.0.10/citations.html +++ b/docs/v0.0.10/citations.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Citing EDA Toolkit — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,7 +101,8 @@
-
EDA Toolkit Logo +

Citing EDA Toolkit

diff --git a/docs/v0.0.10/contributors.html b/docs/v0.0.10/contributors.html index b6d72229b..cb7e85f90 100644 --- a/docs/v0.0.10/contributors.html +++ b/docs/v0.0.10/contributors.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Contributors/Maintainers — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,13 +101,16 @@
-
EDA Toolkit Logo +

Contributors/Maintainers

-
https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg +

Leonid Shpaner is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego’s M.S. Applied Artificial Intelligence program.

-


https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg +


Oscar Gil is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego.

diff --git a/docs/v0.0.10/data_management.html b/docs/v0.0.10/data_management.html index 483e99b62..ca85634d7 100644 --- a/docs/v0.0.10/data_management.html +++ b/docs/v0.0.10/data_management.html @@ -1,3 +1,5 @@ + + @@ -6,26 +8,22 @@ Data Management Overview — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - - + + + + + + + + + @@ -143,7 +141,8 @@
-
EDA Toolkit Logo +

Data Management Overview

In any data-driven project, effective management of data is crucial. This @@ -163,7 +162,7 @@

Path directoriesensure_directory(path)
Parameters:
-

path (str) – The path to the directory that needs to be ensured.

+

path (str) – The path to the directory that needs to be ensured.

Returns:

None

@@ -232,10 +231,10 @@

Adding Unique IdentifiersParameters:
  • df (pd.DataFrame) – The dataframe to add IDs to.

  • -
  • id_colname (str, optional) – The name of the new column for the IDs. Defaults to "ID".

  • -
  • num_digits (int, optional) – The number of digits for the unique IDs. Defaults to 9.

  • -
  • seed (int, optional) – The seed for the random number generator. Defaults to None.

  • -
  • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

  • +
  • id_colname (str, optional) – The name of the new column for the IDs. Defaults to "ID".

  • +
  • num_digits (int, optional) – The number of digits for the unique IDs. Defaults to 9.

  • +
  • seed (int, optional) – The seed for the random number generator. Defaults to None.

  • +
  • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

Returns:
@@ -404,7 +403,7 @@

Trailing Period RemovalParameters:
Returns:
@@ -533,16 +532,16 @@

Standardized Dates
Parameters:
-

date_str (str) – A date string to be standardized.

+

date_str (str) – A date string to be standardized.

Returns:

A standardized date string in the format YYYY-MM-DD.

Return type:
-

str

+

str

Raises:
-

ValueError – If date_str is in an unrecognized format or if the function +

ValueError – If date_str is in an unrecognized format or if the function cannot parse the date.

@@ -622,9 +621,9 @@

DataFrame AnalysisParameters:
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • -
  • background_color (str, optional) – Hex color code or color name for background styling in the output +

  • background_color (str, optional) – Hex color code or color name for background styling in the output DataFrame. Defaults to None.

  • -
  • return_df (bool, optional) – If True, returns the plain DataFrame with the summary statistics. If +

  • return_df (bool, optional) – If True, returns the plain DataFrame with the summary statistics. If False, returns a styled DataFrame for visual presentation. Defaults to False.

@@ -876,17 +875,17 @@

Generating Summary Tables for Variable CombinationsParameters:
  • df (pandas.DataFrame) – The pandas DataFrame containing the data.

  • -
  • variables (list of str) – List of column names from the DataFrame to generate combinations.

  • -
  • data_path (str) – Path where the output Excel file will be saved.

  • -
  • data_name (str) – Name of the output Excel file.

  • -
  • min_length (int, optional) – Minimum size of the combinations to generate. Defaults to 2.

  • +
  • variables (list of str) – List of column names from the DataFrame to generate combinations.

  • +
  • data_path (str) – Path where the output Excel file will be saved.

  • +
  • data_name (str) – Name of the output Excel file.

  • +
  • min_length (int, optional) – Minimum size of the combinations to generate. Defaults to 2.

Returns:

A tuple containing a dictionary of summary tables and a list of all generated combinations.

Return type:
-

tuple(dict, list)

+

tuple(dict, list)

@@ -1068,7 +1067,8 @@

Generating Summary Tables for Variable Combinations

When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. The first sheet will be a Table of Contents with hyperlinks to each summary table.

-
EDA Toolkit Logo +

Saving DataFrames to Excel with Customized Formatting

@@ -1081,9 +1081,9 @@

Saving DataFrames to Excel with Customized Formatting
Parameters:
    -
  • file_path (str) – Full path to the output Excel file.

  • -
  • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

  • -
  • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

  • +
  • file_path (str) – Full path to the output Excel file.

  • +
  • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

  • +
  • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

@@ -1143,12 +1143,12 @@

Creating Contingency TablesParameters:
  • df (pandas.DataFrame) – The DataFrame to analyze.

  • -
  • cols (str or list of str, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

  • -
  • sort_by (int, optional) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order. Defaults to 0.

  • +
  • cols (str or list of str, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

  • +
  • sort_by (int, optional) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order. Defaults to 0.

Raises:
-

ValueError – If no columns are specified or if sort_by is not 0 or 1.

+

ValueError – If no columns are specified or if sort_by is not 0 or 1.

Returns:

A DataFrame containing the contingency table with the specified columns, a 'Total' column representing the count of occurrences, and a 'Percentage' column representing the percentage of the total count.

@@ -1211,8 +1211,8 @@

Highlighting Specific Columns in a DataFrameParameters:
Returns:
diff --git a/docs/v0.0.10/eda_plots.html b/docs/v0.0.10/eda_plots.html index 55abccffb..a4198c33c 100644 --- a/docs/v0.0.10/eda_plots.html +++ b/docs/v0.0.10/eda_plots.html @@ -1,3 +1,5 @@ + + @@ -6,26 +8,22 @@ Plotting and Theoretical Overview — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - - + + + + + + + + + @@ -164,7 +162,8 @@
-
EDA Toolkit Logo +

Plotting and Theoretical Overview

@@ -183,7 +182,8 @@

Gaussian Assumption for Normality\(\mu \pm 2\sigma\)

  • 99.7% within \(\mu \pm 3\sigma\)

  • -
    KDE Distributions - KDE (+) Histograms (Density) +

    Histograms and Kernel Density Estimation (KDE)

    Histograms:

    @@ -339,50 +339,50 @@

    KDE Distribution FunctionParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots. If ‘all’, plots will be generated for all numeric columns.

    • -
    • figsize (tuple of int, optional) – Size of each individual plot, default is (5, 5). Used when only one plot is being generated or when saving individual plots.

    • -
    • grid_figsize (tuple of int, optional) – Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on figsize, n_rows, and n_cols.

    • -
    • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

    • -
    • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

    • -
    • mean_color (str, optional) – Color of the mean line if plot_mean is True, default is '#000000'.

    • -
    • median_color (str, optional) – Color of the median line if plot_median is True, default is '#000000'.

    • -
    • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

    • -
    • hue (str, optional) – Column name to group data by, adding different colors for each group.

    • -
    • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

    • -
    • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid. If not provided, it will be calculated automatically.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid. If not provided, it will be calculated automatically.

    • -
    • w_pad (float, optional) – Width padding between subplots, default is 1.0.

    • -
    • h_pad (float, optional) – Height padding between subplots, default is 1.0.

    • -
    • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

    • -
    • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

    • -
    • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

    • -
    • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

    • -
    • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses figsize for determining the plot size, ignoring grid_figsize.

    • -
    • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

    • -
    • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

    • -
    • log_scale_vars (str or list of str, optional) – Variable name(s) to apply log scaling. Can be a single string or a list of strings.

    • -
    • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

    • -
    • binwidth (float, optional) – Width of each bin, overrides bins but can be used with binrange.

    • -
    • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • -
    • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

    • -
    • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

    • -
    • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • -
    • plot_mean (bool, optional) – Whether to plot the mean as a vertical line, default is False.

    • -
    • plot_median (bool, optional) – Whether to plot the median as a vertical line, default is False.

    • -
    • std_dev_levels (list of int, optional) – Levels of standard deviation to plot around the mean.

    • -
    • std_color (str or list of str, optional) – Color(s) for the standard deviation lines, default is '#808080'.

    • -
    • label_names (dict, optional) – Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display.

    • -
    • show_legend (bool, optional) – Whether to show the legend on the plots, default is True.

    • +
    • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots. If ‘all’, plots will be generated for all numeric columns.

    • +
    • figsize (tuple of int, optional) – Size of each individual plot, default is (5, 5). Used when only one plot is being generated or when saving individual plots.

    • +
    • grid_figsize (tuple of int, optional) – Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on figsize, n_rows, and n_cols.

    • +
    • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

    • +
    • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

    • +
    • mean_color (str, optional) – Color of the mean line if plot_mean is True, default is '#000000'.

    • +
    • median_color (str, optional) – Color of the median line if plot_median is True, default is '#000000'.

    • +
    • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

    • +
    • hue (str, optional) – Column name to group data by, adding different colors for each group.

    • +
    • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

    • +
    • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

    • +
    • n_rows (int, optional) – Number of rows in the subplot grid. If not provided, it will be calculated automatically.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid. If not provided, it will be calculated automatically.

    • +
    • w_pad (float, optional) – Width padding between subplots, default is 1.0.

    • +
    • h_pad (float, optional) – Height padding between subplots, default is 1.0.

    • +
    • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

    • +
    • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

    • +
    • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

    • +
    • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

    • +
    • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses figsize for determining the plot size, ignoring grid_figsize.

    • +
    • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

    • +
    • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

    • +
    • log_scale_vars (str or list of str, optional) – Variable name(s) to apply log scaling. Can be a single string or a list of strings.

    • +
    • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

    • +
    • binwidth (float, optional) – Width of each bin, overrides bins but can be used with binrange.

    • +
    • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • +
    • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

    • +
    • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

    • +
    • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • plot_mean (bool, optional) – Whether to plot the mean as a vertical line, default is False.

    • +
    • plot_median (bool, optional) – Whether to plot the median as a vertical line, default is False.

    • +
    • std_dev_levels (list of int, optional) – Levels of standard deviation to plot around the mean.

    • +
    • std_color (str or list of str, optional) – Color(s) for the standard deviation lines, default is '#808080'.

    • +
    • label_names (dict, optional) – Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display.

    • +
    • show_legend (bool, optional) – Whether to show the legend on the plots, default is True.

    • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

    Raises:

    -
    KDE Distributions - KDE (+) Histograms (Density) +

    Histogram Example (Density)

    @@ -503,7 +504,8 @@

    Histogram Example (Density))

    -
    KDE Distributions - Histograms (Density) +

    Histogram Example (Count)

    @@ -542,7 +544,8 @@

    Histogram Example (Count))

    -
    KDE Distributions - Histograms (Count) +

    Histogram Example - (Mean and Median)

    @@ -589,7 +592,8 @@

    Histogram Example - (Mean and Median))

    -
    KDE Distributions - Histograms (Count) +

    Histogram Example - (Mean, Median, and Std. Deviation)

    @@ -653,7 +657,8 @@

    Histogram Example - (Mean, Median, and Std. Deviation))

    -
    KDE Distributions - Histograms (Count) +
    @@ -675,45 +680,45 @@

    Stacked Crosstab PlotsParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • col (str) – The name of the column in the DataFrame to be analyzed.

    • -
    • func_col (list) – List of ground truth columns to be analyzed.

    • -
    • legend_labels_list (list) – List of legend labels for each ground truth column.

    • -
    • title (list) – List of titles for the plots.

    • -
    • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

    • -
    • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

    • -
    • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

    • -
    • custom_order (list, optional) – Specifies a custom order for the categories in the col.

    • -
    • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

    • -
    • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

    • -
    • save_formats (list, optional) – List of file formats to save the plot images in.

    • -
    • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

    • -
    • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

    • -
    • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

    • -
    • x (int, optional) – The width of the figure.

    • -
    • y (int, optional) – The height of the figure.

    • -
    • p (int, optional) – The padding between the subplots.

    • -
    • file_prefix (str, optional) – Prefix for the filename when output includes plots.

    • -
    • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

    • -
    • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

    • -
    • show_legend (bool, optional) – Specify whether to show the legend, default is True.

    • -
    • label_fontsize (int, optional) – Font size for axis labels, default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • -
    • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • col (str) – The name of the column in the DataFrame to be analyzed.

    • +
    • func_col (list) – List of ground truth columns to be analyzed.

    • +
    • legend_labels_list (list) – List of legend labels for each ground truth column.

    • +
    • title (list) – List of titles for the plots.

    • +
    • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

    • +
    • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

    • +
    • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

    • +
    • custom_order (list, optional) – Specifies a custom order for the categories in the col.

    • +
    • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

    • +
    • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

    • +
    • save_formats (list, optional) – List of file formats to save the plot images in.

    • +
    • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

    • +
    • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

    • +
    • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

    • +
    • x (int, optional) – The width of the figure.

    • +
    • y (int, optional) – The height of the figure.

    • +
    • p (int, optional) – The padding between the subplots.

    • +
    • file_prefix (str, optional) – Prefix for the filename when output includes plots.

    • +
    • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

    • +
    • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

    • +
    • show_legend (bool, optional) – Specify whether to show the legend, default is True.

    • +
    • label_fontsize (int, optional) – Font size for axis labels, default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • +
    • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    Raises:
      -
    • ValueError

        +
      • ValueError

        • If output is not one of "both", "plots_only", or "crosstabs_only".

        • If plot_type is not one of "both", "regular", "normalized".

        • If remove_stacks is set to True and plot_type is not "regular".

        • If the lengths of title, func_col, and legend_labels_list are not equal.

      • -
      • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

      • +
      • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

    Returns:
    @@ -853,8 +858,10 @@

    Stacked Bar Plots With Crosstabs ExampleKDE Distributions -

    Stacked Bar Plot Age vs. Income +
    KDE Distributions + +

    Note

    When you set return_dict=True, you are able to see the crosstabs printed out @@ -1098,7 +1105,8 @@

    Pivoted Stacked Bar Plots Example"barh" in the stacked_crosstab_plot function. This option pivots the standard vertical stacked bar plot into a horizontal orientation, making it easier to compare categories when there are many labels on the y-axis.

    -
    Stacked Bar Plot Age vs. Income (Pivoted) +

    Non-Normalized Stacked Bar Plots Example

    @@ -1108,7 +1116,8 @@

    Non-Normalized Stacked Bar Plots Exampleplot_type to "normalized" will display only the normalized plots. The example below demonstrates regular stacked bar plots for income by age.

    -
    Stacked Bar Plot Age vs. Income (Regular) +

    Regular Non-Stacked Bar Plots Example

    @@ -1123,7 +1132,8 @@

    Regular Non-Stacked Bar Plots Example#333333), and the legend has been removed by setting show_legend=False. This illustrates regular bar plots for income by age, without stacking.

    -
    Bar Plot Age vs. Income (Regular) +

    @@ -1155,31 +1165,31 @@

    Box and Violin PlotsParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • metrics_list (list of str) – List of metric names (columns in df) to plot.

    • -
    • metrics_comp (list of str) – List of comparison categories (columns in df).

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated automatically if not provided.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated automatically if not provided.

    • -
    • image_path_png (str, optional) – Optional directory path to save .png images.

    • -
    • image_path_svg (str, optional) – Optional directory path to save .svg images.

    • -
    • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

    • -
    • show_legend (bool, optional) – Boolean, True if showing the legend in the plots. Default is True.

    • -
    • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • -
    • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

    • -
    • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots. Default is False.

    • -
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • -
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • -
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • -
    • label_names (dict, optional) – Dictionary mapping original column names to custom labels. Default is None.

    • +
    • metrics_list (list of str) – List of metric names (columns in df) to plot.

    • +
    • metrics_comp (list of str) – List of comparison categories (columns in df).

    • +
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated automatically if not provided.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated automatically if not provided.

    • +
    • image_path_png (str, optional) – Optional directory path to save .png images.

    • +
    • image_path_svg (str, optional) – Optional directory path to save .svg images.

    • +
    • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

    • +
    • show_legend (bool, optional) – Boolean, True if showing the legend in the plots. Default is True.

    • +
    • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • +
    • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

    • +
    • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots. Default is False.

    • +
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • +
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • +
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • label_names (dict, optional) – Dictionary mapping original column names to custom labels. Default is None.

    • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

    Raises:
    -

    ValueError

      +

      ValueError

      • If show_plot is not one of "individual", "grid", or "both".

      • If save_plots is not one of None, "all", "individual", or "grid".

      • If save_plots is set without specifying image_path_png or image_path_svg.

      • @@ -1240,7 +1250,8 @@

        Box Plots Grid Example)

    -
    Box Plot Comparisons +

    Violin Plots Grid Example

    @@ -1265,7 +1276,8 @@

    Violin Plots Grid Example)

    -
    Violin Plot Comparisons +

    Pivoted Violin Plots Grid Example

    @@ -1288,7 +1300,8 @@

    Pivoted Violin Plots Grid Example)

    -
    Violin Plot Comparisons (Pivoted) +
    @@ -1331,42 +1344,42 @@

    Scatter Fit PlotParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data.

    • -
    • x_vars (list of str, optional) – List of variable names to plot on the x-axis.

    • -
    • y_vars (list of str, optional) – List of variable names to plot on the y-axis.

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated based on the number of plots and n_cols if not specified.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated based on the number of plots and max_cols if not specified.

    • -
    • max_cols (int, optional) – Maximum number of columns in the subplot grid. Default is 4.

    • -
    • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

    • -
    • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

    • -
    • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid". If None, plots will not be saved.

    • -
    • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • -
    • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

    • -
    • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

    • -
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • -
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified.

    • -
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

    • -
    • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

    • -
    • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

    • -
    • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

    • -
    • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

    • -
    • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the hue parameter to be set.

    • -
    • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

    • -
    • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

    • -
    • marker (str, optional) – Marker style used for the scatter points. Default is "o".

    • -
    • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • -
    • all_vars (list of str, optional) – If provided, automatically generates scatter plots for all combinations of variables in this list, overriding x_vars and y_vars.

    • -
    • label_names (dict, optional) – A dictionary to rename columns for display in the plot titles and labels.

    • -
    • kwargs (dict, optional) – Additional keyword arguments to pass to sns.scatterplot.

    • +
    • x_vars (list of str, optional) – List of variable names to plot on the x-axis.

    • +
    • y_vars (list of str, optional) – List of variable names to plot on the y-axis.

    • +
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated based on the number of plots and n_cols if not specified.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated based on the number of plots and max_cols if not specified.

    • +
    • max_cols (int, optional) – Maximum number of columns in the subplot grid. Default is 4.

    • +
    • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

    • +
    • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

    • +
    • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid". If None, plots will not be saved.

    • +
    • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • +
    • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

    • +
    • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

    • +
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • +
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified.

    • +
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

    • +
    • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

    • +
    • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

    • +
    • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

    • +
    • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

    • +
    • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the hue parameter to be set.

    • +
    • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

    • +
    • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

    • +
    • marker (str, optional) – Marker style used for the scatter points. Default is "o".

    • +
    • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • all_vars (list of str, optional) – If provided, automatically generates scatter plots for all combinations of variables in this list, overriding x_vars and y_vars.

    • +
    • label_names (dict, optional) – A dictionary to rename columns for display in the plot titles and labels.

    • +
    • kwargs (dict, optional) – Additional keyword arguments to pass to sns.scatterplot.

    Raises:
    -

    ValueError

      +

      ValueError

      • If all_vars is provided and either x_vars or y_vars is also provided.

      • If neither all_vars nor both x_vars and y_vars are provided.

      • If hue_palette is specified without hue.

      • @@ -1415,7 +1428,8 @@

        Regression-Centric Scatter Plots Example)

    -
    Scatter Plot Comparisons (with Best Fit Lines) +

    Scatter Plots Grouped by Category Example

    @@ -1468,7 +1482,8 @@

    Scatter Plots Grouped by Category Example)

    -
    Scatter Plot Comparisons (Grouped) +

    Scatter Plots (All Combinations Example)

    @@ -1497,7 +1512,8 @@

    Scatter Plots (All Combinations Example))

    -
    Scatter Plot Comparisons (Grouped2) +
    @@ -1531,30 +1547,30 @@

    Correlation MatricesParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data.

    • -
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • -
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • -
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • -
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • -
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • -
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • -
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • -
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • -
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • -
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • -
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • -
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • -
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • -
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • -
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • -
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    • +
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • +
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • +
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • +
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • +
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • +
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • +
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • +
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • +
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • +
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • +
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • +
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • +
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • +
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • +
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • +
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    Raises:
    -

    ValueError

      +

      ValueError

      • If annot is not a boolean.

      • If cols is not a list.

      • If save_plots is not a boolean.

      • @@ -1612,7 +1628,8 @@

        Triangular Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +

    Full Correlation Matrix Example

    @@ -1646,7 +1663,8 @@

    Full Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -1673,24 +1691,24 @@

    2D Partial Dependence Plots
    • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

    • X_train (pandas.DataFrame or numpy.ndarray) – The training data used to compute partial dependence. Should correspond to the features used to train the model.

    • -
    • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

    • -
    • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

    • -
    • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

    • -
    • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

    • -
    • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

    • -
    • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

    • -
    • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

    • -
    • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • -
    • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

    • -
    • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

    • -
    • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

    • -
    • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

    • +
    • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

    • +
    • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

    • +
    • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

    • +
    • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

    • +
    • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

    • +
    • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

    • +
    • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

    • +
    • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • +
    • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

    • +
    • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

    • +
    • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

    • +
    • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

    Raises:
    -

    ValueError

      +

      ValueError

      • If plot_type is not one of "grid", "individual", or "both".

      • If save_plots is enabled but neither image_path_png nor image_path_svg is provided.

      @@ -1785,7 +1803,8 @@

      2D Plots - CA Housing Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -1806,47 +1825,47 @@

    3D Partial Dependence Plots
    • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

    • dataframe (pandas.DataFrame or numpy.ndarray) – The dataset on which the model was trained or a representative sample. If a DataFrame is provided, feature_names_list should correspond to the column names. If a NumPy array is provided, feature_names_list should correspond to the indices of the columns.

    • -
    • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

    • -
    • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

    • -
    • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

    • -
    • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

    • -
    • title (str) – The title for the plots.

    • -
    • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

    • -
    • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

    • -
    • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

    • -
    • plot_type (str, optional) – The type of plots to generate. Options are: +

    • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

    • +
    • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

    • +
    • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

    • +
    • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

    • +
    • title (str) – The title for the plots.

    • +
    • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

    • +
    • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

    • +
    • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

    • +
    • plot_type (str, optional) – The type of plots to generate. Options are: - "static": Generate only static Matplotlib plots. - "interactive": Generate only interactive Plotly plots. - "both": Generate both static and interactive plots. Default is "both".

    • matplotlib_colormap (matplotlib.colors.Colormap, optional) – Custom colormap for the Matplotlib plot. If not provided, a default colormap is used.

    • -
    • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

    • -
    • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

    • -
    • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

    • -
    • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

    • -
    • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

    • -
    • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • -
    • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

    • -
    • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

    • -
    • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

    • -
    • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

    • -
    • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

    • -
    • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

    • -
    • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

    • -
    • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

    • -
    • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

    • -
    • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

    • -
    • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

    • -
    • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

    • -
    • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

    • -
    • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

    • -
    • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

    • -
    • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

    • -
    • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

    • +
    • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

    • +
    • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

    • +
    • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

    • +
    • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

    • +
    • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

    • +
    • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • +
    • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

    • +
    • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

    • +
    • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

    • +
    • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

    • +
    • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

    • +
    • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

    • +
    • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

    • +
    • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

    • +
    • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

    • +
    • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

    • +
    • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

    • +
    • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

    • +
    • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

    • +
    • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

    • +
    • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

    • +
    • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

    • +
    • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

    Raises:
    -

    ValueError

      +

      ValueError

      • If plot_type is not one of "static", "interactive", or "both".

      • If plot_type is "interactive" or "both" and html_file_path or html_file_name are not provided.

      @@ -1939,7 +1958,8 @@

      Static Plot)

    -
    Scatter Plot Comparisons (Grouped) +

    Interactive Plot

    diff --git a/docs/v0.0.10/genindex.html b/docs/v0.0.10/genindex.html index 4e8ba7ada..5a4045d36 100644 --- a/docs/v0.0.10/genindex.html +++ b/docs/v0.0.10/genindex.html @@ -1,3 +1,5 @@ + + @@ -5,25 +7,21 @@ Index — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - + + + + + + + + diff --git a/docs/v0.0.10/getting_started.html b/docs/v0.0.10/getting_started.html index 2a2ffa4c2..7edf281cb 100644 --- a/docs/v0.0.10/getting_started.html +++ b/docs/v0.0.10/getting_started.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - + + + + + + + + @@ -111,7 +109,8 @@
    -
    EDA Toolkit Logo +

    Welcome to the EDA Toolkit Python Library Documentation!

    diff --git a/docs/v0.0.10/index.html b/docs/v0.0.10/index.html index ef399a7db..cf4b7279e 100644 --- a/docs/v0.0.10/index.html +++ b/docs/v0.0.10/index.html @@ -1,3 +1,5 @@ + + @@ -6,26 +8,22 @@ Table of Contents — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - - + + + + + + + + + @@ -103,7 +101,8 @@
    -
    EDA Toolkit Logo +

    Table of Contents

    diff --git a/docs/v0.0.10/references.html b/docs/v0.0.10/references.html index ddb6eb4d5..e5e3d274e 100644 --- a/docs/v0.0.10/references.html +++ b/docs/v0.0.10/references.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ References — EDA Toolkit 0.0.10 documentation - + - - - - - - - - - - + + + + + + + + @@ -102,7 +100,8 @@
    -
    EDA Toolkit Logo +

    References

    diff --git a/docs/v0.0.10/search.html b/docs/v0.0.10/search.html index bc3b1da99..5a5a8fb64 100644 --- a/docs/v0.0.10/search.html +++ b/docs/v0.0.10/search.html @@ -1,3 +1,5 @@ + + @@ -5,7 +7,7 @@ Search — EDA Toolkit 0.0.10 documentation - + @@ -13,18 +15,14 @@ - - - - - - - - - - + + + + + + + + diff --git a/docs/v0.0.10/searchindex.js b/docs/v0.0.10/searchindex.js index 29e3595c1..16f495317 100644 --- a/docs/v0.0.10/searchindex.js +++ b/docs/v0.0.10/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[5, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[5, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[5, "id14"]], "3D Plots - CA Housing Example": [[5, "id15"]], "About EDA Toolkit": [[7, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[4, "adding-unique-identifiers"]], "Binning Numerical Columns": [[4, "binning-numerical-columns"]], "Box Plots Grid Example": [[5, "box-plots-grid-example"]], "Box and Violin Plots": [[5, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[5, "correlation-matrices"]], "Creating Contingency Tables": [[4, "creating-contingency-tables"]], "Data Management": [[7, null]], "Data Management Overview": [[4, null]], "Data Management Techniques": [[4, "data-management-techniques"]], "DataFrame Analysis": [[4, "dataframe-analysis"]], "Description": [[6, "description"]], "Full Correlation Matrix Example": [[5, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[5, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[4, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[7, null]], "Highlighting Specific Columns in a DataFrame": [[4, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[5, "histogram-example-count"]], "Histogram Example (Density)": [[5, "histogram-example-density"]], "Histogram Example - (Mean and Median)": [[5, "histogram-example-mean-and-median"]], "Histogram Example - (Mean, Median, and Std. Deviation)": [[5, "histogram-example-mean-median-and-std-deviation"]], "Histograms and Kernel Density Estimation (KDE)": [[5, "histograms-and-kernel-density-estimation-kde"]], "Installation": [[6, "installation"]], "Interactive Plot": [[5, "interactive-plot"]], "KDE Distribution Function": [[5, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[5, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[5, "kde-and-histograms-example"]], "Key Features": [[6, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[5, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Foundations": [[5, "partial-dependence-foundations"]], "Partial Dependence Plots": [[5, "partial-dependence-plots"]], "Path directories": [[4, "path-directories"]], "Pearson Correlation Coefficient": [[5, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[5, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[5, "pivoted-violin-plots-grid-example"]], "Plotting Heuristics": [[7, null]], "Plotting and Theoretical Overview": [[5, null]], "Prerequisites": [[6, "prerequisites"]], "Project Links": [[6, "project-links"]], "Purpose of EDA Toolkit": [[6, "purpose-of-eda-toolkit"]], "References": [[8, null]], "Regression-Centric Scatter Plots Example": [[5, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[5, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[4, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[5, "scatter-fit-plot"]], "Scatter Plots (All Combinations Example)": [[5, "scatter-plots-all-combinations-example"]], "Scatter Plots Grouped by Category Example": [[5, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[5, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[5, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[5, "stacked-crosstab-plots"]], "Standardized Dates": [[4, "standardized-dates"]], "Static Plot": [[5, "static-plot"]], "Table of Contents": [[7, null]], "Trailing Period Removal": [[4, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[5, "triangular-correlation-matrix-example"]], "Version 0.0.10": [[1, "version-0-0-10"]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id8"], [1, "id9"], [1, "id10"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Version 0.0.9": [[1, "version-0-0-9"]], "Violin Plots Grid Example": [[5, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[6, null]], "What is EDA?": [[6, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "data_management", "eda_plots", "getting_started", "index", "references"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "data_management.rst", "eda_plots.rst", "getting_started.rst", "index.rst", "references.rst"], "indexentries": {"add_ids()": [[4, "add_ids", false]], "box_violin_plot()": [[5, "box_violin_plot", false]], "built-in function": [[4, "add_ids", false], [4, "contingency_table", false], [4, "dataframe_columns", false], [4, "ensure_directory", false], [4, "highlight_columns", false], [4, "parse_date_with_rule", false], [4, "save_dataframes_to_excel", false], [4, "strip_trailing_period", false], [4, "summarize_all_combinations", false], [5, "box_violin_plot", false], [5, "flex_corr_matrix", false], [5, "kde_distributions", false], [5, "plot_2d_pdp", false], [5, "plot_3d_pdp", false], [5, "scatter_fit_plot", false], [5, "stacked_crosstab_plot", false]], "contingency_table()": [[4, "contingency_table", false]], "dataframe_columns()": [[4, "dataframe_columns", false]], "ensure_directory()": [[4, "ensure_directory", false]], "flex_corr_matrix()": [[5, "flex_corr_matrix", false]], "highlight_columns()": [[4, "highlight_columns", false]], "kde_distributions()": [[5, "kde_distributions", false]], "parse_date_with_rule()": [[4, "parse_date_with_rule", false]], "plot_2d_pdp()": [[5, "plot_2d_pdp", false]], "plot_3d_pdp()": [[5, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[4, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[5, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[5, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[4, "strip_trailing_period", false]], "summarize_all_combinations()": [[4, "summarize_all_combinations", false]]}, "objects": {"": [[4, 0, 1, "", "add_ids"], [5, 0, 1, "", "box_violin_plot"], [4, 0, 1, "", "contingency_table"], [4, 0, 1, "", "dataframe_columns"], [4, 0, 1, "", "ensure_directory"], [5, 0, 1, "", "flex_corr_matrix"], [4, 0, 1, "", "highlight_columns"], [5, 0, 1, "", "kde_distributions"], [4, 0, 1, "", "parse_date_with_rule"], [5, 0, 1, "", "plot_2d_pdp"], [5, 0, 1, "", "plot_3d_pdp"], [4, 0, 1, "", "save_dataframes_to_excel"], [5, 0, 1, "", "scatter_fit_plot"], [5, 0, 1, "", "stacked_crosstab_plot"], [4, 0, 1, "", "strip_trailing_period"], [4, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 4, 5], "0": [2, 4, 5, 6, 7], "00": 4, "000000": 5, "0000ff": 5, "00140": [5, 8], "00bfc4": 5, "01": 4, "02": [1, 4], "03021": [5, 8], "04": [4, 5], "05": 5, "07": [4, 5], "09": 5, "1": [1, 4, 5, 6], "10": [2, 4, 5, 6, 7, 8], "100": [4, 5], "1016": [5, 8], "10724": 5, "11": 4, "1109": [5, 8], "111": 4, "115": 5, "11687": 5, "11th": 4, "12": [4, 5, 6], "120": 5, "12202842": 4, "123": 4, "12929": 5, "13": [4, 5], "131": 5, "13162633": 2, "13163208": 2, "13174": 5, "1348": 4, "13920": [4, 5], "14": [4, 5], "147": 5, "14x4": 5, "15": [4, 5], "150": 4, "15784": 4, "15x5": 5, "16": [4, 5], "16192": 5, "17": 5, "18": [4, 5, 6], "1873": 5, "19716": 4, "1994": 6, "1996": [4, 5, 6, 8], "1997": [5, 8], "1b0": 7, "1d": 5, "1rc0": 7, "2": [4, 5, 6, 7], "20": [4, 5], "200": 4, "2007": [5, 8], "2020": 4, "2021": [4, 5, 8], "2022": 4, "2024": 2, "203488": 4, "21": [4, 5, 6], "21105": [5, 8], "2115": 5, "215646": 4, "22": 5, "22379": 4, "2245": 5, "22803": 4, "23": 5, "234721": 4, "24432": [4, 5, 6, 8], "24720": 4, "25": [1, 4, 5], "250": [4, 5], "2509": 5, "2565": 4, "26": 5, "27": 5, "274": 4, "28": [4, 5], "280": 5, "28523": 4, "29": [4, 5], "291": [5, 8], "295": 5, "297": [5, 8], "2d": [1, 7, 8], "3": [4, 5, 6, 7, 8], "30": [4, 5], "300": [4, 5], "3021": [5, 8], "3054": 5, "31": 4, "3188": 5, "32": 4, "32650": [4, 5], "33": [4, 5, 8], "333333": 5, "338409": 4, "33906": 4, "34": 5, "3461": 5, "35130194": 4, "36": [4, 5], "3680": 4, "37": [4, 5], "37155": 5, "38": [4, 5], "3853": 5, "39": [4, 5], "3986": 5, "3d": [1, 7], "3d_pdp": 5, "4": [4, 5, 6, 7], "40": [4, 5], "41": 5, "4110": 5, "41762": 4, "42": [4, 5], "42643227": 4, "4267": 4, "43832": 4, "44807": 4, "45": [4, 5], "46": 4, "46560": 4, "467": 4, "468": 4, "469": 4, "47": 5, "470": 4, "471": 4, "472": 4, "4746": 5, "48842": [4, 5], "49": [4, 5], "5": [4, 5, 6, 7], "50": [4, 5], "50k": [4, 5], "50k_": 5, "51": [4, 5], "5281": 2, "53": [4, 5], "535": 5, "55": [5, 8], "56": 4, "5623": 4, "5707": 5, "58": 5, "5856": 4, "59": [4, 5], "595": 5, "6": [4, 5, 6, 7, 8], "60": [4, 5, 8], "61": 4, "6172": 4, "62": 5, "64": [4, 5], "65": 5, "66": [4, 5], "6619": 5, "668": 5, "6738": 5, "68": 5, "69": [4, 5], "7": [4, 5, 6, 7], "70": [4, 5], "71": 5, "7152": [5, 8], "73": 5, "74": 4, "74130842": 4, "746": 5, "75": [4, 5], "7536": 5, "76": [4, 5], "77": 5, "77516": 4, "79": [4, 5], "8": [4, 5, 7], "80": [4, 5], "808080": 5, "809": 5, "81": 5, "815": 5, "82": 4, "8213": 5, "82943611": 4, "83": 5, "83311": 4, "85": [4, 5], "8601": 4, "861555": 4, "87": 5, "87104229": 4, "89": [4, 5], "8a": 7, "8b": 7, "8c": 7, "8d": 1, "9": [4, 5, 7, 8], "90": [4, 5, 8], "90069867": 4, "9076": 5, "91": [4, 5], "93": 5, "93837254": 4, "939": 5, "94": 5, "9468": 5, "95": [4, 5, 8], "96": [4, 5, 8], "96078789": 4, "963": 4, "966": 4, "97": 4, "97751875": 4, "98": 4, "99": [4, 5], "A": [1, 4, 5, 6, 8], "As": 5, "By": [1, 5], "For": [4, 5, 6], "If": [1, 4, 5], "In": [4, 5], "Into": 5, "It": [1, 4, 5, 6], "No": [1, 5], "Not": 4, "One": 1, "The": [1, 4, 5, 6], "Then": 4, "There": 5, "These": [1, 4, 5], "To": 5, "With": [3, 7], "_": 5, "_c": 5, "_plotli": 1, "abil": [1, 5], "abl": 5, "about": 4, "abov": [1, 5], "academ": 0, "accept": 1, "access": 5, "accord": [1, 5], "accordingli": 4, "account": 1, "accur": [1, 5], "accuraci": 4, "acknowledg": [1, 7], "across": [1, 4, 5], "actual": 5, "ad": [1, 5, 7], "adapt": [1, 4, 5], "add": [1, 4, 5], "add_best_fit_lin": 5, "add_id": [1, 4, 7], "addit": [1, 5], "addition": [4, 5, 6], "address": [1, 6], "adher": 5, "adjust": [1, 4, 5], "adm": 4, "advanc": 4, "aesthet": [1, 5], "affect": 5, "after": [1, 4, 5], "ag": [4, 5], "against": 5, "age_boxplot_list": 5, "age_group": [4, 5], "ages_18_to_40": 4, "aggreg": 5, "alic": 4, "align": [1, 4, 5], "all": [1, 4, 6, 7], "all_combin": 4, "all_var": 5, "allow": [1, 4, 5], "alon": 5, "along": [1, 4, 5], "alpha": [1, 5], "alreadi": 4, "also": [0, 1, 5], "altern": 5, "alwai": [1, 4], "amount": 4, "an": [0, 1, 3, 4, 5], "analysi": [1, 5, 6, 7], "analyst": 6, "analyt": 3, "analyz": [1, 4, 5], "angl": [1, 5], "ani": [1, 4, 5, 6], "annot": [1, 5], "anomali": 6, "anoth": 5, "anyth": 1, "appar": 5, "appear": [1, 5], "append": [4, 5], "appli": [0, 1, 3, 4, 5, 6], "applic": [1, 5], "approach": 5, "appropri": [1, 5], "approxim": 5, "ar": [1, 4, 5], "area": 5, "arg": 1, "argument": [1, 5], "around": [1, 5], "arrai": 5, "arrang": 5, "arrow": 5, "artifact": 4, "artifici": 3, "asian": 4, "aspect": [1, 5, 6], "assess": 5, "assign": [1, 4, 5], "associ": [5, 6], "assum": 4, "assumpt": 7, "astyp": 1, "attempt": [4, 5], "attent": 5, "attract": 5, "attribut": 5, "aug": 2, "author": [2, 3], "auto": 5, "autofit": 4, "autom": [3, 6], "automat": [1, 5, 6], "autoregress": [5, 8], "avail": 5, "aveoccup": 5, "averag": 5, "averoom": 5, "avoid": [1, 5], "ax": [1, 5], "axi": [1, 5], "azimuth": 5, "bachelor": 4, "back": [4, 5], "backbon": 4, "background": 4, "background_color": [1, 4], "backward": 1, "badg": 1, "band": 5, "bandwidth": 5, "bar": [1, 6, 7], "barh": 5, "barri": [5, 8], "base": [1, 4, 5], "base_path": 4, "bbox_inch": 5, "becaus": [4, 5], "been": [1, 4, 5], "befor": [1, 4, 5, 6], "begin": [4, 5], "behavior": [1, 5], "being": [4, 5], "bell": 5, "below": [4, 5], "beneath": 5, "benefici": 5, "best": [1, 6, 7], "best_fit_linecolor": 5, "best_fit_linestyl": 5, "beta": 1, "better": [1, 5, 6], "between": [1, 4, 5], "bin": [1, 5, 7], "bin_ag": 4, "binrang": 5, "binwidth": [1, 5], "black": [4, 5], "block": [1, 5], "blue": 5, "bob": 4, "bold": 4, "bool": [4, 5], "boolean": [1, 5], "border": 4, "both": [1, 4, 5], "bound": [4, 5], "boundari": 4, "box": [1, 6, 7], "box_violin_plot": [1, 5, 7], "boxplot": 5, "breakdown": 5, "brief": 1, "bring": 3, "broad": [1, 6], "brown": 5, "browser": 5, "bug": 1, "built": 5, "c0": 5, "c5gp7": [4, 5, 6, 8], "c_i": 5, "ca": 7, "calcul": 5, "california": [3, 5], "call": [1, 4, 5], "camera": [1, 5], "can": [1, 4, 5, 6], "cancer": 5, "cannot": 4, "capabl": [1, 4], "capit": 4, "captur": 5, "career": 0, "case": [1, 4, 5], "categor": [1, 4, 5], "categori": [4, 7], "cbar_label": 5, "cbar_thick": [1, 5], "cbar_x": [1, 5], "cdot": 5, "cell": 4, "censu": [4, 5, 6, 8], "census_id": 4, "census_summary_t": 4, "center_baselin": 5, "central": 5, "centric": 7, "certain": 5, "certifi": 1, "cervic": 5, "chang": [1, 5], "changelog": 7, "charact": [4, 5], "characterist": 6, "charli": 4, "check": [1, 4, 5], "choos": [1, 4, 5], "circl": 5, "citat": 1, "cite": 7, "civ": 4, "clariti": [1, 5], "clean": [1, 4, 5, 6], "cleaner": [1, 4], "cleanup": 1, "clear": [1, 5], "clearer": 1, "clearli": 1, "cleric": 4, "closer": 5, "clutter": 5, "cmap": [1, 5], "code": [1, 4, 5], "codebas": 1, "coeffici": 7, "cohes": 5, "col": [1, 4, 5], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 4, 5], "colorbar": 5, "colormap": [1, 5], "column": [1, 5, 7], "column_nam": 4, "combin": [1, 6, 7], "come": 1, "comment": 1, "common": [1, 4, 6], "compar": 5, "comparison": 5, "compat": [1, 5], "complement": 5, "complementari": 5, "complet": 5, "complex": [1, 5], "comprehens": [1, 5, 6], "comput": [5, 8], "concept": 5, "condit": 1, "condition": 1, "configur": [1, 5], "confirm": 1, "confus": [1, 5], "consecut": 4, "consid": 5, "consist": [1, 4, 5], "consolid": 1, "constant": [4, 5], "constraint": 4, "contain": [1, 4, 5], "content": [1, 4], "context": 5, "conting": [1, 5, 6, 7], "contingency_t": [4, 7], "continu": [1, 4, 5], "contour": 5, "contrast": 5, "contributor": 7, "control": [1, 5], "convers": [1, 4], "convert": [1, 4], "coolwarm": [1, 5], "coordin": 1, "cornel": 3, "correct": [1, 5, 6], "correctli": [1, 4, 5], "correl": [1, 7], "correspond": [1, 4, 5], "count": [1, 4, 7], "countri": 4, "cours": 3, "cov": 5, "covari": 5, "creat": [1, 5, 6, 7], "creation": 5, "crop": 5, "crosstab": [1, 7], "crosstab_age_incom": 5, "crosstab_age_sex": 5, "crosstabs_dict": 5, "crosstabs_onli": 5, "crucial": [4, 5, 6], "current": 4, "curv": 5, "custom": [1, 5, 6, 7], "custom_ord": 5, "customiz": [1, 5, 6], "cut": 4, "d": [5, 8], "dai": 4, "dark": 5, "dashboard": 5, "data": [0, 1, 3, 5, 6, 8], "data_nam": 4, "data_output": 4, "data_path": 4, "data_typ": 1, "datafram": [1, 5, 6, 7], "dataframe_column": [1, 4, 7], "dataset": [4, 5, 6], "date": [1, 6, 7], "date_column": 4, "date_str": 4, "datetim": 1, "david": 4, "dd": 4, "deal": [4, 5], "decad": 3, "decim": [1, 4], "decimal_plac": [1, 4], "decis": [1, 5], "decreas": 5, "dedic": 0, "deeper": 5, "deepest": 0, "default": [1, 4, 5], "defin": [1, 4, 5], "definit": 4, "degre": [1, 5], "demograph": 5, "demonstr": [4, 5, 6], "denot": 5, "densiti": [1, 7], "depend": [1, 4, 6, 7], "deprec": 1, "depth": [1, 5], "descend": [4, 5], "describ": [1, 5], "descript": [1, 7], "design": [4, 5, 6], "detail": [1, 4, 5, 6], "determin": 5, "develop": 3, "deviat": [1, 6, 7], "df": [1, 4, 5], "df_censu": 4, "df_dict": 4, "df_num": 5, "dict": [4, 5], "dictionari": [4, 5], "did": 1, "diego": [0, 3], "differ": [1, 5], "digit": [1, 4], "dimens": 5, "dimensionless": 5, "dir": 4, "direct": 5, "directli": [1, 5, 6], "directori": [5, 6, 7], "disabl": [1, 5], "disable_sci_not": [1, 5], "discov": 6, "discret": [4, 5], "dispers": 5, "displai": [1, 4, 5], "distinct": [1, 5], "distinguish": 5, "distract": 5, "distribut": [1, 4, 6, 7], "dive": 4, "divers": 1, "divid": [4, 5], "divorc": 4, "do": [1, 4, 5], "docstr": 1, "document": [1, 7], "doe": [1, 4, 5], "doi": [2, 4, 5, 6, 8], "don": 5, "dot": 5, "doubl": 5, "down": 5, "dr": 0, "draw": 5, "driven": 4, "dtype": 4, "due": [1, 4], "duplic": 1, "dure": [0, 1], "dx_": 5, "dx_c": 5, "dynam": 1, "e": [1, 4, 5], "each": [1, 4, 5], "eas": [1, 4, 6], "easi": [5, 6], "easier": [1, 5], "easili": 5, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 5, 6], "edg": [1, 5], "edgecolor": 1, "educ": [0, 3, 4, 5], "effect": [1, 3, 4, 5, 6], "either": [1, 4, 5], "element": [1, 4, 5], "elev": 5, "els": 1, "emp": 4, "emphas": 1, "emploi": 5, "empti": [1, 4], "enabl": [1, 5, 6], "enable_zoom": [1, 5], "end": [1, 4, 5], "endeavor": 0, "endpoint": 4, "engin": [0, 5, 8], "enhanc": [1, 4, 5, 6], "enough": 1, "ensembl": 5, "ensu": 6, "ensur": [1, 4, 5, 6], "ensure_directori": [4, 7], "enter": [1, 4], "entir": [4, 5], "entri": [1, 5], "environ": [0, 1, 5, 8], "equal": 5, "equat": 5, "equival": 4, "error": [1, 4], "especi": [1, 4, 5], "essenti": [4, 5, 6], "estim": 7, "etc": 6, "ev": 4, "evalu": 5, "even": [1, 5], "everyth": 5, "exact": 1, "examin": 5, "exampl": [1, 4, 6, 7], "exce": 4, "excel": [3, 6, 7], "except": [0, 1, 4], "excess": 5, "exclud": [4, 5], "exclus": 4, "exec": 4, "execut": 5, "exist": [1, 4], "exp": 5, "expand": 1, "expect": [1, 5], "experi": [1, 3], "explain": [1, 4], "explan": 1, "explicitli": 1, "explor": [1, 5, 6], "exploratori": 6, "export": [5, 6], "express": [0, 5], "extend": [0, 5], "extens": [1, 5], "extract": [1, 5], "f": [1, 5], "f8766d": 5, "f8c5c8": 4, "facilit": [3, 4, 6], "factor": 5, "fall": [4, 5], "fallback": 1, "fals": [1, 4, 5], "famili": 4, "fashion": 5, "featur": [1, 4, 5, 7], "feature_nam": 5, "feature_names_list": [1, 5], "feder": 4, "feedback": 1, "femal": [4, 5], "female_": 5, "fetch": 5, "fetch_california_h": 5, "few": 5, "ff0000": 5, "figsiz": [1, 5], "figur": [1, 5], "file": [1, 4, 5], "file_nam": 4, "file_path": 4, "file_prefix": [1, 5], "filenam": [1, 5], "fill": [1, 5], "fill_alpha": [1, 5], "fillna": 1, "filter": [4, 5], "filtered_df": 4, "financi": [3, 5], "find": 1, "first": [1, 4, 5], "fit": [1, 6, 7], "fix": 1, "flag": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 5], "flip": 5, "float": [4, 5], "fnlwgt": 4, "focu": 5, "focus": 5, "folder": 4, "follow": [1, 4, 5, 6], "font": [1, 5], "fontsiz": 1, "form": [4, 6], "format": [1, 5, 6, 7], "formatth": 5, "former": 4, "formerli": 1, "formula": 5, "found": 1, "foundat": 7, "four": 5, "frac": 5, "freedom": 5, "frequenc": [1, 5], "frequent": 4, "friendli": 1, "from": [0, 1, 3, 4, 5, 6], "full": [1, 4, 7], "fulli": 5, "func_col": [1, 5], "function": [1, 4, 6, 7], "further": [1, 5], "futur": [1, 5], "futurewarn": 5, "g": [1, 4, 5], "gain": [4, 6], "gaussian": 7, "gener": [1, 5, 6, 7], "geq": 4, "get": 6, "get_legend": 1, "get_text": 1, "gil": [2, 3], "github": 6, "give": 1, "given": [1, 4, 5], "glanc": 5, "go": 4, "got": 1, "gov": 4, "grad": 4, "gradientboostingregressor": 5, "graduat": 0, "granular": 1, "graphic": [5, 8], "gratitud": 0, "greater": [1, 4], "green": 5, "grei": 5, "grid": [1, 7], "grid_figs": 5, "grid_resolut": 5, "grid_valu": 5, "ground": 5, "group": [1, 4, 7], "gt": 5, "guid": [0, 6], "guidanc": 1, "guidelin": 5, "h": [4, 5], "h_pad": 5, "ha": [1, 3, 4, 5], "half": 5, "halv": 5, "handl": [1, 4, 5, 6], "handler": 4, "hat": 5, "have": [1, 5], "he": 3, "header": [1, 4], "health": 3, "healthcar": 3, "heatmap": [1, 5], "height": 5, "help": [1, 4, 5, 6], "here": [4, 5], "hex": [1, 4], "hi": 0, "hidden": 5, "hide": [1, 5], "hide_index": 1, "high": [1, 5], "higher": [5, 6], "highli": 5, "highlight": [1, 5, 7], "highlight_column": [4, 7], "highlighted_df": 4, "hist": [1, 5], "hist_color": 5, "hist_edgecolor": [1, 5], "histogram": [1, 7], "hold": [3, 5], "horizont": [1, 5], "hour": [4, 5], "hous": 7, "houseag": 5, "household": 5, "hover": 5, "how": [4, 5, 6], "howev": [1, 5], "html": [4, 5], "html_file_nam": [1, 5], "html_file_path": [1, 5], "http": [2, 4, 5, 6, 8], "huber": 5, "hue": [1, 5], "hue_dict": 5, "hue_palett": 5, "hunter": [5, 8], "husband": 4, "hyperlink": 4, "hypothes": 6, "i": [1, 3, 4, 5, 7], "icon": 1, "id": [1, 4, 6], "id_colnam": 4, "identifi": [1, 5, 6, 7], "ignor": 5, "illustr": 5, "imag": [4, 5], "image_filenam": 5, "image_path_png": [1, 4, 5], "image_path_svg": [1, 4, 5], "immedi": 5, "impact": [1, 5], "implement": 1, "import": [1, 4, 5], "imposs": 4, "improv": 1, "inc": 4, "inch": 5, "includ": [1, 4, 5, 6], "inclus": 4, "incom": [4, 5, 6, 8], "inconsist": [1, 4], "incorpor": 1, "incorrect": [1, 5], "increas": 5, "increment": 1, "independ": 1, "index": [1, 4, 5], "indic": [1, 4, 5], "individu": [1, 5], "individual_figs": 5, "industri": 3, "inf": 4, "infin": 4, "influenc": [1, 5], "influenti": 5, "inform": [5, 6], "initi": 6, "inner": 5, "input": [1, 5], "insight": [5, 6], "instal": 7, "instanc": 5, "instead": [1, 5], "instruct": 6, "int": [1, 4, 5], "int64": 4, "integ": 1, "integr": [5, 6], "intellig": 3, "intend": 1, "interact": [1, 7], "interest": 5, "interfac": [1, 5], "intern": [1, 5], "interpret": [1, 5], "interv": 4, "introduc": 1, "introduct": 1, "intuit": [1, 5, 6], "invalid": 1, "invalu": 5, "investig": 6, "involv": [4, 5, 6], "io": 4, "island": 4, "iso": 4, "issu": [1, 6], "item": 5, "iter": 5, "its": [1, 4], "itself": 5, "j": [5, 8], "jinja2": 6, "join": 4, "joint": 5, "jointli": 5, "joss": [5, 8], "journal": [5, 8], "journei": 0, "jupyt": 4, "just": 5, "k": [5, 8], "kde": [1, 6, 7], "kde_color": 5, "kde_density_single_distribut": 5, "kde_distribut": [1, 5, 7], "keep": 5, "kei": [1, 4, 5, 7], "kernel": 7, "keyboard": 5, "keyerror": 5, "keyword": [1, 5], "kind": 5, "kohavi": [4, 5, 6, 8], "kwarg": [1, 5], "l": 2, "label": [1, 4, 5], "label_ag": 4, "label_fonts": [1, 5], "label_nam": 5, "larg": 5, "largest": 5, "last": 4, "latest": 1, "layout": [1, 5], "ldot": 5, "lead": 5, "learn": [0, 1, 3, 4, 5, 6, 8], "learning_r": 5, "least": [1, 4], "lectur": 3, "left": [4, 5], "left_margin": [1, 5], "legend": [1, 5], "legend_label": 5, "legend_labels_list": 5, "legibl": 5, "len": 1, "length": [4, 5], "leonid": [2, 3], "leq": 4, "less": [1, 4], "let": 5, "letter": [5, 8], "level": [4, 5], "leverag": [5, 6], "librari": [1, 4, 5, 7], "licens": 1, "like": [0, 5], "limit": [1, 4, 5], "line": [1, 6, 7], "linear": 5, "linestyl": 5, "link": 7, "list": [1, 4, 5], "load": [4, 5], "local": 4, "locat": [4, 5], "log": [1, 5], "log_scale_var": [1, 5], "logarithm": 5, "logic": 1, "logo": 1, "logscal": 5, "long": 5, "longer": 5, "loop": 5, "loss": [4, 5], "lower": [1, 5], "lt": [4, 5], "m": [0, 3, 5, 8], "machin": [1, 3, 4, 5, 6, 8], "made": 1, "magnitud": 5, "mai": [1, 5], "main": 6, "maintain": [1, 5, 7], "make": [1, 4, 5], "male": [4, 5], "male_": 5, "manag": [1, 3, 5, 6], "manageri": 4, "mani": [5, 6], "manipul": 6, "manner": 5, "manual": [1, 5], "map": [1, 5], "marco": 0, "margin": [1, 5], "marit": 4, "mark": [1, 5], "marker": 5, "marri": 4, "master": 3, "match": [1, 5], "mathbb": 5, "mathbf": 5, "mathemat": [4, 5], "matplotlib": [1, 5, 6, 8], "matplotlib_colormap": 5, "matric": [1, 7], "matrix": [1, 7], "max": 5, "max_col": 5, "max_depth": 5, "max_unique_valu": 4, "max_unique_value_pct": 4, "max_unique_value_tot": 4, "maximum": 5, "mcse": [5, 8], "mean": [1, 4, 6, 7], "mean_color": 5, "meaning": [4, 5], "measur": 5, "mechan": 1, "median": [1, 6, 7], "median_color": 5, "medinc": 5, "meet": 6, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 5, 6], "metric": 5, "metrics_box_violin": 1, "metrics_boxplot_comp": 5, "metrics_comp": 5, "metrics_list": 5, "mid": 5, "might": 5, "min": 5, "min_length": 4, "mind": 6, "minim": [1, 5], "minimum": [4, 5], "minor": 1, "misalign": 5, "misinterpret": 5, "mislead": 1, "miss": [1, 4, 5, 6], "mm": 4, "mode": [1, 5], "model": [1, 5, 6], "model_select": 5, "modifi": [1, 5], "month": [2, 4], "more": [1, 4, 5], "most": [1, 4, 5, 6], "mous": 5, "move": [1, 5], "mu": 5, "mu_i": 5, "mu_x": 5, "much": 5, "multidimension": 5, "multipl": [1, 4, 5, 6], "multipli": 1, "must": [4, 5], "my_datafram": 1, "n": 5, "n_col": 5, "n_estim": 5, "n_row": 5, "na": [1, 4], "name": [1, 4, 5], "nativ": 4, "navig": [4, 5], "nbformat": 6, "ndarrai": 5, "necessari": [1, 4], "need": [1, 4, 5, 6], "neg": 5, "neither": [1, 5], "nest": 5, "neutral": 5, "never": 4, "new": [1, 4, 5], "newer": 5, "next": [4, 5], "nh": 5, "nomenclatur": 1, "non": [1, 4, 7], "none": [1, 4, 5], "nor": [1, 5], "normal": [1, 7], "notat": [1, 5], "note": [4, 5], "notebook": 4, "noth": 4, "notic": 5, "now": 1, "np": 5, "null": [1, 4], "null_pct": 4, "null_tot": 4, "num": [4, 5], "num_digit": 4, "number": [1, 4, 5], "numer": [1, 5, 7], "numpi": [5, 6], "o": [2, 4, 5], "object": [1, 4, 5], "observ": 5, "obviou": 5, "occup": [4, 5], "occur": 1, "occurr": 4, "offer": [1, 5, 6], "often": [5, 6], "older": [1, 5], "omit": 1, "one": [1, 4, 5], "onli": [1, 5], "opaqu": 5, "open": [5, 8], "oper": [4, 5], "optim": 5, "option": [1, 4, 5, 6], "orang": 5, "order": [1, 4, 5], "org": [2, 4, 5, 6, 8], "organ": [1, 5], "orient": 5, "origin": [4, 5], "original_df": 4, "oscar": [2, 3], "other": [1, 4, 5], "otherwis": 5, "our": 0, "out": 5, "outcom": 5, "outlier": 6, "output": [1, 4, 5], "outsid": 5, "over": [1, 3, 5], "overal": [1, 5], "overlai": 5, "overlaid": 5, "overlap": 5, "overrid": 5, "overview": 7, "own": 5, "p": 5, "pac": 4, "pace": [5, 8], "packag": 6, "pad": [1, 5], "page": [5, 6], "pair": [4, 5], "pairwis": 5, "palett": 5, "panda": [1, 4, 5, 6], "param": 1, "paramet": [1, 4, 5], "parametr": 5, "pardir": 4, "parent": 4, "pars": 4, "parse_date_with_rul": [4, 7], "part": 4, "partial": [1, 7], "partial_depend": 5, "particular": 5, "particularli": [1, 4, 5], "pass": [1, 5], "path": [1, 5, 7], "patient": 4, "pattern": [5, 6], "pd": [4, 5], "pdf": 5, "pdp": 5, "pearson": 7, "per": [4, 5], "percent": [1, 5], "percentag": 4, "perfect": 5, "perfectli": 5, "perform": [1, 4, 5], "performancewarn": 1, "period": 7, "person": 3, "perspect": [1, 5], "pi": 5, "pink": 4, "pip": 6, "pitfal": 1, "pivot": [0, 7], "place": [1, 4], "plai": 0, "plain": 4, "plot": [1, 6], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_mean": 5, "plot_median": 5, "plot_typ": [1, 5], "plotli": [1, 5, 6], "plotly_colormap": 5, "plots_onli": 5, "plt": 1, "pm": 5, "png": [1, 4, 5], "png_imag": 4, "point": [1, 5], "pointer": 5, "popul": 5, "popular": 6, "posit": [1, 5], "possibl": [4, 5, 6], "potenti": [1, 4, 5], "power": [1, 5], "pr": 1, "pre": 1, "preced": 5, "predict": [1, 5], "prefer": [1, 5], "prefix": [1, 5], "prepar": [1, 4, 5], "prerequisit": 7, "present": [1, 4, 5], "preval": 5, "prevent": [1, 4, 5], "previou": [1, 5], "previous": 1, "price": 5, "print": [1, 4, 5], "prior": 5, "privat": 4, "probabl": [1, 5, 8], "process": [1, 4, 6], "produc": [1, 5], "product": 5, "prof": 4, "profession": 3, "program": [0, 3], "project": [1, 3, 4, 7], "promin": 5, "proper": [1, 5], "properli": [1, 5], "proport": [1, 4, 5], "provid": [0, 1, 4, 5, 6], "public": 5, "publish": 2, "purpl": 5, "purpos": [1, 7], "pursu": 0, "py": 1, "pypi": [1, 6], "python": [1, 3, 5, 7], "qualiti": [5, 6], "quantifi": 5, "quantit": 5, "quick": 5, "quickli": [5, 6], "r": [3, 4, 5, 6, 8], "r_": 5, "race": 4, "rais": [1, 4, 5], "random": 4, "random_st": 5, "rang": [4, 5, 6], "raw": 5, "re": [1, 5], "read": 4, "readabl": [1, 5], "readi": 6, "readm": 1, "record": 4, "red": 5, "reduc": [1, 5], "redund": 5, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 5], "regress": 7, "regular": [1, 7], "relat": [1, 4, 5], "relationship": [4, 5, 6], "releas": 1, "relev": [1, 6], "reli": 5, "reliabl": 4, "remain": [1, 5], "remov": [1, 5, 6, 7], "remove_stack": [1, 5], "renam": [1, 5], "render": 4, "replac": 4, "replica": 1, "report": [3, 5, 6], "repositori": [4, 5, 6, 8], "repres": [1, 4, 5], "represent": [1, 5], "reproduc": 4, "requir": [1, 5, 6], "research": 6, "reset": 1, "resolut": 5, "respect": [1, 4, 5], "respons": 5, "rest": 5, "result": [1, 4, 5], "return": [1, 4, 5], "return_df": [1, 4], "return_dict": 5, "reveal": 5, "rich": [5, 6], "right": [4, 5], "right_margin": [1, 5], "riversid": 3, "robust": 1, "role": [0, 1], "rot": 5, "rotat": [1, 5], "rotate_plot": 5, "round": 4, "row": [4, 5], "rule": 4, "run": 6, "s0167": [5, 8], "same": [1, 5], "sampl": [4, 5], "san": [0, 3], "save": [1, 5, 6, 7], "save_dataframes_to_excel": [1, 4, 7], "save_format": [1, 5], "save_plot": [1, 5], "scale": [1, 5], "scatter": [1, 6, 7], "scatter_color": 5, "scatter_fit_plot": [1, 5, 7], "scatterplot": 5, "scenario": [1, 5], "schema": 5, "scheme": 5, "school": 0, "scienc": [0, 3, 4, 5, 6, 8], "scientif": [1, 5], "scientist": [0, 3, 6], "scikit": [1, 5, 6], "scroll": 5, "seaborn": [1, 5, 6, 8], "seamlessli": 6, "second": [4, 5], "section": [1, 4], "see": 5, "seed": 4, "select": [1, 5], "select_dtyp": 5, "self": 4, "separ": [1, 4, 5], "sequenc": 5, "seri": 4, "serv": [1, 3], "servic": 3, "set": [1, 4, 5], "set_as_index": 4, "set_titl": 1, "setminu": 5, "setp": 1, "setup": [1, 4, 5], "sever": [1, 5], "sex": [4, 5], "shape": [4, 5], "sheet": 4, "shilei": 0, "should": 5, "show": [1, 4, 5], "show_cbar": 5, "show_correl": 5, "show_legend": [1, 5], "show_modebar": [1, 5], "show_plot": 5, "showcas": 5, "shown": 5, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 5, "sigma_i": 5, "sigma_x": 5, "signatur": 1, "signific": 1, "silver": 5, "similarli": 5, "simpl": 5, "simpler": 1, "simplic": 6, "simplif": 1, "simplifi": [1, 4], "simultan": 5, "sinc": 5, "singl": [1, 4, 5], "single_figs": 5, "single_var_image_filenam": 5, "size": [1, 4, 5], "sklearn": 5, "slightli": 1, "small": 1, "smallest": 5, "smooth": 5, "smoother": [1, 5], "sn": 5, "snippet": [4, 5], "so": [1, 4, 5], "softwar": [2, 5, 8], "some": [1, 4], "sort": [1, 4], "sort_bi": [1, 4], "sortbi": 1, "sourc": [5, 6, 8], "space": [1, 5], "span": 5, "spars": [5, 8], "spatial": [5, 8], "special": 4, "specialti": 4, "specif": [1, 5, 6, 7], "specifi": [1, 4, 5, 6], "split": 5, "spous": 4, "spread": 5, "sql": 3, "sqrt": 5, "squar": [1, 5], "stabil": 1, "stabl": 1, "stack": [1, 6, 7], "stacked_crosstab": 5, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 5, 6, 7], "standardized_d": 4, "start": [1, 4, 6], "stat": [1, 5], "state": 4, "static": [1, 7], "statist": [1, 3, 4, 5, 6, 8], "statu": [1, 4], "std": 7, "std_color": 5, "std_dev_level": 5, "stem": 5, "step": [1, 6], "still": [1, 5], "store": [1, 5], "str": [1, 4, 5], "straightforward": 1, "streamlin": [1, 4, 6], "strength": 5, "string": [1, 4, 5], "strip": 4, "strip_trailing_period": [4, 7], "stronger": 5, "structur": [1, 6], "style": [1, 4, 5], "styler": [1, 4], "subplot": 5, "subset": 5, "substitut": 5, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suit": 6, "suitabl": 1, "sum_": 5, "summar": [5, 6], "summari": [1, 6, 7], "summarize_all_combin": [4, 7], "summary_t": 4, "support": [0, 1, 5], "suppos": 5, "suppress": 5, "sure": 4, "surfac": [1, 5], "svg": [1, 4, 5], "svg_imag": 4, "sy": 1, "system": [4, 6], "t": 5, "tab": 4, "tabl": [1, 5, 6], "tailor": 5, "take": [4, 5], "tall": 5, "target": 5, "tarshizi": 0, "task": [4, 6], "tatist": 5, "teach": 3, "techniqu": [6, 7], "ten": 3, "tend": 5, "tendenc": 5, "test": [1, 5], "test_siz": 5, "text": [1, 4, 5], "text_wrap": [1, 5], "th": 5, "than": [1, 4], "thank": 0, "thei": [1, 4, 5], "them": [1, 4, 5, 6], "theoret": 7, "therefor": 5, "thi": [1, 4, 5, 6], "thick": 5, "those": 1, "three": 5, "through": [1, 5], "throw": 1, "thu": 4, "tick": [1, 5], "tick_fonts": [1, 5], "tight": 5, "time": [0, 1, 4, 5], "titl": [1, 2, 5], "title_i": [1, 5], "title_x": [1, 5], "to_list": 5, "togeth": 5, "toggl": [1, 5], "tool": [1, 5, 6], "toolkit": 1, "top": 5, "top_margin": [1, 5], "topic": 4, "total": [4, 5], "toward": 1, "trail": 7, "train": 5, "train_test_split": 5, "transpar": [1, 5], "trend": [5, 6], "triangl": 5, "triangular": [1, 7], "true": [1, 4, 5], "truth": 5, "try": 1, "tupl": [1, 4, 5], "two": [1, 4, 5], "type": [1, 4, 5, 6], "u": [0, 4, 5], "uci": [4, 5, 6, 8], "ucla": 3, "unambigu": 4, "uncov": [5, 6], "underli": [5, 6], "understand": [4, 5, 6], "uniform": 1, "uniqu": [1, 5, 6, 7], "unique_values_tot": 4, "unique_var": 4, "unit": 4, "univers": [0, 3], "unnecessari": 1, "unrecogn": 4, "unstack": 5, "unus": 1, "unwav": 0, "up": [1, 4, 5], "updat": [1, 4, 5], "upper": [1, 4, 5], "upright": 5, "url": 2, "us": [1, 4, 5, 6], "usabl": 1, "usag": [1, 4, 5], "user": [1, 5, 6], "userwarn": 5, "util": [4, 5, 6], "v": 5, "valid": 1, "valid_plot_typ": 1, "valu": [1, 4, 5, 6], "valueerror": [1, 4, 5], "vari": 5, "variabl": [1, 5, 6, 7], "varianc": 5, "varieti": [3, 5, 6], "variou": [1, 5, 6], "vars_of_interest": 5, "vdot": 4, "vector": 5, "verbiag": 1, "verifi": [1, 4], "versa": 5, "versatil": 5, "version": [2, 5, 6, 7], "version_info": 1, "versu": 1, "vertic": [1, 5], "via": [1, 5], "vice": 5, "view": [1, 5], "view_angl": 5, "violin": [1, 6, 7], "violinplot": 5, "viridi": 5, "visibl": [1, 5], "visual": [1, 4, 5, 6, 8], "vmax": 5, "vmin": 5, "vriabl": 5, "w_pad": 5, "wa": [1, 5], "wai": 5, "want": [1, 5], "wareh": 3, "warn": [1, 4, 5], "waskom": [5, 8], "we": [0, 4, 5, 6], "week": [4, 5], "welcom": 7, "well": [4, 5], "were": 4, "what": [1, 7], "wheel": 5, "when": [1, 4, 5, 6], "where": [1, 4, 5], "whether": [1, 4, 5], "which": [1, 4, 5, 6], "while": [1, 5], "white": 4, "whitespac": 5, "who": 1, "wide": [3, 5], "width": [1, 5], "wife": 4, "wirefram": [1, 5], "wireframe_color": 5, "wish": 5, "within": [1, 3, 4, 5], "without": [1, 4, 5], "work": [1, 4, 5], "workclass": 4, "workflow": [4, 6], "would": [0, 1, 5], "wrangl": 3, "wrap": [1, 5], "write": 4, "x": [1, 4, 5, 8], "x_": 5, "x_1": 5, "x_2": 5, "x_c": 5, "x_i": 5, "x_j": 5, "x_k": 5, "x_label": [1, 5], "x_label_plotli": 1, "x_n": 5, "x_p": 5, "x_test": 5, "x_train": 5, "x_var": 5, "xlabel": 5, "xlabel_align": 5, "xlabel_rot": 5, "xlim": [1, 5], "xlsx": 4, "xlsxwriter": 6, "xx": 1, "xy": 5, "y": [1, 5], "y_axis_label": 5, "y_i": 5, "y_label": [1, 5], "y_label_plotli": 1, "y_test": 5, "y_train": 5, "y_var": 5, "year": [2, 3, 4], "yellow": 4, "ylabel": 5, "ylabel_align": 5, "ylabel_rot": 5, "ylim": [1, 5], "you": [4, 5, 6], "your": [4, 5, 6], "yy": 1, "yyyi": 4, "z": 5, "z_label": [1, 5], "z_label_plotli": 1, "zenodo": [1, 2], "zero": [1, 4], "zoom": [1, 5], "zoom_out_factor": [1, 5], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Data Management Overview", "Plotting and Theoretical Overview", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References"], "titleterms": {"0": 1, "10": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 5, "3": 1, "3d": 5, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "9": 1, "With": 5, "about": 7, "acknowledg": 0, "ad": 4, "all": 5, "analysi": 4, "assumpt": 5, "bar": 5, "best": 5, "bin": 4, "box": 5, "ca": 5, "categori": 5, "centric": 5, "changelog": 1, "cite": 2, "coeffici": 5, "column": 4, "combin": [4, 5], "content": 7, "conting": 4, "contributor": 3, "correl": 5, "count": 5, "creat": 4, "crosstab": 5, "custom": 4, "data": [4, 7], "datafram": 4, "date": 4, "densiti": 5, "depend": 5, "descript": 6, "deviat": 5, "directori": 4, "distribut": 5, "document": 6, "eda": [2, 6, 7], "estim": 5, "exampl": 5, "excel": 4, "featur": 6, "fit": 5, "format": 4, "foundat": 5, "full": 5, "function": 5, "gaussian": 5, "gener": 4, "get": 7, "grid": 5, "group": 5, "heurist": 7, "highlight": 4, "histogram": 5, "hous": 5, "i": 6, "identifi": 4, "instal": 6, "interact": 5, "kde": 5, "kei": 6, "kernel": 5, "librari": 6, "line": 5, "link": 6, "maintain": 3, "manag": [4, 7], "matric": 5, "matrix": 5, "mean": 5, "median": 5, "non": 5, "normal": 5, "numer": 4, "overview": [4, 5], "partial": 5, "path": 4, "pearson": 5, "period": 4, "pivot": 5, "plot": [5, 7], "prerequisit": 6, "project": 6, "purpos": 6, "python": 6, "refer": 8, "regress": 5, "regular": 5, "remov": 4, "save": 4, "scatter": 5, "specif": 4, "stack": 5, "standard": 4, "start": 7, "static": 5, "std": 5, "summari": 4, "tabl": [4, 7], "techniqu": 4, "theoret": 5, "toolkit": [2, 6, 7], "trail": 4, "triangular": 5, "uniqu": 4, "variabl": 4, "version": 1, "violin": 5, "welcom": 6, "what": 6}}) \ No newline at end of file +Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[5, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[5, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[5, "id14"]], "3D Plots - CA Housing Example": [[5, "id15"]], "About EDA Toolkit": [[7, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[4, "adding-unique-identifiers"]], "Binning Numerical Columns": [[4, "binning-numerical-columns"]], "Box Plots Grid Example": [[5, "box-plots-grid-example"]], "Box and Violin Plots": [[5, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[5, "correlation-matrices"]], "Creating Contingency Tables": [[4, "creating-contingency-tables"]], "Data Management": [[7, null]], "Data Management Overview": [[4, null]], "Data Management Techniques": [[4, "data-management-techniques"]], "DataFrame Analysis": [[4, "dataframe-analysis"]], "Description": [[6, "description"]], "Full Correlation Matrix Example": [[5, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[5, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[4, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[7, null]], "Highlighting Specific Columns in a DataFrame": [[4, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[5, "histogram-example-count"]], "Histogram Example (Density)": [[5, "histogram-example-density"]], "Histogram Example - (Mean and Median)": [[5, "histogram-example-mean-and-median"]], "Histogram Example - (Mean, Median, and Std. Deviation)": [[5, "histogram-example-mean-median-and-std-deviation"]], "Histograms and Kernel Density Estimation (KDE)": [[5, "histograms-and-kernel-density-estimation-kde"]], "Installation": [[6, "installation"]], "Interactive Plot": [[5, "interactive-plot"]], "KDE Distribution Function": [[5, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[5, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[5, "kde-and-histograms-example"]], "Key Features": [[6, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[5, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Foundations": [[5, "partial-dependence-foundations"]], "Partial Dependence Plots": [[5, "partial-dependence-plots"]], "Path directories": [[4, "path-directories"]], "Pearson Correlation Coefficient": [[5, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[5, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[5, "pivoted-violin-plots-grid-example"]], "Plotting Heuristics": [[7, null]], "Plotting and Theoretical Overview": [[5, null]], "Prerequisites": [[6, "prerequisites"]], "Project Links": [[6, "project-links"]], "Purpose of EDA Toolkit": [[6, "purpose-of-eda-toolkit"]], "References": [[8, null]], "Regression-Centric Scatter Plots Example": [[5, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[5, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[4, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[5, "scatter-fit-plot"]], "Scatter Plots (All Combinations Example)": [[5, "scatter-plots-all-combinations-example"]], "Scatter Plots Grouped by Category Example": [[5, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[5, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[5, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[5, "stacked-crosstab-plots"]], "Standardized Dates": [[4, "standardized-dates"]], "Static Plot": [[5, "static-plot"]], "Table of Contents": [[7, null]], "Trailing Period Removal": [[4, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[5, "triangular-correlation-matrix-example"]], "Version 0.0.10": [[1, "version-0-0-10"]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id8"], [1, "id9"], [1, "id10"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Version 0.0.9": [[1, "version-0-0-9"]], "Violin Plots Grid Example": [[5, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[6, null]], "What is EDA?": [[6, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "data_management", "eda_plots", "getting_started", "index", "references"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "data_management.rst", "eda_plots.rst", "getting_started.rst", "index.rst", "references.rst"], "indexentries": {"add_ids()": [[4, "add_ids", false]], "box_violin_plot()": [[5, "box_violin_plot", false]], "built-in function": [[4, "add_ids", false], [4, "contingency_table", false], [4, "dataframe_columns", false], [4, "ensure_directory", false], [4, "highlight_columns", false], [4, "parse_date_with_rule", false], [4, "save_dataframes_to_excel", false], [4, "strip_trailing_period", false], [4, "summarize_all_combinations", false], [5, "box_violin_plot", false], [5, "flex_corr_matrix", false], [5, "kde_distributions", false], [5, "plot_2d_pdp", false], [5, "plot_3d_pdp", false], [5, "scatter_fit_plot", false], [5, "stacked_crosstab_plot", false]], "contingency_table()": [[4, "contingency_table", false]], "dataframe_columns()": [[4, "dataframe_columns", false]], "ensure_directory()": [[4, "ensure_directory", false]], "flex_corr_matrix()": [[5, "flex_corr_matrix", false]], "highlight_columns()": [[4, "highlight_columns", false]], "kde_distributions()": [[5, "kde_distributions", false]], "parse_date_with_rule()": [[4, "parse_date_with_rule", false]], "plot_2d_pdp()": [[5, "plot_2d_pdp", false]], "plot_3d_pdp()": [[5, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[4, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[5, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[5, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[4, "strip_trailing_period", false]], "summarize_all_combinations()": [[4, "summarize_all_combinations", false]]}, "objects": {"": [[4, 0, 1, "", "add_ids"], [5, 0, 1, "", "box_violin_plot"], [4, 0, 1, "", "contingency_table"], [4, 0, 1, "", "dataframe_columns"], [4, 0, 1, "", "ensure_directory"], [5, 0, 1, "", "flex_corr_matrix"], [4, 0, 1, "", "highlight_columns"], [5, 0, 1, "", "kde_distributions"], [4, 0, 1, "", "parse_date_with_rule"], [5, 0, 1, "", "plot_2d_pdp"], [5, 0, 1, "", "plot_3d_pdp"], [4, 0, 1, "", "save_dataframes_to_excel"], [5, 0, 1, "", "scatter_fit_plot"], [5, 0, 1, "", "stacked_crosstab_plot"], [4, 0, 1, "", "strip_trailing_period"], [4, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 4, 5], "0": [2, 4, 5, 6, 7], "00": 4, "000000": 5, "0000ff": 5, "00140": [5, 8], "00bfc4": 5, "01": 4, "02": [1, 4], "03021": [5, 8], "04": [4, 5], "05": 5, "07": [4, 5], "09": 5, "1": [1, 4, 5, 6], "10": [2, 4, 5, 6, 7, 8], "100": [4, 5], "1016": [5, 8], "10724": 5, "11": 4, "1109": [5, 8], "111": 4, "115": 5, "11687": 5, "11th": 4, "12": [4, 5, 6], "120": 5, "12202842": 4, "123": 4, "12929": 5, "13": [4, 5], "131": 5, "13162633": 2, "13163208": 2, "13174": 5, "1348": 4, "13920": [4, 5], "14": [4, 5], "147": 5, "14x4": 5, "15": [4, 5], "150": 4, "15784": 4, "15x5": 5, "16": [4, 5], "16192": 5, "17": 5, "18": [4, 5, 6], "1873": 5, "19716": 4, "1994": 6, "1996": [4, 5, 6, 8], "1997": [5, 8], "1b0": 7, "1d": 5, "1rc0": 7, "2": [4, 5, 6, 7], "20": [4, 5], "200": 4, "2007": [5, 8], "2020": 4, "2021": [4, 5, 8], "2022": 4, "2024": 2, "203488": 4, "21": [4, 5, 6], "21105": [5, 8], "2115": 5, "215646": 4, "22": 5, "22379": 4, "2245": 5, "22803": 4, "23": 5, "234721": 4, "24432": [4, 5, 6, 8], "24720": 4, "25": [1, 4, 5], "250": [4, 5], "2509": 5, "2565": 4, "26": 5, "27": 5, "274": 4, "28": [4, 5], "280": 5, "28523": 4, "29": [4, 5], "291": [5, 8], "295": 5, "297": [5, 8], "2d": [1, 7, 8], "3": [4, 5, 6, 7, 8], "30": [4, 5], "300": [4, 5], "3021": [5, 8], "3054": 5, "31": 4, "3188": 5, "32": 4, "32650": [4, 5], "33": [4, 5, 8], "333333": 5, "338409": 4, "33906": 4, "34": 5, "3461": 5, "35130194": 4, "36": [4, 5], "3680": 4, "37": [4, 5], "37155": 5, "38": [4, 5], "3853": 5, "39": [4, 5], "3986": 5, "3d": [1, 7], "3d_pdp": 5, "4": [4, 5, 6, 7], "40": [4, 5], "41": 5, "4110": 5, "41762": 4, "42": [4, 5], "42643227": 4, "4267": 4, "43832": 4, "44807": 4, "45": [4, 5], "46": 4, "46560": 4, "467": 4, "468": 4, "469": 4, "47": 5, "470": 4, "471": 4, "472": 4, "4746": 5, "48842": [4, 5], "49": [4, 5], "5": [4, 5, 6, 7], "50": [4, 5], "50k": [4, 5], "50k_": 5, "51": [4, 5], "5281": 2, "53": [4, 5], "535": 5, "55": [5, 8], "56": 4, "5623": 4, "5707": 5, "58": 5, "5856": 4, "59": [4, 5], "595": 5, "6": [4, 5, 6, 7, 8], "60": [4, 5, 8], "61": 4, "6172": 4, "62": 5, "64": [4, 5], "65": 5, "66": [4, 5], "6619": 5, "668": 5, "6738": 5, "68": 5, "69": [4, 5], "7": [4, 5, 6, 7], "70": [4, 5], "71": 5, "7152": [5, 8], "73": 5, "74": 4, "74130842": 4, "746": 5, "75": [4, 5], "7536": 5, "76": [4, 5], "77": 5, "77516": 4, "79": [4, 5], "8": [4, 5, 7], "80": [4, 5], "808080": 5, "809": 5, "81": 5, "815": 5, "82": 4, "8213": 5, "82943611": 4, "83": 5, "83311": 4, "85": [4, 5], "8601": 4, "861555": 4, "87": 5, "87104229": 4, "89": [4, 5], "8a": 7, "8b": 7, "8c": 7, "8d": 1, "9": [4, 5, 7, 8], "90": [4, 5, 8], "90069867": 4, "9076": 5, "91": [4, 5], "93": 5, "93837254": 4, "939": 5, "94": 5, "9468": 5, "95": [4, 5, 8], "96": [4, 5, 8], "96078789": 4, "963": 4, "966": 4, "97": 4, "97751875": 4, "98": 4, "99": [4, 5], "A": [1, 4, 5, 6, 8], "As": 5, "By": [1, 5], "For": [4, 5, 6], "If": [1, 4, 5], "In": [4, 5], "Into": 5, "It": [1, 4, 5, 6], "No": [1, 5], "Not": 4, "One": 1, "The": [1, 4, 5, 6], "Then": 4, "There": 5, "These": [1, 4, 5], "To": 5, "With": [3, 7], "_": 5, "_c": 5, "_plotli": 1, "abil": [1, 5], "abl": 5, "about": 4, "abov": [1, 5], "academ": 0, "accept": 1, "access": 5, "accord": [1, 5], "accordingli": 4, "account": 1, "accur": [1, 5], "accuraci": 4, "acknowledg": [1, 7], "across": [1, 4, 5], "actual": 5, "ad": [1, 5, 7], "adapt": [1, 4, 5], "add": [1, 4, 5], "add_best_fit_lin": 5, "add_id": [1, 4, 7], "addit": [1, 5], "addition": [4, 5, 6], "address": [1, 6], "adher": 5, "adjust": [1, 4, 5], "adm": 4, "advanc": 4, "aesthet": [1, 5], "affect": 5, "after": [1, 4, 5], "ag": [4, 5], "against": 5, "age_boxplot_list": 5, "age_group": [4, 5], "ages_18_to_40": 4, "aggreg": 5, "alic": 4, "align": [1, 4, 5], "all": [1, 4, 6, 7], "all_combin": 4, "all_var": 5, "allow": [1, 4, 5], "alon": 5, "along": [1, 4, 5], "alpha": [1, 5], "alreadi": 4, "also": [0, 1, 5], "altern": 5, "alwai": [1, 4], "amount": 4, "an": [0, 1, 3, 4, 5], "analysi": [1, 5, 6, 7], "analyst": 6, "analyt": 3, "analyz": [1, 4, 5], "angl": [1, 5], "ani": [1, 4, 5, 6], "annot": [1, 5], "anomali": 6, "anoth": 5, "anyth": 1, "appar": 5, "appear": [1, 5], "append": [4, 5], "appli": [0, 1, 3, 4, 5, 6], "applic": [1, 5], "approach": 5, "appropri": [1, 5], "approxim": 5, "ar": [1, 4, 5], "area": 5, "arg": 1, "argument": [1, 5], "around": [1, 5], "arrai": 5, "arrang": 5, "arrow": 5, "artifact": 4, "artifici": 3, "asian": 4, "aspect": [1, 5, 6], "assess": 5, "assign": [1, 4, 5], "associ": [5, 6], "assum": 4, "assumpt": 7, "astyp": 1, "attempt": [4, 5], "attent": 5, "attract": 5, "attribut": 5, "aug": 2, "author": [2, 3], "auto": 5, "autofit": 4, "autom": [3, 6], "automat": [1, 5, 6], "autoregress": [5, 8], "avail": 5, "aveoccup": 5, "averag": 5, "averoom": 5, "avoid": [1, 5], "ax": [1, 5], "axi": [1, 5], "azimuth": 5, "bachelor": 4, "back": [4, 5], "backbon": 4, "background": 4, "background_color": [1, 4], "backward": 1, "badg": 1, "band": 5, "bandwidth": 5, "bar": [1, 6, 7], "barh": 5, "barri": [5, 8], "base": [1, 4, 5], "base_path": 4, "bbox_inch": 5, "becaus": [4, 5], "been": [1, 4, 5], "befor": [1, 4, 5, 6], "begin": [4, 5], "behavior": [1, 5], "being": [4, 5], "bell": 5, "below": [4, 5], "beneath": 5, "benefici": 5, "best": [1, 6, 7], "best_fit_linecolor": 5, "best_fit_linestyl": 5, "beta": 1, "better": [1, 5, 6], "between": [1, 4, 5], "bin": [1, 5, 7], "bin_ag": 4, "binrang": 5, "binwidth": [1, 5], "black": [4, 5], "block": [1, 5], "blue": 5, "bob": 4, "bold": 4, "bool": [4, 5], "boolean": [1, 5], "border": 4, "both": [1, 4, 5], "bound": [4, 5], "boundari": 4, "box": [1, 6, 7], "box_violin_plot": [1, 5, 7], "boxplot": 5, "breakdown": 5, "brief": 1, "bring": 3, "broad": [1, 6], "brown": 5, "browser": 5, "bug": 1, "built": 5, "c0": 5, "c5gp7": [4, 5, 6, 8], "c_i": 5, "ca": 7, "calcul": 5, "california": [3, 5], "call": [1, 4, 5], "camera": [1, 5], "can": [1, 4, 5, 6], "cancer": 5, "cannot": 4, "capabl": [1, 4], "capit": 4, "captur": 5, "career": 0, "case": [1, 4, 5], "categor": [1, 4, 5], "categori": [4, 7], "cbar_label": 5, "cbar_thick": [1, 5], "cbar_x": [1, 5], "cdot": 5, "cell": 4, "censu": [4, 5, 6, 8], "census_id": 4, "census_summary_t": 4, "center_baselin": 5, "central": 5, "centric": 7, "certain": 5, "certifi": 1, "cervic": 5, "chang": [1, 5], "changelog": 7, "charact": [4, 5], "characterist": 6, "charli": 4, "check": [1, 4, 5], "choos": [1, 4, 5], "circl": 5, "citat": 1, "cite": 7, "civ": 4, "clariti": [1, 5], "clean": [1, 4, 5, 6], "cleaner": [1, 4], "cleanup": 1, "clear": [1, 5], "clearer": 1, "clearli": 1, "cleric": 4, "closer": 5, "clutter": 5, "cmap": [1, 5], "code": [1, 4, 5], "codebas": 1, "coeffici": 7, "cohes": 5, "col": [1, 4, 5], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 4, 5], "colorbar": 5, "colormap": [1, 5], "column": [1, 5, 7], "column_nam": 4, "combin": [1, 6, 7], "come": 1, "comment": 1, "common": [1, 4, 6], "compar": 5, "comparison": 5, "compat": [1, 5], "complement": 5, "complementari": 5, "complet": 5, "complex": [1, 5], "comprehens": [1, 5, 6], "comput": [5, 8], "concept": 5, "condit": 1, "condition": 1, "configur": [1, 5], "confirm": 1, "confus": [1, 5], "consecut": 4, "consid": 5, "consist": [1, 4, 5], "consolid": 1, "constant": [4, 5], "constraint": 4, "contain": [1, 4, 5], "content": [1, 4], "context": 5, "conting": [1, 5, 6, 7], "contingency_t": [4, 7], "continu": [1, 4, 5], "contour": 5, "contrast": 5, "contributor": 7, "control": [1, 5], "convers": [1, 4], "convert": [1, 4], "coolwarm": [1, 5], "coordin": 1, "cornel": 3, "correct": [1, 5, 6], "correctli": [1, 4, 5], "correl": [1, 7], "correspond": [1, 4, 5], "count": [1, 4, 7], "countri": 4, "cours": 3, "cov": 5, "covari": 5, "creat": [1, 5, 6, 7], "creation": 5, "crop": 5, "crosstab": [1, 7], "crosstab_age_incom": 5, "crosstab_age_sex": 5, "crosstabs_dict": 5, "crosstabs_onli": 5, "crucial": [4, 5, 6], "current": 4, "curv": 5, "custom": [1, 5, 6, 7], "custom_ord": 5, "customiz": [1, 5, 6], "cut": 4, "d": [5, 8], "dai": 4, "dark": 5, "dashboard": 5, "data": [0, 1, 3, 5, 6, 8], "data_nam": 4, "data_output": 4, "data_path": 4, "data_typ": 1, "datafram": [1, 5, 6, 7], "dataframe_column": [1, 4, 7], "dataset": [4, 5, 6], "date": [1, 6, 7], "date_column": 4, "date_str": 4, "datetim": 1, "david": 4, "dd": 4, "deal": [4, 5], "decad": 3, "decim": [1, 4], "decimal_plac": [1, 4], "decis": [1, 5], "decreas": 5, "dedic": 0, "deeper": 5, "deepest": 0, "default": [1, 4, 5], "defin": [1, 4, 5], "definit": 4, "degre": [1, 5], "demograph": 5, "demonstr": [4, 5, 6], "denot": 5, "densiti": [1, 7], "depend": [1, 4, 6, 7], "deprec": 1, "depth": [1, 5], "descend": [4, 5], "describ": [1, 5], "descript": [1, 7], "design": [4, 5, 6], "detail": [1, 4, 5, 6], "determin": 5, "develop": 3, "deviat": [1, 6, 7], "df": [1, 4, 5], "df_censu": 4, "df_dict": 4, "df_num": 5, "dict": [4, 5], "dictionari": [4, 5], "did": 1, "diego": [0, 3], "differ": [1, 5], "digit": [1, 4], "dimens": 5, "dimensionless": 5, "dir": 4, "direct": 5, "directli": [1, 5, 6], "directori": [5, 6, 7], "disabl": [1, 5], "disable_sci_not": [1, 5], "discov": 6, "discret": [4, 5], "dispers": 5, "displai": [1, 4, 5], "distinct": [1, 5], "distinguish": 5, "distract": 5, "distribut": [1, 4, 6, 7], "dive": 4, "divers": 1, "divid": [4, 5], "divorc": 4, "do": [1, 4, 5], "docstr": 1, "document": [1, 7], "doe": [1, 4, 5], "doi": [2, 4, 5, 6, 8], "don": 5, "dot": 5, "doubl": 5, "down": 5, "dr": 0, "draw": 5, "driven": 4, "dtype": 4, "due": [1, 4], "duplic": 1, "dure": [0, 1], "dx_": 5, "dx_c": 5, "dynam": 1, "e": [1, 4, 5], "each": [1, 4, 5], "eas": [1, 4, 6], "easi": [5, 6], "easier": [1, 5], "easili": 5, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 5, 6], "edg": [1, 5], "edgecolor": 1, "educ": [0, 3, 4, 5], "effect": [1, 3, 4, 5, 6], "either": [1, 4, 5], "element": [1, 4, 5], "elev": 5, "els": 1, "emp": 4, "emphas": 1, "emploi": 5, "empti": [1, 4], "enabl": [1, 5, 6], "enable_zoom": [1, 5], "end": [1, 4, 5], "endeavor": 0, "endpoint": 4, "engin": [0, 5, 8], "enhanc": [1, 4, 5, 6], "enough": 1, "ensembl": 5, "ensu": 6, "ensur": [1, 4, 5, 6], "ensure_directori": [4, 7], "enter": [1, 4], "entir": [4, 5], "entri": [1, 5], "environ": [0, 1, 5, 8], "equal": 5, "equat": 5, "equival": 4, "error": [1, 4], "especi": [1, 4, 5], "essenti": [4, 5, 6], "estim": 7, "etc": 6, "ev": 4, "evalu": 5, "even": [1, 5], "everyth": 5, "exact": 1, "examin": 5, "exampl": [1, 4, 6, 7], "exce": 4, "excel": [3, 6, 7], "except": [0, 1, 4], "excess": 5, "exclud": [4, 5], "exclus": 4, "exec": 4, "execut": 5, "exist": [1, 4], "exp": 5, "expand": 1, "expect": [1, 5], "experi": [1, 3], "explain": [1, 4], "explan": 1, "explicitli": 1, "explor": [1, 5, 6], "exploratori": 6, "export": [5, 6], "express": [0, 5], "extend": [0, 5], "extens": [1, 5], "extract": [1, 5], "f": [1, 5], "f8766d": 5, "f8c5c8": 4, "facilit": [3, 4, 6], "factor": 5, "fall": [4, 5], "fallback": 1, "fals": [1, 4, 5], "famili": 4, "fashion": 5, "featur": [1, 4, 5, 7], "feature_nam": 5, "feature_names_list": [1, 5], "feder": 4, "feedback": 1, "femal": [4, 5], "female_": 5, "fetch": 5, "fetch_california_h": 5, "few": 5, "ff0000": 5, "figsiz": [1, 5], "figur": [1, 5], "file": [1, 4, 5], "file_nam": 4, "file_path": 4, "file_prefix": [1, 5], "filenam": [1, 5], "fill": [1, 5], "fill_alpha": [1, 5], "fillna": 1, "filter": [4, 5], "filtered_df": 4, "financi": [3, 5], "find": 1, "first": [1, 4, 5], "fit": [1, 6, 7], "fix": 1, "flag": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 5], "flip": 5, "float": [4, 5], "fnlwgt": 4, "focu": 5, "focus": 5, "folder": 4, "follow": [1, 4, 5, 6], "font": [1, 5], "fontsiz": 1, "form": [4, 6], "format": [1, 5, 6, 7], "formatth": 5, "former": 4, "formerli": 1, "formula": 5, "found": 1, "foundat": 7, "four": 5, "frac": 5, "freedom": 5, "frequenc": [1, 5], "frequent": 4, "friendli": 1, "from": [0, 1, 3, 4, 5, 6], "full": [1, 4, 7], "fulli": 5, "func_col": [1, 5], "function": [1, 4, 6, 7], "further": [1, 5], "futur": [1, 5], "futurewarn": 5, "g": [1, 4, 5], "gain": [4, 6], "gaussian": 7, "gener": [1, 5, 6, 7], "geq": 4, "get": 6, "get_legend": 1, "get_text": 1, "gil": [2, 3], "github": 6, "give": 1, "given": [1, 4, 5], "glanc": 5, "go": 4, "got": 1, "gov": 4, "grad": 4, "gradientboostingregressor": 5, "graduat": 0, "granular": 1, "graphic": [5, 8], "gratitud": 0, "greater": [1, 4], "green": 5, "grei": 5, "grid": [1, 7], "grid_figs": 5, "grid_resolut": 5, "grid_valu": 5, "ground": 5, "group": [1, 4, 7], "gt": 5, "guid": [0, 6], "guidanc": 1, "guidelin": 5, "h": [4, 5], "h_pad": 5, "ha": [1, 3, 4, 5], "half": 5, "halv": 5, "handl": [1, 4, 5, 6], "handler": 4, "hat": 5, "have": [1, 5], "he": 3, "header": [1, 4], "health": 3, "healthcar": 3, "heatmap": [1, 5], "height": 5, "help": [1, 4, 5, 6], "here": [4, 5], "hex": [1, 4], "hi": 0, "hidden": 5, "hide": [1, 5], "hide_index": 1, "high": [1, 5], "higher": [5, 6], "highli": 5, "highlight": [1, 5, 7], "highlight_column": [4, 7], "highlighted_df": 4, "hist": [1, 5], "hist_color": 5, "hist_edgecolor": [1, 5], "histogram": [1, 7], "hold": [3, 5], "horizont": [1, 5], "hour": [4, 5], "hous": 7, "houseag": 5, "household": 5, "hover": 5, "how": [4, 5, 6], "howev": [1, 5], "html": [4, 5], "html_file_nam": [1, 5], "html_file_path": [1, 5], "http": [2, 4, 5, 6, 8], "huber": 5, "hue": [1, 5], "hue_dict": 5, "hue_palett": 5, "hunter": [5, 8], "husband": 4, "hyperlink": 4, "hypothes": 6, "i": [1, 3, 4, 5, 7], "icon": 1, "id": [1, 4, 6], "id_colnam": 4, "identifi": [1, 5, 6, 7], "ignor": 5, "illustr": 5, "imag": [4, 5], "image_filenam": 5, "image_path_png": [1, 4, 5], "image_path_svg": [1, 4, 5], "immedi": 5, "impact": [1, 5], "implement": 1, "import": [1, 4, 5], "imposs": 4, "improv": 1, "inc": 4, "inch": 5, "includ": [1, 4, 5, 6], "inclus": 4, "incom": [4, 5, 6, 8], "inconsist": [1, 4], "incorpor": 1, "incorrect": [1, 5], "increas": 5, "increment": 1, "independ": 1, "index": [1, 4, 5], "indic": [1, 4, 5], "individu": [1, 5], "individual_figs": 5, "industri": 3, "inf": 4, "infin": 4, "influenc": [1, 5], "influenti": 5, "inform": [5, 6], "initi": 6, "inner": 5, "input": [1, 5], "insight": [5, 6], "instal": 7, "instanc": 5, "instead": [1, 5], "instruct": 6, "int": [1, 4, 5], "int64": 4, "integ": 1, "integr": [5, 6], "intellig": 3, "intend": 1, "interact": [1, 7], "interest": 5, "interfac": [1, 5], "intern": [1, 5], "interpret": [1, 5], "interv": 4, "introduc": 1, "introduct": 1, "intuit": [1, 5, 6], "invalid": 1, "invalu": 5, "investig": 6, "involv": [4, 5, 6], "io": 4, "island": 4, "iso": 4, "issu": [1, 6], "item": 5, "iter": 5, "its": [1, 4], "itself": 5, "j": [5, 8], "jinja2": 6, "join": 4, "joint": 5, "jointli": 5, "joss": [5, 8], "journal": [5, 8], "journei": 0, "jupyt": 4, "just": 5, "k": [5, 8], "kde": [1, 6, 7], "kde_color": 5, "kde_density_single_distribut": 5, "kde_distribut": [1, 5, 7], "keep": 5, "kei": [1, 4, 5, 7], "kernel": 7, "keyboard": 5, "keyerror": 5, "keyword": [1, 5], "kind": 5, "kohavi": [4, 5, 6, 8], "kwarg": [1, 5], "l": 2, "label": [1, 4, 5], "label_ag": 4, "label_fonts": [1, 5], "label_nam": 5, "larg": 5, "largest": 5, "last": 4, "latest": 1, "layout": [1, 5], "ldot": 5, "lead": 5, "learn": [0, 1, 3, 4, 5, 6, 8], "learning_r": 5, "least": [1, 4], "lectur": 3, "left": [4, 5], "left_margin": [1, 5], "legend": [1, 5], "legend_label": 5, "legend_labels_list": 5, "legibl": 5, "len": 1, "length": [4, 5], "leonid": [2, 3], "leq": 4, "less": [1, 4], "let": 5, "letter": [5, 8], "level": [4, 5], "leverag": [5, 6], "librari": [1, 4, 5, 7], "licens": 1, "like": [0, 5], "limit": [1, 4, 5], "line": [1, 6, 7], "linear": 5, "linestyl": 5, "link": 7, "list": [1, 4, 5], "load": [4, 5], "local": 4, "locat": [4, 5], "log": [1, 5], "log_scale_var": [1, 5], "logarithm": 5, "logic": 1, "logo": 1, "logscal": 5, "long": 5, "longer": 5, "loop": 5, "loss": [4, 5], "lower": [1, 5], "lt": [4, 5], "m": [0, 3, 5, 8], "machin": [1, 3, 4, 5, 6, 8], "made": 1, "magnitud": 5, "mai": [1, 5], "main": 6, "maintain": [1, 5, 7], "make": [1, 4, 5], "male": [4, 5], "male_": 5, "manag": [1, 3, 5, 6], "manageri": 4, "mani": [5, 6], "manipul": 6, "manner": 5, "manual": [1, 5], "map": [1, 5], "marco": 0, "margin": [1, 5], "marit": 4, "mark": [1, 5], "marker": 5, "marri": 4, "master": 3, "match": [1, 5], "mathbb": 5, "mathbf": 5, "mathemat": [4, 5], "matplotlib": [1, 5, 6, 8], "matplotlib_colormap": 5, "matric": [1, 7], "matrix": [1, 7], "max": 5, "max_col": 5, "max_depth": 5, "max_unique_valu": 4, "max_unique_value_pct": 4, "max_unique_value_tot": 4, "maximum": 5, "mcse": [5, 8], "mean": [1, 4, 6, 7], "mean_color": 5, "meaning": [4, 5], "measur": 5, "mechan": 1, "median": [1, 6, 7], "median_color": 5, "medinc": 5, "meet": 6, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 5, 6], "metric": 5, "metrics_box_violin": 1, "metrics_boxplot_comp": 5, "metrics_comp": 5, "metrics_list": 5, "mid": 5, "might": 5, "min": 5, "min_length": 4, "mind": 6, "minim": [1, 5], "minimum": [4, 5], "minor": 1, "misalign": 5, "misinterpret": 5, "mislead": 1, "miss": [1, 4, 5, 6], "mm": 4, "mode": [1, 5], "model": [1, 5, 6], "model_select": 5, "modifi": [1, 5], "month": [2, 4], "more": [1, 4, 5], "most": [1, 4, 5, 6], "mous": 5, "move": [1, 5], "mu": 5, "mu_i": 5, "mu_x": 5, "much": 5, "multidimension": 5, "multipl": [1, 4, 5, 6], "multipli": 1, "must": [4, 5], "my_datafram": 1, "n": 5, "n_col": 5, "n_estim": 5, "n_row": 5, "na": [1, 4], "name": [1, 4, 5], "nativ": 4, "navig": [4, 5], "nbformat": 6, "ndarrai": 5, "necessari": [1, 4], "need": [1, 4, 5, 6], "neg": 5, "neither": [1, 5], "nest": 5, "neutral": 5, "never": 4, "new": [1, 4, 5], "newer": 5, "next": [4, 5], "nh": 5, "nomenclatur": 1, "non": [1, 4, 7], "none": [1, 4, 5], "nor": [1, 5], "normal": [1, 7], "notat": [1, 5], "note": [4, 5], "notebook": 4, "noth": 4, "notic": 5, "now": 1, "np": 5, "null": [1, 4], "null_pct": 4, "null_tot": 4, "num": [4, 5], "num_digit": 4, "number": [1, 4, 5], "numer": [1, 5, 7], "numpi": [5, 6], "o": [2, 4, 5], "object": [1, 4, 5], "observ": 5, "obviou": 5, "occup": [4, 5], "occur": 1, "occurr": 4, "offer": [1, 5, 6], "often": [5, 6], "older": [1, 5], "omit": 1, "one": [1, 4, 5], "onli": [1, 5], "opaqu": 5, "open": [5, 8], "oper": [4, 5], "optim": 5, "option": [1, 4, 5, 6], "orang": 5, "order": [1, 4, 5], "org": [2, 4, 5, 6, 8], "organ": [1, 5], "orient": 5, "origin": [4, 5], "original_df": 4, "oscar": [2, 3], "other": [1, 4, 5], "otherwis": 5, "our": 0, "out": 5, "outcom": 5, "outlier": 6, "output": [1, 4, 5], "outsid": 5, "over": [1, 3, 5], "overal": [1, 5], "overlai": 5, "overlaid": 5, "overlap": 5, "overrid": 5, "overview": 7, "own": 5, "p": 5, "pac": 4, "pace": [5, 8], "packag": 6, "pad": [1, 5], "page": [5, 6], "pair": [4, 5], "pairwis": 5, "palett": 5, "panda": [1, 4, 5, 6], "param": 1, "paramet": [1, 4, 5], "parametr": 5, "pardir": 4, "parent": 4, "pars": 4, "parse_date_with_rul": [4, 7], "part": 4, "partial": [1, 7], "partial_depend": 5, "particular": 5, "particularli": [1, 4, 5], "pass": [1, 5], "path": [1, 5, 7], "patient": 4, "pattern": [5, 6], "pd": [4, 5], "pdf": 5, "pdp": 5, "pearson": 7, "per": [4, 5], "percent": [1, 5], "percentag": 4, "perfect": 5, "perfectli": 5, "perform": [1, 4, 5], "performancewarn": 1, "period": 7, "person": 3, "perspect": [1, 5], "pi": 5, "pink": 4, "pip": 6, "pitfal": 1, "pivot": [0, 7], "place": [1, 4], "plai": 0, "plain": 4, "plot": [1, 6], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_mean": 5, "plot_median": 5, "plot_typ": [1, 5], "plotli": [1, 5, 6], "plotly_colormap": 5, "plots_onli": 5, "plt": 1, "pm": 5, "png": [1, 4, 5], "png_imag": 4, "point": [1, 5], "pointer": 5, "popul": 5, "popular": 6, "posit": [1, 5], "possibl": [4, 5, 6], "potenti": [1, 4, 5], "power": [1, 5], "pr": 1, "pre": 1, "preced": 5, "predict": [1, 5], "prefer": [1, 5], "prefix": [1, 5], "prepar": [1, 4, 5], "prerequisit": 7, "present": [1, 4, 5], "preval": 5, "prevent": [1, 4, 5], "previou": [1, 5], "previous": 1, "price": 5, "print": [1, 4, 5], "prior": 5, "privat": 4, "probabl": [1, 5, 8], "process": [1, 4, 6], "produc": [1, 5], "product": 5, "prof": 4, "profession": 3, "program": [0, 3], "project": [1, 3, 4, 7], "promin": 5, "proper": [1, 5], "properli": [1, 5], "proport": [1, 4, 5], "provid": [0, 1, 4, 5, 6], "public": 5, "publish": 2, "purpl": 5, "purpos": [1, 7], "pursu": 0, "py": 1, "pypi": [1, 6], "python": [1, 3, 5, 7], "qualiti": [5, 6], "quantifi": 5, "quantit": 5, "quick": 5, "quickli": [5, 6], "r": [3, 4, 5, 6, 8], "r_": 5, "race": 4, "rais": [1, 4, 5], "random": 4, "random_st": 5, "rang": [4, 5, 6], "raw": 5, "re": [1, 5], "read": 4, "readabl": [1, 5], "readi": 6, "readm": 1, "record": 4, "red": 5, "reduc": [1, 5], "redund": 5, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 5], "regress": 7, "regular": [1, 7], "relat": [1, 4, 5], "relationship": [4, 5, 6], "releas": 1, "relev": [1, 6], "reli": 5, "reliabl": 4, "remain": [1, 5], "remov": [1, 5, 6, 7], "remove_stack": [1, 5], "renam": [1, 5], "render": 4, "replac": 4, "replica": 1, "report": [3, 5, 6], "repositori": [4, 5, 6, 8], "repres": [1, 4, 5], "represent": [1, 5], "reproduc": 4, "requir": [1, 5, 6], "research": 6, "reset": 1, "resolut": 5, "respect": [1, 4, 5], "respons": 5, "rest": 5, "result": [1, 4, 5], "return": [1, 4, 5], "return_df": [1, 4], "return_dict": 5, "reveal": 5, "rich": [5, 6], "right": [4, 5], "right_margin": [1, 5], "riversid": 3, "robust": 1, "role": [0, 1], "rot": 5, "rotat": [1, 5], "rotate_plot": 5, "round": 4, "row": [4, 5], "rule": 4, "run": 6, "s0167": [5, 8], "same": [1, 5], "sampl": [4, 5], "san": [0, 3], "save": [1, 5, 6, 7], "save_dataframes_to_excel": [1, 4, 7], "save_format": [1, 5], "save_plot": [1, 5], "scale": [1, 5], "scatter": [1, 6, 7], "scatter_color": 5, "scatter_fit_plot": [1, 5, 7], "scatterplot": 5, "scenario": [1, 5], "schema": 5, "scheme": 5, "school": 0, "scienc": [0, 3, 4, 5, 6, 8], "scientif": [1, 5], "scientist": [0, 3, 6], "scikit": [1, 5, 6], "scroll": 5, "seaborn": [1, 5, 6, 8], "seamlessli": 6, "second": [4, 5], "section": [1, 4], "see": 5, "seed": 4, "select": [1, 5], "select_dtyp": 5, "self": 4, "separ": [1, 4, 5], "sequenc": 5, "seri": 4, "serv": [1, 3], "servic": 3, "set": [1, 4, 5], "set_as_index": 4, "set_titl": 1, "setminu": 5, "setp": 1, "setup": [1, 4, 5], "sever": [1, 5], "sex": [4, 5], "shape": [4, 5], "sheet": 4, "shilei": 0, "should": 5, "show": [1, 4, 5], "show_cbar": 5, "show_correl": 5, "show_legend": [1, 5], "show_modebar": [1, 5], "show_plot": 5, "showcas": 5, "shown": 5, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 5, "sigma_i": 5, "sigma_x": 5, "signatur": 1, "signific": 1, "silver": 5, "similarli": 5, "simpl": 5, "simpler": 1, "simplic": 6, "simplif": 1, "simplifi": [1, 4], "simultan": 5, "sinc": 5, "singl": [1, 4, 5], "single_figs": 5, "single_var_image_filenam": 5, "size": [1, 4, 5], "sklearn": 5, "slightli": 1, "small": 1, "smallest": 5, "smooth": 5, "smoother": [1, 5], "sn": 5, "snippet": [4, 5], "so": [1, 4, 5], "softwar": [2, 5, 8], "some": [1, 4], "sort": [1, 4], "sort_bi": [1, 4], "sortbi": 1, "sourc": [5, 6, 8], "space": [1, 5], "span": 5, "spars": [5, 8], "spatial": [5, 8], "special": 4, "specialti": 4, "specif": [1, 5, 6, 7], "specifi": [1, 4, 5, 6], "split": 5, "spous": 4, "spread": 5, "sql": 3, "sqrt": 5, "squar": [1, 5], "stabil": 1, "stabl": 1, "stack": [1, 6, 7], "stacked_crosstab": 5, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 5, 6, 7], "standardized_d": 4, "start": [1, 4, 6], "stat": [1, 5], "state": 4, "static": [1, 7], "statist": [1, 3, 4, 5, 6, 8], "statu": [1, 4], "std": 7, "std_color": 5, "std_dev_level": 5, "stem": 5, "step": [1, 6], "still": [1, 5], "store": [1, 5], "str": [1, 4, 5], "straightforward": 1, "streamlin": [1, 4, 6], "strength": 5, "string": [1, 4, 5], "strip": 4, "strip_trailing_period": [4, 7], "stronger": 5, "structur": [1, 6], "style": [1, 4, 5], "styler": [1, 4], "subplot": 5, "subset": 5, "substitut": 5, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suit": 6, "suitabl": 1, "sum_": 5, "summar": [5, 6], "summari": [1, 6, 7], "summarize_all_combin": [4, 7], "summary_t": 4, "support": [0, 1, 5], "suppos": 5, "suppress": 5, "sure": 4, "surfac": [1, 5], "svg": [1, 4, 5], "svg_imag": 4, "sy": 1, "system": [4, 6], "t": 5, "tab": 4, "tabl": [1, 5, 6], "tailor": 5, "take": [4, 5], "tall": 5, "target": 5, "tarshizi": 0, "task": [4, 6], "tatist": 5, "teach": 3, "techniqu": [6, 7], "ten": 3, "tend": 5, "tendenc": 5, "test": [1, 5], "test_siz": 5, "text": [1, 4, 5], "text_wrap": [1, 5], "th": 5, "than": [1, 4], "thank": 0, "thei": [1, 4, 5], "them": [1, 4, 5, 6], "theoret": 7, "therefor": 5, "thi": [1, 4, 5, 6], "thick": 5, "those": 1, "three": 5, "through": [1, 5], "throw": 1, "thu": 4, "tick": [1, 5], "tick_fonts": [1, 5], "tight": 5, "time": [0, 1, 4, 5], "titl": [1, 2, 5], "title_i": [1, 5], "title_x": [1, 5], "to_list": 5, "togeth": 5, "toggl": [1, 5], "tool": [1, 5, 6], "toolkit": 1, "top": 5, "top_margin": [1, 5], "topic": 4, "total": [4, 5], "toward": 1, "trail": 7, "train": 5, "train_test_split": 5, "transpar": [1, 5], "trend": [5, 6], "triangl": 5, "triangular": [1, 7], "true": [1, 4, 5], "truth": 5, "try": 1, "tupl": [1, 4, 5], "two": [1, 4, 5], "type": [1, 4, 5, 6], "u": [0, 4, 5], "uci": [4, 5, 6, 8], "ucla": 3, "unambigu": 4, "uncov": [5, 6], "underli": [5, 6], "understand": [4, 5, 6], "uniform": 1, "uniqu": [1, 5, 6, 7], "unique_values_tot": 4, "unique_var": 4, "unit": 4, "univers": [0, 3], "unnecessari": 1, "unrecogn": 4, "unstack": 5, "unus": 1, "unwav": 0, "up": [1, 4, 5], "updat": [1, 4, 5], "upper": [1, 4, 5], "upright": 5, "url": 2, "us": [1, 4, 5, 6], "usabl": 1, "usag": [1, 4, 5], "user": [1, 5, 6], "userwarn": 5, "util": [4, 5, 6], "v": 5, "valid": 1, "valid_plot_typ": 1, "valu": [1, 4, 5, 6], "valueerror": [1, 4, 5], "vari": 5, "variabl": [1, 5, 6, 7], "varianc": 5, "varieti": [3, 5, 6], "variou": [1, 5, 6], "vars_of_interest": 5, "vdot": 4, "vector": 5, "verbiag": 1, "verifi": [1, 4], "versa": 5, "versatil": 5, "version": [2, 5, 6, 7], "version_info": 1, "versu": 1, "vertic": [1, 5], "via": [1, 5], "vice": 5, "view": [1, 5], "view_angl": 5, "violin": [1, 6, 7], "violinplot": 5, "viridi": 5, "visibl": [1, 5], "visual": [1, 4, 5, 6, 8], "vmax": 5, "vmin": 5, "vriabl": 5, "w_pad": 5, "wa": [1, 5], "wai": 5, "want": [1, 5], "wareh": 3, "warn": [1, 4, 5], "waskom": [5, 8], "we": [0, 4, 5, 6], "week": [4, 5], "welcom": 7, "well": [4, 5], "were": 4, "what": [1, 7], "wheel": 5, "when": [1, 4, 5, 6], "where": [1, 4, 5], "whether": [1, 4, 5], "which": [1, 4, 5, 6], "while": [1, 5], "white": 4, "whitespac": 5, "who": 1, "wide": [3, 5], "width": [1, 5], "wife": 4, "wirefram": [1, 5], "wireframe_color": 5, "wish": 5, "within": [1, 3, 4, 5], "without": [1, 4, 5], "work": [1, 4, 5], "workclass": 4, "workflow": [4, 6], "would": [0, 1, 5], "wrangl": 3, "wrap": [1, 5], "write": 4, "x": [1, 4, 5, 8], "x_": 5, "x_1": 5, "x_2": 5, "x_c": 5, "x_i": 5, "x_j": 5, "x_k": 5, "x_label": [1, 5], "x_label_plotli": 1, "x_n": 5, "x_p": 5, "x_test": 5, "x_train": 5, "x_var": 5, "xlabel": 5, "xlabel_align": 5, "xlabel_rot": 5, "xlim": [1, 5], "xlsx": 4, "xlsxwriter": 6, "xx": 1, "xy": 5, "y": [1, 5], "y_axis_label": 5, "y_i": 5, "y_label": [1, 5], "y_label_plotli": 1, "y_test": 5, "y_train": 5, "y_var": 5, "year": [2, 3, 4], "yellow": 4, "ylabel": 5, "ylabel_align": 5, "ylabel_rot": 5, "ylim": [1, 5], "you": [4, 5, 6], "your": [4, 5, 6], "yy": 1, "yyyi": 4, "z": 5, "z_label": [1, 5], "z_label_plotli": 1, "zenodo": [1, 2], "zero": [1, 4], "zoom": [1, 5], "zoom_out_factor": [1, 5], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Data Management Overview", "Plotting and Theoretical Overview", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References"], "titleterms": {"0": 1, "10": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 5, "3": 1, "3d": 5, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "9": 1, "With": 5, "about": 7, "acknowledg": 0, "ad": 4, "all": 5, "analysi": 4, "assumpt": 5, "bar": 5, "best": 5, "bin": 4, "box": 5, "ca": 5, "categori": 5, "centric": 5, "changelog": 1, "cite": 2, "coeffici": 5, "column": 4, "combin": [4, 5], "content": 7, "conting": 4, "contributor": 3, "correl": 5, "count": 5, "creat": 4, "crosstab": 5, "custom": 4, "data": [4, 7], "datafram": 4, "date": 4, "densiti": 5, "depend": 5, "descript": 6, "deviat": 5, "directori": 4, "distribut": 5, "document": 6, "eda": [2, 6, 7], "estim": 5, "exampl": 5, "excel": 4, "featur": 6, "fit": 5, "format": 4, "foundat": 5, "full": 5, "function": 5, "gaussian": 5, "gener": 4, "get": 7, "grid": 5, "group": 5, "heurist": 7, "highlight": 4, "histogram": 5, "hous": 5, "i": 6, "identifi": 4, "instal": 6, "interact": 5, "kde": 5, "kei": 6, "kernel": 5, "librari": 6, "line": 5, "link": 6, "maintain": 3, "manag": [4, 7], "matric": 5, "matrix": 5, "mean": 5, "median": 5, "non": 5, "normal": 5, "numer": 4, "overview": [4, 5], "partial": 5, "path": 4, "pearson": 5, "period": 4, "pivot": 5, "plot": [5, 7], "prerequisit": 6, "project": 6, "purpos": 6, "python": 6, "refer": 8, "regress": 5, "regular": 5, "remov": 4, "save": 4, "scatter": 5, "specif": 4, "stack": 5, "standard": 4, "start": 7, "static": 5, "std": 5, "summari": 4, "tabl": [4, 7], "techniqu": 4, "theoret": 5, "toolkit": [2, 6, 7], "trail": 4, "triangular": 5, "uniqu": 4, "variabl": 4, "version": 1, "violin": 5, "welcom": 6, "what": 6}}) \ No newline at end of file diff --git a/docs/v0.0.11/.buildinfo b/docs/v0.0.11/.buildinfo index 5f9727f7b..4d91f3fb2 100644 --- a/docs/v0.0.11/.buildinfo +++ b/docs/v0.0.11/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 73c6d42f691b10300d5f5b37bb70f327 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 80a50012f423d1997628eb1dbd29a4bd tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/v0.0.11/.buildinfo.bak b/docs/v0.0.11/.buildinfo.bak new file mode 100644 index 000000000..5f9727f7b --- /dev/null +++ b/docs/v0.0.11/.buildinfo.bak @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 73c6d42f691b10300d5f5b37bb70f327 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/v0.0.11/.doctrees/acknowledgements.doctree b/docs/v0.0.11/.doctrees/acknowledgements.doctree index 0e486e0bd..70ce21386 100644 Binary files a/docs/v0.0.11/.doctrees/acknowledgements.doctree and b/docs/v0.0.11/.doctrees/acknowledgements.doctree differ diff --git a/docs/v0.0.11/.doctrees/changelog.doctree b/docs/v0.0.11/.doctrees/changelog.doctree index cb3c4e4b4..e856b179d 100644 Binary files a/docs/v0.0.11/.doctrees/changelog.doctree and b/docs/v0.0.11/.doctrees/changelog.doctree differ diff --git a/docs/v0.0.11/.doctrees/citations.doctree b/docs/v0.0.11/.doctrees/citations.doctree index 9e7994ade..bdbb28013 100644 Binary files a/docs/v0.0.11/.doctrees/citations.doctree and b/docs/v0.0.11/.doctrees/citations.doctree differ diff --git a/docs/v0.0.11/.doctrees/contributors.doctree b/docs/v0.0.11/.doctrees/contributors.doctree index b457a2d21..6c998cf2c 100644 Binary files a/docs/v0.0.11/.doctrees/contributors.doctree and b/docs/v0.0.11/.doctrees/contributors.doctree differ diff --git a/docs/v0.0.11/.doctrees/data_management.doctree b/docs/v0.0.11/.doctrees/data_management.doctree index c4e645b9f..41190ef0c 100644 Binary files a/docs/v0.0.11/.doctrees/data_management.doctree and b/docs/v0.0.11/.doctrees/data_management.doctree differ diff --git a/docs/v0.0.11/.doctrees/eda_plots.doctree b/docs/v0.0.11/.doctrees/eda_plots.doctree index b2628d480..3f6b69802 100644 Binary files a/docs/v0.0.11/.doctrees/eda_plots.doctree and b/docs/v0.0.11/.doctrees/eda_plots.doctree differ diff --git a/docs/v0.0.11/.doctrees/environment.pickle b/docs/v0.0.11/.doctrees/environment.pickle index b11a729ea..eb0276414 100644 Binary files a/docs/v0.0.11/.doctrees/environment.pickle and b/docs/v0.0.11/.doctrees/environment.pickle differ diff --git a/docs/v0.0.11/.doctrees/getting_started.doctree b/docs/v0.0.11/.doctrees/getting_started.doctree index 8f2f1a237..f7e570574 100644 Binary files a/docs/v0.0.11/.doctrees/getting_started.doctree and b/docs/v0.0.11/.doctrees/getting_started.doctree differ diff --git a/docs/v0.0.11/.doctrees/index.doctree b/docs/v0.0.11/.doctrees/index.doctree index 3c5774fee..12b820a90 100644 Binary files a/docs/v0.0.11/.doctrees/index.doctree and b/docs/v0.0.11/.doctrees/index.doctree differ diff --git a/docs/v0.0.11/.doctrees/references.doctree b/docs/v0.0.11/.doctrees/references.doctree index 3058ad2e0..f920e3c59 100644 Binary files a/docs/v0.0.11/.doctrees/references.doctree and b/docs/v0.0.11/.doctrees/references.doctree differ diff --git a/docs/v0.0.11/_static/basic.css b/docs/v0.0.11/_static/basic.css index f316efcb4..7ebbd6d07 100644 --- a/docs/v0.0.11/_static/basic.css +++ b/docs/v0.0.11/_static/basic.css @@ -1,12 +1,5 @@ /* - * basic.css - * ~~~~~~~~~ - * * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ /* -- main layout ----------------------------------------------------------- */ @@ -115,15 +108,11 @@ img { /* -- search page ----------------------------------------------------------- */ ul.search { - margin: 10px 0 0 20px; - padding: 0; + margin-top: 10px; } ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; + padding: 5px 0; } ul.search li a { diff --git a/docs/v0.0.11/_static/css/badge_only.css b/docs/v0.0.11/_static/css/badge_only.css index c718cee44..88ba55b96 100644 --- a/docs/v0.0.11/_static/css/badge_only.css +++ b/docs/v0.0.11/_static/css/badge_only.css @@ -1 +1 @@ -.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/docs/v0.0.11/_static/css/theme.css b/docs/v0.0.11/_static/css/theme.css index 19a446a0e..0f14f1064 100644 --- a/docs/v0.0.11/_static/css/theme.css +++ b/docs/v0.0.11/_static/css/theme.css @@ -1,4 +1,4 @@ html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/v0.0.11/_static/doctools.js b/docs/v0.0.11/_static/doctools.js index 4d67807d1..0398ebb9f 100644 --- a/docs/v0.0.11/_static/doctools.js +++ b/docs/v0.0.11/_static/doctools.js @@ -1,12 +1,5 @@ /* - * doctools.js - * ~~~~~~~~~~~ - * * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-bold.eot b/docs/v0.0.11/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-bold.eot differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-bold.ttf b/docs/v0.0.11/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-bold.ttf differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-bold.woff b/docs/v0.0.11/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-bold.woff differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-bold.woff2 b/docs/v0.0.11/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.eot b/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.ttf b/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff b/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-italic.eot b/docs/v0.0.11/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-italic.eot differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-italic.ttf b/docs/v0.0.11/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-italic.ttf differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-italic.woff b/docs/v0.0.11/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-italic.woff differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-italic.woff2 b/docs/v0.0.11/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-regular.eot b/docs/v0.0.11/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-regular.eot differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-regular.ttf b/docs/v0.0.11/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-regular.ttf differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-regular.woff b/docs/v0.0.11/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-regular.woff differ diff --git a/docs/v0.0.11/_static/fonts/Lato/lato-regular.woff2 b/docs/v0.0.11/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/docs/v0.0.11/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/docs/v0.0.11/_static/js/versions.js b/docs/v0.0.11/_static/js/versions.js new file mode 100644 index 000000000..818bc9969 --- /dev/null +++ b/docs/v0.0.11/_static/js/versions.js @@ -0,0 +1,224 @@ +const themeFlyoutDisplay = "hidden"; +const themeVersionSelector = "True"; +const themeLanguageSelector = "True"; + +if (themeFlyoutDisplay === "attached") { + function renderLanguages(config) { + if (!config.projects.translations.length) { + return ""; + } + + const languagesHTML = ` +
    +
    Languages
    + ${config.projects.translations + .map( + (translation) => ` +
    + ${translation.language.code} +
    + `, + ) + .join("\n")} +
    + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
    +
    Versions
    + ${config.versions.active + .map( + (version) => ` +
    + ${version.slug} +
    + `, + ) + .join("\n")} +
    + `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
    +
    Downloads
    + ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
    + ${downloadsNameDisplay[name]} +
    + `, + ) + .join("\n")} +
    + `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
    + + Read the Docs + v: ${config.versions.current.slug} + + +
    +
    + ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
    +
    On Read the Docs
    +
    + Project Home +
    +
    + Builds +
    +
    + Downloads +
    +
    +
    +
    Search
    +
    +
    + +
    +
    +
    +
    + + Hosted by Read the Docs + +
    +
    + `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/docs/v0.0.11/_static/language_data.js b/docs/v0.0.11/_static/language_data.js index 367b8ed81..c7fe6c6fa 100644 --- a/docs/v0.0.11/_static/language_data.js +++ b/docs/v0.0.11/_static/language_data.js @@ -1,13 +1,6 @@ /* - * language_data.js - * ~~~~~~~~~~~~~~~~ - * * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; diff --git a/docs/v0.0.11/_static/searchtools.js b/docs/v0.0.11/_static/searchtools.js index b08d58c9b..2c774d17a 100644 --- a/docs/v0.0.11/_static/searchtools.js +++ b/docs/v0.0.11/_static/searchtools.js @@ -1,12 +1,5 @@ /* - * searchtools.js - * ~~~~~~~~~~~~~~~~ - * * Sphinx JavaScript utilities for the full-text search. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; @@ -20,7 +13,7 @@ if (typeof Scorer === "undefined") { // and returns the new score. /* score: result => { - const [docname, title, anchor, descr, score, filename] = result + const [docname, title, anchor, descr, score, filename, kind] = result return score }, */ @@ -47,6 +40,14 @@ if (typeof Scorer === "undefined") { }; } +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + const _removeChildren = (element) => { while (element && element.lastChild) element.removeChild(element.lastChild); }; @@ -64,9 +65,13 @@ const _displayItem = (item, searchTerms, highlightTerms) => { const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; const contentRoot = document.documentElement.dataset.content_root; - const [docName, title, anchor, descr, score, _filename] = item; + const [docName, title, anchor, descr, score, _filename, kind] = item; let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); let requestUrl; let linkUrl; if (docBuilder === "dirhtml") { @@ -115,8 +120,10 @@ const _finishSearch = (resultCount) => { "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." ); else - Search.status.innerText = _( - "Search finished, found ${resultCount} page(s) matching the search query." + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, ).replace('${resultCount}', resultCount); }; const _displayNextItem = ( @@ -138,7 +145,7 @@ const _displayNextItem = ( else _finishSearch(resultCount); }; // Helper function used by query() to order search results. -// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. // Order the results by score (in opposite order of appearance, since the // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. const _orderResultsByScoreThenName = (a, b) => { @@ -248,6 +255,7 @@ const Search = { searchSummary.classList.add("search-summary"); searchSummary.innerText = ""; const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); searchList.classList.add("search"); const out = document.getElementById("search-results"); @@ -318,7 +326,7 @@ const Search = { const indexEntries = Search._index.indexentries; // Collect multiple result groups to be sorted separately and then ordered. - // Each is an array of [docname, title, anchor, descr, score, filename]. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. const normalResults = []; const nonMainIndexResults = []; @@ -337,6 +345,7 @@ const Search = { null, score + boost, filenames[file], + SearchResultKind.title, ]); } } @@ -354,6 +363,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.index, ]; if (isMain) { normalResults.push(result); @@ -475,6 +485,7 @@ const Search = { descr, score, filenames[match[0]], + SearchResultKind.object, ]); }; Object.keys(objects).forEach((prefix) => @@ -585,6 +596,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.text, ]); } return results; diff --git a/docs/v0.0.11/acknowledgements.html b/docs/v0.0.11/acknowledgements.html index 702dfabf9..3e0db910f 100644 --- a/docs/v0.0.11/acknowledgements.html +++ b/docs/v0.0.11/acknowledgements.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Acknowledgements — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,7 +101,8 @@
    -
    EDA Toolkit Logo +

    Acknowledgements

    diff --git a/docs/v0.0.11/changelog.html b/docs/v0.0.11/changelog.html index 70fde5da0..6b0a5763a 100644 --- a/docs/v0.0.11/changelog.html +++ b/docs/v0.0.11/changelog.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Changelog — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - + + + + + + + + @@ -123,7 +121,8 @@
    -
    EDA Toolkit Logo +

    Changelog

    diff --git a/docs/v0.0.11/citations.html b/docs/v0.0.11/citations.html index d979e8291..6ce0093fe 100644 --- a/docs/v0.0.11/citations.html +++ b/docs/v0.0.11/citations.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Citing EDA Toolkit — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,7 +101,8 @@
    -
    EDA Toolkit Logo +

    Citing EDA Toolkit

    diff --git a/docs/v0.0.11/contributors.html b/docs/v0.0.11/contributors.html index ea8a3e173..4f7a615b3 100644 --- a/docs/v0.0.11/contributors.html +++ b/docs/v0.0.11/contributors.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Contributors/Maintainers — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,13 +101,16 @@
    -
    EDA Toolkit Logo +

    Contributors/Maintainers

    -
    https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg +

    Leonid Shpaner is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego’s M.S. Applied Artificial Intelligence program.

    -


    https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg +


    Oscar Gil is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego.

    diff --git a/docs/v0.0.11/data_management.html b/docs/v0.0.11/data_management.html index 931aa4e93..8d39869a3 100644 --- a/docs/v0.0.11/data_management.html +++ b/docs/v0.0.11/data_management.html @@ -1,3 +1,5 @@ + + @@ -6,26 +8,22 @@ Data Management Overview — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - - + + + + + + + + + @@ -146,7 +144,8 @@
    -
    EDA Toolkit Logo +

    Data Management Overview

    In any data-driven project, effective management of data is crucial. This @@ -166,7 +165,7 @@

    Path directoriesensure_directory(path)
    Parameters:
    -

    path (str) – The path to the directory that needs to be ensured.

    +

    path (str) – The path to the directory that needs to be ensured.

    Returns:

    None

    @@ -235,10 +234,10 @@

    Adding Unique IdentifiersParameters:
    • df (pd.DataFrame) – The dataframe to add IDs to.

    • -
    • id_colname (str, optional) – The name of the new column for the IDs. Defaults to "ID".

    • -
    • num_digits (int, optional) – The number of digits for the unique IDs. Defaults to 9.

    • -
    • seed (int, optional) – The seed for the random number generator. Defaults to None.

    • -
    • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

    • +
    • id_colname (str, optional) – The name of the new column for the IDs. Defaults to "ID".

    • +
    • num_digits (int, optional) – The number of digits for the unique IDs. Defaults to 9.

    • +
    • seed (int, optional) – The seed for the random number generator. Defaults to None.

    • +
    • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

    Returns:
    @@ -407,7 +406,7 @@

    Trailing Period RemovalParameters:
    Returns:
    @@ -536,16 +535,16 @@

    Standardized Dates
    Parameters:
    -

    date_str (str) – A date string to be standardized.

    +

    date_str (str) – A date string to be standardized.

    Returns:

    A standardized date string in the format YYYY-MM-DD.

    Return type:
    -

    str

    +

    str

    Raises:
    -

    ValueError – If date_str is in an unrecognized format or if the function +

    ValueError – If date_str is in an unrecognized format or if the function cannot parse the date.

    @@ -625,9 +624,9 @@

    DataFrame AnalysisParameters:
    • df (pandas.DataFrame) – The DataFrame to analyze.

    • -
    • background_color (str, optional) – Hex color code or color name for background styling in the output +

    • background_color (str, optional) – Hex color code or color name for background styling in the output DataFrame. Defaults to None.

    • -
    • return_df (bool, optional) – If True, returns the plain DataFrame with the summary statistics. If +

    • return_df (bool, optional) – If True, returns the plain DataFrame with the summary statistics. If False, returns a styled DataFrame for visual presentation. Defaults to False.

    @@ -904,17 +903,17 @@

    Generating Summary Tables for Variable CombinationsParameters:
    • df (pandas.DataFrame) – The pandas DataFrame containing the data.

    • -
    • variables (list of str) – List of column names from the DataFrame to generate combinations.

    • -
    • data_path (str) – Path where the output Excel file will be saved.

    • -
    • data_name (str) – Name of the output Excel file.

    • -
    • min_length (int, optional) – Minimum size of the combinations to generate. Defaults to 2.

    • +
    • variables (list of str) – List of column names from the DataFrame to generate combinations.

    • +
    • data_path (str) – Path where the output Excel file will be saved.

    • +
    • data_name (str) – Name of the output Excel file.

    • +
    • min_length (int, optional) – Minimum size of the combinations to generate. Defaults to 2.

    Returns:

    A tuple containing a dictionary of summary tables and a list of all generated combinations.

    Return type:
    -

    tuple(dict, list)

    +

    tuple(dict, list)

    @@ -1096,7 +1095,8 @@

    Generating Summary Tables for Variable Combinations

    When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. The first sheet will be a Table of Contents with hyperlinks to each summary table.

    -
    EDA Toolkit Logo +

    Saving DataFrames to Excel with Customized Formatting

    @@ -1109,9 +1109,9 @@

    Saving DataFrames to Excel with Customized Formatting
    Parameters:
      -
    • file_path (str) – Full path to the output Excel file.

    • -
    • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

    • -
    • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

    • +
    • file_path (str) – Full path to the output Excel file.

    • +
    • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

    • +
    • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

    @@ -1171,12 +1171,12 @@

    Creating Contingency TablesParameters:
    • df (pandas.DataFrame) – The DataFrame to analyze.

    • -
    • cols (str or list of str, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

    • -
    • sort_by (int, optional) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order. Defaults to 0.

    • +
    • cols (str or list of str, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

    • +
    • sort_by (int, optional) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order. Defaults to 0.

    Raises:
    -

    ValueError – If no columns are specified or if sort_by is not 0 or 1.

    +

    ValueError – If no columns are specified or if sort_by is not 0 or 1.

    Returns:

    A DataFrame containing the contingency table with the specified columns, a 'Total' column representing the count of occurrences, and a 'Percentage' column representing the percentage of the total count.

    @@ -1239,8 +1239,8 @@

    Highlighting Specific Columns in a DataFrameParameters:
    Returns:
    diff --git a/docs/v0.0.11/eda_plots.html b/docs/v0.0.11/eda_plots.html index 9bd35e0c3..da7b6daa3 100644 --- a/docs/v0.0.11/eda_plots.html +++ b/docs/v0.0.11/eda_plots.html @@ -1,3 +1,5 @@ + + @@ -6,26 +8,22 @@ Plotting and Theoretical Overview — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - - + + + + + + + + + @@ -164,7 +162,8 @@
    -
    EDA Toolkit Logo +

    Plotting and Theoretical Overview

    @@ -183,7 +182,8 @@

    Gaussian Assumption for Normality\(\mu \pm 2\sigma\)

  • 99.7% within \(\mu \pm 3\sigma\)

  • -
    KDE Distributions - KDE (+) Histograms (Density) +

    Histograms and Kernel Density Estimation (KDE)

    Histograms:

    @@ -339,50 +339,50 @@

    KDE Distribution FunctionParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots. If ‘all’, plots will be generated for all numeric columns.

    • -
    • figsize (tuple of int, optional) – Size of each individual plot, default is (5, 5). Used when only one plot is being generated or when saving individual plots.

    • -
    • grid_figsize (tuple of int, optional) – Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on figsize, n_rows, and n_cols.

    • -
    • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

    • -
    • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

    • -
    • mean_color (str, optional) – Color of the mean line if plot_mean is True, default is '#000000'.

    • -
    • median_color (str, optional) – Color of the median line if plot_median is True, default is '#000000'.

    • -
    • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

    • -
    • hue (str, optional) – Column name to group data by, adding different colors for each group.

    • -
    • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

    • -
    • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid. If not provided, it will be calculated automatically.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid. If not provided, it will be calculated automatically.

    • -
    • w_pad (float, optional) – Width padding between subplots, default is 1.0.

    • -
    • h_pad (float, optional) – Height padding between subplots, default is 1.0.

    • -
    • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

    • -
    • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

    • -
    • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

    • -
    • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

    • -
    • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses figsize for determining the plot size, ignoring grid_figsize.

    • -
    • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

    • -
    • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

    • -
    • log_scale_vars (str or list of str, optional) – Variable name(s) to apply log scaling. Can be a single string or a list of strings.

    • -
    • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

    • -
    • binwidth (float, optional) – Width of each bin, overrides bins but can be used with binrange.

    • -
    • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • -
    • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

    • -
    • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

    • -
    • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • -
    • plot_mean (bool, optional) – Whether to plot the mean as a vertical line, default is False.

    • -
    • plot_median (bool, optional) – Whether to plot the median as a vertical line, default is False.

    • -
    • std_dev_levels (list of int, optional) – Levels of standard deviation to plot around the mean.

    • -
    • std_color (str or list of str, optional) – Color(s) for the standard deviation lines, default is '#808080'.

    • -
    • label_names (dict, optional) – Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display.

    • -
    • show_legend (bool, optional) – Whether to show the legend on the plots, default is True.

    • +
    • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots. If ‘all’, plots will be generated for all numeric columns.

    • +
    • figsize (tuple of int, optional) – Size of each individual plot, default is (5, 5). Used when only one plot is being generated or when saving individual plots.

    • +
    • grid_figsize (tuple of int, optional) – Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on figsize, n_rows, and n_cols.

    • +
    • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

    • +
    • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

    • +
    • mean_color (str, optional) – Color of the mean line if plot_mean is True, default is '#000000'.

    • +
    • median_color (str, optional) – Color of the median line if plot_median is True, default is '#000000'.

    • +
    • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

    • +
    • hue (str, optional) – Column name to group data by, adding different colors for each group.

    • +
    • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

    • +
    • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

    • +
    • n_rows (int, optional) – Number of rows in the subplot grid. If not provided, it will be calculated automatically.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid. If not provided, it will be calculated automatically.

    • +
    • w_pad (float, optional) – Width padding between subplots, default is 1.0.

    • +
    • h_pad (float, optional) – Height padding between subplots, default is 1.0.

    • +
    • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

    • +
    • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

    • +
    • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

    • +
    • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

    • +
    • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses figsize for determining the plot size, ignoring grid_figsize.

    • +
    • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

    • +
    • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

    • +
    • log_scale_vars (str or list of str, optional) – Variable name(s) to apply log scaling. Can be a single string or a list of strings.

    • +
    • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

    • +
    • binwidth (float, optional) – Width of each bin, overrides bins but can be used with binrange.

    • +
    • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • +
    • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

    • +
    • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

    • +
    • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • plot_mean (bool, optional) – Whether to plot the mean as a vertical line, default is False.

    • +
    • plot_median (bool, optional) – Whether to plot the median as a vertical line, default is False.

    • +
    • std_dev_levels (list of int, optional) – Levels of standard deviation to plot around the mean.

    • +
    • std_color (str or list of str, optional) – Color(s) for the standard deviation lines, default is '#808080'.

    • +
    • label_names (dict, optional) – Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display.

    • +
    • show_legend (bool, optional) – Whether to show the legend on the plots, default is True.

    • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

    Raises:

    -
    KDE Distributions - KDE (+) Histograms (Density) +

    Histogram Example (Density)

    @@ -503,7 +504,8 @@

    Histogram Example (Density))

    -
    KDE Distributions - Histograms (Density) +

    Histogram Example (Count)

    @@ -542,7 +544,8 @@

    Histogram Example (Count))

    -
    KDE Distributions - Histograms (Count) +

    Histogram Example - (Mean and Median)

    @@ -589,7 +592,8 @@

    Histogram Example - (Mean and Median))

    -
    KDE Distributions - Histograms (Count) +

    Histogram Example - (Mean, Median, and Std. Deviation)

    @@ -653,7 +657,8 @@

    Histogram Example - (Mean, Median, and Std. Deviation))

    -
    KDE Distributions - Histograms (Count) +
    @@ -675,45 +680,45 @@

    Stacked Crosstab PlotsParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • col (str) – The name of the column in the DataFrame to be analyzed.

    • -
    • func_col (list) – List of ground truth columns to be analyzed.

    • -
    • legend_labels_list (list) – List of legend labels for each ground truth column.

    • -
    • title (list) – List of titles for the plots.

    • -
    • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

    • -
    • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

    • -
    • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

    • -
    • custom_order (list, optional) – Specifies a custom order for the categories in the col.

    • -
    • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

    • -
    • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

    • -
    • save_formats (list, optional) – List of file formats to save the plot images in. Valid formats are 'png' and 'svg'. If not provided, defaults to an empty list and no images will be saved.

    • -
    • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

    • -
    • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

    • -
    • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

    • -
    • x (int, optional) – The width of the figure.

    • -
    • y (int, optional) – The height of the figure.

    • -
    • p (int, optional) – The padding between the subplots.

    • -
    • file_prefix (str, optional) – Prefix for the filename when output includes plots.

    • -
    • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

    • -
    • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

    • -
    • show_legend (bool, optional) – Specify whether to show the legend, default is True.

    • -
    • label_fontsize (int, optional) – Font size for axis labels, default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • -
    • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • col (str) – The name of the column in the DataFrame to be analyzed.

    • +
    • func_col (list) – List of ground truth columns to be analyzed.

    • +
    • legend_labels_list (list) – List of legend labels for each ground truth column.

    • +
    • title (list) – List of titles for the plots.

    • +
    • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

    • +
    • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

    • +
    • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

    • +
    • custom_order (list, optional) – Specifies a custom order for the categories in the col.

    • +
    • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

    • +
    • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

    • +
    • save_formats (list, optional) – List of file formats to save the plot images in. Valid formats are 'png' and 'svg'. If not provided, defaults to an empty list and no images will be saved.

    • +
    • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

    • +
    • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

    • +
    • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

    • +
    • x (int, optional) – The width of the figure.

    • +
    • y (int, optional) – The height of the figure.

    • +
    • p (int, optional) – The padding between the subplots.

    • +
    • file_prefix (str, optional) – Prefix for the filename when output includes plots.

    • +
    • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

    • +
    • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

    • +
    • show_legend (bool, optional) – Specify whether to show the legend, default is True.

    • +
    • label_fontsize (int, optional) – Font size for axis labels, default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • +
    • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    Raises:
      -
    • ValueError

        +
      • ValueError

        • If output is not one of "both", "plots_only", or "crosstabs_only".

        • If plot_type is not one of "both", "regular", "normalized".

        • If remove_stacks is set to True and plot_type is not "regular".

        • If the lengths of title, func_col, and legend_labels_list are not equal.

      • -
      • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

      • +
      • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

    Returns:
    @@ -853,8 +858,10 @@

    Stacked Bar Plots With Crosstabs ExampleKDE Distributions -

    Non-Normalized Stacked Bar Plots Example

    @@ -1108,7 +1116,8 @@

    Non-Normalized Stacked Bar Plots Exampleplot_type to "normalized" will display only the normalized plots. The example below demonstrates regular stacked bar plots for income by age.

    -
    Stacked Bar Plot Age vs. Income (Regular) +

    Regular Non-Stacked Bar Plots Example

    @@ -1123,7 +1132,8 @@

    Regular Non-Stacked Bar Plots Example#333333), and the legend has been removed by setting show_legend=False. This illustrates regular bar plots for income by age, without stacking.

    -
    Bar Plot Age vs. Income (Regular) +

    @@ -1155,31 +1165,31 @@

    Box and Violin PlotsParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • metrics_list (list of str) – List of metric names (columns in df) to plot.

    • -
    • metrics_comp (list of str) – List of comparison categories (columns in df).

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated automatically if not provided.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated automatically if not provided.

    • -
    • image_path_png (str, optional) – Optional directory path to save .png images.

    • -
    • image_path_svg (str, optional) – Optional directory path to save .svg images.

    • -
    • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

    • -
    • show_legend (bool, optional) – Boolean, True if showing the legend in the plots. Default is True.

    • -
    • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • -
    • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

    • -
    • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots. Default is False.

    • -
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • -
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • -
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • -
    • label_names (dict, optional) – Dictionary mapping original column names to custom labels. Default is None.

    • +
    • metrics_list (list of str) – List of metric names (columns in df) to plot.

    • +
    • metrics_comp (list of str) – List of comparison categories (columns in df).

    • +
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated automatically if not provided.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated automatically if not provided.

    • +
    • image_path_png (str, optional) – Optional directory path to save .png images.

    • +
    • image_path_svg (str, optional) – Optional directory path to save .svg images.

    • +
    • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

    • +
    • show_legend (bool, optional) – Boolean, True if showing the legend in the plots. Default is True.

    • +
    • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • +
    • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

    • +
    • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots. Default is False.

    • +
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • +
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • +
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • label_names (dict, optional) – Dictionary mapping original column names to custom labels. Default is None.

    • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

    Raises:
    -

    ValueError

      +

      ValueError

      • If show_plot is not one of "individual", "grid", or "both".

      • If save_plots is not one of None, "all", "individual", or "grid".

      • If save_plots is set without specifying image_path_png or image_path_svg.

      • @@ -1240,7 +1250,8 @@

        Box Plots Grid Example)

    -
    Box Plot Comparisons +

    Violin Plots Grid Example

    @@ -1265,7 +1276,8 @@

    Violin Plots Grid Example)

    -
    Violin Plot Comparisons +

    Pivoted Violin Plots Grid Example

    @@ -1288,7 +1300,8 @@

    Pivoted Violin Plots Grid Example)

    -
    Violin Plot Comparisons (Pivoted) +
    @@ -1331,42 +1344,42 @@

    Scatter Fit PlotParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data.

    • -
    • x_vars (list of str, optional) – List of variable names to plot on the x-axis.

    • -
    • y_vars (list of str, optional) – List of variable names to plot on the y-axis.

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated based on the number of plots and n_cols if not specified.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated based on the number of plots and max_cols if not specified.

    • -
    • max_cols (int, optional) – Maximum number of columns in the subplot grid. Default is 4.

    • -
    • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

    • -
    • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

    • -
    • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid". If None, plots will not be saved.

    • -
    • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • -
    • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

    • -
    • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

    • -
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • -
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified.

    • -
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

    • -
    • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

    • -
    • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

    • -
    • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

    • -
    • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

    • -
    • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the hue parameter to be set.

    • -
    • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

    • -
    • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

    • -
    • marker (str, optional) – Marker style used for the scatter points. Default is "o".

    • -
    • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • -
    • all_vars (list of str, optional) – If provided, automatically generates scatter plots for all combinations of variables in this list, overriding x_vars and y_vars.

    • -
    • label_names (dict, optional) – A dictionary to rename columns for display in the plot titles and labels.

    • -
    • kwargs (dict, optional) – Additional keyword arguments to pass to sns.scatterplot.

    • +
    • x_vars (list of str, optional) – List of variable names to plot on the x-axis.

    • +
    • y_vars (list of str, optional) – List of variable names to plot on the y-axis.

    • +
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated based on the number of plots and n_cols if not specified.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated based on the number of plots and max_cols if not specified.

    • +
    • max_cols (int, optional) – Maximum number of columns in the subplot grid. Default is 4.

    • +
    • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

    • +
    • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

    • +
    • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid". If None, plots will not be saved.

    • +
    • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • +
    • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

    • +
    • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

    • +
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • +
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified.

    • +
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

    • +
    • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

    • +
    • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

    • +
    • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

    • +
    • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

    • +
    • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the hue parameter to be set.

    • +
    • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

    • +
    • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

    • +
    • marker (str, optional) – Marker style used for the scatter points. Default is "o".

    • +
    • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • all_vars (list of str, optional) – If provided, automatically generates scatter plots for all combinations of variables in this list, overriding x_vars and y_vars.

    • +
    • label_names (dict, optional) – A dictionary to rename columns for display in the plot titles and labels.

    • +
    • kwargs (dict, optional) – Additional keyword arguments to pass to sns.scatterplot.

    Raises:
    -

    ValueError

      +

      ValueError

      • If all_vars is provided and either x_vars or y_vars is also provided.

      • If neither all_vars nor both x_vars and y_vars are provided.

      • If hue_palette is specified without hue.

      • @@ -1415,7 +1428,8 @@

        Regression-Centric Scatter Plots Example)

    -
    Scatter Plot Comparisons (with Best Fit Lines) +

    Scatter Plots Grouped by Category Example

    @@ -1468,7 +1482,8 @@

    Scatter Plots Grouped by Category Example)

    -
    Scatter Plot Comparisons (Grouped) +

    Scatter Plots (All Combinations Example)

    @@ -1497,7 +1512,8 @@

    Scatter Plots (All Combinations Example))

    -
    Scatter Plot Comparisons (Grouped2) +
    @@ -1531,30 +1547,30 @@

    Correlation MatricesParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data.

    • -
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • -
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • -
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • -
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • -
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • -
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • -
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • -
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • -
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • -
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • -
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • -
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • -
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • -
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • -
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • -
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    • +
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • +
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • +
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • +
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • +
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • +
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • +
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • +
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • +
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • +
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • +
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • +
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • +
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • +
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • +
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • +
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    Raises:
    -

    ValueError

      +

      ValueError

      • If annot is not a boolean.

      • If cols is not a list.

      • If save_plots is not a boolean.

      • @@ -1612,7 +1628,8 @@

        Triangular Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +

    Full Correlation Matrix Example

    @@ -1646,7 +1663,8 @@

    Full Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -1673,24 +1691,24 @@

    2D Partial Dependence Plots
    • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

    • X_train (pandas.DataFrame or numpy.ndarray) – The training data used to compute partial dependence. Should correspond to the features used to train the model.

    • -
    • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

    • -
    • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

    • -
    • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

    • -
    • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

    • -
    • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

    • -
    • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

    • -
    • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

    • -
    • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • -
    • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

    • -
    • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

    • -
    • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

    • -
    • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

    • +
    • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

    • +
    • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

    • +
    • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

    • +
    • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

    • +
    • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

    • +
    • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

    • +
    • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

    • +
    • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • +
    • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

    • +
    • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

    • +
    • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

    • +
    • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

    Raises:
    -

    ValueError

      +

      ValueError

      • If plot_type is not one of "grid", "individual", or "both".

      • If save_plots is enabled but neither image_path_png nor image_path_svg is provided.

      @@ -1785,7 +1803,8 @@

      2D Plots - CA Housing Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -1806,47 +1825,47 @@

    3D Partial Dependence Plots
    • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

    • dataframe (pandas.DataFrame or numpy.ndarray) – The dataset on which the model was trained or a representative sample. If a DataFrame is provided, feature_names_list should correspond to the column names. If a NumPy array is provided, feature_names_list should correspond to the indices of the columns.

    • -
    • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

    • -
    • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

    • -
    • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

    • -
    • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

    • -
    • title (str) – The title for the plots.

    • -
    • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

    • -
    • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

    • -
    • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

    • -
    • plot_type (str, optional) – The type of plots to generate. Options are: +

    • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

    • +
    • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

    • +
    • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

    • +
    • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

    • +
    • title (str) – The title for the plots.

    • +
    • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

    • +
    • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

    • +
    • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

    • +
    • plot_type (str, optional) – The type of plots to generate. Options are: - "static": Generate only static Matplotlib plots. - "interactive": Generate only interactive Plotly plots. - "both": Generate both static and interactive plots. Default is "both".

    • matplotlib_colormap (matplotlib.colors.Colormap, optional) – Custom colormap for the Matplotlib plot. If not provided, a default colormap is used.

    • -
    • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

    • -
    • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

    • -
    • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

    • -
    • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

    • -
    • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

    • -
    • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • -
    • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

    • -
    • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

    • -
    • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

    • -
    • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

    • -
    • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

    • -
    • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

    • -
    • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

    • -
    • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

    • -
    • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

    • -
    • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

    • -
    • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

    • -
    • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

    • -
    • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

    • -
    • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

    • -
    • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

    • -
    • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

    • -
    • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

    • +
    • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

    • +
    • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

    • +
    • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

    • +
    • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

    • +
    • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

    • +
    • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • +
    • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

    • +
    • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

    • +
    • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

    • +
    • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

    • +
    • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

    • +
    • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

    • +
    • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

    • +
    • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

    • +
    • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

    • +
    • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

    • +
    • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

    • +
    • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

    • +
    • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

    • +
    • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

    • +
    • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

    • +
    • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

    • +
    • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

    Raises:
    -

    ValueError

      +

      ValueError

      • If plot_type is not one of "static", "interactive", or "both".

      • If plot_type is "interactive" or "both" and html_file_path or html_file_name are not provided.

      @@ -1939,7 +1958,8 @@

      Static Plot)

    -
    Scatter Plot Comparisons (Grouped) +

    Interactive Plot

    diff --git a/docs/v0.0.11/genindex.html b/docs/v0.0.11/genindex.html index a3bfc3be1..81f9a23c6 100644 --- a/docs/v0.0.11/genindex.html +++ b/docs/v0.0.11/genindex.html @@ -1,3 +1,5 @@ + + @@ -5,25 +7,21 @@ Index — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - + + + + + + + + diff --git a/docs/v0.0.11/getting_started.html b/docs/v0.0.11/getting_started.html index 349ff508b..806ecf830 100644 --- a/docs/v0.0.11/getting_started.html +++ b/docs/v0.0.11/getting_started.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - + + + + + + + + @@ -111,7 +109,8 @@
    -
    EDA Toolkit Logo +

    Welcome to the EDA Toolkit Python Library Documentation!

    diff --git a/docs/v0.0.11/index.html b/docs/v0.0.11/index.html index d8b9bd933..f2d0e7a25 100644 --- a/docs/v0.0.11/index.html +++ b/docs/v0.0.11/index.html @@ -1,3 +1,5 @@ + + @@ -6,26 +8,22 @@ Table of Contents — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - - + + + + + + + + + @@ -103,7 +101,8 @@
    -
    EDA Toolkit Logo +

    Table of Contents

    diff --git a/docs/v0.0.11/references.html b/docs/v0.0.11/references.html index 82c6858aa..e358adadd 100644 --- a/docs/v0.0.11/references.html +++ b/docs/v0.0.11/references.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ References — EDA Toolkit 0.0.11 documentation - + - - - - - - - - - - + + + + + + + + @@ -102,7 +100,8 @@
    -
    EDA Toolkit Logo +

    References

    diff --git a/docs/v0.0.11/search.html b/docs/v0.0.11/search.html index ec3244717..3a13bfbc4 100644 --- a/docs/v0.0.11/search.html +++ b/docs/v0.0.11/search.html @@ -1,3 +1,5 @@ + + @@ -5,7 +7,7 @@ Search — EDA Toolkit 0.0.11 documentation - + @@ -13,18 +15,14 @@ - - - - - - - - - - + + + + + + + + diff --git a/docs/v0.0.11/searchindex.js b/docs/v0.0.11/searchindex.js index 75b1f6413..43025590a 100644 --- a/docs/v0.0.11/searchindex.js +++ b/docs/v0.0.11/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[5, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[5, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[5, "id14"]], "3D Plots - CA Housing Example": [[5, "id15"]], "About EDA Toolkit": [[7, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[4, "adding-unique-identifiers"]], "Binning Numerical Columns": [[4, "binning-numerical-columns"]], "Box Plots Grid Example": [[5, "box-plots-grid-example"]], "Box and Violin Plots": [[5, "box-and-violin-plots"]], "Calculation Details": [[4, "calculation-details"]], "Census Income Example": [[4, "census-income-example"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[5, "correlation-matrices"]], "Creating Contingency Tables": [[4, "creating-contingency-tables"]], "Data Management": [[7, null]], "Data Management Overview": [[4, null]], "Data Management Techniques": [[4, "data-management-techniques"]], "DataFrame Analysis": [[4, "dataframe-analysis"]], "DataFrame Column Names": [[4, "dataframe-column-names"]], "Description": [[6, "description"]], "Full Correlation Matrix Example": [[5, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[5, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[4, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[7, null]], "Highlighting Specific Columns in a DataFrame": [[4, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[5, "histogram-example-count"]], "Histogram Example (Density)": [[5, "histogram-example-density"]], "Histogram Example - (Mean and Median)": [[5, "histogram-example-mean-and-median"]], "Histogram Example - (Mean, Median, and Std. Deviation)": [[5, "histogram-example-mean-median-and-std-deviation"]], "Histograms and Kernel Density Estimation (KDE)": [[5, "histograms-and-kernel-density-estimation-kde"]], "Installation": [[6, "installation"]], "Interactive Plot": [[5, "interactive-plot"]], "KDE Distribution Function": [[5, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[5, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[5, "kde-and-histograms-example"]], "Key Features": [[6, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[5, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Foundations": [[5, "partial-dependence-foundations"]], "Partial Dependence Plots": [[5, "partial-dependence-plots"]], "Path directories": [[4, "path-directories"]], "Pearson Correlation Coefficient": [[5, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[5, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[5, "pivoted-violin-plots-grid-example"]], "Plotting Heuristics": [[7, null]], "Plotting and Theoretical Overview": [[5, null]], "Prerequisites": [[6, "prerequisites"]], "Project Links": [[6, "project-links"]], "Purpose of EDA Toolkit": [[6, "purpose-of-eda-toolkit"]], "References": [[8, null]], "Regression-Centric Scatter Plots Example": [[5, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[5, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[4, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[5, "scatter-fit-plot"]], "Scatter Plots (All Combinations Example)": [[5, "scatter-plots-all-combinations-example"]], "Scatter Plots Grouped by Category Example": [[5, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[5, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[5, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[5, "stacked-crosstab-plots"]], "Standardized Dates": [[4, "standardized-dates"]], "Static Plot": [[5, "static-plot"]], "Table of Contents": [[7, null]], "Trailing Period Removal": [[4, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[5, "triangular-correlation-matrix-example"]], "Version 0.0.10": [[1, "version-0-0-10"]], "Version 0.0.11": [[1, "version-0-0-11"]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id9"], [1, "id10"], [1, "id11"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Version 0.0.9": [[1, "version-0-0-9"]], "Violin Plots Grid Example": [[5, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[6, null]], "What is EDA?": [[6, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "data_management", "eda_plots", "getting_started", "index", "references"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "data_management.rst", "eda_plots.rst", "getting_started.rst", "index.rst", "references.rst"], "indexentries": {"add_ids()": [[4, "add_ids", false]], "box_violin_plot()": [[5, "box_violin_plot", false]], "built-in function": [[4, "add_ids", false], [4, "contingency_table", false], [4, "dataframe_columns", false], [4, "ensure_directory", false], [4, "highlight_columns", false], [4, "parse_date_with_rule", false], [4, "save_dataframes_to_excel", false], [4, "strip_trailing_period", false], [4, "summarize_all_combinations", false], [5, "box_violin_plot", false], [5, "flex_corr_matrix", false], [5, "kde_distributions", false], [5, "plot_2d_pdp", false], [5, "plot_3d_pdp", false], [5, "scatter_fit_plot", false], [5, "stacked_crosstab_plot", false]], "contingency_table()": [[4, "contingency_table", false]], "dataframe_columns()": [[4, "dataframe_columns", false]], "ensure_directory()": [[4, "ensure_directory", false]], "flex_corr_matrix()": [[5, "flex_corr_matrix", false]], "highlight_columns()": [[4, "highlight_columns", false]], "kde_distributions()": [[5, "kde_distributions", false]], "parse_date_with_rule()": [[4, "parse_date_with_rule", false]], "plot_2d_pdp()": [[5, "plot_2d_pdp", false]], "plot_3d_pdp()": [[5, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[4, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[5, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[5, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[4, "strip_trailing_period", false]], "summarize_all_combinations()": [[4, "summarize_all_combinations", false]]}, "objects": {"": [[4, 0, 1, "", "add_ids"], [5, 0, 1, "", "box_violin_plot"], [4, 0, 1, "", "contingency_table"], [4, 0, 1, "", "dataframe_columns"], [4, 0, 1, "", "ensure_directory"], [5, 0, 1, "", "flex_corr_matrix"], [4, 0, 1, "", "highlight_columns"], [5, 0, 1, "", "kde_distributions"], [4, 0, 1, "", "parse_date_with_rule"], [5, 0, 1, "", "plot_2d_pdp"], [5, 0, 1, "", "plot_3d_pdp"], [4, 0, 1, "", "save_dataframes_to_excel"], [5, 0, 1, "", "scatter_fit_plot"], [5, 0, 1, "", "stacked_crosstab_plot"], [4, 0, 1, "", "strip_trailing_period"], [4, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 4, 5], "0": [2, 4, 5, 6, 7], "00": 4, "000000": 5, "0000ff": 5, "00140": [5, 8], "00bfc4": 5, "01": 4, "02": [1, 4], "03021": [5, 8], "04": [4, 5], "05": 5, "07": [4, 5], "09": 5, "1": [1, 4, 5, 6], "10": [2, 4, 5, 6, 7, 8], "100": [4, 5], "1016": [5, 8], "10724": 5, "11": [2, 4, 6, 7], "1109": [5, 8], "111": 4, "115": 5, "11687": 5, "11th": 4, "12": [4, 5, 6], "120": 5, "12202842": 4, "123": 4, "12929": 5, "13": [4, 5], "131": 5, "13162633": 2, "13163208": 2, "13174": 5, "1348": 4, "13920": [4, 5], "14": [4, 5], "147": 5, "14x4": 5, "15": [4, 5], "150": 4, "15784": 4, "15x5": 5, "16": [4, 5], "16192": 5, "17": 5, "18": [4, 5, 6], "1873": 5, "19716": 4, "1994": 6, "1996": [4, 5, 6, 8], "1997": [5, 8], "1b0": 7, "1d": 5, "1rc0": 7, "2": [4, 5, 6, 7], "20": [4, 5], "200": 4, "2007": [5, 8], "2020": 4, "2021": [4, 5, 8], "2022": 4, "2024": 2, "203488": 4, "21": [4, 5, 6], "21105": [5, 8], "2115": 5, "215646": 4, "22": 5, "22379": 4, "2245": 5, "22803": 4, "23": 5, "234721": 4, "24": 4, "24432": [4, 5, 6, 8], "24720": 4, "25": [1, 4, 5], "250": [4, 5], "2509": 5, "2565": 4, "26": 5, "27": 5, "274": 4, "28": [4, 5], "280": 5, "28523": 4, "29": [4, 5], "291": [5, 8], "295": 5, "297": [5, 8], "2d": [1, 7, 8], "3": [4, 5, 6, 7, 8], "30": [4, 5], "300": [4, 5], "3021": [5, 8], "3054": 5, "31": 4, "3188": 5, "32": 4, "32650": [4, 5], "33": [4, 5, 8], "333333": 5, "338409": 4, "33906": 4, "34": 5, "3461": 5, "35130194": 4, "36": [4, 5], "3680": 4, "37": [4, 5], "37155": 5, "38": [4, 5], "3853": 5, "39": [4, 5], "3986": 5, "3d": [1, 7], "3d_pdp": 5, "4": [4, 5, 6, 7], "40": [4, 5], "41": 5, "4110": 5, "41762": 4, "42": [4, 5], "42643227": 4, "4267": 4, "43": 4, "43832": 4, "44807": 4, "45": [4, 5], "46": 4, "46560": 4, "467": 4, "468": 4, "469": 4, "47": 5, "470": 4, "471": 4, "472": 4, "4746": 5, "48842": [4, 5], "49": [4, 5], "5": [4, 5, 6, 7], "50": [4, 5], "50k": [4, 5], "50k_": 5, "51": [4, 5], "5281": 2, "53": [4, 5], "535": 5, "55": [5, 8], "56": 4, "5623": 4, "5707": 5, "58": 5, "5856": 4, "59": [4, 5], "595": 5, "6": [4, 5, 6, 7, 8], "60": [4, 5, 8], "61": 4, "6172": 4, "62": 5, "64": [4, 5], "65": 5, "66": [4, 5], "6619": 5, "668": 5, "6738": 5, "68": 5, "69": [4, 5], "7": [4, 5, 6, 7], "70": [4, 5], "71": 5, "7152": [5, 8], "720": 4, "73": 5, "74": 4, "74130842": 4, "746": 5, "75": [4, 5], "7536": 5, "76": [4, 5], "77": 5, "77516": 4, "79": [4, 5], "8": [4, 5, 7], "80": [4, 5], "808080": 5, "809": 5, "81": 5, "815": 5, "82": 4, "8213": 5, "82943611": 4, "83": 5, "832": 4, "83311": 4, "85": [4, 5], "8601": 4, "861555": 4, "87": 5, "87104229": 4, "89": [4, 5], "8a": 7, "8b": 7, "8c": 7, "8d": 1, "9": [4, 5, 7, 8], "90": [4, 5, 8], "90069867": 4, "9076": 5, "91": [4, 5], "93": 5, "93837254": 4, "939": 5, "94": 5, "9468": 5, "95": [4, 5, 8], "96": [4, 5, 8], "96078789": 4, "963": 4, "966": 4, "97": 4, "97751875": 4, "98": 4, "99": [4, 5], "A": [1, 4, 5, 6, 8], "As": 5, "By": [1, 5], "For": [4, 5, 6], "If": [1, 4, 5], "In": [4, 5], "Into": 5, "It": [1, 4, 5, 6], "No": [1, 5], "Not": 4, "One": 1, "The": [1, 4, 5, 6], "Then": 4, "There": 5, "These": [1, 4, 5], "To": 5, "With": [3, 7], "_": 5, "_c": 5, "_plotli": 1, "abil": [1, 5], "abl": 5, "about": 4, "abov": [1, 5], "academ": 0, "accept": 1, "access": 5, "accord": [1, 5], "accordingli": 4, "account": 1, "accur": [1, 5], "accuraci": 4, "acknowledg": [1, 7], "across": [1, 4, 5], "actual": 5, "ad": [1, 5, 7], "adapt": [1, 4, 5], "add": [1, 4, 5], "add_best_fit_lin": 5, "add_id": [1, 4, 7], "addit": [1, 5], "addition": [4, 5, 6], "address": [1, 6], "adher": 5, "adjust": [1, 4, 5], "adm": 4, "advanc": 4, "aesthet": [1, 5], "affect": 5, "after": [1, 4, 5], "ag": [4, 5], "against": 5, "age_boxplot_list": 5, "age_group": [4, 5], "ages_18_to_40": 4, "aggreg": 5, "alic": 4, "align": [1, 4, 5], "all": [1, 4, 6, 7], "all_combin": 4, "all_var": 5, "allow": [1, 4, 5], "alon": 5, "along": [1, 4, 5], "alpha": [1, 5], "alreadi": 4, "also": [0, 1, 5], "altern": 5, "alwai": [1, 4], "amount": 4, "an": [0, 1, 3, 4, 5], "analysi": [1, 5, 6, 7], "analyst": 6, "analyt": 3, "analyz": [1, 4, 5], "angl": [1, 5], "ani": [1, 4, 5, 6], "annot": [1, 5], "anomali": 6, "anoth": 5, "anyth": 1, "appar": 5, "appear": [1, 4, 5], "append": [4, 5], "appli": [0, 1, 3, 4, 5, 6], "applic": [1, 5], "approach": 5, "appropri": [1, 5], "approxim": 5, "ar": [1, 4, 5], "area": 5, "arg": 1, "argument": [1, 5], "around": [1, 5], "arrai": 5, "arrang": 5, "arrow": 5, "artifact": 4, "artifici": 3, "asian": 4, "aspect": [1, 5, 6], "assess": 5, "assign": [1, 4, 5], "associ": [5, 6], "assum": 4, "assumpt": 7, "astyp": 1, "attempt": [4, 5], "attent": 5, "attract": 5, "attribut": 5, "aug": 2, "author": [2, 3], "auto": 5, "autofit": 4, "autom": [3, 6], "automat": [1, 5, 6], "autoregress": [5, 8], "avail": 5, "aveoccup": 5, "averag": 5, "averoom": 5, "avoid": [1, 5], "ax": [1, 5], "axi": [1, 5], "azimuth": 5, "bachelor": 4, "back": [4, 5], "backbon": 4, "background": 4, "background_color": [1, 4], "backward": 1, "badg": 1, "band": 5, "bandwidth": 5, "bar": [1, 6, 7], "barh": 5, "barri": [5, 8], "base": [1, 4, 5], "base_path": 4, "bbox_inch": 5, "becaus": [4, 5], "been": [1, 4, 5], "befor": [1, 4, 5, 6], "begin": [4, 5], "behavior": [1, 5], "being": [4, 5], "bell": 5, "belong": 4, "below": [4, 5], "beneath": 5, "benefici": 5, "best": [1, 6, 7], "best_fit_linecolor": 5, "best_fit_linestyl": 5, "beta": 1, "better": [1, 5, 6], "between": [1, 4, 5], "bin": [1, 5, 7], "bin_ag": 4, "binrang": 5, "binwidth": [1, 5], "black": [4, 5], "block": [1, 5], "blue": 5, "bob": 4, "bold": 4, "bool": [4, 5], "boolean": [1, 5], "border": 4, "both": [1, 4, 5], "bound": [4, 5], "boundari": 4, "box": [1, 6, 7], "box_violin_plot": [1, 5, 7], "boxplot": 5, "breakdown": 5, "brief": 1, "bring": 3, "broad": [1, 6], "brown": 5, "browser": 5, "bug": 1, "built": 5, "c0": 5, "c5gp7": [4, 5, 6, 8], "c_i": 5, "ca": 7, "calcul": [5, 7], "california": [3, 5], "call": [1, 4, 5], "camera": [1, 5], "can": [1, 4, 5, 6], "cancer": 5, "cannot": 4, "capabl": [1, 4], "capit": 4, "captur": 5, "career": 0, "case": [1, 4, 5], "categor": [1, 4, 5], "categori": [4, 7], "cbar_label": 5, "cbar_thick": [1, 5], "cbar_x": [1, 5], "cdot": 5, "cell": 4, "censu": [5, 6, 7, 8], "census_id": 4, "census_summary_t": 4, "center_baselin": 5, "central": 5, "centric": 7, "certain": 5, "certifi": 1, "cervic": 5, "chang": [1, 5], "changelog": 7, "charact": [4, 5], "characterist": 6, "charli": 4, "check": [1, 4, 5], "choos": [1, 4, 5], "circl": 5, "citat": 1, "cite": 7, "civ": 4, "clariti": [1, 5], "clean": [1, 4, 5, 6], "cleaner": [1, 4], "cleanup": 1, "clear": [1, 5], "clearer": 1, "clearli": 1, "cleric": 4, "closer": 5, "clutter": 5, "cmap": [1, 5], "code": [1, 4, 5], "codebas": 1, "coeffici": 7, "cohes": 5, "col": [1, 4, 5], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 4, 5], "colorbar": 5, "colormap": [1, 5], "column": [1, 5, 7], "column_nam": 4, "combin": [1, 6, 7], "come": 1, "comment": 1, "common": [1, 4, 6], "compar": 5, "comparison": 5, "compat": [1, 5], "complement": 5, "complementari": 5, "complet": 5, "complex": [1, 5], "comprehens": [1, 5, 6], "comput": [4, 5, 8], "concept": 5, "condit": 1, "condition": 1, "configur": [1, 5], "confirm": 1, "confus": [1, 5], "consecut": 4, "consid": 5, "consist": [1, 4, 5], "consolid": 1, "constant": [4, 5], "constitut": 4, "constraint": 4, "contain": [1, 4, 5], "content": [1, 4], "context": 5, "conting": [1, 5, 6, 7], "contingency_t": [4, 7], "continu": [1, 4, 5], "contour": 5, "contrast": 5, "contributor": 7, "control": [1, 5], "convers": [1, 4], "convert": [1, 4], "coolwarm": [1, 5], "coordin": 1, "cornel": 3, "correct": [1, 5, 6], "correctli": [1, 4, 5], "correl": [1, 7], "correspond": [1, 4, 5], "count": [1, 4, 7], "countri": 4, "cours": 3, "cov": 5, "covari": 5, "creat": [1, 5, 6, 7], "creation": 5, "crop": 5, "crosstab": [1, 7], "crosstab_age_incom": 5, "crosstab_age_sex": 5, "crosstabs_dict": 5, "crosstabs_onli": 5, "crucial": [4, 5, 6], "current": 4, "curv": 5, "custom": [1, 5, 6, 7], "custom_ord": 5, "customiz": [1, 5, 6], "cut": 4, "d": [5, 8], "dai": 4, "dark": 5, "dashboard": 5, "data": [0, 1, 3, 5, 6, 8], "data_nam": 4, "data_output": 4, "data_path": 4, "data_typ": 1, "datafram": [1, 5, 6, 7], "dataframe_column": [1, 4, 7], "dataset": [4, 5, 6], "date": [1, 6, 7], "date_column": 4, "date_str": 4, "datetim": 1, "david": 4, "dd": 4, "deal": [4, 5], "decad": 3, "decim": [1, 4], "decimal_plac": [1, 4], "decis": [1, 5], "decreas": 5, "dedic": 0, "deeper": 5, "deepest": 0, "default": [1, 4, 5], "defin": [1, 4, 5], "definit": 4, "degre": [1, 5], "demograph": 5, "demonstr": [4, 5, 6], "denot": 5, "densiti": [1, 7], "depend": [1, 4, 6, 7], "deprec": 1, "depth": [1, 5], "descend": [4, 5], "describ": [1, 5], "descript": [1, 7], "design": [4, 5, 6], "detail": [1, 5, 6, 7], "determin": [4, 5], "develop": 3, "deviat": [1, 6, 7], "df": [1, 4, 5], "df_censu": 4, "df_dict": 4, "df_num": 5, "dict": [4, 5], "dictionari": [4, 5], "did": 1, "diego": [0, 3], "differ": [1, 5], "digit": [1, 4], "dimens": 5, "dimensionless": 5, "dir": 4, "direct": 5, "directli": [1, 5, 6], "directori": [5, 6, 7], "disabl": [1, 5], "disable_sci_not": [1, 5], "discov": 6, "discret": [4, 5], "dispers": 5, "displai": [1, 4, 5], "distinct": [1, 4, 5], "distinguish": 5, "distract": 5, "distribut": [1, 4, 6, 7], "dive": 4, "divers": 1, "divid": [4, 5], "divorc": 4, "do": [1, 4, 5], "docstr": 1, "document": [1, 7], "doe": [1, 4, 5], "doi": [2, 4, 5, 6, 8], "domin": 4, "don": 5, "dot": 5, "doubl": 5, "down": 5, "dr": 0, "draw": 5, "driven": 4, "dtype": 4, "due": [1, 4], "duplic": 1, "dure": [0, 1], "dx_": 5, "dx_c": 5, "dynam": 1, "e": [1, 4, 5], "each": [1, 4, 5], "eas": [1, 4, 6], "easi": [5, 6], "easier": [1, 5], "easili": 5, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 5, 6], "edg": [1, 5], "edgecolor": 1, "educ": [0, 3, 4, 5], "effect": [1, 3, 4, 5, 6], "either": [1, 4, 5], "element": [1, 4, 5], "elev": 5, "els": 1, "emp": 4, "emphas": 1, "emploi": 5, "employ": 4, "empti": [1, 4, 5], "enabl": [1, 5, 6], "enable_zoom": [1, 5], "end": [1, 4, 5], "endeavor": 0, "endpoint": 4, "engin": [0, 4, 5, 8], "enhanc": [1, 4, 5, 6], "enough": 1, "ensembl": 5, "ensu": 6, "ensur": [1, 4, 5, 6], "ensure_directori": [4, 7], "enter": [1, 4], "entir": [4, 5], "entri": [1, 4, 5], "environ": [0, 1, 5, 8], "equal": 5, "equat": 5, "equival": 4, "error": [1, 4], "especi": [1, 4, 5], "essenti": [4, 5, 6], "estim": 7, "etc": 6, "ev": 4, "evalu": 5, "even": [1, 4, 5], "everyth": 5, "exact": 1, "examin": 5, "exampl": [1, 6, 7], "exce": 4, "excel": [3, 6, 7], "except": [0, 1, 4], "excess": 5, "exclud": [4, 5], "exclus": 4, "exec": 4, "execut": 5, "exist": [1, 4], "exp": 5, "expand": 1, "expect": [1, 5], "experi": [1, 3], "explain": [1, 4], "explan": 1, "explicitli": 1, "explor": [1, 5, 6], "exploratori": 6, "export": [5, 6], "express": [0, 5], "extend": [0, 5], "extens": [1, 5], "extract": [1, 5], "f": [1, 5], "f8766d": 5, "f8c5c8": 4, "facilit": [3, 4, 6], "factor": 5, "fall": [4, 5], "fallback": 1, "fals": [1, 4, 5], "famili": 4, "fashion": 5, "featur": [1, 4, 5, 7], "feature_nam": 5, "feature_names_list": [1, 5], "feder": 4, "feedback": 1, "femal": [4, 5], "female_": 5, "fetch": 5, "fetch_california_h": 5, "few": 5, "ff0000": 5, "figsiz": [1, 5], "figur": [1, 5], "file": [1, 4, 5], "file_nam": 4, "file_path": 4, "file_prefix": [1, 5], "filenam": [1, 5], "fill": [1, 5], "fill_alpha": [1, 5], "fillna": 1, "filter": [4, 5], "filtered_df": 4, "financi": [3, 5], "find": [1, 4], "first": [1, 4, 5], "fit": [1, 6, 7], "fix": 1, "flag": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 5], "flip": 5, "float": [4, 5], "fnlwgt": 4, "focu": 5, "focus": 5, "folder": 4, "follow": [1, 4, 5, 6], "font": [1, 5], "fontsiz": 1, "form": [4, 6], "format": [1, 5, 6, 7], "formatth": 5, "former": 4, "formerli": 1, "formula": 5, "found": 1, "foundat": 7, "four": 5, "frac": 5, "freedom": 5, "frequenc": [1, 4, 5], "frequent": 4, "friendli": 1, "from": [0, 1, 3, 4, 5, 6], "full": [1, 4, 7], "fulli": 5, "func_col": [1, 5], "function": [1, 4, 6, 7], "further": [1, 4, 5], "futur": [1, 5], "futurewarn": 5, "g": [1, 4, 5], "gain": [4, 6], "gaussian": 7, "gener": [1, 5, 6, 7], "geq": 4, "get": 6, "get_legend": 1, "get_text": 1, "gil": [2, 3], "github": 6, "give": 1, "given": [1, 4, 5], "glanc": 5, "go": 4, "got": 1, "gov": 4, "grad": 4, "gradientboostingregressor": 5, "graduat": 0, "granular": 1, "graphic": [5, 8], "gratitud": 0, "greater": [1, 4], "green": 5, "grei": 5, "grid": [1, 7], "grid_figs": 5, "grid_resolut": 5, "grid_valu": 5, "ground": 5, "group": [1, 4, 7], "gt": 5, "guid": [0, 6], "guidanc": 1, "guidelin": 5, "h": [4, 5], "h_pad": 5, "ha": [1, 3, 4, 5], "half": 5, "halv": 5, "handl": [1, 4, 5, 6], "handler": 4, "hat": 5, "have": [1, 4, 5], "he": 3, "header": [1, 4], "health": 3, "healthcar": 3, "heatmap": [1, 5], "height": 5, "help": [1, 4, 5, 6], "here": [4, 5], "hex": [1, 4], "hi": 0, "hidden": 5, "hide": [1, 5], "hide_index": 1, "high": [1, 4, 5], "higher": [5, 6], "highest": 4, "highli": 5, "highlight": [1, 5, 7], "highlight_column": [4, 7], "highlighted_df": 4, "hist": [1, 5], "hist_color": 5, "hist_edgecolor": [1, 5], "histogram": [1, 7], "hold": [3, 4, 5], "horizont": [1, 5], "hour": [4, 5], "hous": 7, "houseag": 5, "household": 5, "hover": 5, "how": [4, 5, 6], "howev": [1, 5], "html": [4, 5], "html_file_nam": [1, 5], "html_file_path": [1, 5], "http": [2, 4, 5, 6, 8], "huber": 5, "hue": [1, 5], "hue_dict": 5, "hue_palett": 5, "hunter": [5, 8], "husband": 4, "hyperlink": 4, "hypothes": 6, "i": [1, 3, 4, 5, 7], "icon": 1, "id": [1, 4, 6], "id_colnam": 4, "idea": 4, "identifi": [1, 5, 6, 7], "ignor": 5, "illustr": 5, "imag": [4, 5], "image_filenam": 5, "image_path_png": [1, 4, 5], "image_path_svg": [1, 4, 5], "imbal": 4, "immedi": 5, "impact": [1, 5], "implement": 1, "import": [1, 4, 5], "imposs": 4, "improv": 1, "inc": 4, "inch": 5, "includ": [1, 4, 5, 6], "inclus": 4, "incom": [5, 6, 7, 8], "inconsist": [1, 4], "incorpor": 1, "incorrect": [1, 5], "increas": 5, "increment": 1, "independ": 1, "index": [1, 4, 5], "indic": [1, 4, 5], "individu": [1, 4, 5], "individual_figs": 5, "industri": 3, "inf": 4, "infin": 4, "influenc": [1, 5], "influenti": 5, "inform": [5, 6], "initi": [1, 6], "inner": 5, "input": [1, 5], "insight": [4, 5, 6], "instal": 7, "instanc": [4, 5], "instead": [1, 5], "instruct": 6, "int": [1, 4, 5], "int64": 4, "integ": 1, "integr": [5, 6], "intellig": 3, "intend": 1, "interact": [1, 7], "interest": 5, "interfac": [1, 5], "intern": [1, 5], "interpret": [1, 5], "interv": 4, "introduc": 1, "introduct": 1, "intuit": [1, 5, 6], "invalid": 1, "invalu": 5, "investig": 6, "involv": [4, 5, 6], "io": 4, "island": 4, "iso": 4, "issu": [1, 6], "item": 5, "iter": [1, 5], "its": [1, 4], "itself": 5, "j": [5, 8], "jinja2": 6, "join": 4, "joint": 5, "jointli": 5, "joss": [5, 8], "journal": [5, 8], "journei": 0, "jupyt": 4, "just": 5, "k": [5, 8], "kde": [1, 6, 7], "kde_color": 5, "kde_density_single_distribut": 5, "kde_distribut": [1, 5, 7], "keep": 5, "kei": [1, 4, 5, 7], "kernel": 7, "keyboard": 5, "keyerror": 5, "keyword": [1, 5], "kind": 5, "kohavi": [4, 5, 6, 8], "kwarg": [1, 5], "l": 2, "label": [1, 4, 5], "label_ag": 4, "label_fonts": [1, 5], "label_nam": 5, "larg": 5, "largest": 5, "last": 4, "latest": 1, "layout": [1, 5], "ldot": 5, "lead": 5, "learn": [0, 1, 3, 4, 5, 6, 8], "learning_r": 5, "least": [1, 4], "lectur": 3, "left": [4, 5], "left_margin": [1, 5], "legend": [1, 5], "legend_label": 5, "legend_labels_list": 5, "legibl": 5, "len": 1, "length": [4, 5], "leonid": [2, 3], "leq": 4, "less": [1, 4], "let": 5, "letter": [5, 8], "level": [4, 5], "leverag": [5, 6], "librari": [1, 4, 5, 7], "licens": 1, "like": [0, 4, 5], "limit": [1, 4, 5], "line": [1, 6, 7], "linear": 5, "linestyl": 5, "link": 7, "list": [1, 4, 5], "load": [4, 5], "local": 4, "locat": [4, 5], "log": [1, 5], "log_scale_var": [1, 5], "logarithm": 5, "logic": 1, "logo": 1, "logscal": 5, "long": 5, "longer": 5, "loop": 5, "loss": [4, 5], "lower": [1, 5], "lt": [4, 5], "m": [0, 3, 5, 8], "machin": [1, 3, 4, 5, 6, 8], "made": 1, "magnitud": 5, "mai": [1, 5], "main": 6, "maintain": [1, 5, 7], "major": 4, "make": [1, 4, 5], "male": [4, 5], "male_": 5, "manag": [1, 3, 5, 6], "manageri": 4, "mani": [5, 6], "manipul": 6, "manner": 5, "manual": [1, 5], "map": [1, 5], "marco": 0, "margin": [1, 5], "marit": 4, "mark": [1, 5], "marker": 5, "marri": 4, "master": 3, "match": [1, 5], "mathbb": 5, "mathbf": 5, "mathemat": [4, 5], "matplotlib": [1, 5, 6, 8], "matplotlib_colormap": 5, "matric": [1, 7], "matrix": [1, 7], "max": 5, "max_col": 5, "max_depth": 5, "max_unique_valu": 4, "max_unique_value_pct": 4, "max_unique_value_tot": 4, "maximum": 5, "mcse": [5, 8], "mean": [1, 4, 6, 7], "mean_color": 5, "meaning": [4, 5], "measur": [4, 5], "mechan": 1, "median": [1, 6, 7], "median_color": 5, "medinc": 5, "meet": 6, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 5, 6], "metric": 5, "metrics_box_violin": 1, "metrics_boxplot_comp": 5, "metrics_comp": 5, "metrics_list": 5, "mid": 5, "might": 5, "min": 5, "min_length": 4, "mind": 6, "minim": [1, 5], "minimum": [4, 5], "minor": 1, "misalign": 5, "misinterpret": 5, "mislead": 1, "miss": [1, 4, 5, 6], "mm": 4, "mode": [1, 5], "model": [1, 5, 6], "model_select": 5, "modifi": [1, 5], "month": [2, 4], "more": [1, 4, 5], "most": [1, 4, 5, 6], "mous": 5, "move": [1, 5], "mu": 5, "mu_i": 5, "mu_x": 5, "much": 5, "multidimension": 5, "multipl": [1, 4, 5, 6], "multipli": 1, "must": [4, 5], "my_datafram": 1, "n": 5, "n_col": 5, "n_estim": 5, "n_row": 5, "na": [1, 4], "name": [1, 5, 7], "nativ": 4, "navig": [4, 5], "nbformat": 6, "ndarrai": 5, "necessari": [1, 4], "need": [1, 4, 5, 6], "neg": 5, "neither": [1, 5], "nest": 5, "neutral": 5, "never": 4, "new": [1, 4, 5], "newer": 5, "next": [4, 5], "nh": 5, "nomenclatur": 1, "non": [1, 4, 7], "none": [1, 4, 5], "nonetyp": 1, "nor": [1, 5], "normal": [1, 7], "notat": [1, 5], "note": [4, 5], "notebook": 4, "noth": 4, "notic": 5, "now": 1, "np": 5, "null": [1, 4], "null_pct": 4, "null_tot": 4, "num": [4, 5], "num_digit": 4, "number": [1, 4, 5], "numer": [1, 5, 7], "numpi": [5, 6], "nuniqu": 4, "o": [2, 4, 5], "object": [1, 4, 5], "observ": 5, "obviou": 5, "occup": [4, 5], "occur": [1, 4], "occurr": 4, "offer": [1, 5, 6], "often": [5, 6], "older": [1, 5], "omit": 1, "one": [1, 4, 5], "onli": [1, 5], "opaqu": 5, "open": [5, 8], "oper": [4, 5], "opportun": 4, "optim": 5, "option": [1, 4, 5, 6], "orang": 5, "order": [1, 4, 5], "org": [2, 4, 5, 6, 8], "organ": [1, 5], "orient": 5, "origin": [4, 5], "original_df": 4, "oscar": [2, 3], "other": [1, 4, 5], "otherwis": 5, "our": 0, "out": 5, "outcom": 5, "outlier": 6, "output": [1, 4, 5], "outsid": 5, "over": [1, 3, 5], "overal": [1, 5], "overlai": 5, "overlaid": 5, "overlap": 5, "overrid": 5, "overview": 7, "own": 5, "p": 5, "pac": 4, "pace": [5, 8], "packag": 6, "pad": [1, 5], "page": [5, 6], "pair": [4, 5], "pairwis": 5, "palett": 5, "panda": [1, 4, 5, 6], "param": 1, "paramet": [1, 4, 5], "parametr": 5, "pardir": 4, "parent": 4, "pars": 4, "parse_date_with_rul": [4, 7], "part": 4, "partial": [1, 7], "partial_depend": 5, "particular": 5, "particularli": [1, 4, 5], "pass": [1, 5], "path": [1, 5, 7], "patient": 4, "pattern": [5, 6], "pd": [4, 5], "pdf": 5, "pdp": 5, "pearson": 7, "per": [4, 5], "percent": [1, 5], "percentag": 4, "perfect": 5, "perfectli": 5, "perform": [1, 4, 5], "performancewarn": 1, "period": 7, "person": 3, "perspect": [1, 5], "pi": 5, "pink": 4, "pip": 6, "pitfal": 1, "pivot": [0, 7], "place": [1, 4], "plai": 0, "plain": 4, "plot": [1, 6], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_mean": 5, "plot_median": 5, "plot_typ": [1, 5], "plotli": [1, 5, 6], "plotly_colormap": 5, "plots_onli": 5, "plt": 1, "pm": 5, "png": [1, 4, 5], "png_imag": 4, "point": [1, 5], "pointer": 5, "popul": 5, "popular": 6, "posit": [1, 5], "possibl": [4, 5, 6], "potenti": [1, 4, 5], "power": [1, 5], "pr": 1, "pre": 1, "preced": 5, "predict": [1, 5], "prefer": [1, 5], "prefix": [1, 5], "prepar": [1, 4, 5], "prerequisit": 7, "present": [1, 4, 5], "preval": 5, "prevent": [1, 4, 5], "previou": [1, 5], "previous": 1, "price": 5, "print": [1, 4, 5], "prior": 5, "privat": 4, "probabl": [1, 5, 8], "process": [1, 4, 6], "produc": [1, 5], "product": 5, "prof": 4, "profession": 3, "program": [0, 3], "project": [1, 3, 4, 7], "promin": 5, "proper": [1, 5], "properli": [1, 5], "proport": [1, 4, 5], "provid": [0, 1, 4, 5, 6], "public": 5, "publish": 2, "purpl": 5, "purpos": [1, 7], "pursu": 0, "py": 1, "pypi": [1, 6], "python": [1, 3, 5, 7], "qualiti": [5, 6], "quantifi": 5, "quantit": 5, "quick": 5, "quickli": [5, 6], "r": [3, 4, 5, 6, 8], "r_": 5, "race": 4, "racial": 4, "rais": [1, 4, 5], "random": 4, "random_st": 5, "rang": [4, 5, 6], "raw": 5, "re": [1, 5], "read": 4, "readabl": [1, 5], "readi": 6, "readm": 1, "record": 4, "red": 5, "reduc": [1, 5], "redund": 5, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 5], "regress": 7, "regular": [1, 7], "relat": [1, 4, 5], "relationship": [4, 5, 6], "releas": 1, "relev": [1, 6], "reli": 5, "reliabl": 4, "remain": [1, 5], "remov": [1, 5, 6, 7], "remove_stack": [1, 5], "renam": [1, 5], "render": 4, "replac": 4, "replica": 1, "report": [3, 5, 6], "repositori": [4, 5, 6, 8], "repres": [1, 4, 5], "represent": [1, 5], "reproduc": 4, "requir": [1, 5, 6], "research": 6, "reset": 1, "resolut": 5, "resolv": 1, "respect": [1, 4, 5], "respons": 5, "rest": 5, "result": [1, 4, 5], "return": [1, 4, 5], "return_df": [1, 4], "return_dict": 5, "reveal": 5, "rich": [5, 6], "right": [4, 5], "right_margin": [1, 5], "riversid": 3, "robust": 1, "role": [0, 1], "rot": 5, "rotat": [1, 5], "rotate_plot": 5, "round": 4, "row": [4, 5], "rule": 4, "run": 6, "s0167": [5, 8], "same": [1, 5], "sampl": [4, 5], "san": [0, 3], "save": [1, 5, 6, 7], "save_dataframes_to_excel": [1, 4, 7], "save_format": [1, 5], "save_plot": [1, 5], "scale": [1, 5], "scatter": [1, 6, 7], "scatter_color": 5, "scatter_fit_plot": [1, 5, 7], "scatterplot": 5, "scenario": [1, 5], "schema": 5, "scheme": 5, "school": 0, "scienc": [0, 3, 4, 5, 6, 8], "scientif": [1, 5], "scientist": [0, 3, 6], "scikit": [1, 5, 6], "scroll": 5, "seaborn": [1, 5, 6, 8], "seamlessli": 6, "second": [4, 5], "section": [1, 4], "see": 5, "seed": 4, "select": [1, 5], "select_dtyp": 5, "self": 4, "separ": [1, 4, 5], "sequenc": 5, "seri": 4, "serv": [1, 3], "servic": 3, "set": [1, 4, 5], "set_as_index": 4, "set_titl": 1, "setminu": 5, "setp": 1, "setup": [1, 4, 5], "sever": [1, 5], "sex": [4, 5], "shape": [4, 5], "sheet": 4, "shilei": 0, "should": 5, "show": [1, 4, 5], "show_cbar": 5, "show_correl": 5, "show_legend": [1, 5], "show_modebar": [1, 5], "show_plot": 5, "showcas": 5, "shown": 5, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 5, "sigma_i": 5, "sigma_x": 5, "signatur": 1, "signific": [1, 4], "silver": 5, "similarli": 5, "simpl": 5, "simpler": 1, "simplic": 6, "simplif": 1, "simplifi": [1, 4], "simultan": 5, "sinc": 5, "singl": [1, 4, 5], "single_figs": 5, "single_var_image_filenam": 5, "size": [1, 4, 5], "sklearn": 5, "slightli": 1, "small": 1, "smallest": 5, "smooth": 5, "smoother": [1, 5], "sn": 5, "snippet": [4, 5], "so": [1, 4, 5], "softwar": [2, 5, 8], "some": [1, 4], "sort": [1, 4], "sort_bi": [1, 4], "sortbi": 1, "sourc": [5, 6, 8], "space": [1, 5], "span": 5, "spars": [5, 8], "spatial": [5, 8], "special": 4, "specialti": 4, "specif": [1, 5, 6, 7], "specifi": [1, 4, 5, 6], "split": 5, "spot": 4, "spous": 4, "spread": 5, "sql": 3, "sqrt": 5, "squar": [1, 5], "stabil": 1, "stabl": 1, "stack": [1, 6, 7], "stacked_crosstab": 5, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 5, 6, 7], "standardized_d": 4, "start": [1, 4, 6], "stat": [1, 5], "state": 4, "static": [1, 7], "statist": [1, 3, 4, 5, 6, 8], "statu": [1, 4], "std": 7, "std_color": 5, "std_dev_level": 5, "stem": 5, "step": [1, 4, 6], "still": [1, 5], "store": [1, 5], "str": [1, 4, 5], "straightforward": 1, "streamlin": [1, 4, 6], "strength": 5, "string": [1, 4, 5], "strip": 4, "strip_trailing_period": [4, 7], "stronger": 5, "structur": [1, 6], "style": [1, 4, 5], "styler": [1, 4], "subplot": 5, "subset": 5, "substitut": 5, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suggest": 4, "suit": 6, "suitabl": 1, "sum_": 5, "summar": [5, 6], "summari": [1, 6, 7], "summarize_all_combin": [4, 7], "summary_t": 4, "support": [0, 1, 5], "suppos": 5, "suppress": 5, "sure": 4, "surfac": [1, 5], "svg": [1, 4, 5], "svg_imag": 4, "sy": 1, "system": [4, 6], "t": 5, "tab": 4, "tabl": [1, 5, 6], "tailor": 5, "take": [4, 5], "tall": 5, "target": 5, "tarshizi": 0, "task": [4, 6], "tatist": 5, "teach": 3, "techniqu": [6, 7], "ten": 3, "tend": 5, "tendenc": 5, "test": [1, 5], "test_siz": 5, "text": [1, 4, 5], "text_wrap": [1, 5], "th": 5, "than": [1, 4], "thank": 0, "thei": [1, 4, 5], "them": [1, 4, 5, 6], "theoret": 7, "therefor": 5, "thi": [1, 4, 5, 6], "thick": 5, "those": 1, "three": 5, "through": [1, 5], "throw": 1, "thu": 4, "tick": [1, 5], "tick_fonts": [1, 5], "tight": 5, "time": [0, 1, 4, 5], "titl": [1, 2, 5], "title_i": [1, 5], "title_x": [1, 5], "to_list": 5, "togeth": 5, "toggl": [1, 5], "tool": [1, 5, 6], "toolkit": 1, "top": 5, "top_margin": [1, 5], "topic": 4, "total": [4, 5], "toward": 1, "trail": 7, "train": 5, "train_test_split": 5, "transpar": [1, 5], "trend": [5, 6], "triangl": 5, "triangular": [1, 7], "true": [1, 4, 5], "truth": 5, "try": 1, "tupl": [1, 4, 5], "two": [1, 4, 5], "type": [1, 4, 5, 6], "typeerror": 1, "u": [0, 4, 5], "uci": [4, 5, 6, 8], "ucla": 3, "unambigu": 4, "uncov": [5, 6], "underli": [5, 6], "understand": [4, 5, 6], "uniform": 1, "uniqu": [1, 5, 6, 7], "unique_values_tot": 4, "unique_var": 4, "unit": 4, "univers": [0, 3], "unnecessari": 1, "unrecogn": 4, "unstack": 5, "unus": 1, "unwav": 0, "up": [1, 4, 5], "updat": [1, 4, 5], "upper": [1, 4, 5], "upright": 5, "url": 2, "us": [1, 4, 5, 6], "usabl": 1, "usag": [1, 4, 5], "user": [1, 5, 6], "userwarn": 5, "util": [4, 5, 6], "v": 5, "valid": [1, 5], "valid_plot_typ": 1, "valu": [1, 4, 5, 6], "value_count": 4, "valueerror": [1, 4, 5], "vari": [4, 5], "variabl": [1, 5, 6, 7], "varianc": 5, "varieti": [3, 5, 6], "variou": [1, 5, 6], "vars_of_interest": 5, "vdot": 4, "vector": 5, "verbiag": 1, "verifi": [1, 4], "versa": 5, "versatil": 5, "version": [2, 5, 6, 7], "version_info": 1, "versu": 1, "vertic": [1, 5], "via": [1, 5], "vice": 5, "view": [1, 5], "view_angl": 5, "violin": [1, 6, 7], "violinplot": 5, "viridi": 5, "visibl": [1, 5], "visual": [1, 4, 5, 6, 8], "vmax": 5, "vmin": 5, "vriabl": 5, "w_pad": 5, "wa": [1, 5], "wai": 5, "want": [1, 5], "wareh": 3, "warn": [1, 4, 5], "waskom": [5, 8], "we": [0, 4, 5, 6], "week": [4, 5], "welcom": 7, "well": [4, 5], "were": 4, "what": [1, 7], "wheel": 5, "when": [1, 4, 5, 6], "where": [1, 4, 5], "whether": [1, 4, 5], "which": [1, 4, 5, 6], "while": [1, 5], "white": 4, "whitespac": 5, "who": 1, "wide": [3, 5], "width": [1, 5], "wife": 4, "wirefram": [1, 5], "wireframe_color": 5, "wish": 5, "within": [1, 3, 4, 5], "without": [1, 4, 5], "work": [1, 4, 5], "workclass": 4, "workflow": [4, 6], "would": [0, 1, 5], "wrangl": 3, "wrap": [1, 5], "write": 4, "x": [1, 4, 5, 8], "x_": 5, "x_1": 5, "x_2": 5, "x_c": 5, "x_i": 5, "x_j": 5, "x_k": 5, "x_label": [1, 5], "x_label_plotli": 1, "x_n": 5, "x_p": 5, "x_test": 5, "x_train": 5, "x_var": 5, "xlabel": 5, "xlabel_align": 5, "xlabel_rot": 5, "xlim": [1, 5], "xlsx": 4, "xlsxwriter": 6, "xx": 1, "xy": 5, "y": [1, 5], "y_axis_label": 5, "y_i": 5, "y_label": [1, 5], "y_label_plotli": 1, "y_test": 5, "y_train": 5, "y_var": 5, "year": [2, 3, 4], "yellow": 4, "ylabel": 5, "ylabel_align": 5, "ylabel_rot": 5, "ylim": [1, 5], "you": [4, 5, 6], "your": [4, 5, 6], "yy": 1, "yyyi": 4, "z": 5, "z_label": [1, 5], "z_label_plotli": 1, "zenodo": [1, 2], "zero": [1, 4], "zoom": [1, 5], "zoom_out_factor": [1, 5], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Data Management Overview", "Plotting and Theoretical Overview", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References"], "titleterms": {"0": 1, "10": 1, "11": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 5, "3": 1, "3d": 5, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "9": 1, "With": 5, "about": 7, "acknowledg": 0, "ad": 4, "all": 5, "analysi": 4, "assumpt": 5, "bar": 5, "best": 5, "bin": 4, "box": 5, "ca": 5, "calcul": 4, "categori": 5, "censu": 4, "centric": 5, "changelog": 1, "cite": 2, "coeffici": 5, "column": 4, "combin": [4, 5], "content": 7, "conting": 4, "contributor": 3, "correl": 5, "count": 5, "creat": 4, "crosstab": 5, "custom": 4, "data": [4, 7], "datafram": 4, "date": 4, "densiti": 5, "depend": 5, "descript": 6, "detail": 4, "deviat": 5, "directori": 4, "distribut": 5, "document": 6, "eda": [2, 6, 7], "estim": 5, "exampl": [4, 5], "excel": 4, "featur": 6, "fit": 5, "format": 4, "foundat": 5, "full": 5, "function": 5, "gaussian": 5, "gener": 4, "get": 7, "grid": 5, "group": 5, "heurist": 7, "highlight": 4, "histogram": 5, "hous": 5, "i": 6, "identifi": 4, "incom": 4, "instal": 6, "interact": 5, "kde": 5, "kei": 6, "kernel": 5, "librari": 6, "line": 5, "link": 6, "maintain": 3, "manag": [4, 7], "matric": 5, "matrix": 5, "mean": 5, "median": 5, "name": 4, "non": 5, "normal": 5, "numer": 4, "overview": [4, 5], "partial": 5, "path": 4, "pearson": 5, "period": 4, "pivot": 5, "plot": [5, 7], "prerequisit": 6, "project": 6, "purpos": 6, "python": 6, "refer": 8, "regress": 5, "regular": 5, "remov": 4, "save": 4, "scatter": 5, "specif": 4, "stack": 5, "standard": 4, "start": 7, "static": 5, "std": 5, "summari": 4, "tabl": [4, 7], "techniqu": 4, "theoret": 5, "toolkit": [2, 6, 7], "trail": 4, "triangular": 5, "uniqu": 4, "variabl": 4, "version": 1, "violin": 5, "welcom": 6, "what": 6}}) \ No newline at end of file +Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[5, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[5, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[5, "id14"]], "3D Plots - CA Housing Example": [[5, "id15"]], "About EDA Toolkit": [[7, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[4, "adding-unique-identifiers"]], "Binning Numerical Columns": [[4, "binning-numerical-columns"]], "Box Plots Grid Example": [[5, "box-plots-grid-example"]], "Box and Violin Plots": [[5, "box-and-violin-plots"]], "Calculation Details": [[4, "calculation-details"]], "Census Income Example": [[4, "census-income-example"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[5, "correlation-matrices"]], "Creating Contingency Tables": [[4, "creating-contingency-tables"]], "Data Management": [[7, null]], "Data Management Overview": [[4, null]], "Data Management Techniques": [[4, "data-management-techniques"]], "DataFrame Analysis": [[4, "dataframe-analysis"]], "DataFrame Column Names": [[4, "dataframe-column-names"]], "Description": [[6, "description"]], "Full Correlation Matrix Example": [[5, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[5, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[4, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[7, null]], "Highlighting Specific Columns in a DataFrame": [[4, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[5, "histogram-example-count"]], "Histogram Example (Density)": [[5, "histogram-example-density"]], "Histogram Example - (Mean and Median)": [[5, "histogram-example-mean-and-median"]], "Histogram Example - (Mean, Median, and Std. Deviation)": [[5, "histogram-example-mean-median-and-std-deviation"]], "Histograms and Kernel Density Estimation (KDE)": [[5, "histograms-and-kernel-density-estimation-kde"]], "Installation": [[6, "installation"]], "Interactive Plot": [[5, "interactive-plot"]], "KDE Distribution Function": [[5, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[5, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[5, "kde-and-histograms-example"]], "Key Features": [[6, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[5, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Foundations": [[5, "partial-dependence-foundations"]], "Partial Dependence Plots": [[5, "partial-dependence-plots"]], "Path directories": [[4, "path-directories"]], "Pearson Correlation Coefficient": [[5, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[5, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[5, "pivoted-violin-plots-grid-example"]], "Plotting Heuristics": [[7, null]], "Plotting and Theoretical Overview": [[5, null]], "Prerequisites": [[6, "prerequisites"]], "Project Links": [[6, "project-links"]], "Purpose of EDA Toolkit": [[6, "purpose-of-eda-toolkit"]], "References": [[8, null]], "Regression-Centric Scatter Plots Example": [[5, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[5, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[4, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[5, "scatter-fit-plot"]], "Scatter Plots (All Combinations Example)": [[5, "scatter-plots-all-combinations-example"]], "Scatter Plots Grouped by Category Example": [[5, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[5, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[5, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[5, "stacked-crosstab-plots"]], "Standardized Dates": [[4, "standardized-dates"]], "Static Plot": [[5, "static-plot"]], "Table of Contents": [[7, null]], "Trailing Period Removal": [[4, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[5, "triangular-correlation-matrix-example"]], "Version 0.0.10": [[1, "version-0-0-10"]], "Version 0.0.11": [[1, "version-0-0-11"]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id9"], [1, "id10"], [1, "id11"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Version 0.0.9": [[1, "version-0-0-9"]], "Violin Plots Grid Example": [[5, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[6, null]], "What is EDA?": [[6, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "data_management", "eda_plots", "getting_started", "index", "references"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "data_management.rst", "eda_plots.rst", "getting_started.rst", "index.rst", "references.rst"], "indexentries": {"add_ids()": [[4, "add_ids", false]], "box_violin_plot()": [[5, "box_violin_plot", false]], "built-in function": [[4, "add_ids", false], [4, "contingency_table", false], [4, "dataframe_columns", false], [4, "ensure_directory", false], [4, "highlight_columns", false], [4, "parse_date_with_rule", false], [4, "save_dataframes_to_excel", false], [4, "strip_trailing_period", false], [4, "summarize_all_combinations", false], [5, "box_violin_plot", false], [5, "flex_corr_matrix", false], [5, "kde_distributions", false], [5, "plot_2d_pdp", false], [5, "plot_3d_pdp", false], [5, "scatter_fit_plot", false], [5, "stacked_crosstab_plot", false]], "contingency_table()": [[4, "contingency_table", false]], "dataframe_columns()": [[4, "dataframe_columns", false]], "ensure_directory()": [[4, "ensure_directory", false]], "flex_corr_matrix()": [[5, "flex_corr_matrix", false]], "highlight_columns()": [[4, "highlight_columns", false]], "kde_distributions()": [[5, "kde_distributions", false]], "parse_date_with_rule()": [[4, "parse_date_with_rule", false]], "plot_2d_pdp()": [[5, "plot_2d_pdp", false]], "plot_3d_pdp()": [[5, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[4, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[5, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[5, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[4, "strip_trailing_period", false]], "summarize_all_combinations()": [[4, "summarize_all_combinations", false]]}, "objects": {"": [[4, 0, 1, "", "add_ids"], [5, 0, 1, "", "box_violin_plot"], [4, 0, 1, "", "contingency_table"], [4, 0, 1, "", "dataframe_columns"], [4, 0, 1, "", "ensure_directory"], [5, 0, 1, "", "flex_corr_matrix"], [4, 0, 1, "", "highlight_columns"], [5, 0, 1, "", "kde_distributions"], [4, 0, 1, "", "parse_date_with_rule"], [5, 0, 1, "", "plot_2d_pdp"], [5, 0, 1, "", "plot_3d_pdp"], [4, 0, 1, "", "save_dataframes_to_excel"], [5, 0, 1, "", "scatter_fit_plot"], [5, 0, 1, "", "stacked_crosstab_plot"], [4, 0, 1, "", "strip_trailing_period"], [4, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 4, 5], "0": [2, 4, 5, 6, 7], "00": 4, "000000": 5, "0000ff": 5, "00140": [5, 8], "00bfc4": 5, "01": 4, "02": [1, 4], "03021": [5, 8], "04": [4, 5], "05": 5, "07": [4, 5], "09": 5, "1": [1, 4, 5, 6], "10": [2, 4, 5, 6, 7, 8], "100": [4, 5], "1016": [5, 8], "10724": 5, "11": [2, 4, 6, 7], "1109": [5, 8], "111": 4, "115": 5, "11687": 5, "11th": 4, "12": [4, 5, 6], "120": 5, "12202842": 4, "123": 4, "12929": 5, "13": [4, 5], "131": 5, "13162633": 2, "13163208": 2, "13174": 5, "1348": 4, "13920": [4, 5], "14": [4, 5], "147": 5, "14x4": 5, "15": [4, 5], "150": 4, "15784": 4, "15x5": 5, "16": [4, 5], "16192": 5, "17": 5, "18": [4, 5, 6], "1873": 5, "19716": 4, "1994": 6, "1996": [4, 5, 6, 8], "1997": [5, 8], "1b0": 7, "1d": 5, "1rc0": 7, "2": [4, 5, 6, 7], "20": [4, 5], "200": 4, "2007": [5, 8], "2020": 4, "2021": [4, 5, 8], "2022": 4, "2024": 2, "203488": 4, "21": [4, 5, 6], "21105": [5, 8], "2115": 5, "215646": 4, "22": 5, "22379": 4, "2245": 5, "22803": 4, "23": 5, "234721": 4, "24": 4, "24432": [4, 5, 6, 8], "24720": 4, "25": [1, 4, 5], "250": [4, 5], "2509": 5, "2565": 4, "26": 5, "27": 5, "274": 4, "28": [4, 5], "280": 5, "28523": 4, "29": [4, 5], "291": [5, 8], "295": 5, "297": [5, 8], "2d": [1, 7, 8], "3": [4, 5, 6, 7, 8], "30": [4, 5], "300": [4, 5], "3021": [5, 8], "3054": 5, "31": 4, "3188": 5, "32": 4, "32650": [4, 5], "33": [4, 5, 8], "333333": 5, "338409": 4, "33906": 4, "34": 5, "3461": 5, "35130194": 4, "36": [4, 5], "3680": 4, "37": [4, 5], "37155": 5, "38": [4, 5], "3853": 5, "39": [4, 5], "3986": 5, "3d": [1, 7], "3d_pdp": 5, "4": [4, 5, 6, 7], "40": [4, 5], "41": 5, "4110": 5, "41762": 4, "42": [4, 5], "42643227": 4, "4267": 4, "43": 4, "43832": 4, "44807": 4, "45": [4, 5], "46": 4, "46560": 4, "467": 4, "468": 4, "469": 4, "47": 5, "470": 4, "471": 4, "472": 4, "4746": 5, "48842": [4, 5], "49": [4, 5], "5": [4, 5, 6, 7], "50": [4, 5], "50k": [4, 5], "50k_": 5, "51": [4, 5], "5281": 2, "53": [4, 5], "535": 5, "55": [5, 8], "56": 4, "5623": 4, "5707": 5, "58": 5, "5856": 4, "59": [4, 5], "595": 5, "6": [4, 5, 6, 7, 8], "60": [4, 5, 8], "61": 4, "6172": 4, "62": 5, "64": [4, 5], "65": 5, "66": [4, 5], "6619": 5, "668": 5, "6738": 5, "68": 5, "69": [4, 5], "7": [4, 5, 6, 7], "70": [4, 5], "71": 5, "7152": [5, 8], "720": 4, "73": 5, "74": 4, "74130842": 4, "746": 5, "75": [4, 5], "7536": 5, "76": [4, 5], "77": 5, "77516": 4, "79": [4, 5], "8": [4, 5, 7], "80": [4, 5], "808080": 5, "809": 5, "81": 5, "815": 5, "82": 4, "8213": 5, "82943611": 4, "83": 5, "832": 4, "83311": 4, "85": [4, 5], "8601": 4, "861555": 4, "87": 5, "87104229": 4, "89": [4, 5], "8a": 7, "8b": 7, "8c": 7, "8d": 1, "9": [4, 5, 7, 8], "90": [4, 5, 8], "90069867": 4, "9076": 5, "91": [4, 5], "93": 5, "93837254": 4, "939": 5, "94": 5, "9468": 5, "95": [4, 5, 8], "96": [4, 5, 8], "96078789": 4, "963": 4, "966": 4, "97": 4, "97751875": 4, "98": 4, "99": [4, 5], "A": [1, 4, 5, 6, 8], "As": 5, "By": [1, 5], "For": [4, 5, 6], "If": [1, 4, 5], "In": [4, 5], "Into": 5, "It": [1, 4, 5, 6], "No": [1, 5], "Not": 4, "One": 1, "The": [1, 4, 5, 6], "Then": 4, "There": 5, "These": [1, 4, 5], "To": 5, "With": [3, 7], "_": 5, "_c": 5, "_plotli": 1, "abil": [1, 5], "abl": 5, "about": 4, "abov": [1, 5], "academ": 0, "accept": 1, "access": 5, "accord": [1, 5], "accordingli": 4, "account": 1, "accur": [1, 5], "accuraci": 4, "acknowledg": [1, 7], "across": [1, 4, 5], "actual": 5, "ad": [1, 5, 7], "adapt": [1, 4, 5], "add": [1, 4, 5], "add_best_fit_lin": 5, "add_id": [1, 4, 7], "addit": [1, 5], "addition": [4, 5, 6], "address": [1, 6], "adher": 5, "adjust": [1, 4, 5], "adm": 4, "advanc": 4, "aesthet": [1, 5], "affect": 5, "after": [1, 4, 5], "ag": [4, 5], "against": 5, "age_boxplot_list": 5, "age_group": [4, 5], "ages_18_to_40": 4, "aggreg": 5, "alic": 4, "align": [1, 4, 5], "all": [1, 4, 6, 7], "all_combin": 4, "all_var": 5, "allow": [1, 4, 5], "alon": 5, "along": [1, 4, 5], "alpha": [1, 5], "alreadi": 4, "also": [0, 1, 5], "altern": 5, "alwai": [1, 4], "amount": 4, "an": [0, 1, 3, 4, 5], "analysi": [1, 5, 6, 7], "analyst": 6, "analyt": 3, "analyz": [1, 4, 5], "angl": [1, 5], "ani": [1, 4, 5, 6], "annot": [1, 5], "anomali": 6, "anoth": 5, "anyth": 1, "appar": 5, "appear": [1, 4, 5], "append": [4, 5], "appli": [0, 1, 3, 4, 5, 6], "applic": [1, 5], "approach": 5, "appropri": [1, 5], "approxim": 5, "ar": [1, 4, 5], "area": 5, "arg": 1, "argument": [1, 5], "around": [1, 5], "arrai": 5, "arrang": 5, "arrow": 5, "artifact": 4, "artifici": 3, "asian": 4, "aspect": [1, 5, 6], "assess": 5, "assign": [1, 4, 5], "associ": [5, 6], "assum": 4, "assumpt": 7, "astyp": 1, "attempt": [4, 5], "attent": 5, "attract": 5, "attribut": 5, "aug": 2, "author": [2, 3], "auto": 5, "autofit": 4, "autom": [3, 6], "automat": [1, 5, 6], "autoregress": [5, 8], "avail": 5, "aveoccup": 5, "averag": 5, "averoom": 5, "avoid": [1, 5], "ax": [1, 5], "axi": [1, 5], "azimuth": 5, "bachelor": 4, "back": [4, 5], "backbon": 4, "background": 4, "background_color": [1, 4], "backward": 1, "badg": 1, "band": 5, "bandwidth": 5, "bar": [1, 6, 7], "barh": 5, "barri": [5, 8], "base": [1, 4, 5], "base_path": 4, "bbox_inch": 5, "becaus": [4, 5], "been": [1, 4, 5], "befor": [1, 4, 5, 6], "begin": [4, 5], "behavior": [1, 5], "being": [4, 5], "bell": 5, "belong": 4, "below": [4, 5], "beneath": 5, "benefici": 5, "best": [1, 6, 7], "best_fit_linecolor": 5, "best_fit_linestyl": 5, "beta": 1, "better": [1, 5, 6], "between": [1, 4, 5], "bin": [1, 5, 7], "bin_ag": 4, "binrang": 5, "binwidth": [1, 5], "black": [4, 5], "block": [1, 5], "blue": 5, "bob": 4, "bold": 4, "bool": [4, 5], "boolean": [1, 5], "border": 4, "both": [1, 4, 5], "bound": [4, 5], "boundari": 4, "box": [1, 6, 7], "box_violin_plot": [1, 5, 7], "boxplot": 5, "breakdown": 5, "brief": 1, "bring": 3, "broad": [1, 6], "brown": 5, "browser": 5, "bug": 1, "built": 5, "c0": 5, "c5gp7": [4, 5, 6, 8], "c_i": 5, "ca": 7, "calcul": [5, 7], "california": [3, 5], "call": [1, 4, 5], "camera": [1, 5], "can": [1, 4, 5, 6], "cancer": 5, "cannot": 4, "capabl": [1, 4], "capit": 4, "captur": 5, "career": 0, "case": [1, 4, 5], "categor": [1, 4, 5], "categori": [4, 7], "cbar_label": 5, "cbar_thick": [1, 5], "cbar_x": [1, 5], "cdot": 5, "cell": 4, "censu": [5, 6, 7, 8], "census_id": 4, "census_summary_t": 4, "center_baselin": 5, "central": 5, "centric": 7, "certain": 5, "certifi": 1, "cervic": 5, "chang": [1, 5], "changelog": 7, "charact": [4, 5], "characterist": 6, "charli": 4, "check": [1, 4, 5], "choos": [1, 4, 5], "circl": 5, "citat": 1, "cite": 7, "civ": 4, "clariti": [1, 5], "clean": [1, 4, 5, 6], "cleaner": [1, 4], "cleanup": 1, "clear": [1, 5], "clearer": 1, "clearli": 1, "cleric": 4, "closer": 5, "clutter": 5, "cmap": [1, 5], "code": [1, 4, 5], "codebas": 1, "coeffici": 7, "cohes": 5, "col": [1, 4, 5], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 4, 5], "colorbar": 5, "colormap": [1, 5], "column": [1, 5, 7], "column_nam": 4, "combin": [1, 6, 7], "come": 1, "comment": 1, "common": [1, 4, 6], "compar": 5, "comparison": 5, "compat": [1, 5], "complement": 5, "complementari": 5, "complet": 5, "complex": [1, 5], "comprehens": [1, 5, 6], "comput": [4, 5, 8], "concept": 5, "condit": 1, "condition": 1, "configur": [1, 5], "confirm": 1, "confus": [1, 5], "consecut": 4, "consid": 5, "consist": [1, 4, 5], "consolid": 1, "constant": [4, 5], "constitut": 4, "constraint": 4, "contain": [1, 4, 5], "content": [1, 4], "context": 5, "conting": [1, 5, 6, 7], "contingency_t": [4, 7], "continu": [1, 4, 5], "contour": 5, "contrast": 5, "contributor": 7, "control": [1, 5], "convers": [1, 4], "convert": [1, 4], "coolwarm": [1, 5], "coordin": 1, "cornel": 3, "correct": [1, 5, 6], "correctli": [1, 4, 5], "correl": [1, 7], "correspond": [1, 4, 5], "count": [1, 4, 7], "countri": 4, "cours": 3, "cov": 5, "covari": 5, "creat": [1, 5, 6, 7], "creation": 5, "crop": 5, "crosstab": [1, 7], "crosstab_age_incom": 5, "crosstab_age_sex": 5, "crosstabs_dict": 5, "crosstabs_onli": 5, "crucial": [4, 5, 6], "current": 4, "curv": 5, "custom": [1, 5, 6, 7], "custom_ord": 5, "customiz": [1, 5, 6], "cut": 4, "d": [5, 8], "dai": 4, "dark": 5, "dashboard": 5, "data": [0, 1, 3, 5, 6, 8], "data_nam": 4, "data_output": 4, "data_path": 4, "data_typ": 1, "datafram": [1, 5, 6, 7], "dataframe_column": [1, 4, 7], "dataset": [4, 5, 6], "date": [1, 6, 7], "date_column": 4, "date_str": 4, "datetim": 1, "david": 4, "dd": 4, "deal": [4, 5], "decad": 3, "decim": [1, 4], "decimal_plac": [1, 4], "decis": [1, 5], "decreas": 5, "dedic": 0, "deeper": 5, "deepest": 0, "default": [1, 4, 5], "defin": [1, 4, 5], "definit": 4, "degre": [1, 5], "demograph": 5, "demonstr": [4, 5, 6], "denot": 5, "densiti": [1, 7], "depend": [1, 4, 6, 7], "deprec": 1, "depth": [1, 5], "descend": [4, 5], "describ": [1, 5], "descript": [1, 7], "design": [4, 5, 6], "detail": [1, 5, 6, 7], "determin": [4, 5], "develop": 3, "deviat": [1, 6, 7], "df": [1, 4, 5], "df_censu": 4, "df_dict": 4, "df_num": 5, "dict": [4, 5], "dictionari": [4, 5], "did": 1, "diego": [0, 3], "differ": [1, 5], "digit": [1, 4], "dimens": 5, "dimensionless": 5, "dir": 4, "direct": 5, "directli": [1, 5, 6], "directori": [5, 6, 7], "disabl": [1, 5], "disable_sci_not": [1, 5], "discov": 6, "discret": [4, 5], "dispers": 5, "displai": [1, 4, 5], "distinct": [1, 4, 5], "distinguish": 5, "distract": 5, "distribut": [1, 4, 6, 7], "dive": 4, "divers": 1, "divid": [4, 5], "divorc": 4, "do": [1, 4, 5], "docstr": 1, "document": [1, 7], "doe": [1, 4, 5], "doi": [2, 4, 5, 6, 8], "domin": 4, "don": 5, "dot": 5, "doubl": 5, "down": 5, "dr": 0, "draw": 5, "driven": 4, "dtype": 4, "due": [1, 4], "duplic": 1, "dure": [0, 1], "dx_": 5, "dx_c": 5, "dynam": 1, "e": [1, 4, 5], "each": [1, 4, 5], "eas": [1, 4, 6], "easi": [5, 6], "easier": [1, 5], "easili": 5, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 5, 6], "edg": [1, 5], "edgecolor": 1, "educ": [0, 3, 4, 5], "effect": [1, 3, 4, 5, 6], "either": [1, 4, 5], "element": [1, 4, 5], "elev": 5, "els": 1, "emp": 4, "emphas": 1, "emploi": 5, "employ": 4, "empti": [1, 4, 5], "enabl": [1, 5, 6], "enable_zoom": [1, 5], "end": [1, 4, 5], "endeavor": 0, "endpoint": 4, "engin": [0, 4, 5, 8], "enhanc": [1, 4, 5, 6], "enough": 1, "ensembl": 5, "ensu": 6, "ensur": [1, 4, 5, 6], "ensure_directori": [4, 7], "enter": [1, 4], "entir": [4, 5], "entri": [1, 4, 5], "environ": [0, 1, 5, 8], "equal": 5, "equat": 5, "equival": 4, "error": [1, 4], "especi": [1, 4, 5], "essenti": [4, 5, 6], "estim": 7, "etc": 6, "ev": 4, "evalu": 5, "even": [1, 4, 5], "everyth": 5, "exact": 1, "examin": 5, "exampl": [1, 6, 7], "exce": 4, "excel": [3, 6, 7], "except": [0, 1, 4], "excess": 5, "exclud": [4, 5], "exclus": 4, "exec": 4, "execut": 5, "exist": [1, 4], "exp": 5, "expand": 1, "expect": [1, 5], "experi": [1, 3], "explain": [1, 4], "explan": 1, "explicitli": 1, "explor": [1, 5, 6], "exploratori": 6, "export": [5, 6], "express": [0, 5], "extend": [0, 5], "extens": [1, 5], "extract": [1, 5], "f": [1, 5], "f8766d": 5, "f8c5c8": 4, "facilit": [3, 4, 6], "factor": 5, "fall": [4, 5], "fallback": 1, "fals": [1, 4, 5], "famili": 4, "fashion": 5, "featur": [1, 4, 5, 7], "feature_nam": 5, "feature_names_list": [1, 5], "feder": 4, "feedback": 1, "femal": [4, 5], "female_": 5, "fetch": 5, "fetch_california_h": 5, "few": 5, "ff0000": 5, "figsiz": [1, 5], "figur": [1, 5], "file": [1, 4, 5], "file_nam": 4, "file_path": 4, "file_prefix": [1, 5], "filenam": [1, 5], "fill": [1, 5], "fill_alpha": [1, 5], "fillna": 1, "filter": [4, 5], "filtered_df": 4, "financi": [3, 5], "find": [1, 4], "first": [1, 4, 5], "fit": [1, 6, 7], "fix": 1, "flag": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 5], "flip": 5, "float": [4, 5], "fnlwgt": 4, "focu": 5, "focus": 5, "folder": 4, "follow": [1, 4, 5, 6], "font": [1, 5], "fontsiz": 1, "form": [4, 6], "format": [1, 5, 6, 7], "formatth": 5, "former": 4, "formerli": 1, "formula": 5, "found": 1, "foundat": 7, "four": 5, "frac": 5, "freedom": 5, "frequenc": [1, 4, 5], "frequent": 4, "friendli": 1, "from": [0, 1, 3, 4, 5, 6], "full": [1, 4, 7], "fulli": 5, "func_col": [1, 5], "function": [1, 4, 6, 7], "further": [1, 4, 5], "futur": [1, 5], "futurewarn": 5, "g": [1, 4, 5], "gain": [4, 6], "gaussian": 7, "gener": [1, 5, 6, 7], "geq": 4, "get": 6, "get_legend": 1, "get_text": 1, "gil": [2, 3], "github": 6, "give": 1, "given": [1, 4, 5], "glanc": 5, "go": 4, "got": 1, "gov": 4, "grad": 4, "gradientboostingregressor": 5, "graduat": 0, "granular": 1, "graphic": [5, 8], "gratitud": 0, "greater": [1, 4], "green": 5, "grei": 5, "grid": [1, 7], "grid_figs": 5, "grid_resolut": 5, "grid_valu": 5, "ground": 5, "group": [1, 4, 7], "gt": 5, "guid": [0, 6], "guidanc": 1, "guidelin": 5, "h": [4, 5], "h_pad": 5, "ha": [1, 3, 4, 5], "half": 5, "halv": 5, "handl": [1, 4, 5, 6], "handler": 4, "hat": 5, "have": [1, 4, 5], "he": 3, "header": [1, 4], "health": 3, "healthcar": 3, "heatmap": [1, 5], "height": 5, "help": [1, 4, 5, 6], "here": [4, 5], "hex": [1, 4], "hi": 0, "hidden": 5, "hide": [1, 5], "hide_index": 1, "high": [1, 4, 5], "higher": [5, 6], "highest": 4, "highli": 5, "highlight": [1, 5, 7], "highlight_column": [4, 7], "highlighted_df": 4, "hist": [1, 5], "hist_color": 5, "hist_edgecolor": [1, 5], "histogram": [1, 7], "hold": [3, 4, 5], "horizont": [1, 5], "hour": [4, 5], "hous": 7, "houseag": 5, "household": 5, "hover": 5, "how": [4, 5, 6], "howev": [1, 5], "html": [4, 5], "html_file_nam": [1, 5], "html_file_path": [1, 5], "http": [2, 4, 5, 6, 8], "huber": 5, "hue": [1, 5], "hue_dict": 5, "hue_palett": 5, "hunter": [5, 8], "husband": 4, "hyperlink": 4, "hypothes": 6, "i": [1, 3, 4, 5, 7], "icon": 1, "id": [1, 4, 6], "id_colnam": 4, "idea": 4, "identifi": [1, 5, 6, 7], "ignor": 5, "illustr": 5, "imag": [4, 5], "image_filenam": 5, "image_path_png": [1, 4, 5], "image_path_svg": [1, 4, 5], "imbal": 4, "immedi": 5, "impact": [1, 5], "implement": 1, "import": [1, 4, 5], "imposs": 4, "improv": 1, "inc": 4, "inch": 5, "includ": [1, 4, 5, 6], "inclus": 4, "incom": [5, 6, 7, 8], "inconsist": [1, 4], "incorpor": 1, "incorrect": [1, 5], "increas": 5, "increment": 1, "independ": 1, "index": [1, 4, 5], "indic": [1, 4, 5], "individu": [1, 4, 5], "individual_figs": 5, "industri": 3, "inf": 4, "infin": 4, "influenc": [1, 5], "influenti": 5, "inform": [5, 6], "initi": [1, 6], "inner": 5, "input": [1, 5], "insight": [4, 5, 6], "instal": 7, "instanc": [4, 5], "instead": [1, 5], "instruct": 6, "int": [1, 4, 5], "int64": 4, "integ": 1, "integr": [5, 6], "intellig": 3, "intend": 1, "interact": [1, 7], "interest": 5, "interfac": [1, 5], "intern": [1, 5], "interpret": [1, 5], "interv": 4, "introduc": 1, "introduct": 1, "intuit": [1, 5, 6], "invalid": 1, "invalu": 5, "investig": 6, "involv": [4, 5, 6], "io": 4, "island": 4, "iso": 4, "issu": [1, 6], "item": 5, "iter": [1, 5], "its": [1, 4], "itself": 5, "j": [5, 8], "jinja2": 6, "join": 4, "joint": 5, "jointli": 5, "joss": [5, 8], "journal": [5, 8], "journei": 0, "jupyt": 4, "just": 5, "k": [5, 8], "kde": [1, 6, 7], "kde_color": 5, "kde_density_single_distribut": 5, "kde_distribut": [1, 5, 7], "keep": 5, "kei": [1, 4, 5, 7], "kernel": 7, "keyboard": 5, "keyerror": 5, "keyword": [1, 5], "kind": 5, "kohavi": [4, 5, 6, 8], "kwarg": [1, 5], "l": 2, "label": [1, 4, 5], "label_ag": 4, "label_fonts": [1, 5], "label_nam": 5, "larg": 5, "largest": 5, "last": 4, "latest": 1, "layout": [1, 5], "ldot": 5, "lead": 5, "learn": [0, 1, 3, 4, 5, 6, 8], "learning_r": 5, "least": [1, 4], "lectur": 3, "left": [4, 5], "left_margin": [1, 5], "legend": [1, 5], "legend_label": 5, "legend_labels_list": 5, "legibl": 5, "len": 1, "length": [4, 5], "leonid": [2, 3], "leq": 4, "less": [1, 4], "let": 5, "letter": [5, 8], "level": [4, 5], "leverag": [5, 6], "librari": [1, 4, 5, 7], "licens": 1, "like": [0, 4, 5], "limit": [1, 4, 5], "line": [1, 6, 7], "linear": 5, "linestyl": 5, "link": 7, "list": [1, 4, 5], "load": [4, 5], "local": 4, "locat": [4, 5], "log": [1, 5], "log_scale_var": [1, 5], "logarithm": 5, "logic": 1, "logo": 1, "logscal": 5, "long": 5, "longer": 5, "loop": 5, "loss": [4, 5], "lower": [1, 5], "lt": [4, 5], "m": [0, 3, 5, 8], "machin": [1, 3, 4, 5, 6, 8], "made": 1, "magnitud": 5, "mai": [1, 5], "main": 6, "maintain": [1, 5, 7], "major": 4, "make": [1, 4, 5], "male": [4, 5], "male_": 5, "manag": [1, 3, 5, 6], "manageri": 4, "mani": [5, 6], "manipul": 6, "manner": 5, "manual": [1, 5], "map": [1, 5], "marco": 0, "margin": [1, 5], "marit": 4, "mark": [1, 5], "marker": 5, "marri": 4, "master": 3, "match": [1, 5], "mathbb": 5, "mathbf": 5, "mathemat": [4, 5], "matplotlib": [1, 5, 6, 8], "matplotlib_colormap": 5, "matric": [1, 7], "matrix": [1, 7], "max": 5, "max_col": 5, "max_depth": 5, "max_unique_valu": 4, "max_unique_value_pct": 4, "max_unique_value_tot": 4, "maximum": 5, "mcse": [5, 8], "mean": [1, 4, 6, 7], "mean_color": 5, "meaning": [4, 5], "measur": [4, 5], "mechan": 1, "median": [1, 6, 7], "median_color": 5, "medinc": 5, "meet": 6, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 5, 6], "metric": 5, "metrics_box_violin": 1, "metrics_boxplot_comp": 5, "metrics_comp": 5, "metrics_list": 5, "mid": 5, "might": 5, "min": 5, "min_length": 4, "mind": 6, "minim": [1, 5], "minimum": [4, 5], "minor": 1, "misalign": 5, "misinterpret": 5, "mislead": 1, "miss": [1, 4, 5, 6], "mm": 4, "mode": [1, 5], "model": [1, 5, 6], "model_select": 5, "modifi": [1, 5], "month": [2, 4], "more": [1, 4, 5], "most": [1, 4, 5, 6], "mous": 5, "move": [1, 5], "mu": 5, "mu_i": 5, "mu_x": 5, "much": 5, "multidimension": 5, "multipl": [1, 4, 5, 6], "multipli": 1, "must": [4, 5], "my_datafram": 1, "n": 5, "n_col": 5, "n_estim": 5, "n_row": 5, "na": [1, 4], "name": [1, 5, 7], "nativ": 4, "navig": [4, 5], "nbformat": 6, "ndarrai": 5, "necessari": [1, 4], "need": [1, 4, 5, 6], "neg": 5, "neither": [1, 5], "nest": 5, "neutral": 5, "never": 4, "new": [1, 4, 5], "newer": 5, "next": [4, 5], "nh": 5, "nomenclatur": 1, "non": [1, 4, 7], "none": [1, 4, 5], "nonetyp": 1, "nor": [1, 5], "normal": [1, 7], "notat": [1, 5], "note": [4, 5], "notebook": 4, "noth": 4, "notic": 5, "now": 1, "np": 5, "null": [1, 4], "null_pct": 4, "null_tot": 4, "num": [4, 5], "num_digit": 4, "number": [1, 4, 5], "numer": [1, 5, 7], "numpi": [5, 6], "nuniqu": 4, "o": [2, 4, 5], "object": [1, 4, 5], "observ": 5, "obviou": 5, "occup": [4, 5], "occur": [1, 4], "occurr": 4, "offer": [1, 5, 6], "often": [5, 6], "older": [1, 5], "omit": 1, "one": [1, 4, 5], "onli": [1, 5], "opaqu": 5, "open": [5, 8], "oper": [4, 5], "opportun": 4, "optim": 5, "option": [1, 4, 5, 6], "orang": 5, "order": [1, 4, 5], "org": [2, 4, 5, 6, 8], "organ": [1, 5], "orient": 5, "origin": [4, 5], "original_df": 4, "oscar": [2, 3], "other": [1, 4, 5], "otherwis": 5, "our": 0, "out": 5, "outcom": 5, "outlier": 6, "output": [1, 4, 5], "outsid": 5, "over": [1, 3, 5], "overal": [1, 5], "overlai": 5, "overlaid": 5, "overlap": 5, "overrid": 5, "overview": 7, "own": 5, "p": 5, "pac": 4, "pace": [5, 8], "packag": 6, "pad": [1, 5], "page": [5, 6], "pair": [4, 5], "pairwis": 5, "palett": 5, "panda": [1, 4, 5, 6], "param": 1, "paramet": [1, 4, 5], "parametr": 5, "pardir": 4, "parent": 4, "pars": 4, "parse_date_with_rul": [4, 7], "part": 4, "partial": [1, 7], "partial_depend": 5, "particular": 5, "particularli": [1, 4, 5], "pass": [1, 5], "path": [1, 5, 7], "patient": 4, "pattern": [5, 6], "pd": [4, 5], "pdf": 5, "pdp": 5, "pearson": 7, "per": [4, 5], "percent": [1, 5], "percentag": 4, "perfect": 5, "perfectli": 5, "perform": [1, 4, 5], "performancewarn": 1, "period": 7, "person": 3, "perspect": [1, 5], "pi": 5, "pink": 4, "pip": 6, "pitfal": 1, "pivot": [0, 7], "place": [1, 4], "plai": 0, "plain": 4, "plot": [1, 6], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_mean": 5, "plot_median": 5, "plot_typ": [1, 5], "plotli": [1, 5, 6], "plotly_colormap": 5, "plots_onli": 5, "plt": 1, "pm": 5, "png": [1, 4, 5], "png_imag": 4, "point": [1, 5], "pointer": 5, "popul": 5, "popular": 6, "posit": [1, 5], "possibl": [4, 5, 6], "potenti": [1, 4, 5], "power": [1, 5], "pr": 1, "pre": 1, "preced": 5, "predict": [1, 5], "prefer": [1, 5], "prefix": [1, 5], "prepar": [1, 4, 5], "prerequisit": 7, "present": [1, 4, 5], "preval": 5, "prevent": [1, 4, 5], "previou": [1, 5], "previous": 1, "price": 5, "print": [1, 4, 5], "prior": 5, "privat": 4, "probabl": [1, 5, 8], "process": [1, 4, 6], "produc": [1, 5], "product": 5, "prof": 4, "profession": 3, "program": [0, 3], "project": [1, 3, 4, 7], "promin": 5, "proper": [1, 5], "properli": [1, 5], "proport": [1, 4, 5], "provid": [0, 1, 4, 5, 6], "public": 5, "publish": 2, "purpl": 5, "purpos": [1, 7], "pursu": 0, "py": 1, "pypi": [1, 6], "python": [1, 3, 5, 7], "qualiti": [5, 6], "quantifi": 5, "quantit": 5, "quick": 5, "quickli": [5, 6], "r": [3, 4, 5, 6, 8], "r_": 5, "race": 4, "racial": 4, "rais": [1, 4, 5], "random": 4, "random_st": 5, "rang": [4, 5, 6], "raw": 5, "re": [1, 5], "read": 4, "readabl": [1, 5], "readi": 6, "readm": 1, "record": 4, "red": 5, "reduc": [1, 5], "redund": 5, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 5], "regress": 7, "regular": [1, 7], "relat": [1, 4, 5], "relationship": [4, 5, 6], "releas": 1, "relev": [1, 6], "reli": 5, "reliabl": 4, "remain": [1, 5], "remov": [1, 5, 6, 7], "remove_stack": [1, 5], "renam": [1, 5], "render": 4, "replac": 4, "replica": 1, "report": [3, 5, 6], "repositori": [4, 5, 6, 8], "repres": [1, 4, 5], "represent": [1, 5], "reproduc": 4, "requir": [1, 5, 6], "research": 6, "reset": 1, "resolut": 5, "resolv": 1, "respect": [1, 4, 5], "respons": 5, "rest": 5, "result": [1, 4, 5], "return": [1, 4, 5], "return_df": [1, 4], "return_dict": 5, "reveal": 5, "rich": [5, 6], "right": [4, 5], "right_margin": [1, 5], "riversid": 3, "robust": 1, "role": [0, 1], "rot": 5, "rotat": [1, 5], "rotate_plot": 5, "round": 4, "row": [4, 5], "rule": 4, "run": 6, "s0167": [5, 8], "same": [1, 5], "sampl": [4, 5], "san": [0, 3], "save": [1, 5, 6, 7], "save_dataframes_to_excel": [1, 4, 7], "save_format": [1, 5], "save_plot": [1, 5], "scale": [1, 5], "scatter": [1, 6, 7], "scatter_color": 5, "scatter_fit_plot": [1, 5, 7], "scatterplot": 5, "scenario": [1, 5], "schema": 5, "scheme": 5, "school": 0, "scienc": [0, 3, 4, 5, 6, 8], "scientif": [1, 5], "scientist": [0, 3, 6], "scikit": [1, 5, 6], "scroll": 5, "seaborn": [1, 5, 6, 8], "seamlessli": 6, "second": [4, 5], "section": [1, 4], "see": 5, "seed": 4, "select": [1, 5], "select_dtyp": 5, "self": 4, "separ": [1, 4, 5], "sequenc": 5, "seri": 4, "serv": [1, 3], "servic": 3, "set": [1, 4, 5], "set_as_index": 4, "set_titl": 1, "setminu": 5, "setp": 1, "setup": [1, 4, 5], "sever": [1, 5], "sex": [4, 5], "shape": [4, 5], "sheet": 4, "shilei": 0, "should": 5, "show": [1, 4, 5], "show_cbar": 5, "show_correl": 5, "show_legend": [1, 5], "show_modebar": [1, 5], "show_plot": 5, "showcas": 5, "shown": 5, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 5, "sigma_i": 5, "sigma_x": 5, "signatur": 1, "signific": [1, 4], "silver": 5, "similarli": 5, "simpl": 5, "simpler": 1, "simplic": 6, "simplif": 1, "simplifi": [1, 4], "simultan": 5, "sinc": 5, "singl": [1, 4, 5], "single_figs": 5, "single_var_image_filenam": 5, "size": [1, 4, 5], "sklearn": 5, "slightli": 1, "small": 1, "smallest": 5, "smooth": 5, "smoother": [1, 5], "sn": 5, "snippet": [4, 5], "so": [1, 4, 5], "softwar": [2, 5, 8], "some": [1, 4], "sort": [1, 4], "sort_bi": [1, 4], "sortbi": 1, "sourc": [5, 6, 8], "space": [1, 5], "span": 5, "spars": [5, 8], "spatial": [5, 8], "special": 4, "specialti": 4, "specif": [1, 5, 6, 7], "specifi": [1, 4, 5, 6], "split": 5, "spot": 4, "spous": 4, "spread": 5, "sql": 3, "sqrt": 5, "squar": [1, 5], "stabil": 1, "stabl": 1, "stack": [1, 6, 7], "stacked_crosstab": 5, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 5, 6, 7], "standardized_d": 4, "start": [1, 4, 6], "stat": [1, 5], "state": 4, "static": [1, 7], "statist": [1, 3, 4, 5, 6, 8], "statu": [1, 4], "std": 7, "std_color": 5, "std_dev_level": 5, "stem": 5, "step": [1, 4, 6], "still": [1, 5], "store": [1, 5], "str": [1, 4, 5], "straightforward": 1, "streamlin": [1, 4, 6], "strength": 5, "string": [1, 4, 5], "strip": 4, "strip_trailing_period": [4, 7], "stronger": 5, "structur": [1, 6], "style": [1, 4, 5], "styler": [1, 4], "subplot": 5, "subset": 5, "substitut": 5, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suggest": 4, "suit": 6, "suitabl": 1, "sum_": 5, "summar": [5, 6], "summari": [1, 6, 7], "summarize_all_combin": [4, 7], "summary_t": 4, "support": [0, 1, 5], "suppos": 5, "suppress": 5, "sure": 4, "surfac": [1, 5], "svg": [1, 4, 5], "svg_imag": 4, "sy": 1, "system": [4, 6], "t": 5, "tab": 4, "tabl": [1, 5, 6], "tailor": 5, "take": [4, 5], "tall": 5, "target": 5, "tarshizi": 0, "task": [4, 6], "tatist": 5, "teach": 3, "techniqu": [6, 7], "ten": 3, "tend": 5, "tendenc": 5, "test": [1, 5], "test_siz": 5, "text": [1, 4, 5], "text_wrap": [1, 5], "th": 5, "than": [1, 4], "thank": 0, "thei": [1, 4, 5], "them": [1, 4, 5, 6], "theoret": 7, "therefor": 5, "thi": [1, 4, 5, 6], "thick": 5, "those": 1, "three": 5, "through": [1, 5], "throw": 1, "thu": 4, "tick": [1, 5], "tick_fonts": [1, 5], "tight": 5, "time": [0, 1, 4, 5], "titl": [1, 2, 5], "title_i": [1, 5], "title_x": [1, 5], "to_list": 5, "togeth": 5, "toggl": [1, 5], "tool": [1, 5, 6], "toolkit": 1, "top": 5, "top_margin": [1, 5], "topic": 4, "total": [4, 5], "toward": 1, "trail": 7, "train": 5, "train_test_split": 5, "transpar": [1, 5], "trend": [5, 6], "triangl": 5, "triangular": [1, 7], "true": [1, 4, 5], "truth": 5, "try": 1, "tupl": [1, 4, 5], "two": [1, 4, 5], "type": [1, 4, 5, 6], "typeerror": 1, "u": [0, 4, 5], "uci": [4, 5, 6, 8], "ucla": 3, "unambigu": 4, "uncov": [5, 6], "underli": [5, 6], "understand": [4, 5, 6], "uniform": 1, "uniqu": [1, 5, 6, 7], "unique_values_tot": 4, "unique_var": 4, "unit": 4, "univers": [0, 3], "unnecessari": 1, "unrecogn": 4, "unstack": 5, "unus": 1, "unwav": 0, "up": [1, 4, 5], "updat": [1, 4, 5], "upper": [1, 4, 5], "upright": 5, "url": 2, "us": [1, 4, 5, 6], "usabl": 1, "usag": [1, 4, 5], "user": [1, 5, 6], "userwarn": 5, "util": [4, 5, 6], "v": 5, "valid": [1, 5], "valid_plot_typ": 1, "valu": [1, 4, 5, 6], "value_count": 4, "valueerror": [1, 4, 5], "vari": [4, 5], "variabl": [1, 5, 6, 7], "varianc": 5, "varieti": [3, 5, 6], "variou": [1, 5, 6], "vars_of_interest": 5, "vdot": 4, "vector": 5, "verbiag": 1, "verifi": [1, 4], "versa": 5, "versatil": 5, "version": [2, 5, 6, 7], "version_info": 1, "versu": 1, "vertic": [1, 5], "via": [1, 5], "vice": 5, "view": [1, 5], "view_angl": 5, "violin": [1, 6, 7], "violinplot": 5, "viridi": 5, "visibl": [1, 5], "visual": [1, 4, 5, 6, 8], "vmax": 5, "vmin": 5, "vriabl": 5, "w_pad": 5, "wa": [1, 5], "wai": 5, "want": [1, 5], "wareh": 3, "warn": [1, 4, 5], "waskom": [5, 8], "we": [0, 4, 5, 6], "week": [4, 5], "welcom": 7, "well": [4, 5], "were": 4, "what": [1, 7], "wheel": 5, "when": [1, 4, 5, 6], "where": [1, 4, 5], "whether": [1, 4, 5], "which": [1, 4, 5, 6], "while": [1, 5], "white": 4, "whitespac": 5, "who": 1, "wide": [3, 5], "width": [1, 5], "wife": 4, "wirefram": [1, 5], "wireframe_color": 5, "wish": 5, "within": [1, 3, 4, 5], "without": [1, 4, 5], "work": [1, 4, 5], "workclass": 4, "workflow": [4, 6], "would": [0, 1, 5], "wrangl": 3, "wrap": [1, 5], "write": 4, "x": [1, 4, 5, 8], "x_": 5, "x_1": 5, "x_2": 5, "x_c": 5, "x_i": 5, "x_j": 5, "x_k": 5, "x_label": [1, 5], "x_label_plotli": 1, "x_n": 5, "x_p": 5, "x_test": 5, "x_train": 5, "x_var": 5, "xlabel": 5, "xlabel_align": 5, "xlabel_rot": 5, "xlim": [1, 5], "xlsx": 4, "xlsxwriter": 6, "xx": 1, "xy": 5, "y": [1, 5], "y_axis_label": 5, "y_i": 5, "y_label": [1, 5], "y_label_plotli": 1, "y_test": 5, "y_train": 5, "y_var": 5, "year": [2, 3, 4], "yellow": 4, "ylabel": 5, "ylabel_align": 5, "ylabel_rot": 5, "ylim": [1, 5], "you": [4, 5, 6], "your": [4, 5, 6], "yy": 1, "yyyi": 4, "z": 5, "z_label": [1, 5], "z_label_plotli": 1, "zenodo": [1, 2], "zero": [1, 4], "zoom": [1, 5], "zoom_out_factor": [1, 5], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Data Management Overview", "Plotting and Theoretical Overview", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References"], "titleterms": {"0": 1, "10": 1, "11": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 5, "3": 1, "3d": 5, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "9": 1, "With": 5, "about": 7, "acknowledg": 0, "ad": 4, "all": 5, "analysi": 4, "assumpt": 5, "bar": 5, "best": 5, "bin": 4, "box": 5, "ca": 5, "calcul": 4, "categori": 5, "censu": 4, "centric": 5, "changelog": 1, "cite": 2, "coeffici": 5, "column": 4, "combin": [4, 5], "content": 7, "conting": 4, "contributor": 3, "correl": 5, "count": 5, "creat": 4, "crosstab": 5, "custom": 4, "data": [4, 7], "datafram": 4, "date": 4, "densiti": 5, "depend": 5, "descript": 6, "detail": 4, "deviat": 5, "directori": 4, "distribut": 5, "document": 6, "eda": [2, 6, 7], "estim": 5, "exampl": [4, 5], "excel": 4, "featur": 6, "fit": 5, "format": 4, "foundat": 5, "full": 5, "function": 5, "gaussian": 5, "gener": 4, "get": 7, "grid": 5, "group": 5, "heurist": 7, "highlight": 4, "histogram": 5, "hous": 5, "i": 6, "identifi": 4, "incom": 4, "instal": 6, "interact": 5, "kde": 5, "kei": 6, "kernel": 5, "librari": 6, "line": 5, "link": 6, "maintain": 3, "manag": [4, 7], "matric": 5, "matrix": 5, "mean": 5, "median": 5, "name": 4, "non": 5, "normal": 5, "numer": 4, "overview": [4, 5], "partial": 5, "path": 4, "pearson": 5, "period": 4, "pivot": 5, "plot": [5, 7], "prerequisit": 6, "project": 6, "purpos": 6, "python": 6, "refer": 8, "regress": 5, "regular": 5, "remov": 4, "save": 4, "scatter": 5, "specif": 4, "stack": 5, "standard": 4, "start": 7, "static": 5, "std": 5, "summari": 4, "tabl": [4, 7], "techniqu": 4, "theoret": 5, "toolkit": [2, 6, 7], "trail": 4, "triangular": 5, "uniqu": 4, "variabl": 4, "version": 1, "violin": 5, "welcom": 6, "what": 6}}) \ No newline at end of file diff --git a/docs/v0.0.5/.buildinfo b/docs/v0.0.5/.buildinfo index 029353984..c1461470f 100644 --- a/docs/v0.0.5/.buildinfo +++ b/docs/v0.0.5/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: ca9bef4c279b7455f584883414f6f038 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: f916628d86e8c134f12211f2a6f1f53d tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/v0.0.5/.buildinfo.bak b/docs/v0.0.5/.buildinfo.bak new file mode 100644 index 000000000..029353984 --- /dev/null +++ b/docs/v0.0.5/.buildinfo.bak @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: ca9bef4c279b7455f584883414f6f038 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/v0.0.5/.doctrees/acknowledgements.doctree b/docs/v0.0.5/.doctrees/acknowledgements.doctree index 3ba1ae71c..6ec6e1a59 100644 Binary files a/docs/v0.0.5/.doctrees/acknowledgements.doctree and b/docs/v0.0.5/.doctrees/acknowledgements.doctree differ diff --git a/docs/v0.0.5/.doctrees/changelog.doctree b/docs/v0.0.5/.doctrees/changelog.doctree index 7c3196557..0071fbda8 100644 Binary files a/docs/v0.0.5/.doctrees/changelog.doctree and b/docs/v0.0.5/.doctrees/changelog.doctree differ diff --git a/docs/v0.0.5/.doctrees/citations.doctree b/docs/v0.0.5/.doctrees/citations.doctree index fc98cd903..3588aac1f 100644 Binary files a/docs/v0.0.5/.doctrees/citations.doctree and b/docs/v0.0.5/.doctrees/citations.doctree differ diff --git a/docs/v0.0.5/.doctrees/environment.pickle b/docs/v0.0.5/.doctrees/environment.pickle index 30810477b..830411ac3 100644 Binary files a/docs/v0.0.5/.doctrees/environment.pickle and b/docs/v0.0.5/.doctrees/environment.pickle differ diff --git a/docs/v0.0.5/.doctrees/getting_started.doctree b/docs/v0.0.5/.doctrees/getting_started.doctree index f6da50d57..d48d266d7 100644 Binary files a/docs/v0.0.5/.doctrees/getting_started.doctree and b/docs/v0.0.5/.doctrees/getting_started.doctree differ diff --git a/docs/v0.0.5/.doctrees/index.doctree b/docs/v0.0.5/.doctrees/index.doctree index 759dfcaa0..3ed59afe4 100644 Binary files a/docs/v0.0.5/.doctrees/index.doctree and b/docs/v0.0.5/.doctrees/index.doctree differ diff --git a/docs/v0.0.5/.doctrees/references.doctree b/docs/v0.0.5/.doctrees/references.doctree index 5dadacedc..128c2db99 100644 Binary files a/docs/v0.0.5/.doctrees/references.doctree and b/docs/v0.0.5/.doctrees/references.doctree differ diff --git a/docs/v0.0.5/.doctrees/usage_guide.doctree b/docs/v0.0.5/.doctrees/usage_guide.doctree index efac99706..6190f6f70 100644 Binary files a/docs/v0.0.5/.doctrees/usage_guide.doctree and b/docs/v0.0.5/.doctrees/usage_guide.doctree differ diff --git a/docs/v0.0.5/_static/basic.css b/docs/v0.0.5/_static/basic.css index f316efcb4..7ebbd6d07 100644 --- a/docs/v0.0.5/_static/basic.css +++ b/docs/v0.0.5/_static/basic.css @@ -1,12 +1,5 @@ /* - * basic.css - * ~~~~~~~~~ - * * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ /* -- main layout ----------------------------------------------------------- */ @@ -115,15 +108,11 @@ img { /* -- search page ----------------------------------------------------------- */ ul.search { - margin: 10px 0 0 20px; - padding: 0; + margin-top: 10px; } ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; + padding: 5px 0; } ul.search li a { diff --git a/docs/v0.0.5/_static/css/badge_only.css b/docs/v0.0.5/_static/css/badge_only.css index c718cee44..88ba55b96 100644 --- a/docs/v0.0.5/_static/css/badge_only.css +++ b/docs/v0.0.5/_static/css/badge_only.css @@ -1 +1 @@ -.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/docs/v0.0.5/_static/css/theme.css b/docs/v0.0.5/_static/css/theme.css index 19a446a0e..0f14f1064 100644 --- a/docs/v0.0.5/_static/css/theme.css +++ b/docs/v0.0.5/_static/css/theme.css @@ -1,4 +1,4 @@ html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/v0.0.5/_static/doctools.js b/docs/v0.0.5/_static/doctools.js index 4d67807d1..0398ebb9f 100644 --- a/docs/v0.0.5/_static/doctools.js +++ b/docs/v0.0.5/_static/doctools.js @@ -1,12 +1,5 @@ /* - * doctools.js - * ~~~~~~~~~~~ - * * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-bold.eot b/docs/v0.0.5/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-bold.eot differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-bold.ttf b/docs/v0.0.5/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-bold.ttf differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-bold.woff b/docs/v0.0.5/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-bold.woff differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-bold.woff2 b/docs/v0.0.5/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.eot b/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.ttf b/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff b/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-italic.eot b/docs/v0.0.5/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-italic.eot differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-italic.ttf b/docs/v0.0.5/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-italic.ttf differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-italic.woff b/docs/v0.0.5/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-italic.woff differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-italic.woff2 b/docs/v0.0.5/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-regular.eot b/docs/v0.0.5/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-regular.eot differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-regular.ttf b/docs/v0.0.5/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-regular.ttf differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-regular.woff b/docs/v0.0.5/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-regular.woff differ diff --git a/docs/v0.0.5/_static/fonts/Lato/lato-regular.woff2 b/docs/v0.0.5/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/docs/v0.0.5/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/docs/v0.0.5/_static/js/versions.js b/docs/v0.0.5/_static/js/versions.js new file mode 100644 index 000000000..818bc9969 --- /dev/null +++ b/docs/v0.0.5/_static/js/versions.js @@ -0,0 +1,224 @@ +const themeFlyoutDisplay = "hidden"; +const themeVersionSelector = "True"; +const themeLanguageSelector = "True"; + +if (themeFlyoutDisplay === "attached") { + function renderLanguages(config) { + if (!config.projects.translations.length) { + return ""; + } + + const languagesHTML = ` +
    +
    Languages
    + ${config.projects.translations + .map( + (translation) => ` +
    + ${translation.language.code} +
    + `, + ) + .join("\n")} +
    + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
    +
    Versions
    + ${config.versions.active + .map( + (version) => ` +
    + ${version.slug} +
    + `, + ) + .join("\n")} +
    + `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
    +
    Downloads
    + ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
    + ${downloadsNameDisplay[name]} +
    + `, + ) + .join("\n")} +
    + `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
    + + Read the Docs + v: ${config.versions.current.slug} + + +
    +
    + ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
    +
    On Read the Docs
    +
    + Project Home +
    +
    + Builds +
    +
    + Downloads +
    +
    +
    +
    Search
    +
    +
    + +
    +
    +
    +
    + + Hosted by Read the Docs + +
    +
    + `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/docs/v0.0.5/_static/language_data.js b/docs/v0.0.5/_static/language_data.js index 367b8ed81..c7fe6c6fa 100644 --- a/docs/v0.0.5/_static/language_data.js +++ b/docs/v0.0.5/_static/language_data.js @@ -1,13 +1,6 @@ /* - * language_data.js - * ~~~~~~~~~~~~~~~~ - * * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; diff --git a/docs/v0.0.5/_static/searchtools.js b/docs/v0.0.5/_static/searchtools.js index b08d58c9b..2c774d17a 100644 --- a/docs/v0.0.5/_static/searchtools.js +++ b/docs/v0.0.5/_static/searchtools.js @@ -1,12 +1,5 @@ /* - * searchtools.js - * ~~~~~~~~~~~~~~~~ - * * Sphinx JavaScript utilities for the full-text search. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; @@ -20,7 +13,7 @@ if (typeof Scorer === "undefined") { // and returns the new score. /* score: result => { - const [docname, title, anchor, descr, score, filename] = result + const [docname, title, anchor, descr, score, filename, kind] = result return score }, */ @@ -47,6 +40,14 @@ if (typeof Scorer === "undefined") { }; } +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + const _removeChildren = (element) => { while (element && element.lastChild) element.removeChild(element.lastChild); }; @@ -64,9 +65,13 @@ const _displayItem = (item, searchTerms, highlightTerms) => { const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; const contentRoot = document.documentElement.dataset.content_root; - const [docName, title, anchor, descr, score, _filename] = item; + const [docName, title, anchor, descr, score, _filename, kind] = item; let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); let requestUrl; let linkUrl; if (docBuilder === "dirhtml") { @@ -115,8 +120,10 @@ const _finishSearch = (resultCount) => { "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." ); else - Search.status.innerText = _( - "Search finished, found ${resultCount} page(s) matching the search query." + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, ).replace('${resultCount}', resultCount); }; const _displayNextItem = ( @@ -138,7 +145,7 @@ const _displayNextItem = ( else _finishSearch(resultCount); }; // Helper function used by query() to order search results. -// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. // Order the results by score (in opposite order of appearance, since the // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. const _orderResultsByScoreThenName = (a, b) => { @@ -248,6 +255,7 @@ const Search = { searchSummary.classList.add("search-summary"); searchSummary.innerText = ""; const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); searchList.classList.add("search"); const out = document.getElementById("search-results"); @@ -318,7 +326,7 @@ const Search = { const indexEntries = Search._index.indexentries; // Collect multiple result groups to be sorted separately and then ordered. - // Each is an array of [docname, title, anchor, descr, score, filename]. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. const normalResults = []; const nonMainIndexResults = []; @@ -337,6 +345,7 @@ const Search = { null, score + boost, filenames[file], + SearchResultKind.title, ]); } } @@ -354,6 +363,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.index, ]; if (isMain) { normalResults.push(result); @@ -475,6 +485,7 @@ const Search = { descr, score, filenames[match[0]], + SearchResultKind.object, ]); }; Object.keys(objects).forEach((prefix) => @@ -585,6 +596,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.text, ]); } return results; diff --git a/docs/v0.0.5/acknowledgements.html b/docs/v0.0.5/acknowledgements.html index b2fc289f1..28d0eda39 100644 --- a/docs/v0.0.5/acknowledgements.html +++ b/docs/v0.0.5/acknowledgements.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Acknowledgements — EDA Toolkit 0.0.5 documentation - + - - - - - - - - - - + + + + + + + + @@ -95,7 +93,8 @@
    -
    EDA Toolkit Logo +

    Acknowledgements

    diff --git a/docs/v0.0.5/changelog.html b/docs/v0.0.5/changelog.html index 922a2bda2..ae774033f 100644 --- a/docs/v0.0.5/changelog.html +++ b/docs/v0.0.5/changelog.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Changelog — EDA Toolkit 0.0.5 documentation - + - - - - - - - - - - + + + + + + + + @@ -106,7 +104,8 @@
    -
    EDA Toolkit Logo +

    Changelog

    diff --git a/docs/v0.0.5/citations.html b/docs/v0.0.5/citations.html index a78be61c6..0d3efa278 100644 --- a/docs/v0.0.5/citations.html +++ b/docs/v0.0.5/citations.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Citing EDA Toolkit — EDA Toolkit 0.0.5 documentation - + - - - - - - - - - - + + + + + + + + @@ -95,7 +93,8 @@
    -
    EDA Toolkit Logo +

    Citing EDA Toolkit

    diff --git a/docs/v0.0.5/genindex.html b/docs/v0.0.5/genindex.html index 2e0b75ff3..718c8c4ff 100644 --- a/docs/v0.0.5/genindex.html +++ b/docs/v0.0.5/genindex.html @@ -1,3 +1,5 @@ + + @@ -5,25 +7,21 @@ Index — EDA Toolkit 0.0.5 documentation - + - - - - - - - - - - + + + + + + + + diff --git a/docs/v0.0.5/getting_started.html b/docs/v0.0.5/getting_started.html index fce830195..26396e211 100644 --- a/docs/v0.0.5/getting_started.html +++ b/docs/v0.0.5/getting_started.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.5 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,7 +101,8 @@
    -
    EDA Toolkit Logo +

    Welcome to the EDA Toolkit Python Library Documentation!

    diff --git a/docs/v0.0.5/index.html b/docs/v0.0.5/index.html index 9cecca5c8..64d265249 100644 --- a/docs/v0.0.5/index.html +++ b/docs/v0.0.5/index.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Table of Contents — EDA Toolkit 0.0.5 documentation - + - - - - - - - - - - + + + + + + + + @@ -94,7 +92,8 @@
    -
    EDA Toolkit Logo +

    Table of Contents

    diff --git a/docs/v0.0.5/references.html b/docs/v0.0.5/references.html index 655a3fefd..94e9c2848 100644 --- a/docs/v0.0.5/references.html +++ b/docs/v0.0.5/references.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ References — EDA Toolkit 0.0.5 documentation - + - - - - - - - - - - + + + + + + + + @@ -94,7 +92,8 @@
    -
    EDA Toolkit Logo +

    The eda_toolkit library

    diff --git a/docs/v0.0.5/search.html b/docs/v0.0.5/search.html index eea300cfa..297818478 100644 --- a/docs/v0.0.5/search.html +++ b/docs/v0.0.5/search.html @@ -1,3 +1,5 @@ + + @@ -5,7 +7,7 @@ Search — EDA Toolkit 0.0.5 documentation - + @@ -13,18 +15,14 @@ - - - - - - - - - - + + + + + + + + diff --git a/docs/v0.0.5/searchindex.js b/docs/v0.0.5/searchindex.js index 4c458aa7e..8dfb4fb54 100644 --- a/docs/v0.0.5/searchindex.js +++ b/docs/v0.0.5/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"About EDA Toolkit": [[4, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[6, "adding-unique-identifiers"]], "Binning Numerical Columns": [[6, "binning-numerical-columns"]], "Box Plots Grid Example": [[6, "box-plots-grid-example"]], "Box and Violin Plots": [[6, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Creating Contingency Tables": [[6, "creating-contingency-tables"]], "Data Preparation and Management": [[6, "data-preparation-and-management"]], "DataFrame Analysis": [[6, "dataframe-analysis"]], "Description": [[6, null]], "Generating Summary Tables for Variable Combinations": [[6, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[4, null]], "Highlighting Specific Columns in a DataFrame": [[6, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[6, "histogram-example-count"]], "Histogram Example (Density)": [[6, "histogram-example-density"]], "Installation": [[3, "installation"]], "KDE and Histogram Distribution Plots": [[6, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[6, "kde-and-histograms-example"]], "Key Features": [[3, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[6, "non-normalized-stacked-bar-plots-example"]], "Path directories": [[6, "path-directories"]], "Pivoted Stacked Bar Plots Example": [[6, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[6, "pivoted-violin-plots-grid-example"]], "Prerequisites": [[3, "prerequisites"]], "Project Links": [[3, "project-links"]], "Purpose of EDA Toolkit": [[3, "purpose-of-eda-toolkit"]], "References": [[5, null]], "Regression-Centric Scatter Plots Example": [[6, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[6, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[6, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Plots Grouped by Category Example": [[6, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[6, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[6, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[6, "stacked-crosstab-plots"]], "Standardized Dates": [[6, "standardized-dates"]], "Table of Contents": [[4, null]], "Trailing Period Removal": [[6, "trailing-period-removal"]], "Usage Guide": [[4, null]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id2"], [1, "id3"], [1, "id4"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Violin Plots Grid Example": [[6, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[3, null]], "What is EDA?": [[3, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "getting_started", "index", "references", "usage_guide"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "getting_started.rst", "index.rst", "references.rst", "usage_guide.rst"], "indexentries": {"add_ids()": [[6, "add_ids", false]], "box_violin_plot()": [[6, "box_violin_plot", false]], "built-in function": [[6, "add_ids", false], [6, "box_violin_plot", false], [6, "contingency_table", false], [6, "dataframe_columns", false], [6, "ensure_directory", false], [6, "highlight_columns", false], [6, "kde_distributions", false], [6, "parse_date_with_rule", false], [6, "save_dataframes_to_excel", false], [6, "scatter_fit_plot", false], [6, "stacked_crosstab_plot", false], [6, "strip_trailing_period", false], [6, "summarize_all_combinations", false]], "contingency_table()": [[6, "contingency_table", false]], "dataframe_columns()": [[6, "dataframe_columns", false]], "ensure_directory()": [[6, "ensure_directory", false]], "highlight_columns()": [[6, "highlight_columns", false]], "kde_distributions()": [[6, "kde_distributions", false]], "parse_date_with_rule()": [[6, "parse_date_with_rule", false]], "save_dataframes_to_excel()": [[6, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[6, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[6, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[6, "strip_trailing_period", false]], "summarize_all_combinations()": [[6, "summarize_all_combinations", false]]}, "objects": {"": [[6, 0, 1, "", "add_ids"], [6, 0, 1, "", "box_violin_plot"], [6, 0, 1, "", "contingency_table"], [6, 0, 1, "", "dataframe_columns"], [6, 0, 1, "", "ensure_directory"], [6, 0, 1, "", "highlight_columns"], [6, 0, 1, "", "kde_distributions"], [6, 0, 1, "", "parse_date_with_rule"], [6, 0, 1, "", "save_dataframes_to_excel"], [6, 0, 1, "", "scatter_fit_plot"], [6, 0, 1, "", "stacked_crosstab_plot"], [6, 0, 1, "", "strip_trailing_period"], [6, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 6], "0": [2, 3, 4, 6], "00": 6, "000000": 6, "0000ff": 6, "00bfc4": 6, "01": 6, "02": 6, "03021": [5, 6], "04": 6, "07": 6, "09": 6, "1": [1, 3, 6], "10": [2, 5, 6], "100": 6, "10724": 6, "11": 6, "1109": [5, 6], "111": 6, "115": 6, "11687": 6, "11th": 6, "12": [3, 6], "12202842": 6, "123": 6, "12929": 6, "13": 6, "131": 6, "13162633": 2, "13163208": 2, "13174": 6, "1348": 6, "13920": 6, "14": 6, "147": 6, "14x4": 6, "15": 6, "150": 6, "15784": 6, "16": 6, "16192": 6, "17": 6, "18": 6, "1873": 6, "19716": 6, "1994": 6, "1996": [5, 6], "1b0": 4, "1rc0": 4, "2": [3, 4, 6], "200": 6, "2007": [5, 6], "2020": 6, "2021": [5, 6], "2022": 6, "2024": 2, "203488": 6, "21": [3, 6], "21105": [5, 6], "2115": 6, "215646": 6, "22379": 6, "2245": 6, "22803": 6, "23": 6, "234721": 6, "24432": [5, 6], "24720": 6, "25": 6, "250": 6, "2509": 6, "2565": 6, "26": 6, "27": 6, "274": 6, "28": 6, "280": 6, "28523": 6, "29": 6, "295": 6, "2d": [5, 6], "3": [3, 4, 5, 6], "30": 6, "300": 6, "3021": [5, 6], "3054": 6, "31": 6, "3188": 6, "32": 6, "32650": 6, "33": 6, "333333": 6, "338409": 6, "33906": 6, "34": 6, "3461": 6, "35130194": 6, "36": 6, "3680": 6, "37": 6, "37155": 6, "38": 6, "3853": 6, "39": 6, "3986": 6, "4": [2, 3, 4, 6], "40": 6, "41": 6, "4110": 6, "41762": 6, "42": 6, "42643227": 6, "4267": 6, "43832": 6, "44807": 6, "45": 6, "46": 6, "46560": 6, "467": 6, "468": 6, "469": 6, "47": 6, "470": 6, "471": 6, "472": 6, "4746": 6, "48842": 6, "49": 6, "5": [3, 4, 6], "50": 6, "50k": 6, "50k_": 6, "51": 6, "5281": 2, "53": 6, "535": 6, "55": [5, 6], "56": 6, "5623": 6, "5707": 6, "58": 6, "5856": 6, "59": 6, "595": 6, "6": [1, 3, 5, 6], "60": [5, 6], "61": 6, "6172": 6, "62": 6, "64": 6, "65": 6, "66": 6, "6619": 6, "668": 6, "6738": 6, "69": 6, "7": [1, 3, 6], "70": 6, "71": 6, "73": 6, "74": 6, "74130842": 6, "746": 6, "75": 6, "7536": 6, "76": 6, "77": 6, "77516": 6, "79": 6, "8": 6, "80": 6, "808080": 6, "809": 6, "81": 6, "815": 6, "82": 6, "8213": 6, "82943611": 6, "83": 6, "83311": 6, "85": 6, "8601": 6, "861555": 6, "87": 6, "87104229": 6, "89": 6, "9": [5, 6], "90": [5, 6], "90069867": 6, "9076": 6, "91": 6, "93": 6, "93837254": 6, "939": 6, "94": 6, "9468": 6, "95": [5, 6], "96": 6, "96078789": 6, "963": 6, "966": 6, "97": 6, "97751875": 6, "98": 6, "99": 6, "A": [1, 3, 5, 6], "By": 6, "For": 6, "If": [1, 6], "In": 6, "It": [1, 3, 6], "No": 1, "Not": 6, "One": 1, "The": [1, 3, 5, 6], "Then": 6, "These": [1, 6], "To": 6, "With": 4, "abil": [1, 6], "abl": 6, "about": 6, "abov": [1, 6], "academ": 0, "accept": 1, "access": 6, "accord": [1, 6], "account": 1, "accur": 6, "acknowledg": [1, 4], "across": [1, 6], "actual": 6, "ad": [1, 4], "adapt": 6, "add": 6, "add_best_fit_lin": 6, "add_id": [1, 4, 6], "addit": [1, 6], "addition": [3, 6], "address": [1, 3], "adher": 6, "adjust": 6, "adm": 6, "aesthet": 6, "affect": 6, "after": [1, 6], "ag": 6, "against": 6, "age_boxplot_list": 6, "age_group": 6, "ages_18_to_40": 6, "aggreg": 6, "alic": 6, "align": 6, "all": [1, 3, 6], "all_combin": 6, "allow": [1, 6], "along": [1, 6], "alpha": [1, 6], "alreadi": 6, "also": [0, 6], "altern": 6, "alwai": 1, "amount": 6, "an": [0, 1, 6], "analysi": [3, 4], "analyst": 3, "analyz": 6, "angl": 6, "ani": [1, 3, 6], "annot": 6, "anomali": 3, "anoth": 6, "anyth": 1, "appear": 6, "append": 6, "appli": [0, 1, 3, 6], "applic": 1, "appropri": 6, "ar": [1, 6], "around": 6, "arrang": 6, "artifact": 6, "asian": 6, "aspect": 3, "assess": 6, "assign": 6, "associ": 3, "assum": 6, "attempt": 6, "attract": 6, "attribut": 6, "aug": 2, "author": 2, "auto": 6, "autofit": 6, "autom": 3, "automat": [3, 6], "avail": 6, "avoid": 1, "ax": [1, 6], "axi": [1, 6], "bachelor": 6, "back": 6, "background": 6, "badg": 1, "bar": [1, 3, 4], "barh": 6, "base": [1, 6], "base_path": 6, "bbox_inch": 6, "becaus": 6, "been": [1, 6], "befor": [1, 3, 6], "being": 6, "below": 6, "beneath": 6, "best": [3, 4], "best_fit_linecolor": 6, "best_fit_linestyl": 6, "better": [3, 6], "between": [1, 6], "bin": [1, 4], "bin_ag": 6, "binrang": 6, "binwidth": [1, 6], "black": 6, "bob": 6, "bold": 6, "bool": 6, "boolean": 6, "border": 6, "both": [1, 6], "bound": 6, "box": [1, 3, 4], "box_violin_plot": [1, 4, 6], "boxplot": 6, "breakdown": 6, "broad": 3, "brown": 6, "built": 6, "c0": 6, "c5gp7": [5, 6], "calcul": 6, "call": 6, "can": [1, 3, 6], "cannot": 6, "capit": 6, "career": 0, "case": 6, "categor": [1, 6], "categori": 4, "cell": 6, "censu": [5, 6], "census_id": 6, "census_summary_t": 6, "centric": 4, "certain": 6, "certifi": 1, "chang": [1, 6], "changelog": 4, "charact": 6, "characterist": 3, "charli": 6, "check": [1, 6], "choos": [1, 6], "circl": 6, "citat": 1, "cite": 4, "civ": 6, "clariti": 6, "clean": [1, 3, 6], "cleaner": 6, "cleanup": 1, "clear": 6, "cleric": 6, "code": [1, 6], "codebas": 1, "coeffici": 6, "cohes": 6, "col": [1, 6], "col1": 1, "col2": 1, "color": [1, 6], "column": [1, 4], "column_nam": 6, "combin": [3, 4], "come": 1, "comment": 1, "common": [3, 6], "compar": 6, "comparison": 6, "compat": 1, "complex": 6, "comprehens": [1, 3, 6], "comput": [5, 6], "condit": 1, "configur": 6, "confirm": 1, "confus": 6, "consist": [1, 6], "constant": 6, "contain": 6, "content": 6, "conting": [1, 3, 4], "contingency_t": [4, 6], "control": [1, 6], "convers": [1, 6], "convert": [1, 6], "correct": [1, 3, 6], "correctli": [1, 6], "correl": 6, "correspond": 6, "count": [1, 4], "countri": 6, "creat": [3, 4], "creation": 6, "crop": 6, "crosstab": [1, 4], "crosstab_age_incom": 6, "crosstab_age_sex": 6, "crosstabs_dict": 6, "crosstabs_onli": 6, "crucial": [3, 6], "current": 6, "custom": [1, 3, 4], "custom_ord": 6, "customiz": [1, 3, 6], "cut": 6, "d": [5, 6], "dai": 6, "dark": 6, "data": [0, 1, 3, 4, 5], "data_nam": 6, "data_output": 6, "data_path": 6, "data_typ": 1, "datafram": [1, 3, 4], "dataframe_column": [4, 6], "dataset": [3, 6], "date": [3, 4], "date_column": 6, "date_str": 6, "datetim": 1, "david": 6, "dd": 6, "deal": 6, "decim": [1, 6], "decimal_plac": [1, 6], "dedic": 0, "deepest": 0, "default": [1, 6], "defin": 6, "degre": 6, "demograph": 6, "demonstr": 6, "densiti": [1, 4], "depend": [3, 6], "descend": 6, "describ": 6, "descript": [1, 3, 4], "design": [3, 6], "detail": 6, "deviat": 3, "df": [1, 6], "df_censu": 6, "df_dict": 6, "dict": 6, "dictionari": 6, "did": 1, "diego": 0, "differ": [1, 6], "digit": [1, 6], "dir": 6, "direct": 6, "directli": [1, 3, 6], "directori": [3, 4], "disabl": [1, 6], "disable_sci_not": [1, 6], "discov": 3, "displai": 6, "distinguish": 6, "distribut": [1, 3, 4], "divid": 6, "divorc": 6, "do": 6, "docstr": 1, "document": [1, 4], "doe": 6, "doi": [2, 5, 6], "doubl": 6, "dr": 0, "draw": 6, "dtype": 6, "due": 6, "duplic": 1, "dure": [0, 1], "e": 6, "each": [1, 6], "eas": 3, "easi": [3, 6], "easier": 6, "easili": 6, "ebrahim": 0, "eda_toolkit": [3, 5, 6], "edg": [1, 6], "edgecolor": 1, "educ": [0, 6], "effect": [3, 6], "either": [1, 6], "element": [1, 6], "els": 1, "emp": 6, "emphas": 1, "emploi": 6, "empti": 6, "enabl": [1, 3, 6], "endeavor": 0, "engin": [0, 5, 6], "enhanc": [1, 3, 6], "ensu": 6, "ensur": [1, 3, 6], "ensure_directori": [4, 6], "enter": 6, "entir": 6, "entri": [1, 6], "environ": [0, 5, 6], "equal": 6, "equat": 6, "equival": 6, "error": [1, 6], "essenti": 3, "estim": 6, "etc": 3, "ev": 6, "even": 6, "everyth": 6, "examin": 6, "exampl": [3, 4], "excel": [3, 4], "except": [0, 1], "excess": 6, "exec": 6, "execut": 6, "exist": 6, "explain": 6, "explan": 1, "explicitli": 1, "explor": 3, "exploratori": 3, "export": [3, 6], "express": 0, "extend": 0, "extens": 6, "f8766d": 6, "f8c5c8": 6, "facilit": [3, 6], "fall": 6, "fals": [1, 6], "famili": 6, "fashion": 6, "featur": [4, 6], "feder": 6, "feedback": 1, "femal": 6, "female_": 6, "few": 6, "ff0000": 6, "figsiz": 1, "figur": [1, 6], "file": [1, 6], "file_nam": 6, "file_path": 6, "file_prefix": 6, "filenam": 6, "fill": [1, 6], "fill_alpha": [1, 6], "fillna": 1, "filter": 6, "filtered_df": 6, "financi": 6, "first": [1, 6], "fit": [1, 3, 4], "fix": 1, "flexibl": [1, 6], "flip": 6, "float": 6, "fnlwgt": 6, "focu": 6, "focus": 6, "folder": 6, "follow": [1, 3, 6], "font": [1, 6], "fontsiz": 1, "form": 3, "format": [1, 3, 4], "former": 6, "formerli": 1, "found": 1, "four": 6, "frequenc": [1, 6], "frequent": 6, "from": [0, 1, 3, 6], "full": 6, "fulli": 6, "func_col": 6, "function": [1, 3, 6], "further": 6, "futur": 6, "g": 6, "gain": [3, 6], "gener": [1, 3, 4], "get": 3, "get_text": 1, "gil": 2, "github": 3, "give": 1, "given": 6, "go": 6, "gov": 6, "grad": 6, "graduat": 0, "graphic": [5, 6], "gratitud": 0, "greater": 6, "green": 6, "grei": 6, "grid": [1, 4], "grid_figs": 6, "ground": 6, "group": [1, 4], "gt": 6, "guid": [0, 6], "guidanc": 1, "guidelin": 6, "h": 6, "h_pad": 6, "ha": 6, "handl": [1, 3, 6], "handler": 6, "have": [1, 6], "header": [1, 6], "height": 6, "help": [3, 6], "here": 6, "hi": 0, "hidden": 6, "hide": 6, "high": 6, "higher": 3, "highlight": 4, "highlight_column": [4, 6], "highlighted_df": 6, "hist": [1, 6], "hist_color": 6, "hist_edgecolor": [1, 6], "histogram": [1, 4], "horizont": 6, "hour": 6, "how": 6, "howev": 6, "html": 6, "http": [2, 5, 6], "hue": [1, 6], "hue_dict": 6, "hue_palett": 6, "hunter": [5, 6], "husband": 6, "hyperlink": 6, "hypothes": 3, "i": [1, 4, 6], "icon": 1, "id": [1, 3, 6], "id_colnam": 6, "identifi": [3, 4], "illustr": 6, "imag": 6, "image_filenam": 6, "image_path_png": 6, "image_path_svg": 6, "impact": 1, "implement": 1, "impor": 6, "import": [1, 6], "imposs": 6, "improv": 1, "inc": 6, "inch": 6, "includ": [3, 6], "incom": [5, 6], "inconsist": [1, 6], "incorpor": 1, "incorrect": 6, "independ": 1, "index": [1, 6], "indic": [1, 6], "individu": [1, 6], "individual_figs": 6, "inf": 6, "inform": 6, "initi": 3, "input": [1, 6], "insight": [3, 6], "instal": 4, "instanc": 6, "instead": [1, 6], "instruct": 6, "int": [1, 6], "int64": 6, "integ": 1, "integr": [3, 6], "interest": 6, "interfac": 6, "interpret": 6, "introduc": 1, "intuit": 3, "invalid": 1, "investig": 3, "involv": [3, 6], "io": 6, "island": 6, "iso": 6, "issu": [1, 3], "its": 6, "j": [5, 6], "jinja2": 3, "join": 6, "joss": [5, 6], "journal": [5, 6], "journei": 0, "jupyt": 6, "kde": [1, 3, 4], "kde_color": 6, "kde_density_single_distribut": 6, "kde_distribut": [1, 4, 6], "keep": 6, "kei": [1, 4, 6], "kernel": 6, "keyerror": 6, "kind": 6, "kohavi": [5, 6], "l": 2, "label": [1, 6], "label_ag": 6, "label_fonts": [1, 6], "largest": 6, "last": 6, "layout": 6, "lead": 6, "learn": [0, 3, 5, 6], "least": [1, 6], "left": 6, "legend": [1, 6], "legend_label": 6, "legend_labels_list": 6, "legibl": 6, "length": 6, "leonid": 2, "less": 6, "level": 6, "leverag": 6, "librari": [1, 4, 5, 6], "licens": 1, "like": [0, 6], "limit": [1, 6], "line": [3, 4], "linear": 6, "linestyl": 6, "link": 4, "list": [1, 6], "load": 6, "local": 6, "locat": 6, "log": [1, 6], "log_scale_var": [1, 6], "logarithm": 6, "logic": [1, 6], "logo": 1, "logscal": 6, "longer": 6, "loop": 6, "loss": 6, "lt": 6, "m": [0, 5, 6], "machin": [3, 5, 6], "made": 1, "magnitud": 6, "mai": [1, 6], "main": 3, "maintain": 6, "make": 6, "male": 6, "male_": 6, "manag": [3, 4], "manageri": 6, "mani": [3, 6], "manipul": 3, "map": 6, "marco": 0, "marit": 6, "mark": [1, 6], "marker": 6, "marri": 6, "match": [1, 6], "matplotlib": [3, 5, 6], "max": 6, "max_unique_valu": 6, "max_unique_value_pct": 6, "max_unique_value_tot": 6, "maximum": 6, "mcse": [5, 6], "mean": [3, 6], "meaning": 6, "measur": 6, "median": 3, "meet": 3, "mentor": 0, "mentorship": 0, "messag": 1, "method": [3, 6], "metric": 6, "metrics_box_violin": 1, "metrics_boxplot_comp": 6, "metrics_list": 6, "min": 6, "min_length": 6, "mind": 3, "minim": [1, 6], "minimum": 6, "minor": 1, "misalign": 6, "misinterpret": 6, "mislead": [1, 6], "miss": [1, 3, 6], "mm": 6, "mode": 6, "model": [3, 6], "modifi": [1, 6], "month": [2, 6], "more": [1, 6], "most": 6, "move": 1, "multipl": [1, 3, 6], "must": 6, "n_col": 6, "n_row": 6, "na": [1, 6], "name": [1, 6], "nativ": 6, "navig": 6, "necessari": [1, 6], "need": [3, 6], "never": 6, "new": [1, 6], "next": 6, "nomenclatur": 1, "non": [1, 4], "none": 6, "normal": [1, 4], "notat": [1, 6], "note": 6, "notebook": 6, "noth": 6, "now": 1, "null": [1, 6], "null_pct": 6, "null_tot": 6, "num": 6, "num_digit": 6, "number": [1, 6], "numer": [1, 4], "numpi": 3, "o": [2, 6], "object": 6, "observ": 6, "occup": 6, "occurr": 6, "offer": [3, 6], "often": [3, 6], "one": [1, 6], "onli": [1, 6], "opaqu": 6, "open": [5, 6], "oper": 6, "option": [1, 3, 6], "orang": 6, "order": 6, "org": [2, 5, 6], "organ": 6, "orient": 6, "origin": 6, "original_df": 6, "oscar": 2, "other": [1, 6], "otherwis": 6, "our": 0, "out": 6, "outlier": 3, "output": [1, 6], "over": 6, "overal": [1, 6], "overlai": 6, "overlaid": 6, "overrid": 6, "own": 6, "p": 6, "pac": 6, "packag": 3, "pad": 6, "page": 3, "pair": 6, "palett": 6, "panda": [3, 6], "param": 1, "paramet": [1, 6], "pardir": 6, "parent": 6, "pars": 6, "parse_date_with_rul": [4, 6], "part": 6, "particular": 6, "particularli": 6, "pass": 6, "path": 4, "patient": 6, "pattern": [3, 6], "pd": 6, "pearson": 6, "per": 6, "percent": [1, 6], "percentag": 6, "perform": [1, 6], "performancewarn": 1, "period": 4, "perspect": 6, "pink": 6, "pip": 3, "pivot": [0, 4], "place": [1, 6], "plai": 0, "plot": [1, 3, 4], "plot_typ": [1, 6], "plots_onli": 6, "plt": 1, "png": 6, "png_imag": 6, "point": 6, "popular": 3, "possibl": [3, 6], "potenti": [1, 6], "power": 6, "pr": 1, "preced": 6, "prefer": 6, "prefix": 6, "prepar": 4, "prerequisit": 4, "present": 6, "preval": 6, "prevent": 6, "previou": 6, "print": [1, 6], "prior": 6, "privat": 6, "probabl": [1, 6], "process": [1, 3, 6], "produc": [1, 6], "prof": 6, "program": 0, "project": [1, 4, 6], "proper": [1, 6], "properli": 6, "proport": [1, 6], "provid": [0, 1, 3, 6], "public": 6, "publish": 2, "purpos": 4, "pursu": 0, "py": 1, "pypi": 3, "python": [1, 4], "qualiti": [3, 6], "quantit": 6, "quick": 6, "quickli": 3, "r": [5, 6], "race": 6, "rais": [1, 6], "random": 6, "rang": [3, 6], "raw": 6, "re": 1, "read": 6, "readabl": [1, 6], "readi": 3, "readm": 1, "record": 6, "red": 6, "refer": [4, 6], "refin": 1, "reflect": [1, 6], "regress": 4, "regular": [1, 4], "relat": 6, "relationship": [3, 6], "releas": 1, "relev": 3, "reli": 6, "remain": 6, "remov": [1, 3, 4], "remove_stack": [1, 6], "renam": 1, "render": 6, "replac": 6, "report": [3, 6], "repositori": [3, 5, 6], "repres": 6, "represent": 6, "reproduc": 6, "requir": [1, 3, 6], "research": 3, "reset": 1, "respect": 6, "rest": 6, "result": 6, "return": 6, "return_dict": 6, "rich": 6, "right": 6, "robust": 1, "role": 0, "rot": 6, "rotat": 6, "rotate_plot": 6, "round": 6, "row": 6, "rule": 6, "run": 3, "same": 6, "sampl": 6, "san": 0, "save": [3, 4], "save_dataframes_to_excel": [1, 4, 6], "save_format": 6, "save_plot": 6, "scale": [1, 6], "scatter": [1, 3, 4], "scatter_color": 6, "scatter_fit_plot": [1, 4, 6], "scenario": 6, "schema": 6, "scheme": 6, "school": 0, "scienc": [0, 3, 5, 6], "scientif": [1, 6], "scientist": [0, 3], "seaborn": [3, 5, 6], "seamlessli": 3, "second": 6, "section": [1, 6], "see": 6, "seed": 6, "select": 6, "self": 6, "separ": [1, 6], "sequenc": 6, "set": [1, 6], "set_as_index": 6, "set_titl": 1, "setp": 1, "setup": [1, 6], "sever": 6, "sex": 6, "shape": 6, "sheet": 6, "shilei": 0, "show": 6, "show_correl": 6, "show_legend": 6, "show_plot": 6, "shown": 6, "shpaner": 2, "shpaner_2024_13162633": 2, "similarli": 6, "simplic": 3, "sinc": 6, "singl": [1, 6], "single_figs": 6, "single_var_image_filenam": 6, "single_var_image_path_png": 6, "single_var_image_path_svg": 6, "size": [1, 6], "smallest": 6, "smooth": 6, "snippet": 6, "so": [1, 6], "softwar": [2, 5, 6], "some": 6, "sort": [1, 6], "sort_bi": [1, 6], "sortbi": 1, "sourc": [5, 6], "space": 6, "span": 6, "special": 6, "specialti": 6, "specif": [1, 3, 4], "specifi": [1, 3, 6], "spous": 6, "squar": 6, "stabl": 1, "stack": [1, 3, 4], "stacked_crosstab": 6, "stacked_crosstab_plot": [1, 4, 6], "standard": [1, 3, 4], "standardized_d": 6, "start": [1, 3, 6], "stat": [1, 6], "state": 6, "statist": [1, 3, 5, 6], "statu": 6, "step": 3, "still": 6, "store": 1, "str": 6, "streamlin": 3, "strength": 6, "string": [1, 6], "strip": 6, "strip_trailing_period": [4, 6], "structur": [1, 3], "style": 6, "styler": 6, "subplot": 6, "success": 0, "successfulli": [0, 1], "suit": 3, "summar": 3, "summari": [3, 4], "summarize_all_combin": [4, 6], "summary_t": 6, "support": [0, 1, 6], "suppress": 6, "sure": 6, "svg": 6, "svg_imag": 6, "sy": 1, "system": [3, 6], "tab": 6, "tabl": [1, 3], "tailor": 6, "take": 6, "tall": 6, "tarshizi": 0, "task": [3, 6], "techniqu": 3, "test": 1, "text": [1, 6], "text_wrap": [1, 6], "than": [1, 6], "thank": 0, "thei": 6, "them": [1, 6], "therefor": 6, "thi": [1, 3, 6], "three": 6, "through": 1, "throw": 1, "thu": 6, "tick": [1, 6], "tick_fonts": [1, 6], "tight": 6, "time": [0, 1, 6], "titl": [1, 2, 6], "to_list": 6, "toggl": [1, 6], "tool": [3, 6], "top": 6, "total": 6, "trail": 4, "transpar": [1, 6], "trend": [3, 6], "true": [1, 6], "truth": 6, "tupl": 6, "two": 6, "type": [1, 3, 6], "u": [0, 6], "uci": [5, 6], "unambigu": 6, "uncov": 3, "underli": 3, "understand": [3, 6], "uniform": 1, "uniqu": [1, 3, 4], "unique_values_tot": 6, "unique_var": 6, "unit": 6, "univers": 0, "unrecogn": 6, "unstack": 6, "unus": 1, "unwav": 0, "up": [1, 6], "updat": [1, 6], "upright": 6, "url": 2, "us": [1, 3, 6], "usag": [1, 6], "user": [1, 3, 6], "userwarn": 6, "util": [3, 6], "valid": 1, "valu": [1, 3, 6], "valueerror": [1, 6], "vari": 6, "variabl": [1, 3, 4], "varieti": 3, "variou": [1, 3, 6], "vars_of_interest": 6, "verbiag": 1, "verifi": [1, 6], "versatil": 6, "version": [2, 3, 4, 6], "version_info": 1, "vertic": 6, "via": 6, "view": 6, "violin": [1, 3, 4], "violinplot": 6, "visual": [3, 5, 6], "vriabl": 6, "w": 2, "w_pad": 6, "wa": 6, "warn": 1, "waskom": [5, 6], "we": [0, 6], "week": 6, "welcom": 4, "well": 6, "were": 6, "what": 4, "when": [1, 3, 6], "where": 6, "whether": [1, 6], "which": [1, 3, 6], "while": [1, 6], "white": 6, "whitespac": 6, "wide": 6, "width": [1, 6], "wife": 6, "within": [1, 6], "without": 6, "work": [1, 6], "workclass": 6, "workflow": 3, "would": [0, 6], "wrap": [1, 6], "write": 6, "x": [1, 6], "x_var": 6, "xlabel": 6, "xlabel_rot": 6, "xlim": [1, 6], "xlsx": 6, "xlsxwriter": 3, "y": [1, 6], "y_axis_label": 6, "y_var": 6, "year": [2, 6], "yellow": 6, "ylabel": 6, "ylim": [1, 6], "you": [3, 6], "your": [3, 6], "yyyi": 6, "zenodo": [1, 2], "zero": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References", "Description"], "titleterms": {"0": 1, "1b0": 1, "1rc0": 1, "2": 1, "3": 1, "4": 1, "5": 1, "With": 6, "about": 4, "acknowledg": 0, "ad": 6, "analysi": 6, "bar": 6, "best": 6, "bin": 6, "box": 6, "categori": 6, "centric": 6, "changelog": 1, "cite": 2, "column": 6, "combin": 6, "content": 4, "conting": 6, "count": 6, "creat": 6, "crosstab": 6, "custom": 6, "data": 6, "datafram": 6, "date": 6, "densiti": 6, "descript": 6, "directori": 6, "distribut": 6, "document": 3, "eda": [2, 3, 4], "exampl": 6, "excel": 6, "featur": 3, "fit": 6, "format": 6, "gener": 6, "get": 4, "grid": 6, "group": 6, "guid": 4, "highlight": 6, "histogram": 6, "i": 3, "identifi": 6, "instal": 3, "kde": 6, "kei": 3, "librari": 3, "line": 6, "link": 3, "manag": 6, "non": 6, "normal": 6, "numer": 6, "path": 6, "period": 6, "pivot": 6, "plot": 6, "prepar": 6, "prerequisit": 3, "project": 3, "purpos": 3, "python": 3, "refer": 5, "regress": 6, "regular": 6, "remov": 6, "save": 6, "scatter": 6, "specif": 6, "stack": 6, "standard": 6, "start": 4, "summari": 6, "tabl": [4, 6], "toolkit": [2, 3, 4], "trail": 6, "uniqu": 6, "usag": 4, "variabl": 6, "version": 1, "violin": 6, "welcom": 3, "what": 3}}) \ No newline at end of file +Search.setIndex({"alltitles": {"About EDA Toolkit": [[4, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[6, "adding-unique-identifiers"]], "Binning Numerical Columns": [[6, "binning-numerical-columns"]], "Box Plots Grid Example": [[6, "box-plots-grid-example"]], "Box and Violin Plots": [[6, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Creating Contingency Tables": [[6, "creating-contingency-tables"]], "Data Preparation and Management": [[6, "data-preparation-and-management"]], "DataFrame Analysis": [[6, "dataframe-analysis"]], "Description": [[6, null]], "Generating Summary Tables for Variable Combinations": [[6, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[4, null]], "Highlighting Specific Columns in a DataFrame": [[6, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[6, "histogram-example-count"]], "Histogram Example (Density)": [[6, "histogram-example-density"]], "Installation": [[3, "installation"]], "KDE and Histogram Distribution Plots": [[6, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[6, "kde-and-histograms-example"]], "Key Features": [[3, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[6, "non-normalized-stacked-bar-plots-example"]], "Path directories": [[6, "path-directories"]], "Pivoted Stacked Bar Plots Example": [[6, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[6, "pivoted-violin-plots-grid-example"]], "Prerequisites": [[3, "prerequisites"]], "Project Links": [[3, "project-links"]], "Purpose of EDA Toolkit": [[3, "purpose-of-eda-toolkit"]], "References": [[5, null]], "Regression-Centric Scatter Plots Example": [[6, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[6, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[6, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Plots Grouped by Category Example": [[6, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[6, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[6, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[6, "stacked-crosstab-plots"]], "Standardized Dates": [[6, "standardized-dates"]], "Table of Contents": [[4, null]], "Trailing Period Removal": [[6, "trailing-period-removal"]], "Usage Guide": [[4, null]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id2"], [1, "id3"], [1, "id4"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Violin Plots Grid Example": [[6, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[3, null]], "What is EDA?": [[3, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "getting_started", "index", "references", "usage_guide"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "getting_started.rst", "index.rst", "references.rst", "usage_guide.rst"], "indexentries": {"add_ids()": [[6, "add_ids", false]], "box_violin_plot()": [[6, "box_violin_plot", false]], "built-in function": [[6, "add_ids", false], [6, "box_violin_plot", false], [6, "contingency_table", false], [6, "dataframe_columns", false], [6, "ensure_directory", false], [6, "highlight_columns", false], [6, "kde_distributions", false], [6, "parse_date_with_rule", false], [6, "save_dataframes_to_excel", false], [6, "scatter_fit_plot", false], [6, "stacked_crosstab_plot", false], [6, "strip_trailing_period", false], [6, "summarize_all_combinations", false]], "contingency_table()": [[6, "contingency_table", false]], "dataframe_columns()": [[6, "dataframe_columns", false]], "ensure_directory()": [[6, "ensure_directory", false]], "highlight_columns()": [[6, "highlight_columns", false]], "kde_distributions()": [[6, "kde_distributions", false]], "parse_date_with_rule()": [[6, "parse_date_with_rule", false]], "save_dataframes_to_excel()": [[6, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[6, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[6, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[6, "strip_trailing_period", false]], "summarize_all_combinations()": [[6, "summarize_all_combinations", false]]}, "objects": {"": [[6, 0, 1, "", "add_ids"], [6, 0, 1, "", "box_violin_plot"], [6, 0, 1, "", "contingency_table"], [6, 0, 1, "", "dataframe_columns"], [6, 0, 1, "", "ensure_directory"], [6, 0, 1, "", "highlight_columns"], [6, 0, 1, "", "kde_distributions"], [6, 0, 1, "", "parse_date_with_rule"], [6, 0, 1, "", "save_dataframes_to_excel"], [6, 0, 1, "", "scatter_fit_plot"], [6, 0, 1, "", "stacked_crosstab_plot"], [6, 0, 1, "", "strip_trailing_period"], [6, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 6], "0": [2, 3, 4, 6], "00": 6, "000000": 6, "0000ff": 6, "00bfc4": 6, "01": 6, "02": 6, "03021": [5, 6], "04": 6, "07": 6, "09": 6, "1": [1, 3, 6], "10": [2, 5, 6], "100": 6, "10724": 6, "11": 6, "1109": [5, 6], "111": 6, "115": 6, "11687": 6, "11th": 6, "12": [3, 6], "12202842": 6, "123": 6, "12929": 6, "13": 6, "131": 6, "13162633": 2, "13163208": 2, "13174": 6, "1348": 6, "13920": 6, "14": 6, "147": 6, "14x4": 6, "15": 6, "150": 6, "15784": 6, "16": 6, "16192": 6, "17": 6, "18": 6, "1873": 6, "19716": 6, "1994": 6, "1996": [5, 6], "1b0": 4, "1rc0": 4, "2": [3, 4, 6], "200": 6, "2007": [5, 6], "2020": 6, "2021": [5, 6], "2022": 6, "2024": 2, "203488": 6, "21": [3, 6], "21105": [5, 6], "2115": 6, "215646": 6, "22379": 6, "2245": 6, "22803": 6, "23": 6, "234721": 6, "24432": [5, 6], "24720": 6, "25": 6, "250": 6, "2509": 6, "2565": 6, "26": 6, "27": 6, "274": 6, "28": 6, "280": 6, "28523": 6, "29": 6, "295": 6, "2d": [5, 6], "3": [3, 4, 5, 6], "30": 6, "300": 6, "3021": [5, 6], "3054": 6, "31": 6, "3188": 6, "32": 6, "32650": 6, "33": 6, "333333": 6, "338409": 6, "33906": 6, "34": 6, "3461": 6, "35130194": 6, "36": 6, "3680": 6, "37": 6, "37155": 6, "38": 6, "3853": 6, "39": 6, "3986": 6, "4": [2, 3, 4, 6], "40": 6, "41": 6, "4110": 6, "41762": 6, "42": 6, "42643227": 6, "4267": 6, "43832": 6, "44807": 6, "45": 6, "46": 6, "46560": 6, "467": 6, "468": 6, "469": 6, "47": 6, "470": 6, "471": 6, "472": 6, "4746": 6, "48842": 6, "49": 6, "5": [3, 4, 6], "50": 6, "50k": 6, "50k_": 6, "51": 6, "5281": 2, "53": 6, "535": 6, "55": [5, 6], "56": 6, "5623": 6, "5707": 6, "58": 6, "5856": 6, "59": 6, "595": 6, "6": [1, 3, 5, 6], "60": [5, 6], "61": 6, "6172": 6, "62": 6, "64": 6, "65": 6, "66": 6, "6619": 6, "668": 6, "6738": 6, "69": 6, "7": [1, 3, 6], "70": 6, "71": 6, "73": 6, "74": 6, "74130842": 6, "746": 6, "75": 6, "7536": 6, "76": 6, "77": 6, "77516": 6, "79": 6, "8": 6, "80": 6, "808080": 6, "809": 6, "81": 6, "815": 6, "82": 6, "8213": 6, "82943611": 6, "83": 6, "83311": 6, "85": 6, "8601": 6, "861555": 6, "87": 6, "87104229": 6, "89": 6, "9": [5, 6], "90": [5, 6], "90069867": 6, "9076": 6, "91": 6, "93": 6, "93837254": 6, "939": 6, "94": 6, "9468": 6, "95": [5, 6], "96": 6, "96078789": 6, "963": 6, "966": 6, "97": 6, "97751875": 6, "98": 6, "99": 6, "A": [1, 3, 5, 6], "By": 6, "For": 6, "If": [1, 6], "In": 6, "It": [1, 3, 6], "No": 1, "Not": 6, "One": 1, "The": [1, 3, 5, 6], "Then": 6, "These": [1, 6], "To": 6, "With": 4, "abil": [1, 6], "abl": 6, "about": 6, "abov": [1, 6], "academ": 0, "accept": 1, "access": 6, "accord": [1, 6], "account": 1, "accur": 6, "acknowledg": [1, 4], "across": [1, 6], "actual": 6, "ad": [1, 4], "adapt": 6, "add": 6, "add_best_fit_lin": 6, "add_id": [1, 4, 6], "addit": [1, 6], "addition": [3, 6], "address": [1, 3], "adher": 6, "adjust": 6, "adm": 6, "aesthet": 6, "affect": 6, "after": [1, 6], "ag": 6, "against": 6, "age_boxplot_list": 6, "age_group": 6, "ages_18_to_40": 6, "aggreg": 6, "alic": 6, "align": 6, "all": [1, 3, 6], "all_combin": 6, "allow": [1, 6], "along": [1, 6], "alpha": [1, 6], "alreadi": 6, "also": [0, 6], "altern": 6, "alwai": 1, "amount": 6, "an": [0, 1, 6], "analysi": [3, 4], "analyst": 3, "analyz": 6, "angl": 6, "ani": [1, 3, 6], "annot": 6, "anomali": 3, "anoth": 6, "anyth": 1, "appear": 6, "append": 6, "appli": [0, 1, 3, 6], "applic": 1, "appropri": 6, "ar": [1, 6], "around": 6, "arrang": 6, "artifact": 6, "asian": 6, "aspect": 3, "assess": 6, "assign": 6, "associ": 3, "assum": 6, "attempt": 6, "attract": 6, "attribut": 6, "aug": 2, "author": 2, "auto": 6, "autofit": 6, "autom": 3, "automat": [3, 6], "avail": 6, "avoid": 1, "ax": [1, 6], "axi": [1, 6], "bachelor": 6, "back": 6, "background": 6, "badg": 1, "bar": [1, 3, 4], "barh": 6, "base": [1, 6], "base_path": 6, "bbox_inch": 6, "becaus": 6, "been": [1, 6], "befor": [1, 3, 6], "being": 6, "below": 6, "beneath": 6, "best": [3, 4], "best_fit_linecolor": 6, "best_fit_linestyl": 6, "better": [3, 6], "between": [1, 6], "bin": [1, 4], "bin_ag": 6, "binrang": 6, "binwidth": [1, 6], "black": 6, "bob": 6, "bold": 6, "bool": 6, "boolean": 6, "border": 6, "both": [1, 6], "bound": 6, "box": [1, 3, 4], "box_violin_plot": [1, 4, 6], "boxplot": 6, "breakdown": 6, "broad": 3, "brown": 6, "built": 6, "c0": 6, "c5gp7": [5, 6], "calcul": 6, "call": 6, "can": [1, 3, 6], "cannot": 6, "capit": 6, "career": 0, "case": 6, "categor": [1, 6], "categori": 4, "cell": 6, "censu": [5, 6], "census_id": 6, "census_summary_t": 6, "centric": 4, "certain": 6, "certifi": 1, "chang": [1, 6], "changelog": 4, "charact": 6, "characterist": 3, "charli": 6, "check": [1, 6], "choos": [1, 6], "circl": 6, "citat": 1, "cite": 4, "civ": 6, "clariti": 6, "clean": [1, 3, 6], "cleaner": 6, "cleanup": 1, "clear": 6, "cleric": 6, "code": [1, 6], "codebas": 1, "coeffici": 6, "cohes": 6, "col": [1, 6], "col1": 1, "col2": 1, "color": [1, 6], "column": [1, 4], "column_nam": 6, "combin": [3, 4], "come": 1, "comment": 1, "common": [3, 6], "compar": 6, "comparison": 6, "compat": 1, "complex": 6, "comprehens": [1, 3, 6], "comput": [5, 6], "condit": 1, "configur": 6, "confirm": 1, "confus": 6, "consist": [1, 6], "constant": 6, "contain": 6, "content": 6, "conting": [1, 3, 4], "contingency_t": [4, 6], "control": [1, 6], "convers": [1, 6], "convert": [1, 6], "correct": [1, 3, 6], "correctli": [1, 6], "correl": 6, "correspond": 6, "count": [1, 4], "countri": 6, "creat": [3, 4], "creation": 6, "crop": 6, "crosstab": [1, 4], "crosstab_age_incom": 6, "crosstab_age_sex": 6, "crosstabs_dict": 6, "crosstabs_onli": 6, "crucial": [3, 6], "current": 6, "custom": [1, 3, 4], "custom_ord": 6, "customiz": [1, 3, 6], "cut": 6, "d": [5, 6], "dai": 6, "dark": 6, "data": [0, 1, 3, 4, 5], "data_nam": 6, "data_output": 6, "data_path": 6, "data_typ": 1, "datafram": [1, 3, 4], "dataframe_column": [4, 6], "dataset": [3, 6], "date": [3, 4], "date_column": 6, "date_str": 6, "datetim": 1, "david": 6, "dd": 6, "deal": 6, "decim": [1, 6], "decimal_plac": [1, 6], "dedic": 0, "deepest": 0, "default": [1, 6], "defin": 6, "degre": 6, "demograph": 6, "demonstr": 6, "densiti": [1, 4], "depend": [3, 6], "descend": 6, "describ": 6, "descript": [1, 3, 4], "design": [3, 6], "detail": 6, "deviat": 3, "df": [1, 6], "df_censu": 6, "df_dict": 6, "dict": 6, "dictionari": 6, "did": 1, "diego": 0, "differ": [1, 6], "digit": [1, 6], "dir": 6, "direct": 6, "directli": [1, 3, 6], "directori": [3, 4], "disabl": [1, 6], "disable_sci_not": [1, 6], "discov": 3, "displai": 6, "distinguish": 6, "distribut": [1, 3, 4], "divid": 6, "divorc": 6, "do": 6, "docstr": 1, "document": [1, 4], "doe": 6, "doi": [2, 5, 6], "doubl": 6, "dr": 0, "draw": 6, "dtype": 6, "due": 6, "duplic": 1, "dure": [0, 1], "e": 6, "each": [1, 6], "eas": 3, "easi": [3, 6], "easier": 6, "easili": 6, "ebrahim": 0, "eda_toolkit": [3, 5, 6], "edg": [1, 6], "edgecolor": 1, "educ": [0, 6], "effect": [3, 6], "either": [1, 6], "element": [1, 6], "els": 1, "emp": 6, "emphas": 1, "emploi": 6, "empti": 6, "enabl": [1, 3, 6], "endeavor": 0, "engin": [0, 5, 6], "enhanc": [1, 3, 6], "ensu": 6, "ensur": [1, 3, 6], "ensure_directori": [4, 6], "enter": 6, "entir": 6, "entri": [1, 6], "environ": [0, 5, 6], "equal": 6, "equat": 6, "equival": 6, "error": [1, 6], "essenti": 3, "estim": 6, "etc": 3, "ev": 6, "even": 6, "everyth": 6, "examin": 6, "exampl": [3, 4], "excel": [3, 4], "except": [0, 1], "excess": 6, "exec": 6, "execut": 6, "exist": 6, "explain": 6, "explan": 1, "explicitli": 1, "explor": 3, "exploratori": 3, "export": [3, 6], "express": 0, "extend": 0, "extens": 6, "f8766d": 6, "f8c5c8": 6, "facilit": [3, 6], "fall": 6, "fals": [1, 6], "famili": 6, "fashion": 6, "featur": [4, 6], "feder": 6, "feedback": 1, "femal": 6, "female_": 6, "few": 6, "ff0000": 6, "figsiz": 1, "figur": [1, 6], "file": [1, 6], "file_nam": 6, "file_path": 6, "file_prefix": 6, "filenam": 6, "fill": [1, 6], "fill_alpha": [1, 6], "fillna": 1, "filter": 6, "filtered_df": 6, "financi": 6, "first": [1, 6], "fit": [1, 3, 4], "fix": 1, "flexibl": [1, 6], "flip": 6, "float": 6, "fnlwgt": 6, "focu": 6, "focus": 6, "folder": 6, "follow": [1, 3, 6], "font": [1, 6], "fontsiz": 1, "form": 3, "format": [1, 3, 4], "former": 6, "formerli": 1, "found": 1, "four": 6, "frequenc": [1, 6], "frequent": 6, "from": [0, 1, 3, 6], "full": 6, "fulli": 6, "func_col": 6, "function": [1, 3, 6], "further": 6, "futur": 6, "g": 6, "gain": [3, 6], "gener": [1, 3, 4], "get": 3, "get_text": 1, "gil": 2, "github": 3, "give": 1, "given": 6, "go": 6, "gov": 6, "grad": 6, "graduat": 0, "graphic": [5, 6], "gratitud": 0, "greater": 6, "green": 6, "grei": 6, "grid": [1, 4], "grid_figs": 6, "ground": 6, "group": [1, 4], "gt": 6, "guid": [0, 6], "guidanc": 1, "guidelin": 6, "h": 6, "h_pad": 6, "ha": 6, "handl": [1, 3, 6], "handler": 6, "have": [1, 6], "header": [1, 6], "height": 6, "help": [3, 6], "here": 6, "hi": 0, "hidden": 6, "hide": 6, "high": 6, "higher": 3, "highlight": 4, "highlight_column": [4, 6], "highlighted_df": 6, "hist": [1, 6], "hist_color": 6, "hist_edgecolor": [1, 6], "histogram": [1, 4], "horizont": 6, "hour": 6, "how": 6, "howev": 6, "html": 6, "http": [2, 5, 6], "hue": [1, 6], "hue_dict": 6, "hue_palett": 6, "hunter": [5, 6], "husband": 6, "hyperlink": 6, "hypothes": 3, "i": [1, 4, 6], "icon": 1, "id": [1, 3, 6], "id_colnam": 6, "identifi": [3, 4], "illustr": 6, "imag": 6, "image_filenam": 6, "image_path_png": 6, "image_path_svg": 6, "impact": 1, "implement": 1, "impor": 6, "import": [1, 6], "imposs": 6, "improv": 1, "inc": 6, "inch": 6, "includ": [3, 6], "incom": [5, 6], "inconsist": [1, 6], "incorpor": 1, "incorrect": 6, "independ": 1, "index": [1, 6], "indic": [1, 6], "individu": [1, 6], "individual_figs": 6, "inf": 6, "inform": 6, "initi": 3, "input": [1, 6], "insight": [3, 6], "instal": 4, "instanc": 6, "instead": [1, 6], "instruct": 6, "int": [1, 6], "int64": 6, "integ": 1, "integr": [3, 6], "interest": 6, "interfac": 6, "interpret": 6, "introduc": 1, "intuit": 3, "invalid": 1, "investig": 3, "involv": [3, 6], "io": 6, "island": 6, "iso": 6, "issu": [1, 3], "its": 6, "j": [5, 6], "jinja2": 3, "join": 6, "joss": [5, 6], "journal": [5, 6], "journei": 0, "jupyt": 6, "kde": [1, 3, 4], "kde_color": 6, "kde_density_single_distribut": 6, "kde_distribut": [1, 4, 6], "keep": 6, "kei": [1, 4, 6], "kernel": 6, "keyerror": 6, "kind": 6, "kohavi": [5, 6], "l": 2, "label": [1, 6], "label_ag": 6, "label_fonts": [1, 6], "largest": 6, "last": 6, "layout": 6, "lead": 6, "learn": [0, 3, 5, 6], "least": [1, 6], "left": 6, "legend": [1, 6], "legend_label": 6, "legend_labels_list": 6, "legibl": 6, "length": 6, "leonid": 2, "less": 6, "level": 6, "leverag": 6, "librari": [1, 4, 5, 6], "licens": 1, "like": [0, 6], "limit": [1, 6], "line": [3, 4], "linear": 6, "linestyl": 6, "link": 4, "list": [1, 6], "load": 6, "local": 6, "locat": 6, "log": [1, 6], "log_scale_var": [1, 6], "logarithm": 6, "logic": [1, 6], "logo": 1, "logscal": 6, "longer": 6, "loop": 6, "loss": 6, "lt": 6, "m": [0, 5, 6], "machin": [3, 5, 6], "made": 1, "magnitud": 6, "mai": [1, 6], "main": 3, "maintain": 6, "make": 6, "male": 6, "male_": 6, "manag": [3, 4], "manageri": 6, "mani": [3, 6], "manipul": 3, "map": 6, "marco": 0, "marit": 6, "mark": [1, 6], "marker": 6, "marri": 6, "match": [1, 6], "matplotlib": [3, 5, 6], "max": 6, "max_unique_valu": 6, "max_unique_value_pct": 6, "max_unique_value_tot": 6, "maximum": 6, "mcse": [5, 6], "mean": [3, 6], "meaning": 6, "measur": 6, "median": 3, "meet": 3, "mentor": 0, "mentorship": 0, "messag": 1, "method": [3, 6], "metric": 6, "metrics_box_violin": 1, "metrics_boxplot_comp": 6, "metrics_list": 6, "min": 6, "min_length": 6, "mind": 3, "minim": [1, 6], "minimum": 6, "minor": 1, "misalign": 6, "misinterpret": 6, "mislead": [1, 6], "miss": [1, 3, 6], "mm": 6, "mode": 6, "model": [3, 6], "modifi": [1, 6], "month": [2, 6], "more": [1, 6], "most": 6, "move": 1, "multipl": [1, 3, 6], "must": 6, "n_col": 6, "n_row": 6, "na": [1, 6], "name": [1, 6], "nativ": 6, "navig": 6, "necessari": [1, 6], "need": [3, 6], "never": 6, "new": [1, 6], "next": 6, "nomenclatur": 1, "non": [1, 4], "none": 6, "normal": [1, 4], "notat": [1, 6], "note": 6, "notebook": 6, "noth": 6, "now": 1, "null": [1, 6], "null_pct": 6, "null_tot": 6, "num": 6, "num_digit": 6, "number": [1, 6], "numer": [1, 4], "numpi": 3, "o": [2, 6], "object": 6, "observ": 6, "occup": 6, "occurr": 6, "offer": [3, 6], "often": [3, 6], "one": [1, 6], "onli": [1, 6], "opaqu": 6, "open": [5, 6], "oper": 6, "option": [1, 3, 6], "orang": 6, "order": 6, "org": [2, 5, 6], "organ": 6, "orient": 6, "origin": 6, "original_df": 6, "oscar": 2, "other": [1, 6], "otherwis": 6, "our": 0, "out": 6, "outlier": 3, "output": [1, 6], "over": 6, "overal": [1, 6], "overlai": 6, "overlaid": 6, "overrid": 6, "own": 6, "p": 6, "pac": 6, "packag": 3, "pad": 6, "page": 3, "pair": 6, "palett": 6, "panda": [3, 6], "param": 1, "paramet": [1, 6], "pardir": 6, "parent": 6, "pars": 6, "parse_date_with_rul": [4, 6], "part": 6, "particular": 6, "particularli": 6, "pass": 6, "path": 4, "patient": 6, "pattern": [3, 6], "pd": 6, "pearson": 6, "per": 6, "percent": [1, 6], "percentag": 6, "perform": [1, 6], "performancewarn": 1, "period": 4, "perspect": 6, "pink": 6, "pip": 3, "pivot": [0, 4], "place": [1, 6], "plai": 0, "plot": [1, 3, 4], "plot_typ": [1, 6], "plots_onli": 6, "plt": 1, "png": 6, "png_imag": 6, "point": 6, "popular": 3, "possibl": [3, 6], "potenti": [1, 6], "power": 6, "pr": 1, "preced": 6, "prefer": 6, "prefix": 6, "prepar": 4, "prerequisit": 4, "present": 6, "preval": 6, "prevent": 6, "previou": 6, "print": [1, 6], "prior": 6, "privat": 6, "probabl": [1, 6], "process": [1, 3, 6], "produc": [1, 6], "prof": 6, "program": 0, "project": [1, 4, 6], "proper": [1, 6], "properli": 6, "proport": [1, 6], "provid": [0, 1, 3, 6], "public": 6, "publish": 2, "purpos": 4, "pursu": 0, "py": 1, "pypi": 3, "python": [1, 4], "qualiti": [3, 6], "quantit": 6, "quick": 6, "quickli": 3, "r": [5, 6], "race": 6, "rais": [1, 6], "random": 6, "rang": [3, 6], "raw": 6, "re": 1, "read": 6, "readabl": [1, 6], "readi": 3, "readm": 1, "record": 6, "red": 6, "refer": [4, 6], "refin": 1, "reflect": [1, 6], "regress": 4, "regular": [1, 4], "relat": 6, "relationship": [3, 6], "releas": 1, "relev": 3, "reli": 6, "remain": 6, "remov": [1, 3, 4], "remove_stack": [1, 6], "renam": 1, "render": 6, "replac": 6, "report": [3, 6], "repositori": [3, 5, 6], "repres": 6, "represent": 6, "reproduc": 6, "requir": [1, 3, 6], "research": 3, "reset": 1, "respect": 6, "rest": 6, "result": 6, "return": 6, "return_dict": 6, "rich": 6, "right": 6, "robust": 1, "role": 0, "rot": 6, "rotat": 6, "rotate_plot": 6, "round": 6, "row": 6, "rule": 6, "run": 3, "same": 6, "sampl": 6, "san": 0, "save": [3, 4], "save_dataframes_to_excel": [1, 4, 6], "save_format": 6, "save_plot": 6, "scale": [1, 6], "scatter": [1, 3, 4], "scatter_color": 6, "scatter_fit_plot": [1, 4, 6], "scenario": 6, "schema": 6, "scheme": 6, "school": 0, "scienc": [0, 3, 5, 6], "scientif": [1, 6], "scientist": [0, 3], "seaborn": [3, 5, 6], "seamlessli": 3, "second": 6, "section": [1, 6], "see": 6, "seed": 6, "select": 6, "self": 6, "separ": [1, 6], "sequenc": 6, "set": [1, 6], "set_as_index": 6, "set_titl": 1, "setp": 1, "setup": [1, 6], "sever": 6, "sex": 6, "shape": 6, "sheet": 6, "shilei": 0, "show": 6, "show_correl": 6, "show_legend": 6, "show_plot": 6, "shown": 6, "shpaner": 2, "shpaner_2024_13162633": 2, "similarli": 6, "simplic": 3, "sinc": 6, "singl": [1, 6], "single_figs": 6, "single_var_image_filenam": 6, "single_var_image_path_png": 6, "single_var_image_path_svg": 6, "size": [1, 6], "smallest": 6, "smooth": 6, "snippet": 6, "so": [1, 6], "softwar": [2, 5, 6], "some": 6, "sort": [1, 6], "sort_bi": [1, 6], "sortbi": 1, "sourc": [5, 6], "space": 6, "span": 6, "special": 6, "specialti": 6, "specif": [1, 3, 4], "specifi": [1, 3, 6], "spous": 6, "squar": 6, "stabl": 1, "stack": [1, 3, 4], "stacked_crosstab": 6, "stacked_crosstab_plot": [1, 4, 6], "standard": [1, 3, 4], "standardized_d": 6, "start": [1, 3, 6], "stat": [1, 6], "state": 6, "statist": [1, 3, 5, 6], "statu": 6, "step": 3, "still": 6, "store": 1, "str": 6, "streamlin": 3, "strength": 6, "string": [1, 6], "strip": 6, "strip_trailing_period": [4, 6], "structur": [1, 3], "style": 6, "styler": 6, "subplot": 6, "success": 0, "successfulli": [0, 1], "suit": 3, "summar": 3, "summari": [3, 4], "summarize_all_combin": [4, 6], "summary_t": 6, "support": [0, 1, 6], "suppress": 6, "sure": 6, "svg": 6, "svg_imag": 6, "sy": 1, "system": [3, 6], "tab": 6, "tabl": [1, 3], "tailor": 6, "take": 6, "tall": 6, "tarshizi": 0, "task": [3, 6], "techniqu": 3, "test": 1, "text": [1, 6], "text_wrap": [1, 6], "than": [1, 6], "thank": 0, "thei": 6, "them": [1, 6], "therefor": 6, "thi": [1, 3, 6], "three": 6, "through": 1, "throw": 1, "thu": 6, "tick": [1, 6], "tick_fonts": [1, 6], "tight": 6, "time": [0, 1, 6], "titl": [1, 2, 6], "to_list": 6, "toggl": [1, 6], "tool": [3, 6], "top": 6, "total": 6, "trail": 4, "transpar": [1, 6], "trend": [3, 6], "true": [1, 6], "truth": 6, "tupl": 6, "two": 6, "type": [1, 3, 6], "u": [0, 6], "uci": [5, 6], "unambigu": 6, "uncov": 3, "underli": 3, "understand": [3, 6], "uniform": 1, "uniqu": [1, 3, 4], "unique_values_tot": 6, "unique_var": 6, "unit": 6, "univers": 0, "unrecogn": 6, "unstack": 6, "unus": 1, "unwav": 0, "up": [1, 6], "updat": [1, 6], "upright": 6, "url": 2, "us": [1, 3, 6], "usag": [1, 6], "user": [1, 3, 6], "userwarn": 6, "util": [3, 6], "valid": 1, "valu": [1, 3, 6], "valueerror": [1, 6], "vari": 6, "variabl": [1, 3, 4], "varieti": 3, "variou": [1, 3, 6], "vars_of_interest": 6, "verbiag": 1, "verifi": [1, 6], "versatil": 6, "version": [2, 3, 4, 6], "version_info": 1, "vertic": 6, "via": 6, "view": 6, "violin": [1, 3, 4], "violinplot": 6, "visual": [3, 5, 6], "vriabl": 6, "w": 2, "w_pad": 6, "wa": 6, "warn": 1, "waskom": [5, 6], "we": [0, 6], "week": 6, "welcom": 4, "well": 6, "were": 6, "what": 4, "when": [1, 3, 6], "where": 6, "whether": [1, 6], "which": [1, 3, 6], "while": [1, 6], "white": 6, "whitespac": 6, "wide": 6, "width": [1, 6], "wife": 6, "within": [1, 6], "without": 6, "work": [1, 6], "workclass": 6, "workflow": 3, "would": [0, 6], "wrap": [1, 6], "write": 6, "x": [1, 6], "x_var": 6, "xlabel": 6, "xlabel_rot": 6, "xlim": [1, 6], "xlsx": 6, "xlsxwriter": 3, "y": [1, 6], "y_axis_label": 6, "y_var": 6, "year": [2, 6], "yellow": 6, "ylabel": 6, "ylim": [1, 6], "you": [3, 6], "your": [3, 6], "yyyi": 6, "zenodo": [1, 2], "zero": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References", "Description"], "titleterms": {"0": 1, "1b0": 1, "1rc0": 1, "2": 1, "3": 1, "4": 1, "5": 1, "With": 6, "about": 4, "acknowledg": 0, "ad": 6, "analysi": 6, "bar": 6, "best": 6, "bin": 6, "box": 6, "categori": 6, "centric": 6, "changelog": 1, "cite": 2, "column": 6, "combin": 6, "content": 4, "conting": 6, "count": 6, "creat": 6, "crosstab": 6, "custom": 6, "data": 6, "datafram": 6, "date": 6, "densiti": 6, "descript": 6, "directori": 6, "distribut": 6, "document": 3, "eda": [2, 3, 4], "exampl": 6, "excel": 6, "featur": 3, "fit": 6, "format": 6, "gener": 6, "get": 4, "grid": 6, "group": 6, "guid": 4, "highlight": 6, "histogram": 6, "i": 3, "identifi": 6, "instal": 3, "kde": 6, "kei": 3, "librari": 3, "line": 6, "link": 3, "manag": 6, "non": 6, "normal": 6, "numer": 6, "path": 6, "period": 6, "pivot": 6, "plot": 6, "prepar": 6, "prerequisit": 3, "project": 3, "purpos": 3, "python": 3, "refer": 5, "regress": 6, "regular": 6, "remov": 6, "save": 6, "scatter": 6, "specif": 6, "stack": 6, "standard": 6, "start": 4, "summari": 6, "tabl": [4, 6], "toolkit": [2, 3, 4], "trail": 6, "uniqu": 6, "usag": 4, "variabl": 6, "version": 1, "violin": 6, "welcom": 3, "what": 3}}) \ No newline at end of file diff --git a/docs/v0.0.5/usage_guide.html b/docs/v0.0.5/usage_guide.html index 73954010e..a9f368128 100644 --- a/docs/v0.0.5/usage_guide.html +++ b/docs/v0.0.5/usage_guide.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Description — EDA Toolkit 0.0.5 documentation - + - - - - - - - - - - + + + + + + + + @@ -158,7 +156,8 @@
    -
    EDA Toolkit Logo +

    Description

    This guide provides detailed instructions and examples for using the functions @@ -177,7 +176,7 @@

    Path directoriesensure_directory(path)
    Parameters:
    -

    path (str) – The path to the directory that needs to be ensured.

    +

    path (str) – The path to the directory that needs to be ensured.

    Returns:

    None

    @@ -246,10 +245,10 @@

    Adding Unique IdentifiersParameters:
    • df (pd.DataFrame) – The dataframe to add IDs to.

    • -
    • id_colname (str) – The name of the new column for the IDs.

    • -
    • num_digits (int) – The number of digits for the unique IDs.

    • -
    • seed (int, optional) – The seed for the random number generator. Defaults to None.

    • -
    • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

    • +
    • id_colname (str) – The name of the new column for the IDs.

    • +
    • num_digits (int) – The number of digits for the unique IDs.

    • +
    • seed (int, optional) – The seed for the random number generator. Defaults to None.

    • +
    • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

    Returns:
    @@ -406,7 +405,7 @@

    Trailing Period RemovalParameters:
    Returns:
    @@ -535,16 +534,16 @@

    Standardized Dates
    Parameters:
    -

    date_str (str) – A date string to be standardized.

    +

    date_str (str) – A date string to be standardized.

    Returns:

    A standardized date string in the format YYYY-MM-DD.

    Return type:
    -

    str

    +

    str

    Raises:
    -

    ValueError – If date_str is in an unrecognized format or if the function +

    ValueError – If date_str is in an unrecognized format or if the function cannot parse the date.

    @@ -868,17 +867,17 @@

    Generating Summary Tables for Variable CombinationsParameters:
    • df (pandas.DataFrame) – The pandas DataFrame containing the data.

    • -
    • variables (list) – List of unique variables to generate combinations.

    • -
    • data_path (str) – Path where the output Excel file will be saved.

    • -
    • data_name (str) – Name of the output Excel file.

    • -
    • min_length (int) – Minimum length of combinations to generate. Defaults to 2.

    • +
    • variables (list) – List of unique variables to generate combinations.

    • +
    • data_path (str) – Path where the output Excel file will be saved.

    • +
    • data_name (str) – Name of the output Excel file.

    • +
    • min_length (int) – Minimum length of combinations to generate. Defaults to 2.

    Returns:

    A dictionary of summary tables and a list of all generated combinations.

    Return type:
    -

    tuple(dict, list)

    +

    tuple(dict, list)

    @@ -1048,7 +1047,8 @@

    Generating Summary Tables for Variable Combinations

    When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. The first sheet will be a Table of Contents with hyperlinks to each summary table.

    -
    EDA Toolkit Logo +

    Saving DataFrames to Excel with Customized Formatting

    @@ -1061,9 +1061,9 @@

    Saving DataFrames to Excel with Customized Formatting
    Parameters:
      -
    • file_path (str) – Full path to the output Excel file.

    • -
    • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

    • -
    • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

    • +
    • file_path (str) – Full path to the output Excel file.

    • +
    • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

    • +
    • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

    Notes:
    @@ -1122,12 +1122,12 @@

    Creating Contingency TablesParameters:
    • df (pandas.DataFrame) – The DataFrame to analyze.

    • -
    • cols (str or list, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

    • -
    • sort_by (int) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order.

    • +
    • cols (str or list, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

    • +
    • sort_by (int) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order.

    Raises:
    -

    ValueError – If no columns are specified or if sort_by is not 0 or 1.

    +

    ValueError – If no columns are specified or if sort_by is not 0 or 1.

    Returns:

    A DataFrame with the specified columns, 'Total', and 'Percentage'.

    @@ -1190,8 +1190,8 @@

    Highlighting Specific Columns in a DataFrameParameters:
    Returns:
    @@ -1392,54 +1392,54 @@

    KDE and Histogram Distribution PlotsParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots.

    • -
    • grid_figsize (tuple, optional) – Size of the overall grid figure, default is (10, 8).

    • -
    • single_figsize (tuple, optional) – Size of individual figures for each variable, default is (6, 4).

    • -
    • kde (bool, optional) – Whether to include KDE plots on the histograms, default is True.

    • -
    • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

    • -
    • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

    • -
    • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

    • -
    • hue (str, optional) – Column name to group data by, adding different colors for each group.

    • -
    • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

    • -
    • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where +

    • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots.

    • +
    • grid_figsize (tuple, optional) – Size of the overall grid figure, default is (10, 8).

    • +
    • single_figsize (tuple, optional) – Size of individual figures for each variable, default is (6, 4).

    • +
    • kde (bool, optional) – Whether to include KDE plots on the histograms, default is True.

    • +
    • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

    • +
    • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

    • +
    • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

    • +
    • hue (str, optional) – Column name to group data by, adding different colors for each group.

    • +
    • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

    • +
    • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid, default is 1.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid, default is 1.

    • -
    • w_pad (float, optional) – Width padding between subplots, default is 1.0.

    • -
    • h_pad (float, optional) – Height padding between subplots, default is 1.0.

    • -
    • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

    • -
    • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

    • -
    • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

    • -
    • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

    • -
    • single_var_image_path_png (str, optional) – Directory path to save the PNG images of the separate distribution plots.

    • -
    • single_var_image_path_svg (str, optional) – Directory path to save the SVG images of the separate distribution plots.

    • -
    • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. +

    • n_rows (int, optional) – Number of rows in the subplot grid, default is 1.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid, default is 1.

    • +
    • w_pad (float, optional) – Width padding between subplots, default is 1.0.

    • +
    • h_pad (float, optional) – Height padding between subplots, default is 1.0.

    • +
    • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

    • +
    • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

    • +
    • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

    • +
    • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

    • +
    • single_var_image_path_png (str, optional) – Directory path to save the PNG images of the separate distribution plots.

    • +
    • single_var_image_path_svg (str, optional) – Directory path to save the SVG images of the separate distribution plots.

    • +
    • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename.

    • -
    • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

    • -
    • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

    • -
    • log_scale_vars (list of str, optional) – List of variable names to apply log scaling.

    • -
    • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

    • +
    • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

    • +
    • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

    • +
    • log_scale_vars (list of str, optional) – List of variable names to apply log scaling.

    • +
    • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

    • binwidth (number or pair of numbers, optional) – Width of each bin, overrides bins but can be used with binrange.

    • -
    • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels, default is 10.

    • -
    • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

    • -
    • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

    • -
    • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', +

    • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels, default is 10.

    • +
    • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

    • +
    • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

    • +
    • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    Raises:
      -
    • ValueError

        +
      • ValueError

        • If plot_type is not one of 'hist', 'kde', or 'both'.

        • If stat is not one of 'count', 'density', 'frequency', 'probability', 'proportion', 'percent'.

        • If log_scale_vars contains variables that are not present in the DataFrame.

        • If fill is set to False and hist_edgecolor is not the default.

      • -
      • UserWarning

          +
        • UserWarning

          • If stat is set to ‘count’ while kde is True, as it may produce misleading plots.

          • If both bins and binwidth are specified, which may affect performance.

          @@ -1514,7 +1514,8 @@

          KDE and Histograms Example)

    -
    KDE Distributions - KDE (+) Histograms (Density) +

    Histogram Example (Density)

    @@ -1556,7 +1557,8 @@

    Histogram Example (Density))

    -
    KDE Distributions - Histograms (Density) +

    Histogram Example (Count)

    @@ -1599,7 +1601,8 @@

    Histogram Example (Count))

    -
    KDE Distributions - Histograms (Count) +
    @@ -1620,45 +1623,45 @@

    Stacked Crosstab PlotsParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • col (str) – The name of the column in the DataFrame to be analyzed.

    • -
    • func_col (list) – List of ground truth columns to be analyzed.

    • -
    • legend_labels_list (list) – List of legend labels for each ground truth column.

    • -
    • title (list) – List of titles for the plots.

    • -
    • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

    • -
    • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

    • -
    • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

    • -
    • custom_order (list, optional) – Specifies a custom order for the categories in the col.

    • -
    • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

    • -
    • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

    • -
    • save_formats (list, optional) – List of file formats to save the plot images in.

    • -
    • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

    • -
    • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

    • -
    • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

    • -
    • x (int, optional) – The width of the figure.

    • -
    • y (int, optional) – The height of the figure.

    • -
    • p (int, optional) – The padding between the subplots.

    • -
    • file_prefix (str, optional) – Prefix for the filename when output includes plots.

    • -
    • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

    • -
    • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

    • -
    • show_legend (bool, optional) – Specify whether to show the legend, default is True.

    • -
    • label_fontsize (int, optional) – Font size for axis labels, default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • -
    • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • col (str) – The name of the column in the DataFrame to be analyzed.

    • +
    • func_col (list) – List of ground truth columns to be analyzed.

    • +
    • legend_labels_list (list) – List of legend labels for each ground truth column.

    • +
    • title (list) – List of titles for the plots.

    • +
    • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

    • +
    • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

    • +
    • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

    • +
    • custom_order (list, optional) – Specifies a custom order for the categories in the col.

    • +
    • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

    • +
    • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

    • +
    • save_formats (list, optional) – List of file formats to save the plot images in.

    • +
    • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

    • +
    • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

    • +
    • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

    • +
    • x (int, optional) – The width of the figure.

    • +
    • y (int, optional) – The height of the figure.

    • +
    • p (int, optional) – The padding between the subplots.

    • +
    • file_prefix (str, optional) – Prefix for the filename when output includes plots.

    • +
    • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

    • +
    • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

    • +
    • show_legend (bool, optional) – Specify whether to show the legend, default is True.

    • +
    • label_fontsize (int, optional) – Font size for axis labels, default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • +
    • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    Raises:
      -
    • ValueError

        +
      • ValueError

        • If output is not one of "both", "plots_only", or "crosstabs_only".

        • If plot_type is not one of "both", "regular", "normalized".

        • If remove_stacks is set to True and plot_type is not "regular".

        • If the lengths of title, func_col, and legend_labels_list are not equal.

      • -
      • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

      • +
      • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

    Returns:
    @@ -1767,8 +1770,10 @@

    Stacked Bar Plots With Crosstabs ExampleKDE Distributions -

    Non-Normalized Stacked Bar Plots Example

    @@ -2022,7 +2028,8 @@

    Non-Normalized Stacked Bar Plots Exampleplot_type to "normalized" will display only the normalized plots. The example below demonstrates regular stacked bar plots for income by age.

    -
    Stacked Bar Plot Age vs. Income (Regular) +

    Regular Non-Stacked Bar Plots Example

    @@ -2037,7 +2044,8 @@

    Regular Non-Stacked Bar Plots Example#333333), and the legend has been removed by setting show_legend=False. This illustrates regular bar plots for income by age, without stacking.

    -
    Bar Plot Age vs. Income (Regular) +

    @@ -2069,29 +2077,29 @@

    Box and Violin PlotsParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • metrics_list (list of str) – List of metric names (columns in df) to plot.

    • -
    • metrics_boxplot_comp (list of str) – List of comparison categories (columns in df).

    • -
    • n_rows (int) – Number of rows in the subplot grid.

    • -
    • n_cols (int) – Number of columns in the subplot grid.

    • -
    • image_path_png (str, optional) – Optional directory path to save .png images.

    • -
    • image_path_svg (str, optional) – Optional directory path to save .svg images.

    • -
    • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

    • -
    • show_legend (bool, optional) – Boolean, True if showing the legend in the plots.

    • -
    • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • -
    • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

    • -
    • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots.

    • -
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • -
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • -
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • metrics_list (list of str) – List of metric names (columns in df) to plot.

    • +
    • metrics_boxplot_comp (list of str) – List of comparison categories (columns in df).

    • +
    • n_rows (int) – Number of rows in the subplot grid.

    • +
    • n_cols (int) – Number of columns in the subplot grid.

    • +
    • image_path_png (str, optional) – Optional directory path to save .png images.

    • +
    • image_path_svg (str, optional) – Optional directory path to save .svg images.

    • +
    • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

    • +
    • show_legend (bool, optional) – Boolean, True if showing the legend in the plots.

    • +
    • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • +
    • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

    • +
    • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots.

    • +
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • +
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • +
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    Raises:
    -

    ValueError

      +

      ValueError

      • If show_plot is not one of "individual", "grid", or "both".

      • If save_plots is not one of None, "all", "individual", or "grid".

      • If save_plots is set without specifying image_path_png or image_path_svg.

      • @@ -2155,7 +2163,8 @@

        Box Plots Grid Example)

    -
    Box Plot Comparisons +

    Violin Plots Grid Example

    @@ -2182,7 +2191,8 @@

    Violin Plots Grid Example)

    -
    Violin Plot Comparisons +

    Pivoted Violin Plots Grid Example

    @@ -2210,7 +2220,8 @@

    Pivoted Violin Plots Grid Example)

    -
    Violin Plot Comparisons (Pivoted) +
    @@ -2254,38 +2265,38 @@

    Scatter Plots and Best Fit LinesParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data.

    • -
    • x_vars (list of str) – List of variable names to plot on the x-axis.

    • -
    • y_vars (list of str) – List of variable names to plot on the y-axis.

    • -
    • n_rows (int) – Number of rows in the subplot grid.

    • -
    • n_cols (int) – Number of columns in the subplot grid.

    • -
    • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

    • -
    • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

    • -
    • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid".

    • -
    • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • -
    • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

    • -
    • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

    • -
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • -
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • -
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • -
    • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

    • -
    • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

    • -
    • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

    • -
    • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

    • -
    • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

    • -
    • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette.

    • -
    • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

    • -
    • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

    • -
    • marker (str, optional) – Marker style used for the scatter points. Default is "o".

    • -
    • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • x_vars (list of str) – List of variable names to plot on the x-axis.

    • +
    • y_vars (list of str) – List of variable names to plot on the y-axis.

    • +
    • n_rows (int) – Number of rows in the subplot grid.

    • +
    • n_cols (int) – Number of columns in the subplot grid.

    • +
    • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

    • +
    • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

    • +
    • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid".

    • +
    • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • +
    • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

    • +
    • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

    • +
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • +
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • +
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • +
    • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

    • +
    • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

    • +
    • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

    • +
    • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

    • +
    • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

    • +
    • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette.

    • +
    • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

    • +
    • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

    • +
    • marker (str, optional) – Marker style used for the scatter points. Default is "o".

    • +
    • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    Raises:
    -

    ValueError

      +

      ValueError

      • If show_plot is not one of "individual", "grid", or "both".

      • If save_plots is not one of None, "all", "individual", or "grid".

      • If save_plots is set but no image paths are provided.

      • @@ -2339,7 +2350,8 @@

        Regression-Centric Scatter Plots Example)

    -
    Scatter Plot Comparisons (with Best Fit Lines) +

    Scatter Plots Grouped by Category Example

    @@ -2400,7 +2412,8 @@

    Scatter Plots Grouped by Category Example)

    -
    Scatter Plot Comparisons (Grouped) +
    -
    Scatter Plot Comparisons (with Best Fit Lines) +

    Scatter Plots Grouped by Category Example

    @@ -2400,7 +2412,8 @@

    Scatter Plots Grouped by Category Example)

    -
    Scatter Plot Comparisons (Grouped) +
    -
    Scatter Plot Comparisons (with Best Fit Lines) +

    Scatter Plots Grouped by Category Example

    @@ -2585,7 +2598,8 @@

    Scatter Plots Grouped by Category Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -2619,30 +2633,30 @@

    Correlation MatricesParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data.

    • -
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • -
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • -
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • -
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • -
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • -
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • -
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • -
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • -
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • -
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • -
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • -
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • -
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • -
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • -
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • -
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    • +
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • +
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • +
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • +
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • +
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • +
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • +
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • +
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • +
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • +
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • +
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • +
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • +
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • +
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • +
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • +
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    Raises:
    -

    ValueError

      +

      ValueError

      • If annot is not a boolean.

      • If cols is not a list.

      • If save_plots is not a boolean.

      • @@ -2700,7 +2714,8 @@

        Triangular Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +

    Full Correlation Matrix Example

    @@ -2734,7 +2749,8 @@

    Full Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +
    -
    Scatter Plot Comparisons (with Best Fit Lines) +

    Scatter Plots Grouped by Category Example

    @@ -2601,7 +2614,8 @@

    Scatter Plots Grouped by Category Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -2635,30 +2649,30 @@

    Correlation MatricesParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data.

    • -
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • -
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • -
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • -
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • -
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • -
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • -
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • -
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • -
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • -
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • -
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • -
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • -
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • -
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • -
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • -
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    • +
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • +
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • +
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • +
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • +
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • +
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • +
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • +
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • +
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • +
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • +
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • +
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • +
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • +
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • +
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • +
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    Raises:
    -

    ValueError

      +

      ValueError

      • If annot is not a boolean.

      • If cols is not a list.

      • If save_plots is not a boolean.

      • @@ -2716,7 +2730,8 @@

        Triangular Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +

    Full Correlation Matrix Example

    @@ -2750,7 +2765,8 @@

    Full Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -2832,24 +2848,24 @@

    2D Partial Dependence Plots
    • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

    • X_train (pandas.DataFrame or numpy.ndarray) – The training data used to compute partial dependence. Should correspond to the features used to train the model.

    • -
    • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

    • -
    • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

    • -
    • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

    • -
    • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

    • -
    • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

    • -
    • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

    • -
    • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

    • -
    • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • -
    • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

    • -
    • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

    • -
    • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

    • -
    • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

    • +
    • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

    • +
    • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

    • +
    • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

    • +
    • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

    • +
    • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

    • +
    • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

    • +
    • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

    • +
    • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • +
    • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

    • +
    • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

    • +
    • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

    • +
    • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

    Raises:
    -

    ValueError

      +

      ValueError

      • If plot_type is not one of "grid", "individual", or "both".

      • If save_plots is enabled but neither image_path_png nor image_path_svg is provided.

      @@ -2944,7 +2960,8 @@

      2D Plots - CA Housing Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -2965,47 +2982,47 @@

    3D Partial Dependence Plots
    • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

    • dataframe (pandas.DataFrame or numpy.ndarray) – The dataset on which the model was trained or a representative sample. If a DataFrame is provided, feature_names_list should correspond to the column names. If a NumPy array is provided, feature_names_list should correspond to the indices of the columns.

    • -
    • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

    • -
    • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

    • -
    • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

    • -
    • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

    • -
    • title (str) – The title for the plots.

    • -
    • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

    • -
    • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

    • -
    • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

    • -
    • plot_type (str, optional) – The type of plots to generate. Options are: +

    • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

    • +
    • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

    • +
    • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

    • +
    • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

    • +
    • title (str) – The title for the plots.

    • +
    • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

    • +
    • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

    • +
    • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

    • +
    • plot_type (str, optional) – The type of plots to generate. Options are: - "static": Generate only static Matplotlib plots. - "interactive": Generate only interactive Plotly plots. - "both": Generate both static and interactive plots. Default is "both".

    • matplotlib_colormap (matplotlib.colors.Colormap, optional) – Custom colormap for the Matplotlib plot. If not provided, a default colormap is used.

    • -
    • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

    • -
    • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

    • -
    • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

    • -
    • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

    • -
    • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

    • -
    • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • -
    • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

    • -
    • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

    • -
    • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

    • -
    • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

    • -
    • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

    • -
    • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

    • -
    • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

    • -
    • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

    • -
    • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

    • -
    • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

    • -
    • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

    • -
    • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

    • -
    • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

    • -
    • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

    • -
    • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

    • -
    • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

    • -
    • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

    • +
    • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

    • +
    • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

    • +
    • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

    • +
    • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

    • +
    • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

    • +
    • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • +
    • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

    • +
    • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

    • +
    • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

    • +
    • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

    • +
    • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

    • +
    • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

    • +
    • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

    • +
    • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

    • +
    • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

    • +
    • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

    • +
    • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

    • +
    • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

    • +
    • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

    • +
    • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

    • +
    • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

    • +
    • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

    • +
    • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

    Raises:
    -

    ValueError

      +

      ValueError

      • If plot_type is not one of "static", "interactive", or "both".

      • If plot_type is "interactive" or "both" and html_file_path or html_file_name are not provided.

      @@ -3098,7 +3115,8 @@

      Static Plot)

    -
    Scatter Plot Comparisons (Grouped) +

    Interactive Plot

    diff --git a/docs/v0.0.9/.buildinfo b/docs/v0.0.9/.buildinfo index 9a08bfdd6..d7b62fc31 100644 --- a/docs/v0.0.9/.buildinfo +++ b/docs/v0.0.9/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: e2c009a6ffe796df27c6964b7d2380c3 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: a6b837a6ec3686d6a5f12451ab7ba742 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/v0.0.9/.buildinfo.bak b/docs/v0.0.9/.buildinfo.bak new file mode 100644 index 000000000..9a08bfdd6 --- /dev/null +++ b/docs/v0.0.9/.buildinfo.bak @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: e2c009a6ffe796df27c6964b7d2380c3 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/v0.0.9/.doctrees/acknowledgements.doctree b/docs/v0.0.9/.doctrees/acknowledgements.doctree index 68eee001a..343c741bc 100644 Binary files a/docs/v0.0.9/.doctrees/acknowledgements.doctree and b/docs/v0.0.9/.doctrees/acknowledgements.doctree differ diff --git a/docs/v0.0.9/.doctrees/changelog.doctree b/docs/v0.0.9/.doctrees/changelog.doctree index 1e8f49e5d..88750f180 100644 Binary files a/docs/v0.0.9/.doctrees/changelog.doctree and b/docs/v0.0.9/.doctrees/changelog.doctree differ diff --git a/docs/v0.0.9/.doctrees/citations.doctree b/docs/v0.0.9/.doctrees/citations.doctree index 07a496566..531a57962 100644 Binary files a/docs/v0.0.9/.doctrees/citations.doctree and b/docs/v0.0.9/.doctrees/citations.doctree differ diff --git a/docs/v0.0.9/.doctrees/contributors.doctree b/docs/v0.0.9/.doctrees/contributors.doctree index 151d2aecb..87da71c61 100644 Binary files a/docs/v0.0.9/.doctrees/contributors.doctree and b/docs/v0.0.9/.doctrees/contributors.doctree differ diff --git a/docs/v0.0.9/.doctrees/data_management.doctree b/docs/v0.0.9/.doctrees/data_management.doctree index 398d0b820..cd1a27a4f 100644 Binary files a/docs/v0.0.9/.doctrees/data_management.doctree and b/docs/v0.0.9/.doctrees/data_management.doctree differ diff --git a/docs/v0.0.9/.doctrees/eda_plots.doctree b/docs/v0.0.9/.doctrees/eda_plots.doctree index d7c6b7088..515e700d1 100644 Binary files a/docs/v0.0.9/.doctrees/eda_plots.doctree and b/docs/v0.0.9/.doctrees/eda_plots.doctree differ diff --git a/docs/v0.0.9/.doctrees/environment.pickle b/docs/v0.0.9/.doctrees/environment.pickle index 8ff97277c..98cf4d7e3 100644 Binary files a/docs/v0.0.9/.doctrees/environment.pickle and b/docs/v0.0.9/.doctrees/environment.pickle differ diff --git a/docs/v0.0.9/.doctrees/getting_started.doctree b/docs/v0.0.9/.doctrees/getting_started.doctree index 1918dadac..92638b642 100644 Binary files a/docs/v0.0.9/.doctrees/getting_started.doctree and b/docs/v0.0.9/.doctrees/getting_started.doctree differ diff --git a/docs/v0.0.9/.doctrees/index.doctree b/docs/v0.0.9/.doctrees/index.doctree index 82fbffbc8..e317164a2 100644 Binary files a/docs/v0.0.9/.doctrees/index.doctree and b/docs/v0.0.9/.doctrees/index.doctree differ diff --git a/docs/v0.0.9/.doctrees/references.doctree b/docs/v0.0.9/.doctrees/references.doctree index 8766ee6c8..be59fe1f8 100644 Binary files a/docs/v0.0.9/.doctrees/references.doctree and b/docs/v0.0.9/.doctrees/references.doctree differ diff --git a/docs/v0.0.9/_static/basic.css b/docs/v0.0.9/_static/basic.css index f316efcb4..7ebbd6d07 100644 --- a/docs/v0.0.9/_static/basic.css +++ b/docs/v0.0.9/_static/basic.css @@ -1,12 +1,5 @@ /* - * basic.css - * ~~~~~~~~~ - * * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ /* -- main layout ----------------------------------------------------------- */ @@ -115,15 +108,11 @@ img { /* -- search page ----------------------------------------------------------- */ ul.search { - margin: 10px 0 0 20px; - padding: 0; + margin-top: 10px; } ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; + padding: 5px 0; } ul.search li a { diff --git a/docs/v0.0.9/_static/css/badge_only.css b/docs/v0.0.9/_static/css/badge_only.css index c718cee44..88ba55b96 100644 --- a/docs/v0.0.9/_static/css/badge_only.css +++ b/docs/v0.0.9/_static/css/badge_only.css @@ -1 +1 @@ -.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/docs/v0.0.9/_static/css/theme.css b/docs/v0.0.9/_static/css/theme.css index 19a446a0e..0f14f1064 100644 --- a/docs/v0.0.9/_static/css/theme.css +++ b/docs/v0.0.9/_static/css/theme.css @@ -1,4 +1,4 @@ html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/v0.0.9/_static/doctools.js b/docs/v0.0.9/_static/doctools.js index 4d67807d1..0398ebb9f 100644 --- a/docs/v0.0.9/_static/doctools.js +++ b/docs/v0.0.9/_static/doctools.js @@ -1,12 +1,5 @@ /* - * doctools.js - * ~~~~~~~~~~~ - * * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-bold.eot b/docs/v0.0.9/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-bold.eot differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-bold.ttf b/docs/v0.0.9/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-bold.ttf differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-bold.woff b/docs/v0.0.9/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-bold.woff differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-bold.woff2 b/docs/v0.0.9/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.eot b/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.ttf b/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff b/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-italic.eot b/docs/v0.0.9/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-italic.eot differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-italic.ttf b/docs/v0.0.9/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-italic.ttf differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-italic.woff b/docs/v0.0.9/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-italic.woff differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-italic.woff2 b/docs/v0.0.9/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-regular.eot b/docs/v0.0.9/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-regular.eot differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-regular.ttf b/docs/v0.0.9/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-regular.ttf differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-regular.woff b/docs/v0.0.9/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-regular.woff differ diff --git a/docs/v0.0.9/_static/fonts/Lato/lato-regular.woff2 b/docs/v0.0.9/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/docs/v0.0.9/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/docs/v0.0.9/_static/js/versions.js b/docs/v0.0.9/_static/js/versions.js new file mode 100644 index 000000000..818bc9969 --- /dev/null +++ b/docs/v0.0.9/_static/js/versions.js @@ -0,0 +1,224 @@ +const themeFlyoutDisplay = "hidden"; +const themeVersionSelector = "True"; +const themeLanguageSelector = "True"; + +if (themeFlyoutDisplay === "attached") { + function renderLanguages(config) { + if (!config.projects.translations.length) { + return ""; + } + + const languagesHTML = ` +
    +
    Languages
    + ${config.projects.translations + .map( + (translation) => ` +
    + ${translation.language.code} +
    + `, + ) + .join("\n")} +
    + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
    +
    Versions
    + ${config.versions.active + .map( + (version) => ` +
    + ${version.slug} +
    + `, + ) + .join("\n")} +
    + `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
    +
    Downloads
    + ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
    + ${downloadsNameDisplay[name]} +
    + `, + ) + .join("\n")} +
    + `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
    + + Read the Docs + v: ${config.versions.current.slug} + + +
    +
    + ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
    +
    On Read the Docs
    +
    + Project Home +
    +
    + Builds +
    +
    + Downloads +
    +
    +
    +
    Search
    +
    +
    + +
    +
    +
    +
    + + Hosted by Read the Docs + +
    +
    + `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/docs/v0.0.9/_static/language_data.js b/docs/v0.0.9/_static/language_data.js index 367b8ed81..c7fe6c6fa 100644 --- a/docs/v0.0.9/_static/language_data.js +++ b/docs/v0.0.9/_static/language_data.js @@ -1,13 +1,6 @@ /* - * language_data.js - * ~~~~~~~~~~~~~~~~ - * * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; diff --git a/docs/v0.0.9/_static/searchtools.js b/docs/v0.0.9/_static/searchtools.js index b08d58c9b..2c774d17a 100644 --- a/docs/v0.0.9/_static/searchtools.js +++ b/docs/v0.0.9/_static/searchtools.js @@ -1,12 +1,5 @@ /* - * searchtools.js - * ~~~~~~~~~~~~~~~~ - * * Sphinx JavaScript utilities for the full-text search. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; @@ -20,7 +13,7 @@ if (typeof Scorer === "undefined") { // and returns the new score. /* score: result => { - const [docname, title, anchor, descr, score, filename] = result + const [docname, title, anchor, descr, score, filename, kind] = result return score }, */ @@ -47,6 +40,14 @@ if (typeof Scorer === "undefined") { }; } +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + const _removeChildren = (element) => { while (element && element.lastChild) element.removeChild(element.lastChild); }; @@ -64,9 +65,13 @@ const _displayItem = (item, searchTerms, highlightTerms) => { const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; const contentRoot = document.documentElement.dataset.content_root; - const [docName, title, anchor, descr, score, _filename] = item; + const [docName, title, anchor, descr, score, _filename, kind] = item; let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); let requestUrl; let linkUrl; if (docBuilder === "dirhtml") { @@ -115,8 +120,10 @@ const _finishSearch = (resultCount) => { "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." ); else - Search.status.innerText = _( - "Search finished, found ${resultCount} page(s) matching the search query." + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, ).replace('${resultCount}', resultCount); }; const _displayNextItem = ( @@ -138,7 +145,7 @@ const _displayNextItem = ( else _finishSearch(resultCount); }; // Helper function used by query() to order search results. -// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. // Order the results by score (in opposite order of appearance, since the // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. const _orderResultsByScoreThenName = (a, b) => { @@ -248,6 +255,7 @@ const Search = { searchSummary.classList.add("search-summary"); searchSummary.innerText = ""; const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); searchList.classList.add("search"); const out = document.getElementById("search-results"); @@ -318,7 +326,7 @@ const Search = { const indexEntries = Search._index.indexentries; // Collect multiple result groups to be sorted separately and then ordered. - // Each is an array of [docname, title, anchor, descr, score, filename]. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. const normalResults = []; const nonMainIndexResults = []; @@ -337,6 +345,7 @@ const Search = { null, score + boost, filenames[file], + SearchResultKind.title, ]); } } @@ -354,6 +363,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.index, ]; if (isMain) { normalResults.push(result); @@ -475,6 +485,7 @@ const Search = { descr, score, filenames[match[0]], + SearchResultKind.object, ]); }; Object.keys(objects).forEach((prefix) => @@ -585,6 +596,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.text, ]); } return results; diff --git a/docs/v0.0.9/acknowledgements.html b/docs/v0.0.9/acknowledgements.html index e219bc4cd..7a31029df 100644 --- a/docs/v0.0.9/acknowledgements.html +++ b/docs/v0.0.9/acknowledgements.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Acknowledgements — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,7 +101,8 @@
    -
    EDA Toolkit Logo +

    Acknowledgements

    diff --git a/docs/v0.0.9/changelog.html b/docs/v0.0.9/changelog.html index 97d895417..d7a5215bb 100644 --- a/docs/v0.0.9/changelog.html +++ b/docs/v0.0.9/changelog.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Changelog — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - + + + + + + + + @@ -121,7 +119,8 @@
    -
    EDA Toolkit Logo +

    Changelog

    diff --git a/docs/v0.0.9/citations.html b/docs/v0.0.9/citations.html index c082152df..30b903c70 100644 --- a/docs/v0.0.9/citations.html +++ b/docs/v0.0.9/citations.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Citing EDA Toolkit — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,7 +101,8 @@
    -
    EDA Toolkit Logo +

    Citing EDA Toolkit

    diff --git a/docs/v0.0.9/contributors.html b/docs/v0.0.9/contributors.html index 802f36f09..9c9bd2f52 100644 --- a/docs/v0.0.9/contributors.html +++ b/docs/v0.0.9/contributors.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Contributors/Maintainers — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - + + + + + + + + @@ -103,13 +101,16 @@
    -
    EDA Toolkit Logo +

    Contributors/Maintainers

    -
    https://www.leonshpaner.com/author/leon-shpaner/avatar_hu48de79c369d5f7d4ff8056a297b2c4c5_1681850_270x270_fill_q90_lanczos_center.jpg +

    Leonid Shpaner is a Data Scientist at UCLA Health. With over a decade of experience in analytics and teaching, he has collaborated on a wide variety of projects within financial services, education, personal development, and healthcare. He serves as a course facilitator for Data Analytics and Applied Statistics at Cornell University and is a lecturer of Statistics in Python for the University of San Diego’s M.S. Applied Artificial Intelligence program.

    -


    https://oscargildata.com/portfolio_content/images/Oscar_LinkedIn_Pic.jpeg +


    Oscar Gil is a Data Scientist at the University of California, Riverside, bringing over ten years of professional experience in the education data management industry. An effective data professional, he excels in Data Warehousing, Data Analytics, Data Wrangling, Machine Learning, SQL, Python, R, Data Automation, and Report Authoring. Oscar holds a Master of Science in Applied Data Science from the University of San Diego.

    diff --git a/docs/v0.0.9/data_management.html b/docs/v0.0.9/data_management.html index 5fb44cc9a..6361bb17b 100644 --- a/docs/v0.0.9/data_management.html +++ b/docs/v0.0.9/data_management.html @@ -1,3 +1,5 @@ + + @@ -6,26 +8,22 @@ Data Management Overview — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - - + + + + + + + + + @@ -143,7 +141,8 @@
    -
    EDA Toolkit Logo +

    Data Management Overview

    In any data-driven project, effective management of data is crucial. This @@ -163,7 +162,7 @@

    Path directoriesensure_directory(path)
    Parameters:
    -

    path (str) – The path to the directory that needs to be ensured.

    +

    path (str) – The path to the directory that needs to be ensured.

    Returns:

    None

    @@ -232,10 +231,10 @@

    Adding Unique IdentifiersParameters:
    • df (pd.DataFrame) – The dataframe to add IDs to.

    • -
    • id_colname (str, optional) – The name of the new column for the IDs. Defaults to "ID".

    • -
    • num_digits (int, optional) – The number of digits for the unique IDs. Defaults to 9.

    • -
    • seed (int, optional) – The seed for the random number generator. Defaults to None.

    • -
    • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

    • +
    • id_colname (str, optional) – The name of the new column for the IDs. Defaults to "ID".

    • +
    • num_digits (int, optional) – The number of digits for the unique IDs. Defaults to 9.

    • +
    • seed (int, optional) – The seed for the random number generator. Defaults to None.

    • +
    • set_as_index (bool, optional) – Whether to set the new ID column as the index. Defaults to False.

    Returns:
    @@ -404,7 +403,7 @@

    Trailing Period RemovalParameters:
    Returns:
    @@ -533,16 +532,16 @@

    Standardized Dates
    Parameters:
    -

    date_str (str) – A date string to be standardized.

    +

    date_str (str) – A date string to be standardized.

    Returns:

    A standardized date string in the format YYYY-MM-DD.

    Return type:
    -

    str

    +

    str

    Raises:
    -

    ValueError – If date_str is in an unrecognized format or if the function +

    ValueError – If date_str is in an unrecognized format or if the function cannot parse the date.

    @@ -622,9 +621,9 @@

    DataFrame AnalysisParameters:
    • df (pandas.DataFrame) – The DataFrame to analyze.

    • -
    • background_color (str, optional) – Hex color code or color name for background styling in the output +

    • background_color (str, optional) – Hex color code or color name for background styling in the output DataFrame. Defaults to None.

    • -
    • return_df (bool, optional) – If True, returns the plain DataFrame with the summary statistics. If +

    • return_df (bool, optional) – If True, returns the plain DataFrame with the summary statistics. If False, returns a styled DataFrame for visual presentation. Defaults to False.

    @@ -876,17 +875,17 @@

    Generating Summary Tables for Variable CombinationsParameters:
    • df (pandas.DataFrame) – The pandas DataFrame containing the data.

    • -
    • variables (list of str) – List of column names from the DataFrame to generate combinations.

    • -
    • data_path (str) – Path where the output Excel file will be saved.

    • -
    • data_name (str) – Name of the output Excel file.

    • -
    • min_length (int, optional) – Minimum size of the combinations to generate. Defaults to 2.

    • +
    • variables (list of str) – List of column names from the DataFrame to generate combinations.

    • +
    • data_path (str) – Path where the output Excel file will be saved.

    • +
    • data_name (str) – Name of the output Excel file.

    • +
    • min_length (int, optional) – Minimum size of the combinations to generate. Defaults to 2.

    Returns:

    A tuple containing a dictionary of summary tables and a list of all generated combinations.

    Return type:
    -

    tuple(dict, list)

    +

    tuple(dict, list)

    @@ -1068,7 +1067,8 @@

    Generating Summary Tables for Variable Combinations

    When applied to the US Census data, the output Excel file will contain summary tables for all possible combinations of the specified variables. The first sheet will be a Table of Contents with hyperlinks to each summary table.

    -
    EDA Toolkit Logo +

    Saving DataFrames to Excel with Customized Formatting

    @@ -1081,9 +1081,9 @@

    Saving DataFrames to Excel with Customized Formatting
    Parameters:
      -
    • file_path (str) – Full path to the output Excel file.

    • -
    • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

    • -
    • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

    • +
    • file_path (str) – Full path to the output Excel file.

    • +
    • df_dict (dict) – Dictionary where keys are sheet names and values are DataFrames to save.

    • +
    • decimal_places (int) – Number of decimal places to round numeric columns. Default is 0.

    @@ -1143,12 +1143,12 @@

    Creating Contingency TablesParameters:
    • df (pandas.DataFrame) – The DataFrame to analyze.

    • -
    • cols (str or list of str, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

    • -
    • sort_by (int, optional) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order. Defaults to 0.

    • +
    • cols (str or list of str, optional) – Name of the column (as a string) for a single column or list of column names for multiple columns. Must provide at least one column.

    • +
    • sort_by (int, optional) – Enter 0 to sort results by column groups; enter 1 to sort results by totals in descending order. Defaults to 0.

    Raises:
    -

    ValueError – If no columns are specified or if sort_by is not 0 or 1.

    +

    ValueError – If no columns are specified or if sort_by is not 0 or 1.

    Returns:

    A DataFrame containing the contingency table with the specified columns, a 'Total' column representing the count of occurrences, and a 'Percentage' column representing the percentage of the total count.

    @@ -1211,8 +1211,8 @@

    Highlighting Specific Columns in a DataFrameParameters:
    Returns:
    diff --git a/docs/v0.0.9/eda_plots.html b/docs/v0.0.9/eda_plots.html index e425c6fce..14933da46 100644 --- a/docs/v0.0.9/eda_plots.html +++ b/docs/v0.0.9/eda_plots.html @@ -1,3 +1,5 @@ + + @@ -6,26 +8,22 @@ Plotting and Theoretical Overview — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - - + + + + + + + + + @@ -164,7 +162,8 @@
    -
    EDA Toolkit Logo +

    Plotting and Theoretical Overview

    @@ -183,7 +182,8 @@

    Gaussian Assumption for Normality\(\mu \pm 2\sigma\)

  • 99.7% within \(\mu \pm 3\sigma\)

  • -
    KDE Distributions - KDE (+) Histograms (Density) +

    Histograms and Kernel Density Estimation (KDE)

    Histograms:

    @@ -339,50 +339,50 @@

    KDE Distribution FunctionParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots. If ‘all’, plots will be generated for all numeric columns.

    • -
    • figsize (tuple of int, optional) – Size of each individual plot, default is (5, 5). Used when only one plot is being generated or when saving individual plots.

    • -
    • grid_figsize (tuple of int, optional) – Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on figsize, n_rows, and n_cols.

    • -
    • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

    • -
    • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

    • -
    • mean_color (str, optional) – Color of the mean line if plot_mean is True, default is '#000000'.

    • -
    • median_color (str, optional) – Color of the median line if plot_median is True, default is '#000000'.

    • -
    • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

    • -
    • hue (str, optional) – Column name to group data by, adding different colors for each group.

    • -
    • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

    • -
    • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid. If not provided, it will be calculated automatically.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid. If not provided, it will be calculated automatically.

    • -
    • w_pad (float, optional) – Width padding between subplots, default is 1.0.

    • -
    • h_pad (float, optional) – Height padding between subplots, default is 1.0.

    • -
    • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

    • -
    • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

    • -
    • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

    • -
    • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

    • -
    • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses figsize for determining the plot size, ignoring grid_figsize.

    • -
    • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

    • -
    • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

    • -
    • log_scale_vars (str or list of str, optional) – Variable name(s) to apply log scaling. Can be a single string or a list of strings.

    • -
    • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

    • -
    • binwidth (float, optional) – Width of each bin, overrides bins but can be used with binrange.

    • -
    • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • -
    • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

    • -
    • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

    • -
    • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • -
    • plot_mean (bool, optional) – Whether to plot the mean as a vertical line, default is False.

    • -
    • plot_median (bool, optional) – Whether to plot the median as a vertical line, default is False.

    • -
    • std_dev_levels (list of int, optional) – Levels of standard deviation to plot around the mean.

    • -
    • std_color (str or list of str, optional) – Color(s) for the standard deviation lines, default is '#808080'.

    • -
    • label_names (dict, optional) – Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display.

    • -
    • show_legend (bool, optional) – Whether to show the legend on the plots, default is True.

    • +
    • vars_of_interest (list of str, optional) – List of column names for which to generate distribution plots. If ‘all’, plots will be generated for all numeric columns.

    • +
    • figsize (tuple of int, optional) – Size of each individual plot, default is (5, 5). Used when only one plot is being generated or when saving individual plots.

    • +
    • grid_figsize (tuple of int, optional) – Size of the overall grid of plots when multiple plots are generated in a grid. Ignored when only one plot is being generated or when saving individual plots. If not specified, it is calculated based on figsize, n_rows, and n_cols.

    • +
    • hist_color (str, optional) – Color of the histogram bars, default is '#0000FF'.

    • +
    • kde_color (str, optional) – Color of the KDE plot, default is '#FF0000'.

    • +
    • mean_color (str, optional) – Color of the mean line if plot_mean is True, default is '#000000'.

    • +
    • median_color (str, optional) – Color of the median line if plot_median is True, default is '#000000'.

    • +
    • hist_edgecolor (str, optional) – Color of the histogram bar edges, default is '#000000'.

    • +
    • hue (str, optional) – Column name to group data by, adding different colors for each group.

    • +
    • fill (bool, optional) – Whether to fill the histogram bars with color, default is True.

    • +
    • fill_alpha (float, optional) – Alpha transparency for the fill color of the histogram bars, where 0 is fully transparent and 1 is fully opaque. Default is 1.

    • +
    • n_rows (int, optional) – Number of rows in the subplot grid. If not provided, it will be calculated automatically.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid. If not provided, it will be calculated automatically.

    • +
    • w_pad (float, optional) – Width padding between subplots, default is 1.0.

    • +
    • h_pad (float, optional) – Height padding between subplots, default is 1.0.

    • +
    • image_path_png (str, optional) – Directory path to save the PNG image of the overall distribution plots.

    • +
    • image_path_svg (str, optional) – Directory path to save the SVG image of the overall distribution plots.

    • +
    • image_filename (str, optional) – Filename to use when saving the overall distribution plots.

    • +
    • bbox_inches (str, optional) – Bounding box to use when saving the figure. For example, 'tight'.

    • +
    • single_var_image_filename (str, optional) – Filename to use when saving the separate distribution plots. The variable name will be appended to this filename. This parameter uses figsize for determining the plot size, ignoring grid_figsize.

    • +
    • y_axis_label (str, optional) – The label to display on the y-axis, default is 'Density'.

    • +
    • plot_type (str, optional) – The type of plot to generate, options are 'hist', 'kde', or 'both'. Default is 'both'.

    • +
    • log_scale_vars (str or list of str, optional) – Variable name(s) to apply log scaling. Can be a single string or a list of strings.

    • +
    • bins (int or sequence, optional) – Specification of histogram bins, default is 'auto'.

    • +
    • binwidth (float, optional) – Width of each bin, overrides bins but can be used with binrange.

    • +
    • label_fontsize (int, optional) – Font size for axis labels, including xlabel, ylabel, and tick marks, default is 10.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • +
    • text_wrap (int, optional) – Maximum width of the title text before wrapping, default is 50.

    • +
    • disable_sci_notation (bool, optional) – Toggle to disable scientific notation on axes, default is False.

    • +
    • stat (str, optional) – Aggregate statistic to compute in each bin (e.g., 'count', 'frequency', 'probability', 'percent', 'density'), default is 'density'.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • plot_mean (bool, optional) – Whether to plot the mean as a vertical line, default is False.

    • +
    • plot_median (bool, optional) – Whether to plot the median as a vertical line, default is False.

    • +
    • std_dev_levels (list of int, optional) – Levels of standard deviation to plot around the mean.

    • +
    • std_color (str or list of str, optional) – Color(s) for the standard deviation lines, default is '#808080'.

    • +
    • label_names (dict, optional) – Custom labels for the variables of interest. Keys should be column names, and values should be the corresponding labels to display.

    • +
    • show_legend (bool, optional) – Whether to show the legend on the plots, default is True.

    • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

    Raises:

    -
    KDE Distributions - KDE (+) Histograms (Density) +

    Histogram Example (Density)

    @@ -504,7 +505,8 @@

    Histogram Example (Density))

    -
    KDE Distributions - Histograms (Density) +

    Histogram Example (Count)

    @@ -544,7 +546,8 @@

    Histogram Example (Count))

    -
    KDE Distributions - Histograms (Count) +

    Histogram Example - (Mean and Median)

    @@ -591,7 +594,8 @@

    Histogram Example - (Mean and Median))

    -
    KDE Distributions - Histograms (Count) +

    Histogram Example - (Mean, Median, and Std. Deviation)

    @@ -655,7 +659,8 @@

    Histogram Example - (Mean, Median, and Std. Deviation))

    -
    KDE Distributions - Histograms (Count) +
    @@ -677,45 +682,45 @@

    Stacked Crosstab PlotsParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • col (str) – The name of the column in the DataFrame to be analyzed.

    • -
    • func_col (list) – List of ground truth columns to be analyzed.

    • -
    • legend_labels_list (list) – List of legend labels for each ground truth column.

    • -
    • title (list) – List of titles for the plots.

    • -
    • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

    • -
    • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

    • -
    • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

    • -
    • custom_order (list, optional) – Specifies a custom order for the categories in the col.

    • -
    • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

    • -
    • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

    • -
    • save_formats (list, optional) – List of file formats to save the plot images in.

    • -
    • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

    • -
    • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

    • -
    • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

    • -
    • x (int, optional) – The width of the figure.

    • -
    • y (int, optional) – The height of the figure.

    • -
    • p (int, optional) – The padding between the subplots.

    • -
    • file_prefix (str, optional) – Prefix for the filename when output includes plots.

    • -
    • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

    • -
    • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

    • -
    • show_legend (bool, optional) – Specify whether to show the legend, default is True.

    • -
    • label_fontsize (int, optional) – Font size for axis labels, default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • -
    • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • col (str) – The name of the column in the DataFrame to be analyzed.

    • +
    • func_col (list) – List of ground truth columns to be analyzed.

    • +
    • legend_labels_list (list) – List of legend labels for each ground truth column.

    • +
    • title (list) – List of titles for the plots.

    • +
    • kind (str, optional) – The kind of plot to generate ('bar' or 'barh' for horizontal bars), default is 'bar'.

    • +
    • width (float, optional) – The width of the bars in the bar plot, default is 0.9.

    • +
    • rot (int, optional) – The rotation angle of the x-axis labels, default is 0.

    • +
    • custom_order (list, optional) – Specifies a custom order for the categories in the col.

    • +
    • image_path_png (str, optional) – Directory path where generated PNG plot images will be saved.

    • +
    • image_path_svg (str, optional) – Directory path where generated SVG plot images will be saved.

    • +
    • save_formats (list, optional) – List of file formats to save the plot images in.

    • +
    • color (list, optional) – List of colors to use for the plots. If not provided, a default color scheme is used.

    • +
    • output (str, optional) – Specify the output type: "plots_only", "crosstabs_only", or "both". Default is "both".

    • +
    • return_dict (bool, optional) – Specify whether to return the crosstabs dictionary, default is False.

    • +
    • x (int, optional) – The width of the figure.

    • +
    • y (int, optional) – The height of the figure.

    • +
    • p (int, optional) – The padding between the subplots.

    • +
    • file_prefix (str, optional) – Prefix for the filename when output includes plots.

    • +
    • logscale (bool, optional) – Apply log scale to the y-axis, default is False.

    • +
    • plot_type (str, optional) – Specify the type of plot to generate: "both", "regular", "normalized". Default is "both".

    • +
    • show_legend (bool, optional) – Specify whether to show the legend, default is True.

    • +
    • label_fontsize (int, optional) – Font size for axis labels, default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels on the axes, default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping, default is 50.

    • +
    • remove_stacks (bool, optional) – If True, removes stacks and creates a regular bar plot using only the col parameter. Only works when plot_type is set to 'regular'. Default is False.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    Raises:
      -
    • ValueError

        +
      • ValueError

        • If output is not one of "both", "plots_only", or "crosstabs_only".

        • If plot_type is not one of "both", "regular", "normalized".

        • If remove_stacks is set to True and plot_type is not "regular".

        • If the lengths of title, func_col, and legend_labels_list are not equal.

      • -
      • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

      • +
      • KeyError – If any columns specified in col or func_col are missing in the DataFrame.

    Returns:
    @@ -855,8 +860,10 @@

    Stacked Bar Plots With Crosstabs ExampleKDE Distributions -

    Stacked Bar Plot Age vs. Income +
    KDE Distributions + +

    Note

    When you set return_dict=True, you are able to see the crosstabs printed out @@ -1100,7 +1107,8 @@

    Pivoted Stacked Bar Plots Example"barh" in the stacked_crosstab_plot function. This option pivots the standard vertical stacked bar plot into a horizontal orientation, making it easier to compare categories when there are many labels on the y-axis.

    -
    Stacked Bar Plot Age vs. Income (Pivoted) +

    Non-Normalized Stacked Bar Plots Example

    @@ -1110,7 +1118,8 @@

    Non-Normalized Stacked Bar Plots Exampleplot_type to "normalized" will display only the normalized plots. The example below demonstrates regular stacked bar plots for income by age.

    -
    Stacked Bar Plot Age vs. Income (Regular) +

    Regular Non-Stacked Bar Plots Example

    @@ -1125,7 +1134,8 @@

    Regular Non-Stacked Bar Plots Example#333333), and the legend has been removed by setting show_legend=False. This illustrates regular bar plots for income by age, without stacking.

    -
    Bar Plot Age vs. Income (Regular) +

    @@ -1157,31 +1167,31 @@

    Box and Violin PlotsParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data to plot.

    • -
    • metrics_list (list of str) – List of metric names (columns in df) to plot.

    • -
    • metrics_comp (list of str) – List of comparison categories (columns in df).

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated automatically if not provided.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated automatically if not provided.

    • -
    • image_path_png (str, optional) – Optional directory path to save .png images.

    • -
    • image_path_svg (str, optional) – Optional directory path to save .svg images.

    • -
    • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

    • -
    • show_legend (bool, optional) – Boolean, True if showing the legend in the plots. Default is True.

    • -
    • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • -
    • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

    • -
    • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots. Default is False.

    • -
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • -
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • -
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • -
    • label_names (dict, optional) – Dictionary mapping original column names to custom labels. Default is None.

    • +
    • metrics_list (list of str) – List of metric names (columns in df) to plot.

    • +
    • metrics_comp (list of str) – List of comparison categories (columns in df).

    • +
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated automatically if not provided.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated automatically if not provided.

    • +
    • image_path_png (str, optional) – Optional directory path to save .png images.

    • +
    • image_path_svg (str, optional) – Optional directory path to save .svg images.

    • +
    • save_plots (str, optional) – String, "all", "individual", or "grid" to control saving plots.

    • +
    • show_legend (bool, optional) – Boolean, True if showing the legend in the plots. Default is True.

    • +
    • plot_type (str, optional) – Specify the type of plot, either "boxplot" or "violinplot". Default is "boxplot".

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • +
    • show_plot (str, optional) – Specify the plot display mode: "individual", "grid", or "both". Default is "both".

    • +
    • rotate_plot (bool, optional) – Boolean, True if rotating (pivoting) the plots. Default is False.

    • +
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • +
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots.

    • +
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • label_names (dict, optional) – Dictionary mapping original column names to custom labels. Default is None.

    • kwargs (additional keyword arguments) – Additional keyword arguments passed to the Seaborn plotting function.

    Raises:
    -

    ValueError

      +

      ValueError

      • If show_plot is not one of "individual", "grid", or "both".

      • If save_plots is not one of None, "all", "individual", or "grid".

      • If save_plots is set without specifying image_path_png or image_path_svg.

      • @@ -1242,7 +1252,8 @@

        Box Plots Grid Example)

    -
    Box Plot Comparisons +

    Violin Plots Grid Example

    @@ -1267,7 +1278,8 @@

    Violin Plots Grid Example)

    -
    Violin Plot Comparisons +

    Pivoted Violin Plots Grid Example

    @@ -1290,7 +1302,8 @@

    Pivoted Violin Plots Grid Example)

    -
    Violin Plot Comparisons (Pivoted) +
    @@ -1333,42 +1346,42 @@

    Scatter Fit PlotParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data.

    • -
    • x_vars (list of str, optional) – List of variable names to plot on the x-axis.

    • -
    • y_vars (list of str, optional) – List of variable names to plot on the y-axis.

    • -
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated based on the number of plots and n_cols if not specified.

    • -
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated based on the number of plots and max_cols if not specified.

    • -
    • max_cols (int, optional) – Maximum number of columns in the subplot grid. Default is 4.

    • -
    • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

    • -
    • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

    • -
    • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid". If None, plots will not be saved.

    • -
    • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • -
    • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

    • -
    • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

    • -
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • -
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified.

    • -
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

    • -
    • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

    • -
    • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

    • -
    • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

    • -
    • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

    • -
    • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the hue parameter to be set.

    • -
    • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

    • -
    • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

    • -
    • marker (str, optional) – Marker style used for the scatter points. Default is "o".

    • -
    • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

    • -
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • -
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • -
    • all_vars (list of str, optional) – If provided, automatically generates scatter plots for all combinations of variables in this list, overriding x_vars and y_vars.

    • -
    • label_names (dict, optional) – A dictionary to rename columns for display in the plot titles and labels.

    • -
    • kwargs (dict, optional) – Additional keyword arguments to pass to sns.scatterplot.

    • +
    • x_vars (list of str, optional) – List of variable names to plot on the x-axis.

    • +
    • y_vars (list of str, optional) – List of variable names to plot on the y-axis.

    • +
    • n_rows (int, optional) – Number of rows in the subplot grid. Calculated based on the number of plots and n_cols if not specified.

    • +
    • n_cols (int, optional) – Number of columns in the subplot grid. Calculated based on the number of plots and max_cols if not specified.

    • +
    • max_cols (int, optional) – Maximum number of columns in the subplot grid. Default is 4.

    • +
    • image_path_png (str, optional) – Directory path to save PNG images of the scatter plots.

    • +
    • image_path_svg (str, optional) – Directory path to save SVG images of the scatter plots.

    • +
    • save_plots (str, optional) – Controls which plots to save: "all", "individual", or "grid". If None, plots will not be saved.

    • +
    • show_legend (bool, optional) – Whether to display the legend on the plots. Default is True.

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 0.

    • +
    • show_plot (str, optional) – Controls plot display: "individual", "grid", or "both". Default is "both".

    • +
    • rotate_plot (bool, optional) – Whether to rotate (pivot) the plots. Default is False.

    • +
    • individual_figsize (tuple or list, optional) – Width and height of the figure for individual plots. Default is (6, 4).

    • +
    • grid_figsize (tuple or list, optional) – Width and height of the figure for grid plots. Calculated based on the number of rows and columns if not specified.

    • +
    • label_fontsize (int, optional) – Font size for axis labels. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • add_best_fit_line (bool, optional) – Whether to add a best fit line to the scatter plots. Default is False.

    • +
    • scatter_color (str, optional) – Color code for the scattered points. Default is "C0".

    • +
    • best_fit_linecolor (str, optional) – Color code for the best fit line. Default is "red".

    • +
    • best_fit_linestyle (str, optional) – Linestyle for the best fit line. Default is "-".

    • +
    • hue (str, optional) – Column name for the grouping variable that will produce points with different colors.

    • +
    • hue_palette (dict, list, or str, optional) – Specifies colors for each hue level. Can be a dictionary mapping hue levels to colors, a list of colors, or the name of a seaborn color palette. This parameter requires the hue parameter to be set.

    • +
    • size (str, optional) – Column name for the grouping variable that will produce points with different sizes.

    • +
    • sizes (dict, optional) – Dictionary mapping sizes (smallest and largest) to min and max values.

    • +
    • marker (str, optional) – Marker style used for the scatter points. Default is "o".

    • +
    • show_correlation (bool, optional) – Whether to display the Pearson correlation coefficient in the plot title. Default is True.

    • +
    • xlim (tuple or list, optional) – Limits for the x-axis as a tuple or list of (min, max).

    • +
    • ylim (tuple or list, optional) – Limits for the y-axis as a tuple or list of (min, max).

    • +
    • all_vars (list of str, optional) – If provided, automatically generates scatter plots for all combinations of variables in this list, overriding x_vars and y_vars.

    • +
    • label_names (dict, optional) – A dictionary to rename columns for display in the plot titles and labels.

    • +
    • kwargs (dict, optional) – Additional keyword arguments to pass to sns.scatterplot.

    Raises:
    -

    ValueError

      +

      ValueError

      • If all_vars is provided and either x_vars or y_vars is also provided.

      • If neither all_vars nor both x_vars and y_vars are provided.

      • If hue_palette is specified without hue.

      • @@ -1417,7 +1430,8 @@

        Regression-Centric Scatter Plots Example)

    -
    Scatter Plot Comparisons (with Best Fit Lines) +

    Scatter Plots Grouped by Category Example

    @@ -1470,7 +1484,8 @@

    Scatter Plots Grouped by Category Example)

    -
    Scatter Plot Comparisons (Grouped) +

    Scatter Plots (All Combinations Example)

    @@ -1499,7 +1514,8 @@

    Scatter Plots (All Combinations Example))

    -
    Scatter Plot Comparisons (Grouped2) +
    @@ -1533,30 +1549,30 @@

    Correlation MatricesParameters:
    • df (pandas.DataFrame) – The DataFrame containing the data.

    • -
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • -
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • -
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • -
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • -
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • -
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • -
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • -
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • -
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • -
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • -
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • -
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • -
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • -
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • -
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • -
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • -
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • -
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    • +
    • cols (list of str, optional) – List of column names to include in the correlation matrix. If None, all columns are included.

    • +
    • annot (bool, optional) – Whether to annotate the heatmap with correlation coefficients. Default is True.

    • +
    • cmap (str, optional) – The colormap to use for the heatmap. Default is "coolwarm".

    • +
    • save_plots (bool, optional) – Controls whether to save the plots. Default is False.

    • +
    • image_path_png (str, optional) – Directory path to save PNG images of the heatmap.

    • +
    • image_path_svg (str, optional) – Directory path to save SVG images of the heatmap.

    • +
    • figsize (tuple, optional) – Width and height of the figure for the heatmap. Default is (10, 10).

    • +
    • title (str, optional) – Title of the heatmap. Default is "Cervical Cancer Data: Correlation Matrix".

    • +
    • label_fontsize (int, optional) – Font size for tick labels and colorbar label. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for axis tick labels. Default is 10.

    • +
    • xlabel_rot (int, optional) – Rotation angle for x-axis labels. Default is 45.

    • +
    • ylabel_rot (int, optional) – Rotation angle for y-axis labels. Default is 0.

    • +
    • xlabel_alignment (str, optional) – Horizontal alignment for x-axis labels. Default is "right".

    • +
    • ylabel_alignment (str, optional) – Vertical alignment for y-axis labels. Default is "center_baseline".

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Default is 50.

    • +
    • vmin (float, optional) – Minimum value for the heatmap color scale. Default is -1.

    • +
    • vmax (float, optional) – Maximum value for the heatmap color scale. Default is 1.

    • +
    • cbar_label (str, optional) – Label for the colorbar. Default is "Correlation Index".

    • +
    • triangular (bool, optional) – Whether to show only the upper triangle of the correlation matrix. Default is True.

    • +
    • kwargs (dict, optional) – Additional keyword arguments to pass to seaborn.heatmap().

    Raises:
    -

    ValueError

      +

      ValueError

      • If annot is not a boolean.

      • If cols is not a list.

      • If save_plots is not a boolean.

      • @@ -1614,7 +1630,8 @@

        Triangular Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +

    Full Correlation Matrix Example

    @@ -1648,7 +1665,8 @@

    Full Correlation Matrix Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -1675,24 +1693,24 @@

    2D Partial Dependence Plots
    • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

    • X_train (pandas.DataFrame or numpy.ndarray) – The training data used to compute partial dependence. Should correspond to the features used to train the model.

    • -
    • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

    • -
    • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

    • -
    • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

    • -
    • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

    • -
    • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

    • -
    • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

    • -
    • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

    • -
    • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

    • -
    • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

    • -
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • -
    • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

    • -
    • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

    • -
    • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

    • -
    • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

    • +
    • feature_names (list of str) – A list of feature names corresponding to the columns in X_train.

    • +
    • features (list of int or tuple of int) – A list of feature indices or tuples of feature indices for which to generate partial dependence plots.

    • +
    • title (str, optional) – The title for the entire plot. Default is "PDP of house value on CA non-location features".

    • +
    • grid_resolution (int, optional) – The number of grid points to use for plotting the partial dependence. Higher values provide smoother curves but may increase computation time. Default is 50.

    • +
    • plot_type (str, optional) – The type of plot to generate. Choose "grid" for a grid layout, "individual" for separate plots, or "both" to generate both layouts. Default is "grid".

    • +
    • grid_figsize (tuple, optional) – Tuple specifying the width and height of the figure for the grid layout. Default is (12, 8).

    • +
    • individual_figsize (tuple, optional) – Tuple specifying the width and height of the figure for individual plots. Default is (6, 4).

    • +
    • label_fontsize (int, optional) – Font size for the axis labels and titles. Default is 12.

    • +
    • tick_fontsize (int, optional) – Font size for the axis tick labels. Default is 10.

    • +
    • text_wrap (int, optional) – The maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • +
    • image_path_png (str, optional) – The directory path where PNG images of the plots will be saved, if saving is enabled.

    • +
    • image_path_svg (str, optional) – The directory path where SVG images of the plots will be saved, if saving is enabled.

    • +
    • save_plots (str, optional) – Controls whether to save the plots. Options include "all", "individual", "grid", or None (default). If saving is enabled, ensure image_path_png or image_path_svg are provided.

    • +
    • file_prefix (str, optional) – Prefix for the filenames of the saved grid plots. Default is "partial_dependence".

    Raises:
    -

    ValueError

      +

      ValueError

      • If plot_type is not one of "grid", "individual", or "both".

      • If save_plots is enabled but neither image_path_png nor image_path_svg is provided.

      @@ -1787,7 +1805,8 @@

      2D Plots - CA Housing Example)

    -
    Scatter Plot Comparisons (Grouped) +
    @@ -1808,47 +1827,47 @@

    3D Partial Dependence Plots
    • model (estimator object) – The trained machine learning model used to generate partial dependence plots.

    • dataframe (pandas.DataFrame or numpy.ndarray) – The dataset on which the model was trained or a representative sample. If a DataFrame is provided, feature_names_list should correspond to the column names. If a NumPy array is provided, feature_names_list should correspond to the indices of the columns.

    • -
    • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

    • -
    • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

    • -
    • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

    • -
    • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

    • -
    • title (str) – The title for the plots.

    • -
    • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

    • -
    • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

    • -
    • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

    • -
    • plot_type (str, optional) – The type of plots to generate. Options are: +

    • feature_names_list (list of str) – A list of two feature names or indices corresponding to the features for which partial dependence plots are generated.

    • +
    • x_label (str, optional) – Label for the x-axis in the plots. Default is None.

    • +
    • y_label (str, optional) – Label for the y-axis in the plots. Default is None.

    • +
    • z_label (str, optional) – Label for the z-axis in the plots. Default is None.

    • +
    • title (str) – The title for the plots.

    • +
    • html_file_path (str, optional) – Path to save the interactive Plotly HTML file. Required if plot_type is "interactive" or "both". Default is None.

    • +
    • html_file_name (str, optional) – Name of the HTML file to save the interactive Plotly plot. Required if plot_type is "interactive" or "both". Default is None.

    • +
    • image_filename (str, optional) – Base filename for saving static Matplotlib plots as PNG and/or SVG. Default is None.

    • +
    • plot_type (str, optional) – The type of plots to generate. Options are: - "static": Generate only static Matplotlib plots. - "interactive": Generate only interactive Plotly plots. - "both": Generate both static and interactive plots. Default is "both".

    • matplotlib_colormap (matplotlib.colors.Colormap, optional) – Custom colormap for the Matplotlib plot. If not provided, a default colormap is used.

    • -
    • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

    • -
    • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

    • -
    • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

    • -
    • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

    • -
    • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

    • -
    • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • -
    • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

    • -
    • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

    • -
    • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

    • -
    • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

    • -
    • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

    • -
    • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

    • -
    • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

    • -
    • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

    • -
    • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

    • -
    • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

    • -
    • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

    • -
    • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

    • -
    • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

    • -
    • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

    • -
    • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

    • -
    • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

    • -
    • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

    • -
    • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

    • +
    • plotly_colormap (str, optional) – Colormap for the Plotly plot. Default is "Viridis".

    • +
    • zoom_out_factor (float, optional) – Factor to adjust the zoom level of the Plotly plot. Default is None.

    • +
    • wireframe_color (str, optional) – Color for the wireframe in the Matplotlib plot. If None, no wireframe is plotted. Default is None.

    • +
    • view_angle (tuple, optional) – Elevation and azimuthal angles for the Matplotlib plot view. Default is (22, 70).

    • +
    • figsize (tuple, optional) – Figure size for the Matplotlib plot. Default is (7, 4.5).

    • +
    • text_wrap (int, optional) – Maximum width of the title text before wrapping. Useful for managing long titles. Default is 50.

    • +
    • horizontal (float, optional) – Horizontal camera position for the Plotly plot. Default is -1.25.

    • +
    • depth (float, optional) – Depth camera position for the Plotly plot. Default is 1.25.

    • +
    • vertical (float, optional) – Vertical camera position for the Plotly plot. Default is 1.25.

    • +
    • cbar_x (float, optional) – Position of the color bar along the x-axis in the Plotly plot. Default is 1.05.

    • +
    • cbar_thickness (int, optional) – Thickness of the color bar in the Plotly plot. Default is 25.

    • +
    • title_x (float, optional) – Horizontal position of the title in the Plotly plot. Default is 0.5.

    • +
    • title_y (float, optional) – Vertical position of the title in the Plotly plot. Default is 0.95.

    • +
    • top_margin (int, optional) – Top margin for the Plotly plot layout. Default is 100.

    • +
    • image_path_png (str, optional) – Directory path to save the PNG file of the Matplotlib plot. Default is None.

    • +
    • image_path_svg (str, optional) – Directory path to save the SVG file of the Matplotlib plot. Default is None.

    • +
    • show_cbar (bool, optional) – Whether to display the color bar in the Matplotlib plot. Default is True.

    • +
    • grid_resolution (int, optional) – The resolution of the grid for computing partial dependence. Default is 20.

    • +
    • left_margin (int, optional) – Left margin for the Plotly plot layout. Default is 20.

    • +
    • right_margin (int, optional) – Right margin for the Plotly plot layout. Default is 65.

    • +
    • label_fontsize (int, optional) – Font size for axis labels in the Matplotlib plot. Default is 8.

    • +
    • tick_fontsize (int, optional) – Font size for tick labels in the Matplotlib plot. Default is 6.

    • +
    • enable_zoom (bool, optional) – Whether to enable zooming in the Plotly plot. Default is True.

    • +
    • show_modebar (bool, optional) – Whether to display the mode bar in the Plotly plot. Default is True.

    Raises:
    -

    ValueError

      +

      ValueError

      • If plot_type is not one of "static", "interactive", or "both".

      • If plot_type is "interactive" or "both" and html_file_path or html_file_name are not provided.

      @@ -1941,7 +1960,8 @@

      Static Plot)

    -
    Scatter Plot Comparisons (Grouped) +

    Interactive Plot

    diff --git a/docs/v0.0.9/genindex.html b/docs/v0.0.9/genindex.html index 81d4721f3..2a3c13516 100644 --- a/docs/v0.0.9/genindex.html +++ b/docs/v0.0.9/genindex.html @@ -1,3 +1,5 @@ + + @@ -5,25 +7,21 @@ Index — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - + + + + + + + + diff --git a/docs/v0.0.9/getting_started.html b/docs/v0.0.9/getting_started.html index c3aeaf154..0e30326ed 100644 --- a/docs/v0.0.9/getting_started.html +++ b/docs/v0.0.9/getting_started.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ Welcome to the EDA Toolkit Python Library Documentation! — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - + + + + + + + + @@ -111,7 +109,8 @@
    -
    EDA Toolkit Logo +

    Welcome to the EDA Toolkit Python Library Documentation!

    diff --git a/docs/v0.0.9/index.html b/docs/v0.0.9/index.html index b74921046..7ce21aa08 100644 --- a/docs/v0.0.9/index.html +++ b/docs/v0.0.9/index.html @@ -1,3 +1,5 @@ + + @@ -6,26 +8,22 @@ Table of Contents — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - - + + + + + + + + + @@ -103,7 +101,8 @@
    -
    EDA Toolkit Logo +

    Table of Contents

    diff --git a/docs/v0.0.9/references.html b/docs/v0.0.9/references.html index 2988fb228..2a3260908 100644 --- a/docs/v0.0.9/references.html +++ b/docs/v0.0.9/references.html @@ -1,3 +1,5 @@ + + @@ -6,25 +8,21 @@ References — EDA Toolkit 0.0.9 documentation - + - - - - - - - - - - + + + + + + + + @@ -102,7 +100,8 @@
    -
    EDA Toolkit Logo +

    References

    diff --git a/docs/v0.0.9/search.html b/docs/v0.0.9/search.html index 176112af3..e471445bc 100644 --- a/docs/v0.0.9/search.html +++ b/docs/v0.0.9/search.html @@ -1,3 +1,5 @@ + + @@ -5,7 +7,7 @@ Search — EDA Toolkit 0.0.9 documentation - + @@ -13,18 +15,14 @@ - - - - - - - - - - + + + + + + + + diff --git a/docs/v0.0.9/searchindex.js b/docs/v0.0.9/searchindex.js index 5277202ce..9569ec2b9 100644 --- a/docs/v0.0.9/searchindex.js +++ b/docs/v0.0.9/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[5, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[5, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[5, "id14"]], "3D Plots - CA Housing Example": [[5, "id15"]], "About EDA Toolkit": [[7, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[4, "adding-unique-identifiers"]], "Binning Numerical Columns": [[4, "binning-numerical-columns"]], "Box Plots Grid Example": [[5, "box-plots-grid-example"]], "Box and Violin Plots": [[5, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[5, "correlation-matrices"]], "Creating Contingency Tables": [[4, "creating-contingency-tables"]], "Data Management": [[7, null]], "Data Management Overview": [[4, null]], "Data Management Techniques": [[4, "data-management-techniques"]], "DataFrame Analysis": [[4, "dataframe-analysis"]], "Description": [[6, "description"]], "Full Correlation Matrix Example": [[5, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[5, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[4, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[7, null]], "Highlighting Specific Columns in a DataFrame": [[4, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[5, "histogram-example-count"]], "Histogram Example (Density)": [[5, "histogram-example-density"]], "Histogram Example - (Mean and Median)": [[5, "histogram-example-mean-and-median"]], "Histogram Example - (Mean, Median, and Std. Deviation)": [[5, "histogram-example-mean-median-and-std-deviation"]], "Histograms and Kernel Density Estimation (KDE)": [[5, "histograms-and-kernel-density-estimation-kde"]], "Installation": [[6, "installation"]], "Interactive Plot": [[5, "interactive-plot"]], "KDE Distribution Function": [[5, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[5, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[5, "kde-and-histograms-example"]], "Key Features": [[6, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[5, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Foundations": [[5, "partial-dependence-foundations"]], "Partial Dependence Plots": [[5, "partial-dependence-plots"]], "Path directories": [[4, "path-directories"]], "Pearson Correlation Coefficient": [[5, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[5, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[5, "pivoted-violin-plots-grid-example"]], "Plotting Heuristics": [[7, null]], "Plotting and Theoretical Overview": [[5, null]], "Prerequisites": [[6, "prerequisites"]], "Project Links": [[6, "project-links"]], "Purpose of EDA Toolkit": [[6, "purpose-of-eda-toolkit"]], "References": [[8, null]], "Regression-Centric Scatter Plots Example": [[5, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[5, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[4, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[5, "scatter-fit-plot"]], "Scatter Plots (All Combinations Example)": [[5, "scatter-plots-all-combinations-example"]], "Scatter Plots Grouped by Category Example": [[5, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[5, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[5, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[5, "stacked-crosstab-plots"]], "Standardized Dates": [[4, "standardized-dates"]], "Static Plot": [[5, "static-plot"]], "Table of Contents": [[7, null]], "Trailing Period Removal": [[4, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[5, "triangular-correlation-matrix-example"]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id7"], [1, "id8"], [1, "id9"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Version 0.0.9": [[1, "version-0-0-9"]], "Violin Plots Grid Example": [[5, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[6, null]], "What is EDA?": [[6, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "data_management", "eda_plots", "getting_started", "index", "references"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "data_management.rst", "eda_plots.rst", "getting_started.rst", "index.rst", "references.rst"], "indexentries": {"add_ids()": [[4, "add_ids", false]], "box_violin_plot()": [[5, "box_violin_plot", false]], "built-in function": [[4, "add_ids", false], [4, "contingency_table", false], [4, "dataframe_columns", false], [4, "ensure_directory", false], [4, "highlight_columns", false], [4, "parse_date_with_rule", false], [4, "save_dataframes_to_excel", false], [4, "strip_trailing_period", false], [4, "summarize_all_combinations", false], [5, "box_violin_plot", false], [5, "flex_corr_matrix", false], [5, "kde_distributions", false], [5, "plot_2d_pdp", false], [5, "plot_3d_pdp", false], [5, "scatter_fit_plot", false], [5, "stacked_crosstab_plot", false]], "contingency_table()": [[4, "contingency_table", false]], "dataframe_columns()": [[4, "dataframe_columns", false]], "ensure_directory()": [[4, "ensure_directory", false]], "flex_corr_matrix()": [[5, "flex_corr_matrix", false]], "highlight_columns()": [[4, "highlight_columns", false]], "kde_distributions()": [[5, "kde_distributions", false]], "parse_date_with_rule()": [[4, "parse_date_with_rule", false]], "plot_2d_pdp()": [[5, "plot_2d_pdp", false]], "plot_3d_pdp()": [[5, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[4, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[5, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[5, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[4, "strip_trailing_period", false]], "summarize_all_combinations()": [[4, "summarize_all_combinations", false]]}, "objects": {"": [[4, 0, 1, "", "add_ids"], [5, 0, 1, "", "box_violin_plot"], [4, 0, 1, "", "contingency_table"], [4, 0, 1, "", "dataframe_columns"], [4, 0, 1, "", "ensure_directory"], [5, 0, 1, "", "flex_corr_matrix"], [4, 0, 1, "", "highlight_columns"], [5, 0, 1, "", "kde_distributions"], [4, 0, 1, "", "parse_date_with_rule"], [5, 0, 1, "", "plot_2d_pdp"], [5, 0, 1, "", "plot_3d_pdp"], [4, 0, 1, "", "save_dataframes_to_excel"], [5, 0, 1, "", "scatter_fit_plot"], [5, 0, 1, "", "stacked_crosstab_plot"], [4, 0, 1, "", "strip_trailing_period"], [4, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 4, 5], "0": [2, 4, 5, 6, 7], "00": 4, "000000": 5, "0000ff": 5, "00140": [5, 8], "00bfc4": 5, "01": 4, "02": [1, 4], "03021": [5, 8], "04": [4, 5], "05": 5, "07": [4, 5], "09": 5, "1": [1, 4, 5, 6], "10": [2, 4, 5, 6, 8], "100": [4, 5], "1016": [5, 8], "10724": 5, "11": 4, "1109": [5, 8], "111": 4, "115": 5, "11687": 5, "11th": 4, "12": [4, 5, 6], "120": 5, "12202842": 4, "123": 4, "12929": 5, "13": [4, 5], "131": 5, "13162633": 2, "13163208": 2, "13174": 5, "1348": 4, "13920": [4, 5], "14": [4, 5], "147": 5, "14x4": 5, "15": [4, 5], "150": 4, "15784": 4, "15x5": 5, "16": [4, 5], "16192": 5, "17": 5, "18": [4, 5, 6], "1873": 5, "19716": 4, "1994": 6, "1996": [4, 5, 6, 8], "1997": [5, 8], "1b0": 7, "1d": 5, "1rc0": 7, "2": [4, 5, 6, 7], "20": [4, 5], "200": 4, "2007": [5, 8], "2020": 4, "2021": [4, 5, 8], "2022": 4, "2024": 2, "203488": 4, "21": [4, 5, 6], "21105": [5, 8], "2115": 5, "215646": 4, "22": 5, "22379": 4, "2245": 5, "22803": 4, "23": 5, "234721": 4, "24432": [4, 5, 6, 8], "24720": 4, "25": [1, 4, 5], "250": [4, 5], "2509": 5, "2565": 4, "26": 5, "27": 5, "274": 4, "28": [4, 5], "280": 5, "28523": 4, "29": [4, 5], "291": [5, 8], "295": 5, "297": [5, 8], "2d": [1, 7, 8], "3": [4, 5, 6, 7, 8], "30": [4, 5], "300": [4, 5], "3021": [5, 8], "3054": 5, "31": 4, "3188": 5, "32": 4, "32650": [4, 5], "33": [4, 5, 8], "333333": 5, "338409": 4, "33906": 4, "34": 5, "3461": 5, "35130194": 4, "36": [4, 5], "3680": 4, "37": [4, 5], "37155": 5, "38": [4, 5], "3853": 5, "39": [4, 5], "3986": 5, "3d": [1, 7], "3d_pdp": 5, "4": [4, 5, 6, 7], "40": [4, 5], "41": 5, "4110": 5, "41762": 4, "42": [4, 5], "42643227": 4, "4267": 4, "43832": 4, "44807": 4, "45": [4, 5], "46": 4, "46560": 4, "467": 4, "468": 4, "469": 4, "47": 5, "470": 4, "471": 4, "472": 4, "4746": 5, "48842": [4, 5], "49": [4, 5], "5": [4, 5, 6, 7], "50": [4, 5], "50k": [4, 5], "50k_": 5, "51": [4, 5], "5281": 2, "53": [4, 5], "535": 5, "55": [5, 8], "56": 4, "5623": 4, "5707": 5, "58": 5, "5856": 4, "59": [4, 5], "595": 5, "6": [4, 5, 6, 7, 8], "60": [4, 5, 8], "61": 4, "6172": 4, "62": 5, "64": [4, 5], "65": 5, "66": [4, 5], "6619": 5, "668": 5, "6738": 5, "68": 5, "69": [4, 5], "7": [4, 5, 6, 7], "70": [4, 5], "71": 5, "7152": [5, 8], "73": 5, "74": 4, "74130842": 4, "746": 5, "75": [4, 5], "7536": 5, "76": [4, 5], "77": 5, "77516": 4, "79": [4, 5], "8": [4, 5, 7], "80": [4, 5], "808080": 5, "809": 5, "81": 5, "815": 5, "82": 4, "8213": 5, "82943611": 4, "83": 5, "83311": 4, "85": [4, 5], "8601": 4, "861555": 4, "87": 5, "87104229": 4, "89": [4, 5], "8a": 7, "8b": 7, "8c": 7, "8d": 1, "9": [2, 4, 5, 6, 7, 8], "90": [4, 5, 8], "90069867": 4, "9076": 5, "91": [4, 5], "93": 5, "93837254": 4, "939": 5, "94": 5, "9468": 5, "95": [4, 5, 8], "96": [4, 5, 8], "96078789": 4, "963": 4, "966": 4, "97": 4, "97751875": 4, "98": 4, "99": [4, 5], "A": [1, 4, 5, 6, 8], "As": 5, "By": [1, 5], "For": [4, 5, 6], "If": [1, 4, 5], "In": [4, 5], "Into": 5, "It": [1, 4, 5, 6], "No": [1, 5], "Not": 4, "One": 1, "The": [1, 4, 5, 6], "Then": 4, "There": 5, "These": [1, 4, 5], "To": 5, "With": [3, 7], "_": 5, "_c": 5, "_plotli": 1, "abil": [1, 5], "abl": 5, "about": 4, "abov": [1, 5], "academ": 0, "accept": 1, "access": 5, "accord": [1, 5], "accordingli": 4, "account": 1, "accur": [1, 5], "accuraci": 4, "acknowledg": [1, 7], "across": [1, 4, 5], "actual": 5, "ad": [1, 5, 7], "adapt": [1, 4, 5], "add": [1, 4, 5], "add_best_fit_lin": 5, "add_id": [1, 4, 7], "addit": [1, 5], "addition": [4, 5, 6], "address": [1, 6], "adher": 5, "adjust": [1, 4, 5], "adm": 4, "advanc": 4, "aesthet": [1, 5], "affect": 5, "after": [1, 4, 5], "ag": [4, 5], "against": 5, "age_boxplot_list": 5, "age_group": [4, 5], "ages_18_to_40": 4, "aggreg": 5, "alic": 4, "align": [1, 4, 5], "all": [1, 4, 6, 7], "all_combin": 4, "all_var": 5, "allow": [1, 4, 5], "alon": 5, "along": [1, 4, 5], "alpha": [1, 5], "alreadi": 4, "also": [0, 1, 5], "altern": 5, "alwai": [1, 4], "amount": 4, "an": [0, 1, 3, 4, 5], "analysi": [1, 5, 6, 7], "analyst": 6, "analyt": 3, "analyz": [1, 4, 5], "angl": [1, 5], "ani": [1, 4, 5, 6], "annot": [1, 5], "anomali": 6, "anoth": 5, "anyth": 1, "appar": 5, "appear": [1, 5], "append": [4, 5], "appli": [0, 1, 3, 4, 5, 6], "applic": [1, 5], "approach": 5, "appropri": [1, 5], "approxim": 5, "ar": [1, 4, 5], "area": 5, "arg": 1, "argument": [1, 5], "around": [1, 5], "arrai": 5, "arrang": 5, "arrow": 5, "artifact": 4, "artifici": 3, "asian": 4, "aspect": [1, 5, 6], "assess": 5, "assign": [1, 4, 5], "associ": [5, 6], "assum": 4, "assumpt": 7, "astyp": 1, "attempt": [4, 5], "attent": 5, "attract": 5, "attribut": 5, "aug": 2, "author": [2, 3], "auto": 5, "autofit": 4, "autom": [3, 6], "automat": [1, 5, 6], "autoregress": [5, 8], "avail": 5, "aveoccup": 5, "averag": 5, "averoom": 5, "avoid": [1, 5], "ax": [1, 5], "axi": [1, 5], "azimuth": 5, "bachelor": 4, "back": [4, 5], "backbon": 4, "background": 4, "background_color": [1, 4], "backward": 1, "badg": 1, "band": 5, "bandwidth": 5, "bar": [1, 6, 7], "barh": 5, "barri": [5, 8], "base": [1, 4, 5], "base_path": 4, "bbox_inch": 5, "becaus": [4, 5], "been": [1, 4, 5], "befor": [1, 4, 5, 6], "begin": [4, 5], "behavior": 5, "being": [4, 5], "bell": 5, "below": [4, 5], "beneath": 5, "benefici": 5, "best": [1, 6, 7], "best_fit_linecolor": 5, "best_fit_linestyl": 5, "beta": 1, "better": [1, 5, 6], "between": [1, 4, 5], "bin": [1, 5, 7], "bin_ag": 4, "binrang": 5, "binwidth": [1, 5], "black": [4, 5], "block": 5, "blue": 5, "bob": 4, "bold": 4, "bool": [4, 5], "boolean": [1, 5], "border": 4, "both": [1, 4, 5], "bound": [4, 5], "boundari": 4, "box": [1, 6, 7], "box_violin_plot": [1, 5, 7], "boxplot": 5, "breakdown": 5, "brief": 1, "bring": 3, "broad": [1, 6], "brown": 5, "browser": 5, "bug": 1, "built": 5, "c0": 5, "c5gp7": [4, 5, 6, 8], "c_i": 5, "ca": 7, "calcul": 5, "california": [3, 5], "call": [1, 4, 5], "camera": [1, 5], "can": [1, 4, 5, 6], "cancer": 5, "cannot": 4, "capabl": [1, 4], "capit": 4, "captur": 5, "career": 0, "case": [1, 4, 5], "categor": [1, 4, 5], "categori": [4, 7], "cbar_label": 5, "cbar_thick": [1, 5], "cbar_x": [1, 5], "cdot": 5, "cell": 4, "censu": [4, 5, 6, 8], "census_id": 4, "census_summary_t": 4, "center_baselin": 5, "central": 5, "centric": 7, "certain": 5, "certifi": 1, "cervic": 5, "chang": [1, 5], "changelog": 7, "charact": [4, 5], "characterist": 6, "charli": 4, "check": [1, 4, 5], "choos": [1, 4, 5], "circl": 5, "citat": 1, "cite": 7, "civ": 4, "clariti": [1, 5], "clean": [1, 4, 5, 6], "cleaner": [1, 4], "cleanup": 1, "clear": [1, 5], "clearer": 1, "clearli": 1, "cleric": 4, "closer": 5, "clutter": 5, "cmap": [1, 5], "code": [1, 4, 5], "codebas": 1, "coeffici": 7, "cohes": 5, "col": [1, 4, 5], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 4, 5], "colorbar": 5, "colormap": [1, 5], "column": [1, 5, 7], "column_nam": 4, "combin": [1, 6, 7], "come": 1, "comment": 1, "common": [1, 4, 6], "compar": 5, "comparison": 5, "compat": [1, 5], "complement": 5, "complementari": 5, "complet": 5, "complex": [1, 5], "comprehens": [1, 5, 6], "comput": [5, 8], "concept": 5, "condit": 1, "condition": 1, "configur": [1, 5], "confirm": 1, "confus": [1, 5], "consecut": 4, "consid": 5, "consist": [1, 4, 5], "consolid": 1, "constant": [4, 5], "constraint": 4, "contain": [4, 5], "content": 4, "context": 5, "conting": [1, 5, 6, 7], "contingency_t": [4, 7], "continu": [1, 4, 5], "contour": 5, "contrast": 5, "contributor": 7, "control": [1, 5], "convers": [1, 4], "convert": [1, 4], "coolwarm": [1, 5], "coordin": 1, "cornel": 3, "correct": [1, 5, 6], "correctli": [1, 4, 5], "correl": [1, 7], "correspond": [1, 4, 5], "count": [1, 4, 7], "countri": 4, "cours": 3, "cov": 5, "covari": 5, "creat": [1, 5, 6, 7], "creation": 5, "crop": 5, "crosstab": [1, 7], "crosstab_age_incom": 5, "crosstab_age_sex": 5, "crosstabs_dict": 5, "crosstabs_onli": 5, "crucial": [4, 5, 6], "current": 4, "curv": 5, "custom": [1, 5, 6, 7], "custom_ord": 5, "customiz": [1, 5, 6], "cut": 4, "d": [5, 8], "dai": 4, "dark": 5, "dashboard": 5, "data": [0, 1, 3, 5, 6, 8], "data_nam": 4, "data_output": 4, "data_path": 4, "data_typ": 1, "datafram": [1, 5, 6, 7], "dataframe_column": [1, 4, 7], "dataset": [4, 5, 6], "date": [1, 6, 7], "date_column": 4, "date_str": 4, "datetim": 1, "david": 4, "dd": 4, "deal": [4, 5], "decad": 3, "decim": [1, 4], "decimal_plac": [1, 4], "decis": [1, 5], "decreas": 5, "dedic": 0, "deeper": 5, "deepest": 0, "default": [1, 4, 5], "defin": [1, 4, 5], "definit": 4, "degre": [1, 5], "demograph": 5, "demonstr": [4, 5, 6], "denot": 5, "densiti": [1, 7], "depend": [1, 4, 6, 7], "deprec": 1, "depth": [1, 5], "descend": [4, 5], "describ": [1, 5], "descript": [1, 7], "design": [4, 5, 6], "detail": [1, 4, 5, 6], "determin": 5, "develop": 3, "deviat": [1, 6, 7], "df": [1, 4, 5], "df2": [], "df_censu": 4, "df_dict": 4, "df_num": 5, "dict": [4, 5], "dictionari": [4, 5], "did": 1, "diego": [0, 3], "differ": [1, 5], "digit": [1, 4], "dimens": 5, "dimensionless": 5, "dir": 4, "direct": 5, "directli": [1, 5, 6], "directori": [5, 6, 7], "disabl": [1, 5], "disable_sci_not": [1, 5], "discov": 6, "discret": [4, 5], "dispers": 5, "displai": [1, 4, 5], "distinct": [1, 5], "distinguish": 5, "distract": 5, "distribut": [1, 4, 6, 7], "dive": 4, "divers": 1, "divid": [4, 5], "divorc": 4, "do": [1, 4, 5], "docstr": 1, "document": [1, 7], "doe": [1, 4, 5], "doi": [2, 4, 5, 6, 8], "don": 5, "dot": 5, "doubl": 5, "down": 5, "dr": 0, "draw": 5, "driven": 4, "dtype": 4, "due": [1, 4], "duplic": 1, "dure": [0, 1], "dx_": 5, "dx_c": 5, "dynam": 1, "e": [1, 4, 5], "each": [1, 4, 5], "eas": [1, 4, 6], "easi": [5, 6], "easier": [1, 5], "easili": 5, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 5, 6], "edg": [1, 5], "edgecolor": 1, "educ": [0, 3, 4, 5], "effect": [1, 3, 4, 5, 6], "either": [1, 4, 5], "element": [1, 4, 5], "elev": 5, "els": 1, "emp": 4, "emphas": 1, "emploi": 5, "empti": 4, "enabl": [1, 5, 6], "enable_zoom": [1, 5], "end": [1, 4, 5], "endeavor": 0, "endpoint": 4, "engin": [0, 5, 8], "enhanc": [1, 4, 5, 6], "enough": 1, "ensembl": 5, "ensu": 6, "ensur": [1, 4, 5, 6], "ensure_directori": [4, 7], "enter": [1, 4], "entir": [4, 5], "entri": [1, 5], "environ": [0, 1, 5, 8], "equal": 5, "equat": 5, "equival": 4, "error": [1, 4], "especi": [1, 4, 5], "essenti": [4, 5, 6], "estim": 7, "etc": 6, "ev": 4, "evalu": 5, "even": 5, "everyth": 5, "exact": 1, "examin": 5, "exampl": [1, 4, 6, 7], "exce": 4, "excel": [3, 6, 7], "except": [0, 1, 4], "excess": 5, "exclud": [4, 5], "exclus": 4, "exec": 4, "execut": 5, "exist": [1, 4], "exp": 5, "expand": 1, "expect": [1, 5], "experi": [1, 3], "explain": [1, 4], "explan": 1, "explicitli": 1, "explor": [1, 5, 6], "exploratori": 6, "export": [5, 6], "express": [0, 5], "extend": [0, 5], "extens": [1, 5], "extract": [1, 5], "f": [1, 5], "f8766d": 5, "f8c5c8": 4, "facilit": [3, 4, 6], "factor": 5, "fall": [4, 5], "fallback": 1, "fals": [1, 4, 5], "famili": 4, "fashion": 5, "featur": [1, 4, 5, 7], "feature_nam": 5, "feature_names_list": [1, 5], "feder": 4, "feedback": 1, "femal": [4, 5], "female_": 5, "fetch": 5, "fetch_california_h": 5, "few": 5, "ff0000": 5, "figsiz": [1, 5], "figur": [1, 5], "file": [1, 4, 5], "file_nam": 4, "file_path": 4, "file_prefix": [1, 5], "filenam": [1, 5], "fill": [1, 5], "fill_alpha": [1, 5], "fillna": 1, "filter": [4, 5], "filtered_df": 4, "financi": [3, 5], "find": 1, "first": [1, 4, 5], "fit": [1, 6, 7], "fix": 1, "flag": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 5], "flip": 5, "float": [4, 5], "fnlwgt": 4, "focu": 5, "focus": 5, "folder": 4, "follow": [1, 4, 5, 6], "font": [1, 5], "fontsiz": 1, "form": [4, 6], "format": [1, 5, 6, 7], "formatth": 5, "former": 4, "formerli": 1, "formula": 5, "found": 1, "foundat": 7, "four": 5, "frac": 5, "freedom": 5, "frequenc": [1, 5], "frequent": 4, "friendli": 1, "from": [0, 1, 3, 4, 5, 6], "full": [1, 4, 7], "fulli": 5, "func_col": [1, 5], "function": [1, 4, 6, 7], "further": [1, 5], "futur": [1, 5], "futurewarn": 5, "g": [1, 4, 5], "gain": [4, 6], "gaussian": 7, "gener": [1, 5, 6, 7], "geq": 4, "get": 6, "get_text": 1, "gil": [2, 3], "github": 6, "give": 1, "given": [1, 4, 5], "glanc": 5, "go": 4, "got": 1, "gov": 4, "grad": 4, "gradientboostingregressor": 5, "graduat": 0, "granular": 1, "graphic": [5, 8], "gratitud": 0, "greater": [1, 4], "green": 5, "grei": 5, "grid": [1, 7], "grid_figs": 5, "grid_resolut": 5, "grid_valu": 5, "ground": 5, "group": [1, 4, 7], "gt": 5, "guid": [0, 6], "guidanc": 1, "guidelin": 5, "h": [4, 5], "h_pad": 5, "ha": [1, 3, 4, 5], "half": 5, "halv": 5, "handl": [1, 4, 5, 6], "handler": 4, "hat": 5, "have": [1, 5], "he": 3, "header": [1, 4], "health": 3, "healthcar": 3, "heatmap": [1, 5], "height": 5, "help": [1, 4, 5, 6], "here": [4, 5], "hex": [1, 4], "hi": 0, "hidden": 5, "hide": [1, 5], "hide_index": 1, "high": [1, 5], "higher": [5, 6], "highli": 5, "highlight": [1, 5, 7], "highlight_column": [4, 7], "highlighted_df": 4, "hist": [1, 5], "hist_color": 5, "hist_edgecolor": [1, 5], "histogram": [1, 7], "hold": [3, 5], "horizont": [1, 5], "hour": [4, 5], "hous": 7, "houseag": 5, "household": 5, "hover": 5, "how": [4, 5, 6], "howev": [1, 5], "html": [4, 5], "html_file_nam": [1, 5], "html_file_path": [1, 5], "http": [2, 4, 5, 6, 8], "huber": 5, "hue": [1, 5], "hue_dict": 5, "hue_palett": 5, "hunter": [5, 8], "husband": 4, "hyperlink": 4, "hypothes": 6, "i": [1, 3, 4, 5, 7], "icon": 1, "id": [1, 4, 6], "id_colnam": 4, "identifi": [1, 5, 6, 7], "ignor": 5, "illustr": 5, "imag": [4, 5], "image_filenam": 5, "image_path_png": [1, 4, 5], "image_path_svg": [1, 4, 5], "immedi": 5, "impact": [1, 5], "implement": 1, "import": [1, 4, 5], "imposs": 4, "improv": 1, "inc": 4, "inch": 5, "includ": [1, 4, 5, 6], "inclus": 4, "incom": [4, 5, 6, 8], "inconsist": [1, 4], "incorpor": 1, "incorrect": [1, 5], "increas": 5, "increment": 1, "independ": 1, "index": [1, 4, 5], "indic": [1, 4, 5], "individu": [1, 5], "individual_figs": 5, "industri": 3, "inf": 4, "infin": 4, "influenc": [1, 5], "influenti": 5, "inform": [5, 6], "initi": 6, "inner": 5, "input": [1, 5], "insight": [5, 6], "instal": 7, "instanc": 5, "instead": [1, 5], "instruct": 6, "int": [1, 4, 5], "int64": 4, "integ": 1, "integr": [5, 6], "intellig": 3, "interact": [1, 7], "interest": 5, "interfac": [1, 5], "intern": [1, 5], "interpret": [1, 5], "interv": 4, "introduc": 1, "introduct": 1, "intuit": [1, 5, 6], "invalid": 1, "invalu": 5, "investig": 6, "involv": [4, 5, 6], "io": 4, "island": 4, "iso": 4, "issu": [1, 6], "item": 5, "iter": 5, "its": [1, 4], "itself": 5, "j": [5, 8], "jinja2": 6, "join": 4, "joint": 5, "jointli": 5, "joss": [5, 8], "journal": [5, 8], "journei": 0, "jupyt": 4, "just": 5, "k": [5, 8], "kde": [1, 6, 7], "kde_color": 5, "kde_density_single_distribut": 5, "kde_distribut": [1, 5, 7], "keep": 5, "kei": [1, 4, 5, 7], "kernel": 7, "keyboard": 5, "keyerror": 5, "keyword": [1, 5], "kind": 5, "kohavi": [4, 5, 6, 8], "kwarg": [1, 5], "l": 2, "label": [1, 4, 5], "label_ag": 4, "label_fonts": [1, 5], "label_nam": 5, "larg": 5, "largest": 5, "last": 4, "latest": 1, "layout": [1, 5], "ldot": 5, "lead": 5, "learn": [0, 1, 3, 4, 5, 6, 8], "learning_r": 5, "least": [1, 4], "lectur": 3, "left": [4, 5], "left_margin": [1, 5], "legend": [1, 5], "legend_label": 5, "legend_labels_list": 5, "legibl": 5, "length": [4, 5], "leonid": [2, 3], "leq": 4, "less": [1, 4], "let": 5, "letter": [5, 8], "level": [4, 5], "leverag": [5, 6], "librari": [1, 4, 5, 7], "licens": 1, "like": [0, 5], "limit": [1, 4, 5], "line": [1, 6, 7], "linear": 5, "linestyl": 5, "link": 7, "list": [1, 4, 5], "load": [4, 5], "local": 4, "locat": [4, 5], "log": [1, 5], "log_scale_var": [1, 5], "logarithm": 5, "logic": 1, "logo": 1, "logscal": 5, "long": 5, "longer": 5, "loop": 5, "loss": [4, 5], "lower": [1, 5], "lt": [4, 5], "m": [0, 3, 5, 8], "machin": [1, 3, 4, 5, 6, 8], "made": 1, "magnitud": 5, "mai": [1, 5], "main": 6, "maintain": [1, 5, 7], "make": [1, 4, 5], "male": [4, 5], "male_": 5, "manag": [1, 3, 5, 6], "manageri": 4, "mani": [5, 6], "manipul": 6, "manner": 5, "manual": [1, 5], "map": [1, 5], "marco": 0, "margin": [1, 5], "marit": 4, "mark": [1, 5], "marker": 5, "marri": 4, "master": 3, "match": [1, 5], "mathbb": 5, "mathbf": 5, "mathemat": [4, 5], "matplotlib": [1, 5, 6, 8], "matplotlib_colormap": 5, "matric": [1, 7], "matrix": [1, 7], "max": 5, "max_col": 5, "max_depth": 5, "max_unique_valu": 4, "max_unique_value_pct": 4, "max_unique_value_tot": 4, "maximum": 5, "mcse": [5, 8], "mean": [1, 4, 6, 7], "mean_color": 5, "meaning": [4, 5], "measur": 5, "mechan": 1, "median": [1, 6, 7], "median_color": 5, "medinc": 5, "meet": 6, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 5, 6], "metric": 5, "metrics_box_violin": 1, "metrics_boxplot_comp": 5, "metrics_comp": 5, "metrics_list": 5, "mid": 5, "might": 5, "min": 5, "min_length": 4, "mind": 6, "minim": [1, 5], "minimum": [4, 5], "minor": 1, "misalign": 5, "misinterpret": 5, "mislead": 1, "miss": [1, 4, 5, 6], "mm": 4, "mode": [1, 5], "model": [1, 5, 6], "model_select": 5, "modifi": [1, 5], "month": [2, 4], "more": [1, 4, 5], "most": [1, 4, 5, 6], "mous": 5, "move": [1, 5], "mu": 5, "mu_i": 5, "mu_x": 5, "much": 5, "multidimension": 5, "multipl": [1, 4, 5, 6], "multipli": 1, "must": [4, 5], "my_datafram": 1, "n": 5, "n_col": 5, "n_estim": 5, "n_row": 5, "na": [1, 4], "name": [1, 4, 5], "nativ": 4, "navig": [4, 5], "nbformat": 6, "ndarrai": 5, "necessari": [1, 4], "need": [1, 4, 5, 6], "neg": 5, "neither": [1, 5], "nest": 5, "neutral": 5, "never": 4, "new": [1, 4, 5], "newer": 5, "next": [4, 5], "nh": 5, "nomenclatur": 1, "non": [1, 4, 7], "none": [1, 4, 5], "nor": [1, 5], "normal": [1, 7], "notat": [1, 5], "note": [4, 5], "notebook": 4, "noth": 4, "notic": 5, "now": 1, "np": 5, "null": [1, 4], "null_pct": 4, "null_tot": 4, "num": [4, 5], "num_digit": 4, "number": [1, 4, 5], "numer": [1, 5, 7], "numpi": [5, 6], "o": [2, 4, 5], "object": [1, 4, 5], "observ": 5, "obviou": 5, "occup": [4, 5], "occurr": 4, "offer": [1, 5, 6], "often": [5, 6], "older": [1, 5], "omit": 1, "one": [1, 4, 5], "onli": [1, 5], "opaqu": 5, "open": [5, 8], "oper": [4, 5], "optim": 5, "option": [1, 4, 5, 6], "orang": 5, "order": [1, 4, 5], "org": [2, 4, 5, 6, 8], "organ": [1, 5], "orient": 5, "origin": [4, 5], "original_df": 4, "oscar": [2, 3], "other": [1, 4, 5], "otherwis": 5, "our": 0, "out": 5, "outcom": 5, "outlier": 6, "output": [1, 4, 5], "outsid": 5, "over": [1, 3, 5], "overal": [1, 5], "overlai": 5, "overlaid": 5, "overlap": 5, "overrid": 5, "overview": 7, "own": 5, "p": 5, "pac": 4, "pace": [5, 8], "packag": 6, "pad": [1, 5], "page": [5, 6], "pair": [4, 5], "pairwis": 5, "palett": 5, "panda": [1, 4, 5, 6], "param": 1, "paramet": [1, 4, 5], "parametr": 5, "pardir": 4, "parent": 4, "pars": 4, "parse_date_with_rul": [4, 7], "part": 4, "partial": [1, 7], "partial_depend": 5, "particular": 5, "particularli": [1, 4, 5], "pass": [1, 5], "path": [1, 5, 7], "patient": 4, "pattern": [5, 6], "pd": [4, 5], "pdf": 5, "pdp": 5, "pearson": 7, "per": [4, 5], "percent": [1, 5], "percentag": 4, "perfect": 5, "perfectli": 5, "perform": [1, 4, 5], "performancewarn": 1, "period": 7, "person": 3, "perspect": [1, 5], "pi": 5, "pink": 4, "pip": 6, "pitfal": 1, "pivot": [0, 7], "place": [1, 4], "plai": 0, "plain": 4, "plot": [1, 6], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_mean": 5, "plot_median": 5, "plot_typ": [1, 5], "plotli": [1, 5, 6], "plotly_colormap": 5, "plots_onli": 5, "plt": 1, "pm": 5, "png": [1, 4, 5], "png_imag": 4, "point": [1, 5], "pointer": 5, "popul": 5, "popular": 6, "posit": [1, 5], "possibl": [4, 5, 6], "potenti": [1, 4, 5], "power": [1, 5], "pr": 1, "pre": 1, "preced": 5, "predict": [1, 5], "prefer": [1, 5], "prefix": [1, 5], "prepar": [1, 4, 5], "prerequisit": 7, "present": [1, 4, 5], "preval": 5, "prevent": [1, 4, 5], "previou": [1, 5], "previous": 1, "price": 5, "print": [1, 4, 5], "prior": 5, "privat": 4, "probabl": [1, 5, 8], "process": [1, 4, 6], "produc": [1, 5], "product": 5, "prof": 4, "profession": 3, "program": [0, 3], "project": [1, 3, 4, 7], "promin": 5, "proper": [1, 5], "properli": 5, "proport": [1, 4, 5], "provid": [0, 1, 4, 5, 6], "public": 5, "publish": 2, "purpl": 5, "purpos": [1, 7], "pursu": 0, "py": 1, "pypi": [1, 6], "python": [1, 3, 5, 7], "qualiti": [5, 6], "quantifi": 5, "quantit": 5, "quick": 5, "quickli": [5, 6], "r": [3, 4, 5, 6, 8], "r_": 5, "race": 4, "rais": [1, 4, 5], "random": 4, "random_st": 5, "rang": [4, 5, 6], "raw": 5, "re": [1, 5], "read": 4, "readabl": [1, 5], "readi": 6, "readm": 1, "record": 4, "red": 5, "reduc": [1, 5], "redund": 5, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 5], "regress": 7, "regular": [1, 7], "relat": [4, 5], "relationship": [4, 5, 6], "releas": 1, "relev": 6, "reli": 5, "reliabl": 4, "remain": [1, 5], "remov": [1, 5, 6, 7], "remove_stack": [1, 5], "renam": [1, 5], "render": 4, "replac": 4, "replica": 1, "report": [3, 5, 6], "repositori": [4, 5, 6, 8], "repres": [1, 4, 5], "represent": [1, 5], "reproduc": 4, "requir": [1, 5, 6], "research": 6, "reset": 1, "resolut": 5, "respect": [4, 5], "respons": 5, "rest": 5, "result": [1, 4, 5], "return": [1, 4, 5], "return_df": [1, 4], "return_dict": 5, "reveal": 5, "rich": [5, 6], "right": [4, 5], "right_margin": [1, 5], "riversid": 3, "robust": 1, "role": [0, 1], "rot": 5, "rotat": [1, 5], "rotate_plot": 5, "round": 4, "row": [4, 5], "rule": 4, "run": 6, "s0167": [5, 8], "same": [1, 5], "sampl": [4, 5], "san": [0, 3], "save": [1, 5, 6, 7], "save_dataframes_to_excel": [1, 4, 7], "save_format": [1, 5], "save_plot": [1, 5], "scale": [1, 5], "scatter": [1, 6, 7], "scatter_color": 5, "scatter_fit_plot": [1, 5, 7], "scatterplot": 5, "scenario": [1, 5], "schema": 5, "scheme": 5, "school": 0, "scienc": [0, 3, 4, 5, 6, 8], "scientif": [1, 5], "scientist": [0, 3, 6], "scikit": [1, 5, 6], "scroll": 5, "seaborn": [1, 5, 6, 8], "seamlessli": 6, "second": [4, 5], "section": [1, 4], "see": 5, "seed": 4, "select": [1, 5], "select_dtyp": 5, "self": 4, "separ": [1, 4, 5], "sequenc": 5, "seri": 4, "serv": [1, 3], "servic": 3, "set": [1, 4, 5], "set_as_index": 4, "set_titl": 1, "setminu": 5, "setp": 1, "setup": [1, 4, 5], "sever": [1, 5], "sex": [4, 5], "shape": [4, 5], "sheet": 4, "shilei": 0, "should": 5, "show": [4, 5], "show_cbar": 5, "show_correl": 5, "show_legend": 5, "show_modebar": [1, 5], "show_plot": 5, "showcas": 5, "shown": 5, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 5, "sigma_i": 5, "sigma_x": 5, "signatur": 1, "signific": 1, "silver": 5, "similarli": 5, "simpl": 5, "simpler": 1, "simplic": 6, "simplif": 1, "simplifi": [1, 4], "simultan": 5, "sinc": 5, "singl": [1, 4, 5], "single_figs": 5, "single_var_image_filenam": 5, "size": [1, 4, 5], "sklearn": 5, "slightli": 1, "small": 1, "smallest": 5, "smooth": 5, "smoother": [1, 5], "sn": 5, "snippet": [4, 5], "so": [1, 4, 5], "softwar": [2, 5, 8], "some": [1, 4], "sort": [1, 4], "sort_bi": [1, 4], "sortbi": 1, "sourc": [5, 6, 8], "space": [1, 5], "span": 5, "spars": [5, 8], "spatial": [5, 8], "special": 4, "specialti": 4, "specif": [1, 5, 6, 7], "specifi": [1, 4, 5, 6], "split": 5, "spous": 4, "spread": 5, "sql": 3, "sqrt": 5, "squar": 5, "stabil": 1, "stabl": 1, "stack": [1, 6, 7], "stacked_crosstab": 5, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 5, 6, 7], "standardized_d": 4, "start": [1, 4, 6], "stat": [1, 5], "state": 4, "static": [1, 7], "statist": [1, 3, 4, 5, 6, 8], "statu": [1, 4], "std": 7, "std_color": 5, "std_dev_level": 5, "stem": 5, "step": [1, 6], "still": [1, 5], "store": [1, 5], "str": [1, 4, 5], "straightforward": 1, "streamlin": [1, 4, 6], "strength": 5, "string": [1, 4, 5], "strip": 4, "strip_trailing_period": [4, 7], "stronger": 5, "structur": [1, 6], "style": [1, 4, 5], "styler": [1, 4], "subplot": 5, "subset": 5, "substitut": 5, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suit": 6, "suitabl": 1, "sum_": 5, "summar": [5, 6], "summari": [1, 6, 7], "summarize_all_combin": [4, 7], "summary_t": 4, "support": [0, 1, 5], "suppos": 5, "suppress": 5, "sure": 4, "surfac": [1, 5], "svg": [1, 4, 5], "svg_imag": 4, "sy": 1, "system": [4, 6], "t": 5, "tab": 4, "tabl": [1, 5, 6], "tailor": 5, "take": [4, 5], "tall": 5, "target": 5, "tarshizi": 0, "task": [4, 6], "tatist": 5, "teach": 3, "techniqu": [6, 7], "ten": 3, "tend": 5, "tendenc": 5, "test": [1, 5], "test_siz": 5, "text": [1, 4, 5], "text_wrap": [1, 5], "th": 5, "than": [1, 4], "thank": 0, "thei": [4, 5], "them": [1, 4, 5, 6], "theoret": 7, "therefor": 5, "thi": [1, 4, 5, 6], "thick": 5, "those": 1, "three": 5, "through": [1, 5], "throw": 1, "thu": 4, "tick": [1, 5], "tick_fonts": [1, 5], "tight": 5, "time": [0, 1, 4, 5], "titl": [1, 2, 5], "title_i": [1, 5], "title_x": [1, 5], "to_list": 5, "togeth": 5, "toggl": [1, 5], "tool": [1, 5, 6], "toolkit": 1, "top": 5, "top_margin": [1, 5], "topic": 4, "total": [4, 5], "toward": 1, "trail": 7, "train": 5, "train_test_split": 5, "transpar": [1, 5], "trend": [5, 6], "triangl": 5, "triangular": [1, 7], "true": [1, 4, 5], "truth": 5, "try": 1, "tupl": [1, 4, 5], "two": [1, 4, 5], "type": [1, 4, 5, 6], "u": [0, 4, 5], "uci": [4, 5, 6, 8], "ucla": 3, "unambigu": 4, "uncov": [5, 6], "underli": [5, 6], "understand": [4, 5, 6], "uniform": 1, "uniqu": [1, 5, 6, 7], "unique_values_tot": 4, "unique_var": 4, "unit": 4, "univers": [0, 3], "unrecogn": 4, "unstack": 5, "unus": 1, "unwav": 0, "up": [1, 4, 5], "updat": [1, 4, 5], "upper": [1, 4, 5], "upright": 5, "url": 2, "us": [1, 4, 5, 6], "usabl": 1, "usag": [1, 4, 5], "user": [1, 5, 6], "userwarn": 5, "util": [4, 5, 6], "v": 5, "valid": 1, "valid_plot_typ": 1, "valu": [1, 4, 5, 6], "valueerror": [1, 4, 5], "vari": 5, "variabl": [1, 5, 6, 7], "varianc": 5, "varieti": [3, 5, 6], "variou": [1, 5, 6], "vars_of_interest": 5, "vdot": 4, "vector": 5, "verbiag": 1, "verifi": [1, 4], "versa": 5, "versatil": 5, "version": [2, 5, 6, 7], "version_info": 1, "versu": 1, "vertic": [1, 5], "via": [1, 5], "vice": 5, "view": [1, 5], "view_angl": 5, "violin": [1, 6, 7], "violinplot": 5, "viridi": 5, "visibl": [1, 5], "visual": [1, 4, 5, 6, 8], "vmax": 5, "vmin": 5, "vriabl": 5, "w_pad": 5, "wa": [1, 5], "wai": 5, "want": [1, 5], "wareh": 3, "warn": [1, 4, 5], "waskom": [5, 8], "we": [0, 4, 5, 6], "week": [4, 5], "welcom": 7, "well": [4, 5], "were": 4, "what": [1, 7], "wheel": 5, "when": [1, 4, 5, 6], "where": [1, 4, 5], "whether": [1, 4, 5], "which": [1, 4, 5, 6], "while": [1, 5], "white": 4, "whitespac": 5, "who": 1, "wide": [3, 5], "width": [1, 5], "wife": 4, "wirefram": [1, 5], "wireframe_color": 5, "wish": 5, "within": [1, 3, 4, 5], "without": [1, 4, 5], "work": [1, 4, 5], "workclass": 4, "workflow": [4, 6], "would": [0, 1, 5], "wrangl": 3, "wrap": [1, 5], "write": 4, "x": [1, 4, 5, 8], "x_": 5, "x_1": 5, "x_2": 5, "x_c": 5, "x_i": 5, "x_j": 5, "x_k": 5, "x_label": [1, 5], "x_label_plotli": 1, "x_n": 5, "x_p": 5, "x_test": 5, "x_train": 5, "x_var": 5, "xlabel": 5, "xlabel_align": 5, "xlabel_rot": 5, "xlim": [1, 5], "xlsx": 4, "xlsxwriter": 6, "xx": 1, "xy": 5, "y": [1, 5], "y_axis_label": 5, "y_i": 5, "y_label": [1, 5], "y_label_plotli": 1, "y_test": 5, "y_train": 5, "y_var": 5, "year": [2, 3, 4], "yellow": 4, "ylabel": 5, "ylabel_align": 5, "ylabel_rot": 5, "ylim": [1, 5], "you": [4, 5, 6], "your": [4, 5, 6], "yy": 1, "yyyi": 4, "z": 5, "z_label": [1, 5], "z_label_plotli": 1, "zenodo": [1, 2], "zero": [1, 4], "zoom": [1, 5], "zoom_out_factor": [1, 5], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Data Management Overview", "Plotting and Theoretical Overview", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References"], "titleterms": {"0": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 5, "3": 1, "3d": 5, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "9": 1, "With": 5, "about": 7, "acknowledg": 0, "ad": 4, "all": 5, "analysi": 4, "assumpt": 5, "bar": 5, "best": 5, "bin": 4, "box": 5, "ca": 5, "categori": 5, "centric": 5, "changelog": 1, "cite": 2, "coeffici": 5, "column": 4, "combin": [4, 5], "content": 7, "conting": 4, "contributor": 3, "correl": 5, "count": 5, "creat": 4, "crosstab": 5, "custom": 4, "data": [4, 7], "datafram": 4, "date": 4, "densiti": 5, "depend": 5, "descript": 6, "deviat": 5, "directori": 4, "distribut": 5, "document": 6, "eda": [2, 6, 7], "estim": 5, "exampl": 5, "excel": 4, "featur": 6, "fit": 5, "format": 4, "foundat": 5, "full": 5, "function": 5, "gaussian": 5, "gener": 4, "get": 7, "grid": 5, "group": 5, "heurist": 7, "highlight": 4, "histogram": 5, "hous": 5, "i": 6, "identifi": 4, "instal": 6, "interact": 5, "kde": 5, "kei": 6, "kernel": 5, "librari": 6, "line": 5, "link": 6, "maintain": 3, "manag": [4, 7], "matric": 5, "matrix": 5, "mean": 5, "median": 5, "non": 5, "normal": 5, "numer": 4, "overview": [4, 5], "partial": 5, "path": 4, "pearson": 5, "period": 4, "pivot": 5, "plot": [5, 7], "prerequisit": 6, "project": 6, "purpos": 6, "python": 6, "refer": 8, "regress": 5, "regular": 5, "remov": 4, "save": 4, "scatter": 5, "specif": 4, "stack": 5, "standard": 4, "start": 7, "static": 5, "std": 5, "summari": 4, "tabl": [4, 7], "techniqu": 4, "theoret": 5, "toolkit": [2, 6, 7], "trail": 4, "triangular": 5, "uniqu": 4, "variabl": 4, "version": 1, "violin": 5, "welcom": 6, "what": 6}}) \ No newline at end of file +Search.setIndex({"alltitles": {"2D Partial Dependence Plots": [[5, "d-partial-dependence-plots"]], "2D Plots - CA Housing Example": [[5, "d-plots-ca-housing-example"]], "3D Partial Dependence Plots": [[5, "id14"]], "3D Plots - CA Housing Example": [[5, "id15"]], "About EDA Toolkit": [[7, null]], "Acknowledgements": [[0, null]], "Adding Unique Identifiers": [[4, "adding-unique-identifiers"]], "Binning Numerical Columns": [[4, "binning-numerical-columns"]], "Box Plots Grid Example": [[5, "box-plots-grid-example"]], "Box and Violin Plots": [[5, "box-and-violin-plots"]], "Changelog": [[1, null]], "Citing EDA Toolkit": [[2, null]], "Contributors/Maintainers": [[3, null]], "Correlation Matrices": [[5, "correlation-matrices"]], "Creating Contingency Tables": [[4, "creating-contingency-tables"]], "Data Management": [[7, null]], "Data Management Overview": [[4, null]], "Data Management Techniques": [[4, "data-management-techniques"]], "DataFrame Analysis": [[4, "dataframe-analysis"]], "Description": [[6, "description"]], "Full Correlation Matrix Example": [[5, "full-correlation-matrix-example"]], "Gaussian Assumption for Normality": [[5, "gaussian-assumption-for-normality"]], "Generating Summary Tables for Variable Combinations": [[4, "generating-summary-tables-for-variable-combinations"]], "Getting Started": [[7, null]], "Highlighting Specific Columns in a DataFrame": [[4, "highlighting-specific-columns-in-a-dataframe"]], "Histogram Example (Count)": [[5, "histogram-example-count"]], "Histogram Example (Density)": [[5, "histogram-example-density"]], "Histogram Example - (Mean and Median)": [[5, "histogram-example-mean-and-median"]], "Histogram Example - (Mean, Median, and Std. Deviation)": [[5, "histogram-example-mean-median-and-std-deviation"]], "Histograms and Kernel Density Estimation (KDE)": [[5, "histograms-and-kernel-density-estimation-kde"]], "Installation": [[6, "installation"]], "Interactive Plot": [[5, "interactive-plot"]], "KDE Distribution Function": [[5, "kde-distribution-function"]], "KDE and Histogram Distribution Plots": [[5, "kde-and-histogram-distribution-plots"]], "KDE and Histograms Example": [[5, "kde-and-histograms-example"]], "Key Features": [[6, "key-features"]], "Non-Normalized Stacked Bar Plots Example": [[5, "non-normalized-stacked-bar-plots-example"]], "Partial Dependence Foundations": [[5, "partial-dependence-foundations"]], "Partial Dependence Plots": [[5, "partial-dependence-plots"]], "Path directories": [[4, "path-directories"]], "Pearson Correlation Coefficient": [[5, "pearson-correlation-coefficient"]], "Pivoted Stacked Bar Plots Example": [[5, "pivoted-stacked-bar-plots-example"]], "Pivoted Violin Plots Grid Example": [[5, "pivoted-violin-plots-grid-example"]], "Plotting Heuristics": [[7, null]], "Plotting and Theoretical Overview": [[5, null]], "Prerequisites": [[6, "prerequisites"]], "Project Links": [[6, "project-links"]], "Purpose of EDA Toolkit": [[6, "purpose-of-eda-toolkit"]], "References": [[8, null]], "Regression-Centric Scatter Plots Example": [[5, "regression-centric-scatter-plots-example"]], "Regular Non-Stacked Bar Plots Example": [[5, "regular-non-stacked-bar-plots-example"]], "Saving DataFrames to Excel with Customized Formatting": [[4, "saving-dataframes-to-excel-with-customized-formatting"]], "Scatter Fit Plot": [[5, "scatter-fit-plot"]], "Scatter Plots (All Combinations Example)": [[5, "scatter-plots-all-combinations-example"]], "Scatter Plots Grouped by Category Example": [[5, "scatter-plots-grouped-by-category-example"]], "Scatter Plots and Best Fit Lines": [[5, "scatter-plots-and-best-fit-lines"]], "Stacked Bar Plots With Crosstabs Example": [[5, "stacked-bar-plots-with-crosstabs-example"]], "Stacked Crosstab Plots": [[5, "stacked-crosstab-plots"]], "Standardized Dates": [[4, "standardized-dates"]], "Static Plot": [[5, "static-plot"]], "Table of Contents": [[7, null]], "Trailing Period Removal": [[4, "trailing-period-removal"]], "Triangular Correlation Matrix Example": [[5, "triangular-correlation-matrix-example"]], "Version 0.0.1b0": [[1, "version-0-0-1b0"], [1, "id7"], [1, "id8"], [1, "id9"]], "Version 0.0.1rc0": [[1, "version-0-0-1rc0"]], "Version 0.0.2": [[1, "version-0-0-2"]], "Version 0.0.3": [[1, "version-0-0-3"]], "Version 0.0.4": [[1, "version-0-0-4"]], "Version 0.0.5": [[1, "version-0-0-5"]], "Version 0.0.6": [[1, "version-0-0-6"]], "Version 0.0.7": [[1, "version-0-0-7"]], "Version 0.0.8": [[1, "version-0-0-8"]], "Version 0.0.8a": [[1, "version-0-0-8a"]], "Version 0.0.8b": [[1, "version-0-0-8b"]], "Version 0.0.8c": [[1, "version-0-0-8c"]], "Version 0.0.9": [[1, "version-0-0-9"]], "Violin Plots Grid Example": [[5, "violin-plots-grid-example"]], "Welcome to the EDA Toolkit Python Library Documentation!": [[6, null]], "What is EDA?": [[6, "what-is-eda"]]}, "docnames": ["acknowledgements", "changelog", "citations", "contributors", "data_management", "eda_plots", "getting_started", "index", "references"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgements.rst", "changelog.rst", "citations.rst", "contributors.rst", "data_management.rst", "eda_plots.rst", "getting_started.rst", "index.rst", "references.rst"], "indexentries": {"add_ids()": [[4, "add_ids", false]], "box_violin_plot()": [[5, "box_violin_plot", false]], "built-in function": [[4, "add_ids", false], [4, "contingency_table", false], [4, "dataframe_columns", false], [4, "ensure_directory", false], [4, "highlight_columns", false], [4, "parse_date_with_rule", false], [4, "save_dataframes_to_excel", false], [4, "strip_trailing_period", false], [4, "summarize_all_combinations", false], [5, "box_violin_plot", false], [5, "flex_corr_matrix", false], [5, "kde_distributions", false], [5, "plot_2d_pdp", false], [5, "plot_3d_pdp", false], [5, "scatter_fit_plot", false], [5, "stacked_crosstab_plot", false]], "contingency_table()": [[4, "contingency_table", false]], "dataframe_columns()": [[4, "dataframe_columns", false]], "ensure_directory()": [[4, "ensure_directory", false]], "flex_corr_matrix()": [[5, "flex_corr_matrix", false]], "highlight_columns()": [[4, "highlight_columns", false]], "kde_distributions()": [[5, "kde_distributions", false]], "parse_date_with_rule()": [[4, "parse_date_with_rule", false]], "plot_2d_pdp()": [[5, "plot_2d_pdp", false]], "plot_3d_pdp()": [[5, "plot_3d_pdp", false]], "save_dataframes_to_excel()": [[4, "save_dataframes_to_excel", false]], "scatter_fit_plot()": [[5, "scatter_fit_plot", false]], "stacked_crosstab_plot()": [[5, "stacked_crosstab_plot", false]], "strip_trailing_period()": [[4, "strip_trailing_period", false]], "summarize_all_combinations()": [[4, "summarize_all_combinations", false]]}, "objects": {"": [[4, 0, 1, "", "add_ids"], [5, 0, 1, "", "box_violin_plot"], [4, 0, 1, "", "contingency_table"], [4, 0, 1, "", "dataframe_columns"], [4, 0, 1, "", "ensure_directory"], [5, 0, 1, "", "flex_corr_matrix"], [4, 0, 1, "", "highlight_columns"], [5, 0, 1, "", "kde_distributions"], [4, 0, 1, "", "parse_date_with_rule"], [5, 0, 1, "", "plot_2d_pdp"], [5, 0, 1, "", "plot_3d_pdp"], [4, 0, 1, "", "save_dataframes_to_excel"], [5, 0, 1, "", "scatter_fit_plot"], [5, 0, 1, "", "stacked_crosstab_plot"], [4, 0, 1, "", "strip_trailing_period"], [4, 0, 1, "", "summarize_all_combinations"]]}, "objnames": {"0": ["py", "function", "Python function"]}, "objtypes": {"0": "py:function"}, "terms": {"": [0, 1, 3, 4, 5], "0": [2, 4, 5, 6, 7], "00": 4, "000000": 5, "0000ff": 5, "00140": [5, 8], "00bfc4": 5, "01": 4, "02": [1, 4], "03021": [5, 8], "04": [4, 5], "05": 5, "07": [4, 5], "09": 5, "1": [1, 4, 5, 6], "10": [2, 4, 5, 6, 8], "100": [4, 5], "1016": [5, 8], "10724": 5, "11": 4, "1109": [5, 8], "111": 4, "115": 5, "11687": 5, "11th": 4, "12": [4, 5, 6], "120": 5, "12202842": 4, "123": 4, "12929": 5, "13": [4, 5], "131": 5, "13162633": 2, "13163208": 2, "13174": 5, "1348": 4, "13920": [4, 5], "14": [4, 5], "147": 5, "14x4": 5, "15": [4, 5], "150": 4, "15784": 4, "15x5": 5, "16": [4, 5], "16192": 5, "17": 5, "18": [4, 5, 6], "1873": 5, "19716": 4, "1994": 6, "1996": [4, 5, 6, 8], "1997": [5, 8], "1b0": 7, "1d": 5, "1rc0": 7, "2": [4, 5, 6, 7], "20": [4, 5], "200": 4, "2007": [5, 8], "2020": 4, "2021": [4, 5, 8], "2022": 4, "2024": 2, "203488": 4, "21": [4, 5, 6], "21105": [5, 8], "2115": 5, "215646": 4, "22": 5, "22379": 4, "2245": 5, "22803": 4, "23": 5, "234721": 4, "24432": [4, 5, 6, 8], "24720": 4, "25": [1, 4, 5], "250": [4, 5], "2509": 5, "2565": 4, "26": 5, "27": 5, "274": 4, "28": [4, 5], "280": 5, "28523": 4, "29": [4, 5], "291": [5, 8], "295": 5, "297": [5, 8], "2d": [1, 7, 8], "3": [4, 5, 6, 7, 8], "30": [4, 5], "300": [4, 5], "3021": [5, 8], "3054": 5, "31": 4, "3188": 5, "32": 4, "32650": [4, 5], "33": [4, 5, 8], "333333": 5, "338409": 4, "33906": 4, "34": 5, "3461": 5, "35130194": 4, "36": [4, 5], "3680": 4, "37": [4, 5], "37155": 5, "38": [4, 5], "3853": 5, "39": [4, 5], "3986": 5, "3d": [1, 7], "3d_pdp": 5, "4": [4, 5, 6, 7], "40": [4, 5], "41": 5, "4110": 5, "41762": 4, "42": [4, 5], "42643227": 4, "4267": 4, "43832": 4, "44807": 4, "45": [4, 5], "46": 4, "46560": 4, "467": 4, "468": 4, "469": 4, "47": 5, "470": 4, "471": 4, "472": 4, "4746": 5, "48842": [4, 5], "49": [4, 5], "5": [4, 5, 6, 7], "50": [4, 5], "50k": [4, 5], "50k_": 5, "51": [4, 5], "5281": 2, "53": [4, 5], "535": 5, "55": [5, 8], "56": 4, "5623": 4, "5707": 5, "58": 5, "5856": 4, "59": [4, 5], "595": 5, "6": [4, 5, 6, 7, 8], "60": [4, 5, 8], "61": 4, "6172": 4, "62": 5, "64": [4, 5], "65": 5, "66": [4, 5], "6619": 5, "668": 5, "6738": 5, "68": 5, "69": [4, 5], "7": [4, 5, 6, 7], "70": [4, 5], "71": 5, "7152": [5, 8], "73": 5, "74": 4, "74130842": 4, "746": 5, "75": [4, 5], "7536": 5, "76": [4, 5], "77": 5, "77516": 4, "79": [4, 5], "8": [4, 5, 7], "80": [4, 5], "808080": 5, "809": 5, "81": 5, "815": 5, "82": 4, "8213": 5, "82943611": 4, "83": 5, "83311": 4, "85": [4, 5], "8601": 4, "861555": 4, "87": 5, "87104229": 4, "89": [4, 5], "8a": 7, "8b": 7, "8c": 7, "8d": 1, "9": [2, 4, 5, 6, 7, 8], "90": [4, 5, 8], "90069867": 4, "9076": 5, "91": [4, 5], "93": 5, "93837254": 4, "939": 5, "94": 5, "9468": 5, "95": [4, 5, 8], "96": [4, 5, 8], "96078789": 4, "963": 4, "966": 4, "97": 4, "97751875": 4, "98": 4, "99": [4, 5], "A": [1, 4, 5, 6, 8], "As": 5, "By": [1, 5], "For": [4, 5, 6], "If": [1, 4, 5], "In": [4, 5], "Into": 5, "It": [1, 4, 5, 6], "No": [1, 5], "Not": 4, "One": 1, "The": [1, 4, 5, 6], "Then": 4, "There": 5, "These": [1, 4, 5], "To": 5, "With": [3, 7], "_": 5, "_c": 5, "_plotli": 1, "abil": [1, 5], "abl": 5, "about": 4, "abov": [1, 5], "academ": 0, "accept": 1, "access": 5, "accord": [1, 5], "accordingli": 4, "account": 1, "accur": [1, 5], "accuraci": 4, "acknowledg": [1, 7], "across": [1, 4, 5], "actual": 5, "ad": [1, 5, 7], "adapt": [1, 4, 5], "add": [1, 4, 5], "add_best_fit_lin": 5, "add_id": [1, 4, 7], "addit": [1, 5], "addition": [4, 5, 6], "address": [1, 6], "adher": 5, "adjust": [1, 4, 5], "adm": 4, "advanc": 4, "aesthet": [1, 5], "affect": 5, "after": [1, 4, 5], "ag": [4, 5], "against": 5, "age_boxplot_list": 5, "age_group": [4, 5], "ages_18_to_40": 4, "aggreg": 5, "alic": 4, "align": [1, 4, 5], "all": [1, 4, 6, 7], "all_combin": 4, "all_var": 5, "allow": [1, 4, 5], "alon": 5, "along": [1, 4, 5], "alpha": [1, 5], "alreadi": 4, "also": [0, 1, 5], "altern": 5, "alwai": [1, 4], "amount": 4, "an": [0, 1, 3, 4, 5], "analysi": [1, 5, 6, 7], "analyst": 6, "analyt": 3, "analyz": [1, 4, 5], "angl": [1, 5], "ani": [1, 4, 5, 6], "annot": [1, 5], "anomali": 6, "anoth": 5, "anyth": 1, "appar": 5, "appear": [1, 5], "append": [4, 5], "appli": [0, 1, 3, 4, 5, 6], "applic": [1, 5], "approach": 5, "appropri": [1, 5], "approxim": 5, "ar": [1, 4, 5], "area": 5, "arg": 1, "argument": [1, 5], "around": [1, 5], "arrai": 5, "arrang": 5, "arrow": 5, "artifact": 4, "artifici": 3, "asian": 4, "aspect": [1, 5, 6], "assess": 5, "assign": [1, 4, 5], "associ": [5, 6], "assum": 4, "assumpt": 7, "astyp": 1, "attempt": [4, 5], "attent": 5, "attract": 5, "attribut": 5, "aug": 2, "author": [2, 3], "auto": 5, "autofit": 4, "autom": [3, 6], "automat": [1, 5, 6], "autoregress": [5, 8], "avail": 5, "aveoccup": 5, "averag": 5, "averoom": 5, "avoid": [1, 5], "ax": [1, 5], "axi": [1, 5], "azimuth": 5, "bachelor": 4, "back": [4, 5], "backbon": 4, "background": 4, "background_color": [1, 4], "backward": 1, "badg": 1, "band": 5, "bandwidth": 5, "bar": [1, 6, 7], "barh": 5, "barri": [5, 8], "base": [1, 4, 5], "base_path": 4, "bbox_inch": 5, "becaus": [4, 5], "been": [1, 4, 5], "befor": [1, 4, 5, 6], "begin": [4, 5], "behavior": 5, "being": [4, 5], "bell": 5, "below": [4, 5], "beneath": 5, "benefici": 5, "best": [1, 6, 7], "best_fit_linecolor": 5, "best_fit_linestyl": 5, "beta": 1, "better": [1, 5, 6], "between": [1, 4, 5], "bin": [1, 5, 7], "bin_ag": 4, "binrang": 5, "binwidth": [1, 5], "black": [4, 5], "block": 5, "blue": 5, "bob": 4, "bold": 4, "bool": [4, 5], "boolean": [1, 5], "border": 4, "both": [1, 4, 5], "bound": [4, 5], "boundari": 4, "box": [1, 6, 7], "box_violin_plot": [1, 5, 7], "boxplot": 5, "breakdown": 5, "brief": 1, "bring": 3, "broad": [1, 6], "brown": 5, "browser": 5, "bug": 1, "built": 5, "c0": 5, "c5gp7": [4, 5, 6, 8], "c_i": 5, "ca": 7, "calcul": 5, "california": [3, 5], "call": [1, 4, 5], "camera": [1, 5], "can": [1, 4, 5, 6], "cancer": 5, "cannot": 4, "capabl": [1, 4], "capit": 4, "captur": 5, "career": 0, "case": [1, 4, 5], "categor": [1, 4, 5], "categori": [4, 7], "cbar_label": 5, "cbar_thick": [1, 5], "cbar_x": [1, 5], "cdot": 5, "cell": 4, "censu": [4, 5, 6, 8], "census_id": 4, "census_summary_t": 4, "center_baselin": 5, "central": 5, "centric": 7, "certain": 5, "certifi": 1, "cervic": 5, "chang": [1, 5], "changelog": 7, "charact": [4, 5], "characterist": 6, "charli": 4, "check": [1, 4, 5], "choos": [1, 4, 5], "circl": 5, "citat": 1, "cite": 7, "civ": 4, "clariti": [1, 5], "clean": [1, 4, 5, 6], "cleaner": [1, 4], "cleanup": 1, "clear": [1, 5], "clearer": 1, "clearli": 1, "cleric": 4, "closer": 5, "clutter": 5, "cmap": [1, 5], "code": [1, 4, 5], "codebas": 1, "coeffici": 7, "cohes": 5, "col": [1, 4, 5], "col1": 1, "col2": 1, "collabor": 3, "color": [1, 4, 5], "colorbar": 5, "colormap": [1, 5], "column": [1, 5, 7], "column_nam": 4, "combin": [1, 6, 7], "come": 1, "comment": 1, "common": [1, 4, 6], "compar": 5, "comparison": 5, "compat": [1, 5], "complement": 5, "complementari": 5, "complet": 5, "complex": [1, 5], "comprehens": [1, 5, 6], "comput": [5, 8], "concept": 5, "condit": 1, "condition": 1, "configur": [1, 5], "confirm": 1, "confus": [1, 5], "consecut": 4, "consid": 5, "consist": [1, 4, 5], "consolid": 1, "constant": [4, 5], "constraint": 4, "contain": [4, 5], "content": 4, "context": 5, "conting": [1, 5, 6, 7], "contingency_t": [4, 7], "continu": [1, 4, 5], "contour": 5, "contrast": 5, "contributor": 7, "control": [1, 5], "convers": [1, 4], "convert": [1, 4], "coolwarm": [1, 5], "coordin": 1, "cornel": 3, "correct": [1, 5, 6], "correctli": [1, 4, 5], "correl": [1, 7], "correspond": [1, 4, 5], "count": [1, 4, 7], "countri": 4, "cours": 3, "cov": 5, "covari": 5, "creat": [1, 5, 6, 7], "creation": 5, "crop": 5, "crosstab": [1, 7], "crosstab_age_incom": 5, "crosstab_age_sex": 5, "crosstabs_dict": 5, "crosstabs_onli": 5, "crucial": [4, 5, 6], "current": 4, "curv": 5, "custom": [1, 5, 6, 7], "custom_ord": 5, "customiz": [1, 5, 6], "cut": 4, "d": [5, 8], "dai": 4, "dark": 5, "dashboard": 5, "data": [0, 1, 3, 5, 6, 8], "data_nam": 4, "data_output": 4, "data_path": 4, "data_typ": 1, "datafram": [1, 5, 6, 7], "dataframe_column": [1, 4, 7], "dataset": [4, 5, 6], "date": [1, 6, 7], "date_column": 4, "date_str": 4, "datetim": 1, "david": 4, "dd": 4, "deal": [4, 5], "decad": 3, "decim": [1, 4], "decimal_plac": [1, 4], "decis": [1, 5], "decreas": 5, "dedic": 0, "deeper": 5, "deepest": 0, "default": [1, 4, 5], "defin": [1, 4, 5], "definit": 4, "degre": [1, 5], "demograph": 5, "demonstr": [4, 5, 6], "denot": 5, "densiti": [1, 7], "depend": [1, 4, 6, 7], "deprec": 1, "depth": [1, 5], "descend": [4, 5], "describ": [1, 5], "descript": [1, 7], "design": [4, 5, 6], "detail": [1, 4, 5, 6], "determin": 5, "develop": 3, "deviat": [1, 6, 7], "df": [1, 4, 5], "df_censu": 4, "df_dict": 4, "df_num": 5, "dict": [4, 5], "dictionari": [4, 5], "did": 1, "diego": [0, 3], "differ": [1, 5], "digit": [1, 4], "dimens": 5, "dimensionless": 5, "dir": 4, "direct": 5, "directli": [1, 5, 6], "directori": [5, 6, 7], "disabl": [1, 5], "disable_sci_not": [1, 5], "discov": 6, "discret": [4, 5], "dispers": 5, "displai": [1, 4, 5], "distinct": [1, 5], "distinguish": 5, "distract": 5, "distribut": [1, 4, 6, 7], "dive": 4, "divers": 1, "divid": [4, 5], "divorc": 4, "do": [1, 4, 5], "docstr": 1, "document": [1, 7], "doe": [1, 4, 5], "doi": [2, 4, 5, 6, 8], "don": 5, "dot": 5, "doubl": 5, "down": 5, "dr": 0, "draw": 5, "driven": 4, "dtype": 4, "due": [1, 4], "duplic": 1, "dure": [0, 1], "dx_": 5, "dx_c": 5, "dynam": 1, "e": [1, 4, 5], "each": [1, 4, 5], "eas": [1, 4, 6], "easi": [5, 6], "easier": [1, 5], "easili": 5, "ebrahim": 0, "eda": 1, "eda_toolkit": [4, 5, 6], "edg": [1, 5], "edgecolor": 1, "educ": [0, 3, 4, 5], "effect": [1, 3, 4, 5, 6], "either": [1, 4, 5], "element": [1, 4, 5], "elev": 5, "els": 1, "emp": 4, "emphas": 1, "emploi": 5, "empti": 4, "enabl": [1, 5, 6], "enable_zoom": [1, 5], "end": [1, 4, 5], "endeavor": 0, "endpoint": 4, "engin": [0, 5, 8], "enhanc": [1, 4, 5, 6], "enough": 1, "ensembl": 5, "ensu": 6, "ensur": [1, 4, 5, 6], "ensure_directori": [4, 7], "enter": [1, 4], "entir": [4, 5], "entri": [1, 5], "environ": [0, 1, 5, 8], "equal": 5, "equat": 5, "equival": 4, "error": [1, 4], "especi": [1, 4, 5], "essenti": [4, 5, 6], "estim": 7, "etc": 6, "ev": 4, "evalu": 5, "even": 5, "everyth": 5, "exact": 1, "examin": 5, "exampl": [1, 4, 6, 7], "exce": 4, "excel": [3, 6, 7], "except": [0, 1, 4], "excess": 5, "exclud": [4, 5], "exclus": 4, "exec": 4, "execut": 5, "exist": [1, 4], "exp": 5, "expand": 1, "expect": [1, 5], "experi": [1, 3], "explain": [1, 4], "explan": 1, "explicitli": 1, "explor": [1, 5, 6], "exploratori": 6, "export": [5, 6], "express": [0, 5], "extend": [0, 5], "extens": [1, 5], "extract": [1, 5], "f": [1, 5], "f8766d": 5, "f8c5c8": 4, "facilit": [3, 4, 6], "factor": 5, "fall": [4, 5], "fallback": 1, "fals": [1, 4, 5], "famili": 4, "fashion": 5, "featur": [1, 4, 5, 7], "feature_nam": 5, "feature_names_list": [1, 5], "feder": 4, "feedback": 1, "femal": [4, 5], "female_": 5, "fetch": 5, "fetch_california_h": 5, "few": 5, "ff0000": 5, "figsiz": [1, 5], "figur": [1, 5], "file": [1, 4, 5], "file_nam": 4, "file_path": 4, "file_prefix": [1, 5], "filenam": [1, 5], "fill": [1, 5], "fill_alpha": [1, 5], "fillna": 1, "filter": [4, 5], "filtered_df": 4, "financi": [3, 5], "find": 1, "first": [1, 4, 5], "fit": [1, 6, 7], "fix": 1, "flag": 1, "flex_corr_matrix": [1, 5, 7], "flexibl": [1, 5], "flip": 5, "float": [4, 5], "fnlwgt": 4, "focu": 5, "focus": 5, "folder": 4, "follow": [1, 4, 5, 6], "font": [1, 5], "fontsiz": 1, "form": [4, 6], "format": [1, 5, 6, 7], "formatth": 5, "former": 4, "formerli": 1, "formula": 5, "found": 1, "foundat": 7, "four": 5, "frac": 5, "freedom": 5, "frequenc": [1, 5], "frequent": 4, "friendli": 1, "from": [0, 1, 3, 4, 5, 6], "full": [1, 4, 7], "fulli": 5, "func_col": [1, 5], "function": [1, 4, 6, 7], "further": [1, 5], "futur": [1, 5], "futurewarn": 5, "g": [1, 4, 5], "gain": [4, 6], "gaussian": 7, "gener": [1, 5, 6, 7], "geq": 4, "get": 6, "get_text": 1, "gil": [2, 3], "github": 6, "give": 1, "given": [1, 4, 5], "glanc": 5, "go": 4, "got": 1, "gov": 4, "grad": 4, "gradientboostingregressor": 5, "graduat": 0, "granular": 1, "graphic": [5, 8], "gratitud": 0, "greater": [1, 4], "green": 5, "grei": 5, "grid": [1, 7], "grid_figs": 5, "grid_resolut": 5, "grid_valu": 5, "ground": 5, "group": [1, 4, 7], "gt": 5, "guid": [0, 6], "guidanc": 1, "guidelin": 5, "h": [4, 5], "h_pad": 5, "ha": [1, 3, 4, 5], "half": 5, "halv": 5, "handl": [1, 4, 5, 6], "handler": 4, "hat": 5, "have": [1, 5], "he": 3, "header": [1, 4], "health": 3, "healthcar": 3, "heatmap": [1, 5], "height": 5, "help": [1, 4, 5, 6], "here": [4, 5], "hex": [1, 4], "hi": 0, "hidden": 5, "hide": [1, 5], "hide_index": 1, "high": [1, 5], "higher": [5, 6], "highli": 5, "highlight": [1, 5, 7], "highlight_column": [4, 7], "highlighted_df": 4, "hist": [1, 5], "hist_color": 5, "hist_edgecolor": [1, 5], "histogram": [1, 7], "hold": [3, 5], "horizont": [1, 5], "hour": [4, 5], "hous": 7, "houseag": 5, "household": 5, "hover": 5, "how": [4, 5, 6], "howev": [1, 5], "html": [4, 5], "html_file_nam": [1, 5], "html_file_path": [1, 5], "http": [2, 4, 5, 6, 8], "huber": 5, "hue": [1, 5], "hue_dict": 5, "hue_palett": 5, "hunter": [5, 8], "husband": 4, "hyperlink": 4, "hypothes": 6, "i": [1, 3, 4, 5, 7], "icon": 1, "id": [1, 4, 6], "id_colnam": 4, "identifi": [1, 5, 6, 7], "ignor": 5, "illustr": 5, "imag": [4, 5], "image_filenam": 5, "image_path_png": [1, 4, 5], "image_path_svg": [1, 4, 5], "immedi": 5, "impact": [1, 5], "implement": 1, "import": [1, 4, 5], "imposs": 4, "improv": 1, "inc": 4, "inch": 5, "includ": [1, 4, 5, 6], "inclus": 4, "incom": [4, 5, 6, 8], "inconsist": [1, 4], "incorpor": 1, "incorrect": [1, 5], "increas": 5, "increment": 1, "independ": 1, "index": [1, 4, 5], "indic": [1, 4, 5], "individu": [1, 5], "individual_figs": 5, "industri": 3, "inf": 4, "infin": 4, "influenc": [1, 5], "influenti": 5, "inform": [5, 6], "initi": 6, "inner": 5, "input": [1, 5], "insight": [5, 6], "instal": 7, "instanc": 5, "instead": [1, 5], "instruct": 6, "int": [1, 4, 5], "int64": 4, "integ": 1, "integr": [5, 6], "intellig": 3, "interact": [1, 7], "interest": 5, "interfac": [1, 5], "intern": [1, 5], "interpret": [1, 5], "interv": 4, "introduc": 1, "introduct": 1, "intuit": [1, 5, 6], "invalid": 1, "invalu": 5, "investig": 6, "involv": [4, 5, 6], "io": 4, "island": 4, "iso": 4, "issu": [1, 6], "item": 5, "iter": 5, "its": [1, 4], "itself": 5, "j": [5, 8], "jinja2": 6, "join": 4, "joint": 5, "jointli": 5, "joss": [5, 8], "journal": [5, 8], "journei": 0, "jupyt": 4, "just": 5, "k": [5, 8], "kde": [1, 6, 7], "kde_color": 5, "kde_density_single_distribut": 5, "kde_distribut": [1, 5, 7], "keep": 5, "kei": [1, 4, 5, 7], "kernel": 7, "keyboard": 5, "keyerror": 5, "keyword": [1, 5], "kind": 5, "kohavi": [4, 5, 6, 8], "kwarg": [1, 5], "l": 2, "label": [1, 4, 5], "label_ag": 4, "label_fonts": [1, 5], "label_nam": 5, "larg": 5, "largest": 5, "last": 4, "latest": 1, "layout": [1, 5], "ldot": 5, "lead": 5, "learn": [0, 1, 3, 4, 5, 6, 8], "learning_r": 5, "least": [1, 4], "lectur": 3, "left": [4, 5], "left_margin": [1, 5], "legend": [1, 5], "legend_label": 5, "legend_labels_list": 5, "legibl": 5, "length": [4, 5], "leonid": [2, 3], "leq": 4, "less": [1, 4], "let": 5, "letter": [5, 8], "level": [4, 5], "leverag": [5, 6], "librari": [1, 4, 5, 7], "licens": 1, "like": [0, 5], "limit": [1, 4, 5], "line": [1, 6, 7], "linear": 5, "linestyl": 5, "link": 7, "list": [1, 4, 5], "load": [4, 5], "local": 4, "locat": [4, 5], "log": [1, 5], "log_scale_var": [1, 5], "logarithm": 5, "logic": 1, "logo": 1, "logscal": 5, "long": 5, "longer": 5, "loop": 5, "loss": [4, 5], "lower": [1, 5], "lt": [4, 5], "m": [0, 3, 5, 8], "machin": [1, 3, 4, 5, 6, 8], "made": 1, "magnitud": 5, "mai": [1, 5], "main": 6, "maintain": [1, 5, 7], "make": [1, 4, 5], "male": [4, 5], "male_": 5, "manag": [1, 3, 5, 6], "manageri": 4, "mani": [5, 6], "manipul": 6, "manner": 5, "manual": [1, 5], "map": [1, 5], "marco": 0, "margin": [1, 5], "marit": 4, "mark": [1, 5], "marker": 5, "marri": 4, "master": 3, "match": [1, 5], "mathbb": 5, "mathbf": 5, "mathemat": [4, 5], "matplotlib": [1, 5, 6, 8], "matplotlib_colormap": 5, "matric": [1, 7], "matrix": [1, 7], "max": 5, "max_col": 5, "max_depth": 5, "max_unique_valu": 4, "max_unique_value_pct": 4, "max_unique_value_tot": 4, "maximum": 5, "mcse": [5, 8], "mean": [1, 4, 6, 7], "mean_color": 5, "meaning": [4, 5], "measur": 5, "mechan": 1, "median": [1, 6, 7], "median_color": 5, "medinc": 5, "meet": 6, "mentor": 0, "mentorship": 0, "messag": 1, "method": [4, 5, 6], "metric": 5, "metrics_box_violin": 1, "metrics_boxplot_comp": 5, "metrics_comp": 5, "metrics_list": 5, "mid": 5, "might": 5, "min": 5, "min_length": 4, "mind": 6, "minim": [1, 5], "minimum": [4, 5], "minor": 1, "misalign": 5, "misinterpret": 5, "mislead": 1, "miss": [1, 4, 5, 6], "mm": 4, "mode": [1, 5], "model": [1, 5, 6], "model_select": 5, "modifi": [1, 5], "month": [2, 4], "more": [1, 4, 5], "most": [1, 4, 5, 6], "mous": 5, "move": [1, 5], "mu": 5, "mu_i": 5, "mu_x": 5, "much": 5, "multidimension": 5, "multipl": [1, 4, 5, 6], "multipli": 1, "must": [4, 5], "my_datafram": 1, "n": 5, "n_col": 5, "n_estim": 5, "n_row": 5, "na": [1, 4], "name": [1, 4, 5], "nativ": 4, "navig": [4, 5], "nbformat": 6, "ndarrai": 5, "necessari": [1, 4], "need": [1, 4, 5, 6], "neg": 5, "neither": [1, 5], "nest": 5, "neutral": 5, "never": 4, "new": [1, 4, 5], "newer": 5, "next": [4, 5], "nh": 5, "nomenclatur": 1, "non": [1, 4, 7], "none": [1, 4, 5], "nor": [1, 5], "normal": [1, 7], "notat": [1, 5], "note": [4, 5], "notebook": 4, "noth": 4, "notic": 5, "now": 1, "np": 5, "null": [1, 4], "null_pct": 4, "null_tot": 4, "num": [4, 5], "num_digit": 4, "number": [1, 4, 5], "numer": [1, 5, 7], "numpi": [5, 6], "o": [2, 4, 5], "object": [1, 4, 5], "observ": 5, "obviou": 5, "occup": [4, 5], "occurr": 4, "offer": [1, 5, 6], "often": [5, 6], "older": [1, 5], "omit": 1, "one": [1, 4, 5], "onli": [1, 5], "opaqu": 5, "open": [5, 8], "oper": [4, 5], "optim": 5, "option": [1, 4, 5, 6], "orang": 5, "order": [1, 4, 5], "org": [2, 4, 5, 6, 8], "organ": [1, 5], "orient": 5, "origin": [4, 5], "original_df": 4, "oscar": [2, 3], "other": [1, 4, 5], "otherwis": 5, "our": 0, "out": 5, "outcom": 5, "outlier": 6, "output": [1, 4, 5], "outsid": 5, "over": [1, 3, 5], "overal": [1, 5], "overlai": 5, "overlaid": 5, "overlap": 5, "overrid": 5, "overview": 7, "own": 5, "p": 5, "pac": 4, "pace": [5, 8], "packag": 6, "pad": [1, 5], "page": [5, 6], "pair": [4, 5], "pairwis": 5, "palett": 5, "panda": [1, 4, 5, 6], "param": 1, "paramet": [1, 4, 5], "parametr": 5, "pardir": 4, "parent": 4, "pars": 4, "parse_date_with_rul": [4, 7], "part": 4, "partial": [1, 7], "partial_depend": 5, "particular": 5, "particularli": [1, 4, 5], "pass": [1, 5], "path": [1, 5, 7], "patient": 4, "pattern": [5, 6], "pd": [4, 5], "pdf": 5, "pdp": 5, "pearson": 7, "per": [4, 5], "percent": [1, 5], "percentag": 4, "perfect": 5, "perfectli": 5, "perform": [1, 4, 5], "performancewarn": 1, "period": 7, "person": 3, "perspect": [1, 5], "pi": 5, "pink": 4, "pip": 6, "pitfal": 1, "pivot": [0, 7], "place": [1, 4], "plai": 0, "plain": 4, "plot": [1, 6], "plot_2d_pdp": [1, 5, 7], "plot_3d_pdp": [1, 5, 7], "plot_mean": 5, "plot_median": 5, "plot_typ": [1, 5], "plotli": [1, 5, 6], "plotly_colormap": 5, "plots_onli": 5, "plt": 1, "pm": 5, "png": [1, 4, 5], "png_imag": 4, "point": [1, 5], "pointer": 5, "popul": 5, "popular": 6, "posit": [1, 5], "possibl": [4, 5, 6], "potenti": [1, 4, 5], "power": [1, 5], "pr": 1, "pre": 1, "preced": 5, "predict": [1, 5], "prefer": [1, 5], "prefix": [1, 5], "prepar": [1, 4, 5], "prerequisit": 7, "present": [1, 4, 5], "preval": 5, "prevent": [1, 4, 5], "previou": [1, 5], "previous": 1, "price": 5, "print": [1, 4, 5], "prior": 5, "privat": 4, "probabl": [1, 5, 8], "process": [1, 4, 6], "produc": [1, 5], "product": 5, "prof": 4, "profession": 3, "program": [0, 3], "project": [1, 3, 4, 7], "promin": 5, "proper": [1, 5], "properli": 5, "proport": [1, 4, 5], "provid": [0, 1, 4, 5, 6], "public": 5, "publish": 2, "purpl": 5, "purpos": [1, 7], "pursu": 0, "py": 1, "pypi": [1, 6], "python": [1, 3, 5, 7], "qualiti": [5, 6], "quantifi": 5, "quantit": 5, "quick": 5, "quickli": [5, 6], "r": [3, 4, 5, 6, 8], "r_": 5, "race": 4, "rais": [1, 4, 5], "random": 4, "random_st": 5, "rang": [4, 5, 6], "raw": 5, "re": [1, 5], "read": 4, "readabl": [1, 5], "readi": 6, "readm": 1, "record": 4, "red": 5, "reduc": [1, 5], "redund": 5, "refactor": 1, "refer": [5, 7], "refin": 1, "reflect": [1, 5], "regress": 7, "regular": [1, 7], "relat": [4, 5], "relationship": [4, 5, 6], "releas": 1, "relev": 6, "reli": 5, "reliabl": 4, "remain": [1, 5], "remov": [1, 5, 6, 7], "remove_stack": [1, 5], "renam": [1, 5], "render": 4, "replac": 4, "replica": 1, "report": [3, 5, 6], "repositori": [4, 5, 6, 8], "repres": [1, 4, 5], "represent": [1, 5], "reproduc": 4, "requir": [1, 5, 6], "research": 6, "reset": 1, "resolut": 5, "respect": [4, 5], "respons": 5, "rest": 5, "result": [1, 4, 5], "return": [1, 4, 5], "return_df": [1, 4], "return_dict": 5, "reveal": 5, "rich": [5, 6], "right": [4, 5], "right_margin": [1, 5], "riversid": 3, "robust": 1, "role": [0, 1], "rot": 5, "rotat": [1, 5], "rotate_plot": 5, "round": 4, "row": [4, 5], "rule": 4, "run": 6, "s0167": [5, 8], "same": [1, 5], "sampl": [4, 5], "san": [0, 3], "save": [1, 5, 6, 7], "save_dataframes_to_excel": [1, 4, 7], "save_format": [1, 5], "save_plot": [1, 5], "scale": [1, 5], "scatter": [1, 6, 7], "scatter_color": 5, "scatter_fit_plot": [1, 5, 7], "scatterplot": 5, "scenario": [1, 5], "schema": 5, "scheme": 5, "school": 0, "scienc": [0, 3, 4, 5, 6, 8], "scientif": [1, 5], "scientist": [0, 3, 6], "scikit": [1, 5, 6], "scroll": 5, "seaborn": [1, 5, 6, 8], "seamlessli": 6, "second": [4, 5], "section": [1, 4], "see": 5, "seed": 4, "select": [1, 5], "select_dtyp": 5, "self": 4, "separ": [1, 4, 5], "sequenc": 5, "seri": 4, "serv": [1, 3], "servic": 3, "set": [1, 4, 5], "set_as_index": 4, "set_titl": 1, "setminu": 5, "setp": 1, "setup": [1, 4, 5], "sever": [1, 5], "sex": [4, 5], "shape": [4, 5], "sheet": 4, "shilei": 0, "should": 5, "show": [4, 5], "show_cbar": 5, "show_correl": 5, "show_legend": 5, "show_modebar": [1, 5], "show_plot": 5, "showcas": 5, "shown": 5, "shpaner": [2, 3], "shpaner_2024_13162633": 2, "shrink": 1, "sigma": 5, "sigma_i": 5, "sigma_x": 5, "signatur": 1, "signific": 1, "silver": 5, "similarli": 5, "simpl": 5, "simpler": 1, "simplic": 6, "simplif": 1, "simplifi": [1, 4], "simultan": 5, "sinc": 5, "singl": [1, 4, 5], "single_figs": 5, "single_var_image_filenam": 5, "size": [1, 4, 5], "sklearn": 5, "slightli": 1, "small": 1, "smallest": 5, "smooth": 5, "smoother": [1, 5], "sn": 5, "snippet": [4, 5], "so": [1, 4, 5], "softwar": [2, 5, 8], "some": [1, 4], "sort": [1, 4], "sort_bi": [1, 4], "sortbi": 1, "sourc": [5, 6, 8], "space": [1, 5], "span": 5, "spars": [5, 8], "spatial": [5, 8], "special": 4, "specialti": 4, "specif": [1, 5, 6, 7], "specifi": [1, 4, 5, 6], "split": 5, "spous": 4, "spread": 5, "sql": 3, "sqrt": 5, "squar": 5, "stabil": 1, "stabl": 1, "stack": [1, 6, 7], "stacked_crosstab": 5, "stacked_crosstab_plot": [1, 5, 7], "standard": [1, 5, 6, 7], "standardized_d": 4, "start": [1, 4, 6], "stat": [1, 5], "state": 4, "static": [1, 7], "statist": [1, 3, 4, 5, 6, 8], "statu": [1, 4], "std": 7, "std_color": 5, "std_dev_level": 5, "stem": 5, "step": [1, 6], "still": [1, 5], "store": [1, 5], "str": [1, 4, 5], "straightforward": 1, "streamlin": [1, 4, 6], "strength": 5, "string": [1, 4, 5], "strip": 4, "strip_trailing_period": [4, 7], "stronger": 5, "structur": [1, 6], "style": [1, 4, 5], "styler": [1, 4], "subplot": 5, "subset": 5, "substitut": 5, "subtl": 1, "success": 0, "successfulli": [0, 1], "suffici": 1, "suit": 6, "suitabl": 1, "sum_": 5, "summar": [5, 6], "summari": [1, 6, 7], "summarize_all_combin": [4, 7], "summary_t": 4, "support": [0, 1, 5], "suppos": 5, "suppress": 5, "sure": 4, "surfac": [1, 5], "svg": [1, 4, 5], "svg_imag": 4, "sy": 1, "system": [4, 6], "t": 5, "tab": 4, "tabl": [1, 5, 6], "tailor": 5, "take": [4, 5], "tall": 5, "target": 5, "tarshizi": 0, "task": [4, 6], "tatist": 5, "teach": 3, "techniqu": [6, 7], "ten": 3, "tend": 5, "tendenc": 5, "test": [1, 5], "test_siz": 5, "text": [1, 4, 5], "text_wrap": [1, 5], "th": 5, "than": [1, 4], "thank": 0, "thei": [4, 5], "them": [1, 4, 5, 6], "theoret": 7, "therefor": 5, "thi": [1, 4, 5, 6], "thick": 5, "those": 1, "three": 5, "through": [1, 5], "throw": 1, "thu": 4, "tick": [1, 5], "tick_fonts": [1, 5], "tight": 5, "time": [0, 1, 4, 5], "titl": [1, 2, 5], "title_i": [1, 5], "title_x": [1, 5], "to_list": 5, "togeth": 5, "toggl": [1, 5], "tool": [1, 5, 6], "toolkit": 1, "top": 5, "top_margin": [1, 5], "topic": 4, "total": [4, 5], "toward": 1, "trail": 7, "train": 5, "train_test_split": 5, "transpar": [1, 5], "trend": [5, 6], "triangl": 5, "triangular": [1, 7], "true": [1, 4, 5], "truth": 5, "try": 1, "tupl": [1, 4, 5], "two": [1, 4, 5], "type": [1, 4, 5, 6], "u": [0, 4, 5], "uci": [4, 5, 6, 8], "ucla": 3, "unambigu": 4, "uncov": [5, 6], "underli": [5, 6], "understand": [4, 5, 6], "uniform": 1, "uniqu": [1, 5, 6, 7], "unique_values_tot": 4, "unique_var": 4, "unit": 4, "univers": [0, 3], "unrecogn": 4, "unstack": 5, "unus": 1, "unwav": 0, "up": [1, 4, 5], "updat": [1, 4, 5], "upper": [1, 4, 5], "upright": 5, "url": 2, "us": [1, 4, 5, 6], "usabl": 1, "usag": [1, 4, 5], "user": [1, 5, 6], "userwarn": 5, "util": [4, 5, 6], "v": 5, "valid": 1, "valid_plot_typ": 1, "valu": [1, 4, 5, 6], "valueerror": [1, 4, 5], "vari": 5, "variabl": [1, 5, 6, 7], "varianc": 5, "varieti": [3, 5, 6], "variou": [1, 5, 6], "vars_of_interest": 5, "vdot": 4, "vector": 5, "verbiag": 1, "verifi": [1, 4], "versa": 5, "versatil": 5, "version": [2, 5, 6, 7], "version_info": 1, "versu": 1, "vertic": [1, 5], "via": [1, 5], "vice": 5, "view": [1, 5], "view_angl": 5, "violin": [1, 6, 7], "violinplot": 5, "viridi": 5, "visibl": [1, 5], "visual": [1, 4, 5, 6, 8], "vmax": 5, "vmin": 5, "vriabl": 5, "w_pad": 5, "wa": [1, 5], "wai": 5, "want": [1, 5], "wareh": 3, "warn": [1, 4, 5], "waskom": [5, 8], "we": [0, 4, 5, 6], "week": [4, 5], "welcom": 7, "well": [4, 5], "were": 4, "what": [1, 7], "wheel": 5, "when": [1, 4, 5, 6], "where": [1, 4, 5], "whether": [1, 4, 5], "which": [1, 4, 5, 6], "while": [1, 5], "white": 4, "whitespac": 5, "who": 1, "wide": [3, 5], "width": [1, 5], "wife": 4, "wirefram": [1, 5], "wireframe_color": 5, "wish": 5, "within": [1, 3, 4, 5], "without": [1, 4, 5], "work": [1, 4, 5], "workclass": 4, "workflow": [4, 6], "would": [0, 1, 5], "wrangl": 3, "wrap": [1, 5], "write": 4, "x": [1, 4, 5, 8], "x_": 5, "x_1": 5, "x_2": 5, "x_c": 5, "x_i": 5, "x_j": 5, "x_k": 5, "x_label": [1, 5], "x_label_plotli": 1, "x_n": 5, "x_p": 5, "x_test": 5, "x_train": 5, "x_var": 5, "xlabel": 5, "xlabel_align": 5, "xlabel_rot": 5, "xlim": [1, 5], "xlsx": 4, "xlsxwriter": 6, "xx": 1, "xy": 5, "y": [1, 5], "y_axis_label": 5, "y_i": 5, "y_label": [1, 5], "y_label_plotli": 1, "y_test": 5, "y_train": 5, "y_var": 5, "year": [2, 3, 4], "yellow": 4, "ylabel": 5, "ylabel_align": 5, "ylabel_rot": 5, "ylim": [1, 5], "you": [4, 5, 6], "your": [4, 5, 6], "yy": 1, "yyyi": 4, "z": 5, "z_label": [1, 5], "z_label_plotli": 1, "zenodo": [1, 2], "zero": [1, 4], "zoom": [1, 5], "zoom_out_factor": [1, 5], "zz": 1}, "titles": ["Acknowledgements", "Changelog", "Citing EDA Toolkit", "Contributors/Maintainers", "Data Management Overview", "Plotting and Theoretical Overview", "Welcome to the EDA Toolkit Python Library Documentation!", "Table of Contents", "References"], "titleterms": {"0": 1, "1b0": 1, "1rc0": 1, "2": 1, "2d": 5, "3": 1, "3d": 5, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "8a": 1, "8b": 1, "8c": 1, "9": 1, "With": 5, "about": 7, "acknowledg": 0, "ad": 4, "all": 5, "analysi": 4, "assumpt": 5, "bar": 5, "best": 5, "bin": 4, "box": 5, "ca": 5, "categori": 5, "centric": 5, "changelog": 1, "cite": 2, "coeffici": 5, "column": 4, "combin": [4, 5], "content": 7, "conting": 4, "contributor": 3, "correl": 5, "count": 5, "creat": 4, "crosstab": 5, "custom": 4, "data": [4, 7], "datafram": 4, "date": 4, "densiti": 5, "depend": 5, "descript": 6, "deviat": 5, "directori": 4, "distribut": 5, "document": 6, "eda": [2, 6, 7], "estim": 5, "exampl": 5, "excel": 4, "featur": 6, "fit": 5, "format": 4, "foundat": 5, "full": 5, "function": 5, "gaussian": 5, "gener": 4, "get": 7, "grid": 5, "group": 5, "heurist": 7, "highlight": 4, "histogram": 5, "hous": 5, "i": 6, "identifi": 4, "instal": 6, "interact": 5, "kde": 5, "kei": 6, "kernel": 5, "librari": 6, "line": 5, "link": 6, "maintain": 3, "manag": [4, 7], "matric": 5, "matrix": 5, "mean": 5, "median": 5, "non": 5, "normal": 5, "numer": 4, "overview": [4, 5], "partial": 5, "path": 4, "pearson": 5, "period": 4, "pivot": 5, "plot": [5, 7], "prerequisit": 6, "project": 6, "purpos": 6, "python": 6, "refer": 8, "regress": 5, "regular": 5, "remov": 4, "save": 4, "scatter": 5, "specif": 4, "stack": 5, "standard": 4, "start": 7, "static": 5, "std": 5, "summari": 4, "tabl": [4, 7], "techniqu": 4, "theoret": 5, "toolkit": [2, 6, 7], "trail": 4, "triangular": 5, "uniqu": 4, "variabl": 4, "version": 1, "violin": 5, "welcom": 6, "what": 6}}) \ No newline at end of file