├── docs
├── src
│ ├── _static
│ │ ├── head.png
│ │ ├── info.png
│ │ ├── column.png
│ │ ├── run_all.png
│ │ ├── 2_plus_2.png
│ │ ├── R44-story.png
│ │ ├── bar_color.png
│ │ ├── bar_export.gif
│ │ ├── bar_head.png
│ │ ├── bar_sort.png
│ │ ├── bar_title.png
│ │ ├── fullname.png
│ │ ├── hello_ccdc.png
│ │ ├── labpreview.png
│ │ ├── name_group.png
│ │ ├── new_prop.png
│ │ ├── notebook.png
│ │ ├── oppose_len.png
│ │ ├── prop_len.png
│ │ ├── read_csv.png
│ │ ├── apply-group.png
│ │ ├── apply-series.png
│ │ ├── bar_fullname.png
│ │ ├── bar_vertical.png
│ │ ├── merged_head.png
│ │ ├── merged_info.png
│ │ ├── merged_sort.png
│ │ ├── oppose_sort.png
│ │ ├── prop_filter.png
│ │ ├── support_len.png
│ │ ├── support_sort.png
│ │ ├── value_counts.png
│ │ ├── voter_guide.jpg
│ │ ├── bar_horizontal.png
│ │ ├── committee_group.png
│ │ ├── contribs_head.png
│ │ ├── contribs_info.png
│ │ ├── hello_calaccess.png
│ │ ├── img
│ │ │ ├── labpreview.webp
│ │ │ ├── pandas-pypi.png
│ │ │ └── ben-blue-800.jpg
│ │ ├── import_pandas.png
│ │ ├── markdown_print.png
│ │ ├── merged_amount.png
│ │ ├── merged_position.png
│ │ ├── support_filter.png
│ │ ├── support_support.png
│ │ ├── value_counts_df.png
│ │ ├── jupyterlabdesktop.png
│ │ ├── markdown_example.png
│ │ ├── markdown_pulldown.png
│ │ ├── matplotlib_inline.png
│ │ ├── merged_amount_sum.png
│ │ ├── merged_sort_desc.png
│ │ ├── merged_sort_head.png
│ │ ├── oppose_amount_sum.png
│ │ ├── top_supporters_df.png
│ │ ├── committee_group_df.png
│ │ ├── committee_group_sort.png
│ │ ├── jupyter-desktop-repo.png
│ │ ├── name_position_group.png
│ │ ├── support_amount_sum.png
│ │ ├── jupyter-desktop-blank.png
│ │ ├── jupyter-desktop-splash.png
│ │ ├── support_amount_percent.png
│ │ ├── jupyter-desktop-install.png
│ │ ├── jupyterlabdesktop-download.png
│ │ ├── jupyterlabdesktop-homepage.png
│ │ ├── faa-survey.csv
│ │ ├── ntsb-accidents-update.csv
│ │ ├── custom.css
│ │ ├── ntsb-accidents.csv
│ │ ├── committees.csv
│ │ └── prop-committees.csv
│ ├── conf.py
│ ├── accident-rate-ranking.csv
│ ├── index.md
│ ├── about.md
│ ├── sorting.md
│ ├── compute.md
│ ├── filters.md
│ ├── export.md
│ ├── groupby.md
│ ├── jupyter_desktop.md
│ ├── dataframe.md
│ ├── columns.md
│ ├── concat.md
│ ├── merge.md
│ ├── pandas.md
│ ├── notebook.md
│ ├── appendix
│ │ └── index.md
│ └── charts.md
└── Makefile
├── SECURITY.md
├── .github
├── dependabot.yml
└── workflows
│ ├── test.yaml
│ └── docs.yml
├── jupyterlite
└── stanford-winter-2023
│ ├── faa-survey.csv
│ ├── tutorial.ipynb
│ └── ntsb-accidents.csv
├── Pipfile
├── README.md
├── CONTRIBUTING.md
├── LICENSE
├── .gitignore
├── Makefile
└── CODE_OF_CONDUCT.md
/docs/src/_static/head.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/head.png
--------------------------------------------------------------------------------
/docs/src/_static/info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/info.png
--------------------------------------------------------------------------------
/docs/src/_static/column.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/column.png
--------------------------------------------------------------------------------
/docs/src/_static/run_all.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/run_all.png
--------------------------------------------------------------------------------
/docs/src/_static/2_plus_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/2_plus_2.png
--------------------------------------------------------------------------------
/docs/src/_static/R44-story.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/R44-story.png
--------------------------------------------------------------------------------
/docs/src/_static/bar_color.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/bar_color.png
--------------------------------------------------------------------------------
/docs/src/_static/bar_export.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/bar_export.gif
--------------------------------------------------------------------------------
/docs/src/_static/bar_head.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/bar_head.png
--------------------------------------------------------------------------------
/docs/src/_static/bar_sort.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/bar_sort.png
--------------------------------------------------------------------------------
/docs/src/_static/bar_title.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/bar_title.png
--------------------------------------------------------------------------------
/docs/src/_static/fullname.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/fullname.png
--------------------------------------------------------------------------------
/docs/src/_static/hello_ccdc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/hello_ccdc.png
--------------------------------------------------------------------------------
/docs/src/_static/labpreview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/labpreview.png
--------------------------------------------------------------------------------
/docs/src/_static/name_group.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/name_group.png
--------------------------------------------------------------------------------
/docs/src/_static/new_prop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/new_prop.png
--------------------------------------------------------------------------------
/docs/src/_static/notebook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/notebook.png
--------------------------------------------------------------------------------
/docs/src/_static/oppose_len.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/oppose_len.png
--------------------------------------------------------------------------------
/docs/src/_static/prop_len.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/prop_len.png
--------------------------------------------------------------------------------
/docs/src/_static/read_csv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/read_csv.png
--------------------------------------------------------------------------------
/docs/src/_static/apply-group.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/apply-group.png
--------------------------------------------------------------------------------
/docs/src/_static/apply-series.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/apply-series.png
--------------------------------------------------------------------------------
/docs/src/_static/bar_fullname.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/bar_fullname.png
--------------------------------------------------------------------------------
/docs/src/_static/bar_vertical.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/bar_vertical.png
--------------------------------------------------------------------------------
/docs/src/_static/merged_head.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/merged_head.png
--------------------------------------------------------------------------------
/docs/src/_static/merged_info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/merged_info.png
--------------------------------------------------------------------------------
/docs/src/_static/merged_sort.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/merged_sort.png
--------------------------------------------------------------------------------
/docs/src/_static/oppose_sort.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/oppose_sort.png
--------------------------------------------------------------------------------
/docs/src/_static/prop_filter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/prop_filter.png
--------------------------------------------------------------------------------
/docs/src/_static/support_len.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/support_len.png
--------------------------------------------------------------------------------
/docs/src/_static/support_sort.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/support_sort.png
--------------------------------------------------------------------------------
/docs/src/_static/value_counts.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/value_counts.png
--------------------------------------------------------------------------------
/docs/src/_static/voter_guide.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/voter_guide.jpg
--------------------------------------------------------------------------------
/docs/src/_static/bar_horizontal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/bar_horizontal.png
--------------------------------------------------------------------------------
/docs/src/_static/committee_group.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/committee_group.png
--------------------------------------------------------------------------------
/docs/src/_static/contribs_head.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/contribs_head.png
--------------------------------------------------------------------------------
/docs/src/_static/contribs_info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/contribs_info.png
--------------------------------------------------------------------------------
/docs/src/_static/hello_calaccess.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/hello_calaccess.png
--------------------------------------------------------------------------------
/docs/src/_static/img/labpreview.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/img/labpreview.webp
--------------------------------------------------------------------------------
/docs/src/_static/img/pandas-pypi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/img/pandas-pypi.png
--------------------------------------------------------------------------------
/docs/src/_static/import_pandas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/import_pandas.png
--------------------------------------------------------------------------------
/docs/src/_static/markdown_print.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/markdown_print.png
--------------------------------------------------------------------------------
/docs/src/_static/merged_amount.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/merged_amount.png
--------------------------------------------------------------------------------
/docs/src/_static/merged_position.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/merged_position.png
--------------------------------------------------------------------------------
/docs/src/_static/support_filter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/support_filter.png
--------------------------------------------------------------------------------
/docs/src/_static/support_support.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/support_support.png
--------------------------------------------------------------------------------
/docs/src/_static/value_counts_df.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/value_counts_df.png
--------------------------------------------------------------------------------
/docs/src/_static/img/ben-blue-800.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/img/ben-blue-800.jpg
--------------------------------------------------------------------------------
/docs/src/_static/jupyterlabdesktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/jupyterlabdesktop.png
--------------------------------------------------------------------------------
/docs/src/_static/markdown_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/markdown_example.png
--------------------------------------------------------------------------------
/docs/src/_static/markdown_pulldown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/markdown_pulldown.png
--------------------------------------------------------------------------------
/docs/src/_static/matplotlib_inline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/matplotlib_inline.png
--------------------------------------------------------------------------------
/docs/src/_static/merged_amount_sum.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/merged_amount_sum.png
--------------------------------------------------------------------------------
/docs/src/_static/merged_sort_desc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/merged_sort_desc.png
--------------------------------------------------------------------------------
/docs/src/_static/merged_sort_head.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/merged_sort_head.png
--------------------------------------------------------------------------------
/docs/src/_static/oppose_amount_sum.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/oppose_amount_sum.png
--------------------------------------------------------------------------------
/docs/src/_static/top_supporters_df.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/top_supporters_df.png
--------------------------------------------------------------------------------
/docs/src/_static/committee_group_df.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/committee_group_df.png
--------------------------------------------------------------------------------
/docs/src/_static/committee_group_sort.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/committee_group_sort.png
--------------------------------------------------------------------------------
/docs/src/_static/jupyter-desktop-repo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/jupyter-desktop-repo.png
--------------------------------------------------------------------------------
/docs/src/_static/name_position_group.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/name_position_group.png
--------------------------------------------------------------------------------
/docs/src/_static/support_amount_sum.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/support_amount_sum.png
--------------------------------------------------------------------------------
/docs/src/_static/jupyter-desktop-blank.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/jupyter-desktop-blank.png
--------------------------------------------------------------------------------
/docs/src/_static/jupyter-desktop-splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/jupyter-desktop-splash.png
--------------------------------------------------------------------------------
/docs/src/_static/support_amount_percent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/support_amount_percent.png
--------------------------------------------------------------------------------
/docs/src/_static/jupyter-desktop-install.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/jupyter-desktop-install.png
--------------------------------------------------------------------------------
/docs/src/_static/jupyterlabdesktop-download.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/jupyterlabdesktop-download.png
--------------------------------------------------------------------------------
/docs/src/_static/jupyterlabdesktop-homepage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/palewire/first-python-notebook/HEAD/docs/src/_static/jupyterlabdesktop-homepage.png
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Reporting a Vulnerability
4 |
5 | If you have found a vulnerability in this project, please contact maintainer Ben Welsh at [b@palewi.re](mailto:b@palewi.re)
6 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: "pip"
4 | directory: "/"
5 | schedule:
6 | interval: "monthly"
7 |
8 | - package-ecosystem: "github-actions"
9 | directory: "/.github/workflows"
10 | schedule:
11 | interval: "monthly"
12 |
--------------------------------------------------------------------------------
/docs/src/_static/faa-survey.csv:
--------------------------------------------------------------------------------
1 | latimes_make_and_model,total_hours
2 | AGuSTA 109,362172
3 | airbus 130,1053786
4 | AIrBuS 135,884596
5 | Airbus 350,3883490
6 | bELL 206,5501308
7 | bElL 407,2113788
8 | hughes 369,1201688
9 | MCDONNELl DOUGLAS 369,550689
10 | robiNsoN R22,2970806
11 | robinson R44,2359729
12 | schWEIZer 269,1139326
13 | SIKORSKy 76,915515
14 |
--------------------------------------------------------------------------------
/jupyterlite/stanford-winter-2023/faa-survey.csv:
--------------------------------------------------------------------------------
1 | latimes_make_and_model,total_hours
2 | AGUSTA 109,362172
3 | AIRBUS 130,1053786
4 | AIRBUS 135,884596
5 | AIRBUS 350,3883490
6 | BELL 206,5501308
7 | BELL 407,2113788
8 | HUGHES 369,1201688
9 | MCDONNELL DOUGLAS 369,550689
10 | ROBINSON R22,2970806
11 | ROBINSON R44,2359729
12 | SCHWEIZER 269,1139326
13 | SIKORSKY 76,915515
14 |
--------------------------------------------------------------------------------
/Pipfile:
--------------------------------------------------------------------------------
1 | [[source]]
2 | name = "pypi"
3 | url = "https://pypi.org/simple"
4 | verify_ssl = true
5 |
6 | [packages]
7 | jupyterlab = "*"
8 | pandas = "*"
9 | altair = "*"
10 | yolk3k = "*"
11 | sphinx = "*"
12 | sphinx-autobuild = "*"
13 | myst-nb = "*"
14 | sphinx-multitoc-numbering = "*"
15 | jupyterlite = "*"
16 | pyarrow = "*"
17 | sphinx-palewire-theme = "==0.1.2"
18 |
19 | [requires]
20 | python_version = "3.11"
21 |
22 | [pipenv]
23 | allow_prereleases = true
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # First Python Notebook
2 |
3 | A step-by-step guide to analyzing data with Python and the Jupyter notebook. Take the class at [firstpythonnotebook.org](http://www.firstpythonnotebook.org).
4 |
5 | ### Links
6 |
7 | * [More about this class](https://palewi.re/docs/first-python-notebook/about.html)
8 | * [How to contribute](https://github.com/palewire/first-python-notebook/blob/main/CONTRIBUTING.md)
9 | * [Other classes in this series](https://palewi.re/docs/)
10 |
--------------------------------------------------------------------------------
/docs/src/_static/ntsb-accidents-update.csv:
--------------------------------------------------------------------------------
1 | ntsb-model,ntsb-number,year,date,city,state,country,total-fatalities,latimes_make,latimes_model,latimes_make_and_model,event_id,ntsb_make
2 | 777,NYC07FA048,2024,12/14/2024 0:00,DAGSBORO,DE,USA,20,HELICOP,777,HELICOP 777,20241222X01838,HELICOP
3 | 777,LAX06LA257,2024,8/10/2024 0:00,TUCSON,AZ,USA,11,HELICOP,777,HELICOP 777,20240817X01187,HELICOP
4 | 777,MIA06FA039,2024,1/1/2024 0:00,GRAND RIDGE,FL,USA,202,HELICOP,777,HELICOP 777,20240111X00044,HELICOP
--------------------------------------------------------------------------------
/docs/src/_static/custom.css:
--------------------------------------------------------------------------------
1 | .cell_output {
2 | padding-left: 0 !important;
3 | margin-top: 0 !important;
4 | overflow: auto !important;
5 | }
6 |
7 | .tag_hide-cell {
8 | overflow: auto !important;
9 | display: none !important;
10 | }
11 |
12 | .responsive-iframe-container {
13 | position: relative;
14 | overflow: hidden;
15 | width: 100%;
16 | padding-top: 56.25%; /* 16:9 Aspect Ratio (divide 9 by 16 = 0.5625) */
17 | margin: 15px 0;
18 | }
19 |
20 | .responsive-iframe {
21 | position: absolute;
22 | top: 0;
23 | left: 0;
24 | bottom: 0;
25 | right: 0;
26 | width: 100%;
27 | height: 100%;
28 | }
--------------------------------------------------------------------------------
/docs/src/conf.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime
2 |
3 | extensions = [
4 | "myst_nb",
5 | "sphinx_multitoc_numbering",
6 | ]
7 | source_suffix = ".md"
8 | master_doc = "index"
9 |
10 | project = 'First Python Notebook'
11 | year = datetime.now().year
12 | copyright = f'{year} palewi.re'
13 |
14 | exclude_patterns = ["_build"]
15 |
16 | html_theme = "palewire"
17 | html_sidebars = {
18 | '**': [
19 | 'about.html',
20 | 'navigation.html',
21 | ]
22 | }
23 | html_theme_options = {
24 | "canonical_url": f"https://palewi.re/docs/first-python-notebook/",
25 | }
26 |
27 | html_static_path = ['_static']
28 |
29 | pygments_style = 'sphinx'
30 |
31 | # jupyter_execute_notebooks = "off"
32 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | How to propose changes to this repository.
4 |
5 | ## Installation
6 |
7 | Fork the repository and clone it:
8 |
9 | ```bash
10 | gh repo clone your-name/first-python-notebook
11 | ```
12 |
13 | Change into the project directory:
14 |
15 | ```bash
16 | cd first-python-notebook
17 | ```
18 |
19 | Install the dependencies using pipenv:
20 |
21 | ```bash
22 | pipenv install
23 | ```
24 |
25 | ## Contributing
26 |
27 | To start a test server that previews the site, use the following command:
28 |
29 | ```bash
30 | make serve
31 | ```
32 |
33 | Once it starts, visit [localhost:8000](http://localhost:8000) in your browser. Edits made in the `docs/` folder will appear immediately. Commit your changes to a branch and then submit a pull request to the source repository.
34 |
--------------------------------------------------------------------------------
/docs/Makefile:
--------------------------------------------------------------------------------
1 | # Minimal makefile for Sphinx documentation
2 | #
3 |
4 | # You can set these variables from the command line.
5 | SPHINXOPTS =
6 | SPHINXBUILD = sphinx-build
7 | SPHINXPROJ = FirstPythonNotebook
8 | SOURCEDIR = .
9 | BUILDDIR = _build
10 |
11 | # Put it first so that "make" without argument is like "make help".
12 | help:
13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14 |
15 | .PHONY: help Makefile
16 |
17 | livehtml:
18 | sphinx-autobuild --ignore=`pwd`/jupyter_execute \
19 | --ignore=`pwd`/_build/jupyter_execute \
20 | --ignore=`pwd`/_build_html/jupyter_execute \
21 | -b html \
22 | ./src ./_build_html
23 |
24 | # Catch-all target: route all unknown targets to Sphinx using the new
25 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
26 | %: Makefile
27 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
28 |
--------------------------------------------------------------------------------
/docs/src/accident-rate-ranking.csv:
--------------------------------------------------------------------------------
1 | latimes_make;latimes_make_and_model;accidents;total_hours;per_hour;per_100k_hours
2 | AGUSTA;AGUSTA 109;2;362172;5.522238052637973e-06;0.5522238052637973
3 | AIRBUS;AIRBUS 130;1;1053786;9.489592763616143e-07;0.09489592763616142
4 | AIRBUS;AIRBUS 135;4;884596;4.521838217672248e-06;0.4521838217672248
5 | AIRBUS;AIRBUS 350;29;3883490;7.46750989445061e-06;0.746750989445061
6 | BELL;BELL 206;30;5501308;5.453248572884849e-06;0.5453248572884849
7 | BELL;BELL 407;13;2113788;6.150096414588407e-06;0.6150096414588407
8 | HUGHES;HUGHES 369;13;1201688;1.0818115850370479e-05;1.081811585037048
9 | MCDONNELL DOUGLAS;MCDONNELL DOUGLAS 369;6;550689;1.089544189188453e-05;1.089544189188453
10 | ROBINSON;ROBINSON R22;20;2970806;6.732179751892247e-06;0.6732179751892248
11 | ROBINSON;ROBINSON R44;38;2359729;1.6103544093410725e-05;1.6103544093410724
12 | SCHWEIZER;SCHWEIZER 269;5;1139326;4.388559551875407e-06;0.4388559551875407
13 | SIKORSKY;SIKORSKY 76;2;915515;2.1845627870652038e-06;0.21845627870652037
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Ben Welsh
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.github/workflows/test.yaml:
--------------------------------------------------------------------------------
1 | name: Test
2 |
3 | on:
4 | push:
5 | pull_request:
6 | workflow_dispatch:
7 |
8 | jobs:
9 | build:
10 | name: Build
11 | runs-on: ubuntu-latest
12 | steps:
13 | - id: checkout
14 | name: Checkout
15 | uses: actions/checkout@v4
16 |
17 | - id: setup-python
18 | name: Setup Python
19 | uses: actions/setup-python@v5
20 | with:
21 | python-version: '3.11'
22 | cache: 'pipenv'
23 |
24 | - id: install-pipenv
25 | name: Install pipenv
26 | run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python
27 | shell: bash
28 |
29 | - id: install-python-dependencies
30 | name: Install Python dependencies
31 | run: pipenv sync --dev
32 | shell: bash
33 |
34 | - id: build-sphinx-documentation
35 | name: Build Sphinx documentation
36 | run: make build
37 | shell: bash
38 |
39 | - id: upload-release-candidate
40 | name: Upload release candidate
41 | uses: actions/upload-artifact@v4
42 | with:
43 | name: release-candidate
44 | path: ./docs/_build/
45 |
--------------------------------------------------------------------------------
/docs/src/index.md:
--------------------------------------------------------------------------------
1 | # First Python Notebook
2 |
3 | A step-by-step guide to analyzing data with Python and the Jupyter notebook.
4 |
5 | ## What you will learn
6 |
7 | * Just enough of the [Python](https://www.python.org/) computer-programming language to read, filter, join, group, aggregate and rank structured data with [pandas](http://pandas.pydata.org/), a popular tool for statistical analysis
8 |
9 | * How to record, remix and republish your work using [Project Jupyter](http://jupyter.org/), the emerging standard for generating reproducible research
10 |
11 | * How to explore data using using [Altair](https://altair-viz.github.io/), a Python package that offers a simple, structured grammar for generating charts.
12 |
13 | ## Who can take it
14 |
15 | This course is free. All you need is a good attitude.
16 |
17 | ## Table of contents
18 |
19 | ```{toctree}
20 | :maxdepth: 1
21 | :caption: Chapters
22 | :name: mastertoc
23 | :numbered:
24 |
25 | jupyter_desktop
26 | notebook
27 | pandas
28 | dataframe
29 | columns
30 | filters
31 | groupby
32 | merge
33 | compute
34 | sorting
35 | concat
36 | charts
37 | export
38 | ```
39 |
40 | ```{toctree}
41 | :maxdepth: 1
42 | :caption: Appendix
43 | :name: appendix
44 | :numbered:
45 |
46 | appendix/index
47 | about
48 | ```
49 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | lab/
2 | .jupyterlite.doit.db
3 | _output
4 | docs/jupyter_execute
5 | *.DS_Store
6 | *.~lock*
7 | # Byte-compiled / optimized / DLL files
8 | __pycache__/
9 | *.py[cod]
10 | *$py.class
11 |
12 | # C extensions
13 | *.so
14 |
15 | # Distribution / packaging
16 | .Python
17 | env/
18 | build/
19 | develop-eggs/
20 | dist/
21 | downloads/
22 | eggs/
23 | .eggs/
24 | lib/
25 | lib64/
26 | parts/
27 | sdist/
28 | var/
29 | *.egg-info/
30 | .installed.cfg
31 | *.egg
32 |
33 | # PyInstaller
34 | # Usually these files are written by a python script from a template
35 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
36 | *.manifest
37 | *.spec
38 |
39 | # Installer logs
40 | pip-log.txt
41 | pip-delete-this-directory.txt
42 |
43 | # Unit test / coverage reports
44 | htmlcov/
45 | .tox/
46 | .coverage
47 | .coverage.*
48 | .cache
49 | nosetests.xml
50 | coverage.xml
51 | *,cover
52 | .hypothesis/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 |
62 | # Flask stuff:
63 | instance/
64 | .webassets-cache
65 |
66 | # Scrapy stuff:
67 | .scrapy
68 |
69 | # Sphinx documentation
70 | docs/_build/
71 |
72 | # PyBuilder
73 | target/
74 |
75 | # IPython Notebook
76 | .ipynb_checkpoints
77 |
78 | # pyenv
79 | .python-version
80 |
81 | # celery beat schedule file
82 | celerybeat-schedule
83 |
84 | # dotenv
85 | .env
86 |
87 | # virtualenv
88 | venv/
89 | ENV/
90 |
91 | # Spyder project settings
92 | .spyderproject
93 |
94 | # Rope project settings
95 | .ropeproject
96 |
97 | # Vscode
98 | .vscode
99 |
100 | # rendered html
101 | docs/_build_html
102 |
--------------------------------------------------------------------------------
/docs/src/about.md:
--------------------------------------------------------------------------------
1 | # About this class
2 |
3 | This course was first developed by [Ben Welsh](https://palewi.re/who-is-ben-welsh/) for an October 2016 ["watchdog workshop"](http://www.californiacivicdata.org/2016/10/08/first-python-notebook/) organized by Investigative Reporters and Editors at San Diego State University's school of journalism.
4 |
5 | Since then it has been [taught](https://knightcenter.utexas.edu/blog/00-18396-sign-now-our-new-online-course-data-journalism-python-data-journalists-analyzing-money), [twice](https://journalismcourses.org/product/first-python-notebook-data-analysis-on-deadline/) as a massive, open online course at the University of Texas at Austin, become part of Stanford’s curriculum and been frequently offered at annual conferences organized by the National Institute for Computer-Assisted Reporting. Several classes have been streamed live, with [more](https://www.youtube.com/watch?v=x-y7tRpq7xM) than [one](https://www.youtube.com/watch?v=2RgPoy05AnA) available as a recording.
6 |
7 | The class has frequently been taught with and by others, including [James Gordon](https://journalism.missouri.edu/people/james-gordon/), [Andrea Suozzo](https://andreasuozzo.com/), [Cheryl Phillips](https://comm.stanford.edu/faculty-phillips/), [Iris Lee](https://www.latimes.com/people/iris-lee), [Gabrielle LaMarr LeMee](https://linktr.ee/lamarrlemee), [Melissa Lewis](https://melissalewis.codes/), [Aaron Williams](https://acwx.net/), [Derek Willis](http://thescoop.org/), [Joe Germuska](https://about.me/joegermuska), [Kae Petrin](https://petrinkae.github.io), [Eric Sagara](https://www.linkedin.com/in/esagara), [Serdar Tumgoren](https://twitter.com/zstumgoren), [Simon Willison](https://simonwillison.net/), [David Eads](http://www.recoveredfactory.net/), [Amy Schmitz Weiss](https://californiacivicdata.org/2017/07/12/first-python-notebook-at-sdsu/) and [Katlyn Alo](https://www.linkedin.com/in/katalo/).
8 |
--------------------------------------------------------------------------------
/.github/workflows/docs.yml:
--------------------------------------------------------------------------------
1 | name: Build documentation
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | workflow_dispatch:
8 |
9 | jobs:
10 | build:
11 | name: Build
12 | runs-on: ubuntu-latest
13 | steps:
14 | - id: checkout
15 | name: Checkout
16 | uses: actions/checkout@v4
17 |
18 | - id: setup-python
19 | name: Setup Python
20 | uses: actions/setup-python@v5
21 | with:
22 | python-version: '3.11'
23 | cache: 'pipenv'
24 |
25 | - id: install-pipenv
26 | name: Install pipenv
27 | run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python
28 | shell: bash
29 |
30 | - id: install-python-dependencies
31 | name: Install Python dependencies
32 | run: pipenv sync --dev
33 | shell: bash
34 |
35 | - id: build-sphinx-documentation
36 | name: Build Sphinx documentation
37 | run: make build
38 | shell: bash
39 |
40 | - id: upload-release-candidate
41 | name: Upload release candidate
42 | uses: actions/upload-artifact@v4
43 | with:
44 | name: release-candidate
45 | path: docs/_build/
46 |
47 | deploy:
48 | name: Deploy
49 | runs-on: ubuntu-latest
50 | needs: build
51 | if: ${{ github.ref_name == 'main' }}
52 | steps:
53 | - name: Download release candidate
54 | uses: actions/download-artifact@v4
55 | with:
56 | name: release-candidate
57 | path: ./docs/
58 |
59 | - id: configure-aws
60 | name: Configure AWS Credentials
61 | uses: aws-actions/configure-aws-credentials@v4
62 | with:
63 | aws-access-key-id: ${{ secrets.PALEWIRE_DOCS_AWS_ACCESS_KEY_ID }}
64 | aws-secret-access-key: ${{ secrets.PALEWIRE_DOCS_AWS_SECRET_ACCESS_KEY }}
65 | aws-region: us-east-1
66 |
67 | - id: upload-to-s3
68 | name: Upload documentation to Amazon S3
69 | uses: datadesk/delivery-deploy-action@v1
70 | with:
71 | bucket: ${{ secrets.PALEWIRE_DOCS_AWS_BUCKET }}
72 | base-path: first-python-notebook
73 | dir: ./docs/
74 | should-cache: false
75 | use-accelerate-endpoint: false
76 | public: true
--------------------------------------------------------------------------------
/jupyterlite/stanford-winter-2023/tutorial.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "37529264-50ff-4bf6-ba7f-0b67d1cafbf5",
6 | "metadata": {},
7 | "source": [
8 | "# First Python Notebook: Stanford Winter 2023 edition\n",
9 | "\n",
10 | "An guide to data with the [Python](https://www.python.org/) programming language and a [Jupyter](https://jupyter.org/) notebook\n",
11 | " \n",
12 | "By [Ben Welsh](https://palewi.re/who-is-ben-welsh/)"
13 | ]
14 | },
15 | {
16 | "cell_type": "markdown",
17 | "id": "2b3934dd-a0b6-4d99-9ad4-4370318e8f69",
18 | "metadata": {},
19 | "source": [
20 | "First developed in 2016, [\"First Python Notebook\"](https://palewi.re/docs/first-python-notebook/) is a tutorial that guides students through a data-driven investigation. It is most commonly taught as a six-hour, in-person class. This document is an updated, and abbreviated, spin-off for Stanford students in the winter 2023 semester\n",
21 | "\n",
22 | "You will learn just enough of the Python computer programming language to work with the [pandas](https://pandas.pydata.org/) library, a popular open-source tool for analyzing data. The course will teach you how to read, filter, join, group, aggregate and rank structured data by recreating a Los Angeles Times analysis.\n",
23 | "\n",
24 | "The class, which we will code together live below, walks through [the standard \"First Python Notebook\" tutorial](https://palewi.re/docs/first-python-notebook/index.htmlhttps://palewi.re/docs/first-python-notebook/index.html)."
25 | ]
26 | },
27 | {
28 | "cell_type": "code",
29 | "execution_count": null,
30 | "id": "a4456818-022e-4c61-b874-0c0e6a5a47f0",
31 | "metadata": {},
32 | "outputs": [],
33 | "source": []
34 | }
35 | ],
36 | "metadata": {
37 | "kernelspec": {
38 | "display_name": "Python 3 (ipykernel)",
39 | "language": "python",
40 | "name": "python3"
41 | },
42 | "language_info": {
43 | "codemirror_mode": {
44 | "name": "ipython",
45 | "version": 3
46 | },
47 | "file_extension": ".py",
48 | "mimetype": "text/x-python",
49 | "name": "python",
50 | "nbconvert_exporter": "python",
51 | "pygments_lexer": "ipython3",
52 | "version": "3.9.9"
53 | }
54 | },
55 | "nbformat": 4,
56 | "nbformat_minor": 5
57 | }
58 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | #
2 | # Colors
3 | #
4 |
5 | # Define ANSI color codes
6 | RESET_COLOR = \033[m
7 |
8 | BLUE = \033[1;34m
9 | YELLOW = \033[1;33m
10 | GREEN = \033[1;32m
11 | RED = \033[1;31m
12 | BLACK = \033[1;30m
13 | MAGENTA = \033[1;35m
14 | CYAN = \033[1;36m
15 | WHITE = \033[1;37m
16 |
17 | DBLUE = \033[0;34m
18 | DYELLOW = \033[0;33m
19 | DGREEN = \033[0;32m
20 | DRED = \033[0;31m
21 | DBLACK = \033[0;30m
22 | DMAGENTA = \033[0;35m
23 | DCYAN = \033[0;36m
24 | DWHITE = \033[0;37m
25 |
26 | BG_WHITE = \033[47m
27 | BG_RED = \033[41m
28 | BG_GREEN = \033[42m
29 | BG_YELLOW = \033[43m
30 | BG_BLUE = \033[44m
31 | BG_MAGENTA = \033[45m
32 | BG_CYAN = \033[46m
33 |
34 | # Name some of the colors
35 | COM_COLOR = $(DBLUE)
36 | OBJ_COLOR = $(DCYAN)
37 | OK_COLOR = $(DGREEN)
38 | ERROR_COLOR = $(DRED)
39 | WARN_COLOR = $(DYELLOW)
40 | NO_COLOR = $(RESET_COLOR)
41 |
42 | OK_STRING = "[OK]"
43 | ERROR_STRING = "[ERROR]"
44 | WARN_STRING = "[WARNING]"
45 |
46 | define banner
47 | @echo " $(WHITE)__________$(RESET_COLOR)"
48 | @echo "$(WHITE) |$(DWHITE) PALEWIRE $(RESET_COLOR)$(WHITE)|$(RESET_COLOR)"
49 | @echo "$(WHITE) |&&& ======|$(RESET_COLOR)"
50 | @echo "$(WHITE) |=== ======|$(RESET_COLOR) $(DWHITE)This is a $(RESET_COLOR)$(DBLACK)$(BG_WHITE)palewire$(RESET_COLOR)$(DWHITE) automation$(RESET_COLOR)"
51 | @echo "$(WHITE) |=== == %%%|$(RESET_COLOR)"
52 | @echo "$(WHITE) |[_] ======|$(RESET_COLOR) $(1)"
53 | @echo "$(WHITE) |=== ===!##|$(RESET_COLOR)"
54 | @echo "$(WHITE) |__________|$(RESET_COLOR)"
55 | @echo ""
56 | endef
57 |
58 | #
59 | # Python helpers
60 | #
61 |
62 | PIPENV := pipenv run
63 | PYTHON := python -W ignore -m
64 |
65 | #
66 | # Commands
67 | #
68 |
69 | serve: ## Test the site
70 | $(call banner, 🧪 Serving test site 🧪)
71 | @rm -rf docs/_build
72 | @rm -rf docs/jupyter_execute
73 | @cd docs && $(PIPENV) make livehtml
74 |
75 |
76 | build: ## Build a release candidate
77 | $(call banner,🏗️ Building release candidate 🏗️)
78 | @cd docs && pipenv run sphinx-build -b html src _build
79 | @mkdir -p docs/_build/_extra/
80 | @mkdir _dist/
81 | @pipenv run jupyter lite build --contents ./jupyterlite/ --output-dir=./_dist/
82 | @mv ./_dist/* docs/_build/_extra/
83 |
84 | #
85 | # Extras
86 | #
87 |
88 | format: ## automatically format Python code with black
89 | $(call banner, 🪥 Cleaning code 🪥)
90 | @$(PIPENV) black .
91 |
92 |
93 | help: ## Show this help. Example: make help
94 | @egrep -h '\s##\s' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
95 |
96 |
97 | # Mark all the commands that don't have a target
98 | .PHONY: help \
99 | format \
100 | serve
--------------------------------------------------------------------------------
/docs/src/sorting.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Sort
15 |
16 |
17 |
18 |
19 |
20 | Another simple but common technique for analyzing data is sorting. This can be useful for ranking the DataFrame to show the first and last members of the table according to a particular column.
21 |
22 | ```{code-cell}
23 | :tags: [hide-cell]
24 |
25 | import pandas as pd
26 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
27 | accident_list["latimes_make_and_model"] = accident_list["latimes_make_and_model"].str.upper()
28 | accident_counts = accident_list.groupby("latimes_make_and_model").size().reset_index().rename(columns={0: "accidents"})
29 | survey = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/faa-survey.csv")
30 | survey["latimes_make_and_model"] = survey["latimes_make_and_model"].str.upper()
31 | merged_list = pd.merge(accident_counts, survey, on="latimes_make_and_model")
32 | merged_list["per_hour"] = merged_list.accidents / merged_list.total_hours
33 | merged_list["per_100k_hours"] = (merged_list.accidents / merged_list.total_hours) * 100_000
34 | ```
35 |
36 | The [`sort_values`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html) method is how pandas does it. It expects you to provide it with the name of the column to sort by in quotes. Try sorting by our computed field.
37 |
38 | ```{code-cell}
39 | :tags: [show-input]
40 | merged_list.sort_values("per_100k_hours")
41 | ```
42 |
43 | Note that by default `sort_values` returns the DataFrame sorted in ascending order from lowest to highest. You can show the largest values first by passing in an optional keyword argument called `ascending`. When it is set to `False`, the DataFrame is sorted in descending order.
44 |
45 | ```{code-cell}
46 | :tags: [show-input]
47 | merged_list.sort_values("per_100k_hours", ascending=False)
48 | ```
49 |
50 | Congratulations. With that, you've re-created the heart of the analysis published in the Los Angeles Times and covered most of the basic skills necessary to access and analyze data with pandas.
51 |
52 | Before we move on, here's another quiz for you. You can answer all of these questions using only tricks we've learned thus far.
53 |
54 | 1. What’s the date of the most recent fatal helicopter accident in Texas?
55 | 2. How many fatalities occurred in Texas accidents?
56 | 3. What helicopter model logged the most flight hours?
57 | 4. Where did the accident with the NTSB number `ERA13LA057` occur?
--------------------------------------------------------------------------------
/docs/src/compute.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Compute
15 |
16 |
17 |
18 |
19 |
20 | ```{code-cell}
21 | :tags: [hide-cell]
22 |
23 | import pandas as pd
24 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
25 | accident_list["latimes_make_and_model"] = accident_list["latimes_make_and_model"].str.upper()
26 | accident_counts = accident_list.groupby("latimes_make_and_model").size().reset_index().rename(columns={0: "accidents"})
27 | survey = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/faa-survey.csv")
28 | survey["latimes_make_and_model"] = survey["latimes_make_and_model"].str.upper()
29 | merged_list = pd.merge(accident_counts, survey, on="latimes_make_and_model")
30 | ```
31 |
32 | To calculate an accident rate, we’ll need to create a new column based on the data in other columns, a process sometimes known as “computing.”
33 |
34 | In many cases, it’s no more complicated than combining two Series using a mathematical operator. That's true in this case, where our goal is to divide the total number of accidents in each row by the total hours. That can accomplished with the following:
35 |
36 | ```{code-cell}
37 | :tags: [show-input]
38 | merged_list["accidents"] / merged_list["total_hours"]
39 | ```
40 |
41 | The resulting Series can be added to your DataFrame by assigning it to a new column. Name your column by providing it as a quoted string inside of square brackets. Let's call this column something brief and clear like `per_hour`.
42 |
43 | ```{code-cell}
44 | :tags: [show-input]
45 | merged_list["per_hour"] = merged_list["accidents"] / merged_list["total_hours"]
46 | ```
47 |
48 | Like everything else, you can inspect with the `head` command.
49 |
50 | ```{code-cell}
51 | :tags: [show-input]
52 | merged_list.head()
53 | ```
54 |
55 | You can see that the result is in [scientific notation](https://en.wikipedia.org/wiki/Scientific_notation). As is common when calculating per capita statistics, let's multiple the per-hour results by a common number to make the figures more legible. That's as easy as tacking some multiplication at the end of a computation. Here we'll multiply by 100,000 hours.
56 |
57 | ```{code-cell}
58 | :tags: [show-input]
59 | merged_list["per_100k_hours"] = merged_list["per_hour"] * 100_000
60 | ```
61 |
62 | Have a look at the result with `head` again.
63 |
64 | ```{code-cell}
65 | :tags: [show-input]
66 | merged_list.head()
67 | ```
68 |
69 | Much better! Now lets move on to the next step, sorting our data into a ranking.
--------------------------------------------------------------------------------
/docs/src/filters.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Filter
15 |
16 |
17 |
18 |
19 |
20 | The most common way to filter a DataFrame is to pass an expression as an “index” that can be used to decide which records to keep and which to discard. You write the expression by combining a column of your DataFrame with an “operator” like `==` or `>` or `<` and a value to compare each row against.
21 |
22 | ```{note}
23 | If you are familiar with writing [SQL](https://en.wikipedia.org/wiki/SQL) to manipulate databases, pandas’ filtering system is somewhat similar to a WHERE query. The [official pandas documentation](https://pandas.pydata.org/pandas-docs/stable/getting_started/comparison/comparison_with_sql.html#where) offers direct translations between the two.
24 | ```
25 |
26 | Let's try filtering against the `state` field. Save a state's postal code into a variable. This will allow us to reuse it later.
27 |
28 | ```{code-cell}
29 | :tags: [hide-cell]
30 |
31 | import pandas as pd
32 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
33 | accident_list["latimes_make_and_model"] = accident_list["latimes_make_and_model"].str.upper()
34 | ```
35 |
36 | ```{code-cell}
37 | :tags: [show-input]
38 | my_state = "IA"
39 | ```
40 |
41 | In the next cell we will ask pandas to narrow down our list of accidents to just those in our state of interest. We will create a filter expression and place it between two square brackets following the DataFrame we wish to filter.
42 |
43 | ```{code-cell}
44 | :tags: [show-input]
45 | accident_list[accident_list["state"] == my_state]
46 | ```
47 |
48 | Now we should save the results of that filter into a new variable separate from the full list we imported from the CSV file. Since it includes only accidents in our chosen state, let’s call it `my_accidents`.
49 |
50 | ```{code-cell}
51 | :tags: [show-input]
52 | my_accidents = accident_list[accident_list["state"] == my_state]
53 | ```
54 |
55 | To check our work and find out how many records are left after the filter, let's run the DataFrame inspection commands we learned earlier.
56 |
57 | First `head`.
58 |
59 | ```{code-cell}
60 | :tags: [show-input]
61 | my_accidents.head()
62 | ```
63 |
64 | Then `info`.
65 |
66 | ```{code-cell}
67 | :tags: [show-input]
68 | my_accidents.info()
69 | ```
70 |
71 | Now pick another state and try running the code again. See if you can write filters that will answer the following questions:
72 |
73 | 1. Which state recorded more accidents: Iowa or Missouri?
74 | 2. How many accidents recorded more than one fatality?
75 | 3. How many accidents happened in California in 2015?
76 | 4. What percentage of the total fatalities occured in California?
77 |
78 | Once you’ve written code that generates the answers, you’re ready to move on to the next chapter.
--------------------------------------------------------------------------------
/docs/src/export.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Export
15 |
16 |
17 |
18 |
19 |
20 | Saving the dataframes you’ve created to your computer requires one final pandas method. It’s [`to_csv`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html), an exporting companion to `read_csv`. Append it to any dataframe and provide a filepath. That's all it takes.
21 |
22 | ```{code-cell}
23 | :tags: [hide-cell]
24 |
25 | import pandas as pd
26 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
27 | accident_list['latimes_make_and_model'] = accident_list['latimes_make_and_model'].str.upper()
28 | accident_counts = accident_list.groupby(["latimes_make", "latimes_make_and_model"]).size().reset_index().rename(columns={0: "accidents"})
29 | survey = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/faa-survey.csv")
30 | survey['latimes_make_and_model'] = survey['latimes_make_and_model'].str.upper()
31 | merged_list = pd.merge(accident_counts, survey, on="latimes_make_and_model")
32 | merged_list['per_hour'] = merged_list.accidents / merged_list.total_hours
33 | merged_list['per_100k_hours'] = (merged_list.accidents / merged_list.total_hours) * 100_000
34 | ```
35 |
36 | ```{code-cell}
37 | merged_list.to_csv("accident-rate-ranking.csv")
38 | ```
39 |
40 | The file it creates can be imported into other programs for reuse, including the data visualization tools many newsrooms rely on to publish graphics. For instance, the file we've exported above could be used to quickly draft a chart with [Datawrapper](https://datawrapper.de/), like this one:
41 |
42 |
44 |
45 | ```{note}
46 | Interested in learning more about how to publish data online? Check out ["First Visual Story,"](https://palewi.re/docs/first-visual-story/) a tutorial that will show you how journalists at America’s top news organizations escape rigid content-management systems to publish custom interactive graphics on deadline.
47 | ```
48 |
49 |
50 | The `to_csv()` method accepts several optional arguments. The most important one is the filename input, which is used to specify the path and name of the file that will be created. The `index=False` keyword argument tells pandas to exclude the index column of the DataFrame. You can also specify the separator by passing the `sep` parameter.
51 |
52 |
53 | ```{code-cell}
54 | merged_list.to_csv("accident-rate-ranking.csv", index=False, sep=";")
55 | ```
56 |
57 | This will create a CSV file without the index with semicolons as the separator between values.
58 |
59 | And with that, you've completed “First Python Notebook.” If you have any questions or critiques, you can get involved on [our GitHub repository](https://github.com/palewire/first-python-notebook), where all of the code that powers this site is available as open source.
60 |
--------------------------------------------------------------------------------
/docs/src/groupby.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Group
15 |
16 |
17 |
18 |
19 |
20 | The [`groupby`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html) method allows you to group a DataFrame by a column and then calculate a sum, or any other statistic, for each unique value. This functions much like the ["pivot table"](https://en.wikipedia.org/wiki/Pivot_table) feature found in most spreadsheets programs.
21 |
22 | Let's use it to total up the accidents by helicopter make and model. You start by passing the field you want to group on to the function.
23 |
24 | ```{code-cell}
25 | :tags: [hide-cell]
26 |
27 | import pandas as pd
28 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
29 | accident_list["latimes_make_and_model"] = accident_list["latimes_make_and_model"].str.upper()
30 | ```
31 |
32 | ```{code-cell}
33 | :tags: [show-input]
34 | accident_list.groupby("latimes_make_and_model")
35 | ```
36 |
37 | That's a nice start, but you’ll notice you don’t get much back. The data has been grouped, but we haven’t chosen what to do with it yet. If we want the total by model, we can use the `size` method.
38 |
39 | ```{code-cell}
40 | :tags: [show-input]
41 | accident_list.groupby("latimes_make_and_model").size()
42 | ```
43 |
44 | The result is much like `value_counts`, but we're allowed run to all kinds of statistical operations on the group, like `sum`, `mean` and `std`. For instance, we could sum up the number of fatalities for each maker by stringing that field on the end followed by the statistical method.
45 |
46 | ```{code-cell}
47 | :tags: [show-input]
48 | accident_list.groupby("latimes_make_and_model")["total_fatalities"].sum()
49 | ```
50 |
51 | ## Reset a DataFrame
52 |
53 | You may notice that even though the result of a `groupby` has two columns, pandas does not return a clean-looking table the same way other operations like `head` do. In most instances, you can convert ugly tables like the ones above into a pretty DataFrame by tacking the `reset_index` method onto the end of your code.
54 |
55 | ```{code-cell}
56 | :tags: [show-input]
57 | accident_list.groupby("latimes_make_and_model").size().reset_index()
58 | ```
59 |
60 | Why doesn't `groupby` return a DataFrame? Why does `reset_index` have such a weird name?
61 |
62 | Like so much in computer programming, the answer is simply, “because the people who created the library said so.” It’s important to learn that all open-source programming tools are made by humans, and humans have their quirks. Over time you’ll see pandas has more than a few.
63 |
64 | As a beginner, you should just accept the oddities and keep moving. As you get more advanced, if there’s something about the system you think could be improved, you should consider [contributing](https://pandas.pydata.org/pandas-docs/stable/development/contributing.html) to the Python code that operates the library.
65 |
66 | You can clean up the `0` column name assigned by pandas with the `rename` method.
67 |
68 | ```{code-cell}
69 | :tags: [show-input]
70 | accident_list.groupby("latimes_make_and_model").size().rename("accidents").reset_index()
71 | ```
72 |
73 | Now save that as a variable.
74 |
75 | ```{code-cell}
76 | :tags: [show-input]
77 | accident_counts = accident_list.groupby("latimes_make_and_model").size().rename("accidents").reset_index()
78 | ```
79 |
80 | That will return a DataFrame with the accident totals we need to calculate a rate. Inspect it with `head`.
81 |
82 | ```{code-cell}
83 | :tags: [show-input]
84 | accident_counts.head()
85 | ```
86 |
87 | Now we‘ve got a ranking we can work with.
88 |
--------------------------------------------------------------------------------
/docs/src/jupyter_desktop.md:
--------------------------------------------------------------------------------
1 | # JupyterLab
2 |
3 | A [Jupyter](http://jupyter.org/) notebook is a browser-based interface where you can write, run, remix and republish code.
4 |
5 | It is free software that anyone can install and run. It is used by [scientists](http://nbviewer.jupyter.org/github/robertodealmeida/notebooks/blob/master/earth_day_data_challenge/Analyzing%20whale%20tracks.ipynb), [scholars](http://nbviewer.jupyter.org/github/nealcaren/workshop_2014/blob/master/notebooks/5_Times_API.ipynb), [investors](https://github.com/rsvp/fecon235/blob/master/nb/fred-debt-pop.ipynb) and corporations to create and share their research.
6 |
7 | It is also used by journalists to develop stories and show their work. Examples published by past students and teachers of this class include:
8 |
9 | * [“As Opioid Crisis Ramped Up, Pills Flowed Into Vermont by the Millions”](https://github.com/asuozzo/arcos-opioid-analysis-vt) by
10 | Andrea Suozzo
11 | * [“A frenzy of well drilling is depleting aquifers in California farmland.”](https://github.com/datadesk/groundwater-analysis) by Gabrielle LaMarr LeMee
12 | * [“What it’s like to go to school when dozens have been killed nearby”](https://github.com/datadesk/highschool-homicide-analysis) by Iris Lee
13 | * [“City of Chicago Parking and Camera Ticket Data”](https://github.com/propublica/il-tickets-notebooks) by David Eads
14 | * [“Chicago's Sidewalk Snow Clearance: The North Side Complains, the South Side Gets Fined“](https://github.com/reliablerascal/snow-clearance) by Rob Reid
15 |
16 | You can find hundreds of other examples [on GitHub](https://github.com/search?q=language%3A%22Jupyter+Notebook%22&type=Repositories&ref=advsearch&l=Jupyter+Notebook&l=&s=updated&o=desc), including notebooks published by [Buzzfeed](https://github.com/BuzzFeedNews/2016-01-tennis-betting-analysis/blob/master/notebooks/tennis-analysis.ipynb), [ProPublica](https://github.com/propublica/compas-analysis/blob/master/Compas%20Analysis.ipynb), [The Economist](https://github.com/theeconomist/big-mac-data/blob/master/Big%20Mac%20data%20generator.ipynb), [POLITICO](https://github.com/The-Politico/politico-2018-district-similarity-maps/blob/master/demographic_similarity.ipynb), [The Markup](https://github.com/the-markup/investigation-isp) and [the Los Angeles Times](https://github.com/datadesk/notebooks).
17 |
18 | There are numerous ways to install and configure Jupyter notebooks. Since this tutorial is designed for beginners, it will demonstrate how to use [JupyterLab Desktop](https://github.com/jupyterlab/jupyterlab-desktop), a self-contained application that provides a ready-to-use Python environment with several popular libraries bundled in. It can be installed on any operating system with a simple point-and-click interface.
19 |
20 | ```{note}
21 | Advanced users like to have more control over when and where code is installed on their system. Readers interested in the techniques preferred by the pros should consult [our appendix](/appendix/index.md). It requires use of your computer’s command-line interface.
22 | ```
23 |
24 | ## Install JupyterLab Desktop
25 |
26 |
27 |
28 |
29 |
30 | The first step is to visit [JupyterLab Desktop’s homepage on GitHub](https://github.com/jupyterlab/jupyterlab-desktop) in your web browser.
31 |
32 | 
33 |
34 | Scroll down to the documentation below the code until you reach the [Installation](https://github.com/jupyterlab/jupyterlab-desktop) section.
35 |
36 | 
37 |
38 | Then pick the link appropriate for your operating system. The installation file is large, so the download might take a while.
39 |
40 | Find the file in your downloads directory and double click it to begin the installation process. Follow the instructions presented by the pop-up windows, sticking to the default options.
41 |
42 | ```{warning}
43 | Your computer's operating system might flag the JupyterLab Desktop installer as an unverified or insecure application. Don't worry. The tool has been vetted by Project Jupyter's core developers and it's safe to use.
44 |
45 | If your system is blocking you from installing the tool, you'll likely need to work around its barriers. For instance, on MacOS, this might require [visiting your system’s security settings](https://www.wikihow.com/Install-Software-from-Unsigned-Developers-on-a-Mac) to allow the installation.
46 | ```
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, religion, or sexual identity
10 | and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the
26 | overall community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or
31 | advances of any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email
35 | address, without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement at
63 | b@palewi.re.
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series
86 | of actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or
93 | permanent ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within
113 | the community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.0, available at
119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120 |
121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct
122 | enforcement ladder](https://github.com/mozilla/diversity).
123 |
124 | [homepage]: https://www.contributor-covenant.org
125 |
126 | For answers to common questions about this code of conduct, see the FAQ at
127 | https://www.contributor-covenant.org/faq. Translations are available at
128 | https://www.contributor-covenant.org/translations.
129 |
--------------------------------------------------------------------------------
/docs/src/dataframe.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Data
15 |
16 | In 2018, the Los Angeles Times published an investigation headlined, [“The Robinson R44, the world’s best-selling civilian helicopter, has a long history of deadly crashes.”](https://www.latimes.com/projects/la-me-robinson-helicopters/)
17 |
18 | 
19 |
20 | It reported that Robinson’s R44 led all major models with the highest fatal accident rate from 2006 to 2016. The analysis was [published on GitHub](https://github.com/datadesk/helicopter-accident-analysis) as a series of Jupyter notebooks.
21 |
22 | The findings were drawn from two key datasets:
23 |
24 | 1. The National Transportation Safety Board's [Aviation Accident Database](https://www.ntsb.gov/_layouts/ntsb.aviation/index.aspx)
25 | 2. The Federal Aviation Administration's [General Aviation and Part 135 Activity Survey](https://www.faa.gov/data_research/aviation_data_statistics/general_aviation/)
26 |
27 | After a significant amount of work gathering and cleaning the source data, the number of accidents for each helicopter model were normalized using the flight hour estimates in the survey. For the purposes of this demonstration, we will read in tidied versions of each file that are ready for analysis.
28 |
29 | The data are structured in rows of comma-separated values. This is known as a [CSV file](https://en.wikipedia.org/wiki/Comma-separated\_values). It is the most common way you will find data published online. The pandas library is able to read in files from a variety formats, including CSV.
30 |
31 | ```{code-cell}
32 | :tags: [hide-cell]
33 |
34 | import pandas as pd
35 | ```
36 |
37 | ## The `read_csv` method
38 |
39 |
40 |
41 |
42 |
43 | Scroll down to the first open cell. There we will import the first CSV file using the [`read_csv`](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html) function included with pandas.
44 |
45 | ```{code-cell}
46 | :tags: [show-input]
47 | pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
48 | ```
49 |
50 | ```{warning}
51 | You need the exact URL shared in the example to access the file. While you could laboriously type it out, feel free to copy and paste it into your notebook.
52 | ```
53 |
54 | After you run the cell, you should see a big table output to your notebook. It is a “DataFrame” where pandas has structured the CSV data into rows and columns, just like Excel or other spreadsheet software might. Take a moment to look at the columns and rows in the output, which contain the data we'll use in our analysis.
55 |
56 | ```{note}
57 | On the left-hand side, you'll see a bolded number incrementing upward from zero that's not present in our source data file. This is what pandas calls the [index](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Index.html). It is a separate column created automatically and used to identify each row. The index is not considered part of the data, but it is used to reference the rows of the DataFrame or Series in advanced operations that are beyond the scope of this class.
58 | ```
59 |
60 | A major advantage of Jupyter over spreadsheets is that rather than manipulating the data through a haphazard series of clicks and keypunches, we will be gradually grinding it down using a computer programming script that is transparent and reproducible.
61 |
62 | To do more with your DataFrame, we need to store it so it can be reused in subsequent cells. We can do this by saving it in a variable, just as we did in with our `number` in Chapter 2.
63 |
64 | Go back to your latest cell and change it to this. Rerun it.
65 |
66 | ```{code-cell}
67 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
68 | ```
69 |
70 | You shouldn't see anything. That's a good thing. It means our DataFrame has been saved under the name `accident_list`, which we can now begin interacting with in the following cells.
71 |
72 | We can do this by calling ["methods"](https://en.wikipedia.org/wiki/Method_(computer_programming)) that pandas makes available to all DataFrames. You may not have known it at the time, but `read_csv` is one of these methods. There are dozens more that can do all sorts of interesting things. Let’s start with some easy ones that analysts use all the time.
73 |
74 | ## The `head` method
75 |
76 | To preview the first few rows of the dataset, try the [`head`](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.head.html) method. Add a new cell, type this in and hit the play button again.
77 |
78 | ```{code-cell}
79 | :tags: [show-input]
80 | accident_list.head()
81 | ```
82 |
83 | It serves up the first five rows by default. If you want a different number, submit it as an input.
84 |
85 | ```{code-cell}
86 | :tags: [show-input]
87 | accident_list.head(1)
88 | ```
89 |
90 | ## The `info` method
91 |
92 | To get a look at all of the columns and what type of data they store, add another cell and try the [info](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.info.html) method. Look carefully at the results and you'll see we have 163 fatal accidents to review.
93 |
94 | ```{code-cell}
95 | :tags: [show-input]
96 | accident_list.info()
97 | ```
98 |
99 | Now that you've got some data imported, we’re ready to begin our analysis.
100 |
--------------------------------------------------------------------------------
/docs/src/columns.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Columns
15 |
16 |
17 |
18 |
19 |
20 | We’ll begin with the `latimes_make_and_model` column, which records the standardized name of each helicopter that crashed. To access its contents separate from the rest of the DataFrame, append a pair of square brackets with the column’s name in quotes inside.
21 |
22 | ```{code-cell}
23 | :tags: [hide-cell]
24 |
25 | import pandas as pd
26 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
27 | ```
28 |
29 | ```{code-cell}
30 | :tags: [show-input]
31 | accident_list["latimes_make_and_model"]
32 | ```
33 |
34 | That will list the column out as a `Series`, just like the ones we created from scratch earlier. Just as we did then, you can now start tacking on additional methods that will analyze the contents of the column.
35 |
36 | ````{note}
37 | You can also access columns a second way, like this: `accident_list.latimes_make_and_model`. This method is quicker to type, but it won't work if your column has a space in its name. So we're teaching the universal bracket method instead.
38 | ````
39 |
40 | ## Count a column's values
41 |
42 | In this case, the column is filled with characters. So we don’t want to calculate statistics like the median and average, as we did before.
43 |
44 | There’s another built-in pandas tool that will total up the frequency of values in a column. The method is called [`value_counts`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.value_counts.html) and it’s just as easy to use as `sum`, `min` or `max`. All you need to do it is add a period after the column name and chain it on the tail end of your cell.
45 |
46 | ```{code-cell}
47 | :tags: [show-input]
48 | accident_list["latimes_make_and_model"].value_counts()
49 | ```
50 |
51 | Congratulations, you've made your first finding. With that little line of code, you've calculated an important fact: During the period being studied, the Robinson R44 had more fatal accidents than any other helicopter.
52 |
53 | But wait. Before we congratulate ourselves, let's take a closer look at the data. Our value counts operation has turned up an imperfection that was buried in the data. Can you see it?
54 |
55 | ## Cleaning data columns
56 |
57 | On closer inspection, we can see that Bell 206 helicopter is listed two different ways, as `BELL 206` and `bell 206`. The variation in capitalization is causing pandas to treat them as two distinct values.
58 |
59 | This is a common problem and a simple example of how "dirty" data can trip up a computer program. The solution is to clean up the column prior to analysis.
60 |
61 | In this case, we can use the `str` method, which is short for string. In many computer programming languages, string is the technical term used to refer to text. Thus, the pandas `str` method is designed to manipulate a column of text. It can change the casing of text, find and replace different patterns and conduct many other useful operations.
62 |
63 | You can access it by chaining `.str` and your desired manipulation method after the column name. In this case, we want to use the `upper` method, which will convert all of the text in the column to uppercase.
64 |
65 | ```{code-cell}
66 | :tags: [show-input]
67 |
68 | accident_list["latimes_make_and_model"].str.upper()
69 | ```
70 |
71 | While it's not useful in this case, we can try out the companion `lower` method to see it do the opposite.
72 |
73 | ```{code-cell}
74 | :tags: [show-input]
75 |
76 | accident_list["latimes_make_and_model"].str.lower()
77 | ```
78 |
79 | ```{note}
80 | You can find a full list of `str` methods, along with useful examples, in the [pandas documentation](https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html#string-methods).
81 | ```
82 |
83 | To correct the bug, we need to assign the result of the `upper` method to our existing column and overwrite what's there. We can do that with the `=` operator.
84 |
85 | ```{code-cell}
86 | :tags: [show-input]
87 |
88 | accident_list["latimes_make_and_model"] = accident_list["latimes_make_and_model"].str.upper()
89 | ```
90 |
91 | Now we can run `value_counts` again to see if the problem has been fixed.
92 |
93 | ```{code-cell}
94 | :tags: [show-input]
95 |
96 | accident_list["latimes_make_and_model"].value_counts()
97 | ```
98 |
99 | Much better! We have a clean list of helicopter models and their frequencies.
100 |
101 | In the real world, you will almost always need to clean your data before you can analyze it, though the challenges will typically be more complex than this one. Pandas offers a wide range of tools to help you clean your data, but the basic process is always the same: Identify the problem, fix it, and then check your work. The `value_counts` method is one of the most useful tools in this process.
102 |
103 | Before we move on to the next chapter, here's a challenge. See if you can answer a few more questions a journalist might ask about our dataset. All of the questions below can be answered using only tricks we've covered thus far.
104 |
105 | 1. What was the total number of fatalities?
106 | 2. Which helicopter maker had the most fatal accidents?
107 | 3. Which year had the most fatal helicopter accidents?
108 | 4. How many fatal helicopter accidents occurred in Texas?
109 | 5. How many different helicopter makers are in the dataset?
110 |
111 | Once you’ve written code that generates the answers, you’re ready to move on to the next chapter.
--------------------------------------------------------------------------------
/docs/src/concat.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Concatenate
15 |
16 | ```{code-cell}
17 | :tags: [hide-cell]
18 |
19 | import pandas as pd
20 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
21 | accident_list["latimes_make_and_model"] = accident_list["latimes_make_and_model"].str.upper()
22 | accident_counts = accident_list.groupby("latimes_make_and_model").size().reset_index().rename(columns={0: "accidents"})
23 | survey = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/faa-survey.csv")
24 | survey["latimes_make_and_model"] = survey["latimes_make_and_model"].str.upper()
25 | merged_list = pd.merge(accident_counts, survey, on="latimes_make_and_model")
26 | ```
27 |
28 | Let's briefly pretend we've already completed our analysis, visualized and published our findings. A year later, there's more data. We want to follow up.
29 |
30 | Let's crack open the old notebook and see what we can do.
31 |
32 | ```{code-cell}
33 | :tags: [show-input]
34 |
35 | new_accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents-update.csv")
36 | ```
37 |
38 | Now that we've imported it, let's peek at the new data using our familiar `head()` method.
39 |
40 | ```{code-cell}
41 | :tags: [show-input]
42 |
43 | new_accident_list.head()
44 | ```
45 |
46 | Okay, so we have three new accidents that we want to add in. But, hang on. Can you spot the differences in the data?
47 |
48 | Our columns are in a slightly different order. This happens a lot from year to year in state datasets: a new data person starts, and they decide to reformat everything. But we've set everything up using the previous years' formatting style.
49 |
50 | Luckily, Pandas has a built-in method for dealing with problems like this: `concat`.
51 |
52 | This method *concatenates* multiple DataFrames into a single DataFrame by combining their rows and columns.
53 |
54 | ```{code-cell}
55 | :tags: [show-input]
56 |
57 | updated_accident_list = pd.concat([accident_list, new_accident_list])
58 | ```
59 |
60 | How do we check what this actually did? Let's take a quick look at our columns.
61 |
62 | `count()` gives us a brief overview of how many non-null values we have in each column. If we did this right and our data is complete, we should have the same number of values in every column.
63 |
64 | ```{code-cell}
65 | :tags: [show-input]
66 |
67 | updated_accident_list.count()
68 | ```
69 |
70 | Hang on. That doesn't look right. Three values in `ntsb-model`, `ntsb-number`, and `total-fatalities`? It looks like we have the same total in other columns. But those three values should be combined with `ntsb_model` and so on, instead of on their own.
71 |
72 | We need to change the column names from the 2024 data so they match previous years'.
73 |
74 | Luckily, there's a way to do that.
75 |
76 | Write out any column names you want to be changed in this format:
77 |
78 | ```{code-cell}
79 | :tags: [show-input]
80 |
81 | bad_columns = {"ntsb-model" : "ntsb_model",
82 | "ntsb-number" : "ntsb_number",
83 | "total-fatalities" : "total_fatalities"}
84 | ```
85 |
86 | This is called a `dictionary`. It's a [very useful data type](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) built into Python. It basically functions like a list, except each list item has a `key` that maps to a `value`. In our case, we'll be using the `key` to look for the current column name and the `value` to assign a new column name.
87 |
88 | That means the old names go to the left of the colon, and the new names go to the right.
89 |
90 | ```{note}
91 | Renaming columns in a dictionary can get really handy for larger datasets. You can even create a default, reusable dictionary that renames standard or common strings to your newsroom's house style, or that changes all instances of "number" to "#". This dataset is small, but when you start analyzing datasets with thousands of columns, this can save you a lot of pain.
92 | ```
93 |
94 | Next, let's grab the DataFrame we originally imported the 2024 data into (`new_accident_list`) and apply our column-name cleaner to it *before* we concatenate it with the other data.
95 |
96 | (If you rename the columns after concatenating, you'll just end up with two columns with the same name and different variables.)
97 |
98 | ```{code-cell}
99 | :tags: [show-input]
100 |
101 | new_accident_list = new_accident_list.rename(columns=bad_columns)
102 | ```
103 |
104 | Okay, let's see how that worked.
105 |
106 | ```{code-cell}
107 | :tags: [show-input]
108 |
109 | new_accident_list.count()
110 | ```
111 | *This* looks more like what we want to put together.
112 |
113 | Let's try the `concat` step again.
114 |
115 | ```{code-cell}
116 | :tags: [show-input]
117 |
118 | updated_accident_list = pd.concat([accident_list, new_accident_list])
119 | ```
120 |
121 | And check our work with `count`.
122 |
123 | ```{code-cell}
124 | :tags: [show-input]
125 |
126 | updated_accident_list.count()
127 | ```
128 |
129 | We now have 166 complete values and no split columns. This also reorders your columns for you automatically, because `concat` matches on the column name. It defaults to the column order in the DataFrame on the left; if you wanted to keep the `new_accident_list` order, you'd have to swap the order in the `concat` command.
130 |
131 | And now we can re-run our whole analysis with a fresh year of data added in — without changing anything except the name of the DataFrame it's operating on.
132 |
133 | We could also overwrite our original DataFrame with the new data so we don't even have to change the DataFrame name to re-run the analysis. But that can be risky if you don't keep track of your order of operations and leave good notes for yourself.
134 |
--------------------------------------------------------------------------------
/docs/src/merge.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Merge
15 |
16 |
17 |
18 |
19 |
20 | Next we'll cover how to merge two DataFrames together into a combined table.
21 |
22 | We'll pull `faa-survey.csv`, which contains annual estimates of how many hours each type of helicopter was in the air. If we merge it with our accident totals, we will be able to calculate an accident rate.
23 |
24 | We can read it in the same way as the NTSB accident list, with `read_csv`.
25 |
26 | ```{code-cell}
27 | :tags: [hide-cell]
28 |
29 | import pandas as pd
30 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
31 | accident_list["latimes_make_and_model"] = accident_list["latimes_make_and_model"].str.upper()
32 | accident_counts = accident_list.groupby("latimes_make_and_model").size().reset_index().rename(columns={0: "accidents"})
33 | ```
34 |
35 | ```{code-cell}
36 | :tags: [show-input]
37 | survey = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/faa-survey.csv")
38 | ```
39 |
40 | When joining two tables together, the first step is to look carefully at the columns in each table to find one they have in common and can serve as the basis for the join. We can do that with the `info` command we learned earlier.
41 |
42 | ```{code-cell}
43 | :tags: [show-input]
44 | accident_counts.info()
45 | ```
46 |
47 | ```{code-cell}
48 | :tags: [show-input]
49 | survey.info()
50 | ```
51 |
52 | You can see that each table contains the `latimes_make_and_model` column. We can therefore join the two files using that column with the pandas [`merge`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html) method.
53 |
54 | ```{note}
55 | If you are familar with traditional databases, you may recognize that the merge method in pandas is similar to [SQL’s JOIN statement](https://en.wikipedia.org/wiki/Join_(SQL)). If you dig into [merge’s documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html) you will see it has many of the same options.
56 | ```
57 |
58 | Merging two DataFrames is as simple as passing both to pandas' built-in `merge` method and specifying which field you’d like to use to connect them. We will save the result into another new variable, which I'm going to call `merged_list`.
59 |
60 | ```{code-cell}
61 | :tags: [show-input]
62 | merged_list = pd.merge(accident_counts, survey, on="latimes_make_and_model")
63 | ```
64 |
65 | ```{note}
66 | You may notice something new with the `on="latimes_make_and_model"` bit above. It is what Python calls a [keyword argument](https://docs.python.org/3/glossary.html#term-argument). Keyword arguments are inputs passed to a function or method after explicitly specifying the name of the argument, followed by an equal sign.
67 |
68 | Keyword arguments can be passed in any order, as long as the name of the argument is specified. When creating a function, they can be used to specify a default value for a parameter. For this reason, they are commonly used to provide overrides of a method's out-of-the-box behavior.
69 |
70 | The pandas documentation for [`merge`]([https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html)) reveals all of the keyword options available, as well as their defaults.
71 | ```
72 |
73 | That new DataFrame can be inspected like any other.
74 |
75 | ```{code-cell}
76 | :tags: [show-input]
77 | merged_list.head()
78 | ```
79 |
80 | Gasp! There's nothing there! What happened? Let's go back and inspect the datasets we're trying to merge. The `head` command remains our trusty friend for this type of task.
81 |
82 | First, there was the accident counts.
83 |
84 | ```{code-cell}
85 | :tags: [show-input]
86 | accident_counts.head()
87 | ```
88 |
89 | Then, there was the FAA survey dataset.
90 |
91 | ```{code-cell}
92 | :tags: [show-input]
93 | survey.head()
94 | ```
95 |
96 | It looks like even though the `latimes_make_and_model` column represents the same data in each dataset, the casing is messy in the FAA survey data. Raw data is usually messy (even if this particular example is contrived). It's always important to inspect your data thoroughly and know how to clean it up before analyzing.
97 |
98 | Since the uppercase accident counts data is more consistent, let's modify the FAA data to match. There are a handful of ways to do this, but the most straightforward is simply replacing everything in the `latimes_make_and_model` column with an uppercase copy of itself, as we did with the accident data in an earlier chapter. Once again, the `str` method can do the job.
99 |
100 | ```{code-cell}
101 | :tags: [show-input]
102 | survey["latimes_make_and_model"] = survey["latimes_make_and_model"].str.upper()
103 | ```
104 |
105 | Now let's try merging our data again.
106 |
107 | ```{code-cell}
108 | :tags: [show-input]
109 | merged_list = pd.merge(accident_counts, survey, on="latimes_make_and_model")
110 | ```
111 |
112 | And then take a peek.
113 |
114 | ```{code-cell}
115 | :tags: [show-input]
116 | merged_list.head()
117 | ```
118 |
119 | Much better! By looking at the columns, you can check how many rows survived the merge, a precaution you should take every time you join two tables.
120 |
121 | ```{code-cell}
122 | :tags: [show-input]
123 | merged_list.info()
124 | ```
125 |
126 | You can also verify that the DataFrame has the same number of records as there are values in `accident_totals` column. That's good; if there are no null values, that means that every record in each DataFrame found a match in the other.
127 |
128 | Another simple approach is to simply ask pandas to print the number of rows in the DataFrame. That can be done with the `len` function.
129 |
130 | ```{code-cell}
131 | :tags: [show-input]
132 | len(merged_list)
133 | ```
134 |
135 | That number should match the number of rows in the accident totals DataFrame.
136 |
137 | ```{code-cell}
138 | :tags: [show-input]
139 | len(accident_counts)
140 | ```
141 |
142 | Now that we are confident we have a properly merged DataFrame, we're ready to move on to the next step: calculating the accident rate.
--------------------------------------------------------------------------------
/docs/src/pandas.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_versio n: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Pandas
15 |
16 |
17 |
18 |
19 |
20 | Python is filled with functions to do pretty much anything you’d ever want to do with a programming language: [navigate the web](http://docs.python-requests.org/), [parse data](https://docs.python.org/2/library/csv.html), [interact with a database](http://www.sqlalchemy.org/), [run fancy statistics](https://www.scipy.org/), [build a pretty website](https://www.djangoproject.com/) and [so](https://www.crummy.com/software/BeautifulSoup/) [much](http://www.nltk.org/) [more](https://pillow.readthedocs.io/en/stable/).
21 |
22 | Creative people have put these tools to work to get [a wide range of things done](https://www.python.org/about/success/) in the academy, the laboratory and even in outer space. Some are included in a toolbox that comes with the language, known as the standard library. Others have been built by members of Python’s developer community and need to be downloaded and installed from the web.
23 |
24 | 
25 |
26 | One third-party tool that's important for this class is called [pandas](http://pandas.pydata.org/). It was invented for use at a [financial investment firm](https://www.aqr.com/) and has become the leading open-source library for accessing and analyzing data in many different fields.
27 |
28 | ## Import pandas
29 |
30 | Create a new cell at the top of your notebook where we will import pandas for our use. Type in the following and hit the play button.
31 |
32 | ```{code-cell}
33 | :tags: [hide-cell]
34 |
35 | my_list = [1, 3, 5, 7, 9, 999]
36 | ```
37 |
38 | ```{code-cell}
39 | import pandas
40 | ```
41 |
42 | If nothing happens, that's good. It means you have pandas installed and ready to use.
43 |
44 | ```{note}
45 | Since pandas is created by a third party independent from the core Python developers, it wouldn't be installed by default if you followed our [advanced installation](/appendix/index.md) instructions.
46 |
47 | It's available to you because the JupyterLab Desktop developers have pre-selected a curated list of common utilities to include with the package, another reason to love their easy installer.
48 |
49 | If your notebook doesn't have pandas, you can install it by running `%pip install pandas` in a cell. This will download and install the library using the [pip](https://pip.pypa.io/en/stable/) package manager and Jupyter's built-in [magic command](https://ipython.readthedocs.io/en/stable/interactive/magics.html).
50 | ```
51 |
52 | Return to the cell with the import and rewrite it like this.
53 |
54 | ```{code-cell}
55 | import pandas as pd
56 | ```
57 |
58 | This will import the pandas library at the shorter variable name of `pd`. This is standard practice in the pandas community. You will frequently see examples of pandas code online using `pd` as shorthand. It's not required, but it's good to get in the habit so that your code is more likely to be quickly understood by other computer programmers.
59 |
60 | ```{note}
61 | In Python, a variable is a way to store a value in memory for later use. A variable is a named location in the computer's memory where a value can be stored and retrieved. Variables are used to store data values, such as numbers, strings, lists, or objects, and they can be used throughout the program to refer to the stored value.
62 |
63 | To create your own variable in Python, you use the assignment operator (`=`) to assign a value to a variable. The variable name is on the left side of the assignment operator and the value is on the right side.
64 | ```
65 |
66 | ## Conduct a simple data analysis
67 |
68 | Those two little letters contain dozens of data analysis tools that we'll use in future lessons. They can read in millions of records, compute advanced statistics, filter, sort, rank and do just about anything else you'd want to do with data.
69 |
70 | As we saw with the list in the last chapter, Python can do quite a bit on its own. The advantage of pandas is that it saves time by offering even more options.
71 |
72 | We can start to get a look at its powers by converting that plain Python list into what pandas calls a [Series](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html). Here's how to make it happen in your next cell. Let’s stick with simple variables and name it `my_series`.
73 |
74 | ```{code-cell}
75 | my_series = pd.Series(my_list)
76 | ```
77 |
78 | Once the data becomes a Series, you can immediately run a wide range of [descriptive statistics](https://en.wikipedia.org/wiki/Descriptive_statistics). Let's try a few.
79 |
80 | How about summing all the numbers? Make a new cell and run this. It should spit out the total, just like the `sum()` function in the last chapter.
81 |
82 | ```{code-cell}
83 | :tags: [show-input]
84 | my_series.sum()
85 | ```
86 |
87 | Then find the maximum value in the next.
88 |
89 | ```{code-cell}
90 | :tags: [show-input]
91 | my_series.max()
92 | ```
93 |
94 | The minimum value in the next.
95 |
96 | ```{code-cell}
97 | :tags: [show-input]
98 | my_series.min()
99 | ```
100 |
101 | How about the average?
102 |
103 | ```{code-cell}
104 | :tags: [show-input]
105 | my_series.mean()
106 | ```
107 |
108 | And how about the median, which we didn't have a way to do with just Python?
109 |
110 | ```{code-cell}
111 | :tags: [show-input]
112 | my_series.median()
113 | ```
114 |
115 | Let's go further. How about the standard deviation?
116 |
117 | ```{code-cell}
118 | :tags: [show-input]
119 | my_series.std()
120 | ```
121 |
122 | Finally, all of the above, plus a little more about the distribution, in one simple command.
123 |
124 | ```{code-cell}
125 | :tags: [show-input]
126 | my_series.describe()
127 | ```
128 |
129 | If you substituted in a series of 10 million records, your notebook would calculate all those same statistics without you needing to write any more code. Once your data, however large or complex, is imported into pandas, there's little limit to what you can do to filter, merge, group, aggregate, compute or chart using simple methods like the ones above. In the chapter to come we’ll start doing just using that with data from a real Los Angeles Times investigation.
130 |
--------------------------------------------------------------------------------
/docs/src/notebook.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Notebooks
15 |
16 |
17 |
18 |
19 |
20 | Once JupyterLab Desktop is installed, you can accept the installation wizard's offer to immediately open the program, or you can search for "Jupyter Lab" in your operating system’s application finder.
21 |
22 | That will open up a new window that looks something like this:
23 |
24 | 
25 |
26 | ```{warning}
27 | If you see a warning bar at the bottom of the screen that says you need to install Python, click the link provided to make that happen.
28 | ```
29 |
30 | Click the “New notebook…” button to open the Python interface.
31 |
32 | 
33 |
34 | Welcome to your first Jupyter notebook. Now you're ready to move on to writing code.
35 |
36 | You should see a new panel with an empty box at the top. That means you are all set up and ready to write Python. If you‘ve never done it before, you can remain calm. We can start out slow with some simple math.
37 |
38 | Type the following into the box, then hit the play button in the toolbar above the notebook or hit `SHIFT+ENTER` on your keyboard. The number four should appear.
39 |
40 | ```{code-cell}
41 | :tags: [show-input]
42 | 2+2
43 | ```
44 |
45 | There. Not so bad, right? You have just written your first line of code. When you execute a cell, the text inside it will be processed and the output will be displayed below the cell. If the cell contains code, it will be run by the Jupyter notebook's underlying programming language. In the jargon of Python, you have entered two [integers](https://docs.python.org/3/library/functions.html#int) and combined them using [the addition operator](https://docs.python.org/3/library/operator.html#mapping-operators-to-functions).
46 |
47 |
48 |
49 |
50 |
51 | Now try writing in your own math problem in the next cell. Maybe `2+3` or `2+200`. Whatever strikes your fancy. After you've typed it in, hit the play button or `SHIFT+ENTER`. This to-and-fro of writing Python code in a cell and then running it with the play button is the rhythm of working in a notebook.
52 |
53 | If you get an error after you run a cell, look carefully at your code and check whether it exactly matches what’s been written in the example. Here's an example of a error that I've added intentionally:
54 |
55 | ```{code-cell}
56 | :tags: [show-input,raises-exception]
57 | 2+2+
58 | ```
59 |
60 | Don’t worry. Code crashes are a normal part of life for computer programmers. They’re usually caused by small typos that can be quickly corrected.
61 |
62 | ```{code-cell}
63 | :tags: [show-input]
64 | 2+2+2
65 | ```
66 |
67 | The best thing you can do is remain calm and carefully read the error message. It usually contains clues that can help you fix the problem.
68 |
69 | Over time you will gradually stack cells to organize an analysis that runs down your notebook from the top. A simple example is storing your number in a variable in one cell:
70 |
71 | ```{code-cell}
72 | number = 2
73 | ```
74 |
75 | Then adding it to another value in the next cell:
76 |
77 | ```{code-cell}
78 | :tags: [show-input]
79 | number + 3
80 | ```
81 |
82 | Run those two cells in succession and the notebook should output the number 5.
83 |
84 | Change the `number` value to 3 and run both cells again. Instead of 5, it should now output 6.
85 |
86 | So, first this:
87 |
88 | ```{code-cell}
89 | number = 3
90 | ```
91 |
92 | Then this:
93 |
94 | ```{code-cell}
95 | :tags: [show-input]
96 | number + 3
97 | ```
98 |
99 | Now try defining your own numeric variable and doing some math with it. You can name it whatever you want. Want to try some other math operations? The `-` sign does subtraction. Multipication is `*`. Division is `/`.
100 |
101 | Sometimes it is helpful to describe what the code is doing in case you want to share it with a colleague or return to it after some time. You can add comments in the cell by putting a hash `#` in front of the text. So, for example, we could use a comment to add extra information about the number variable.
102 |
103 | ```{code-cell}
104 | # This is a random number
105 | number = 3
106 | ```
107 |
108 | To add a cell in a Jupyter notebook, you can use the "+" plus button in the toolbar just above the cells. Alternatively, you can use the keyboard shortcut "a" to insert a cell above the current cell or "b" to insert a cell below the current cell.
109 |
110 | To remove a cell, you can select the cell and press the "d" key twice in a row. Alternatively, you can use the "Edit" menu at the top of the page and select "Delete Cells" or you can use the "scissors" button in the toolbar above the notebook to delete the selected cell. Note that when you delete a cell, everything in that cell will be lost and it cannot be undone.
111 |
112 | ```{note}
113 | Cells can contain variables, functions or imports. If you’ve never written code before and are unfamiliar with those terms, we recommend [“An Informal Introduction to Python”](https://docs.python.org/3/tutorial/introduction.html) and subsequent sections of python.org's official tutorial.
114 | ```
115 |
116 | Now let's make a list of numbers in a new notebook cell. A list is another tool Python offers for working with figures. Creating one is as simple as stringing together a set of values surrounded by square brackets and separated by commas.
117 |
118 | Let's start simple. Enter all of the even numbers between zero and ten. Name its variable something plain like `my_list`. Press play.
119 |
120 | ```{code-cell}
121 | my_list = [2, 4, 6, 8]
122 | ```
123 |
124 | You can do cool stuff with any list, even calculate statistics. One built-in Python function that's always available is `sum`, which adds up all the items in the list.
125 |
126 | ```{code-cell}
127 | sum(my_list)
128 | ```
129 |
130 | Another is `len`, an abbreviation for length, which returns how many values are contained in the list.
131 |
132 | ```{code-cell}
133 | len(my_list)
134 | ```
135 |
136 | Using the simple math operators we explored earlier, you can calculate the basic formula for an average by dividing the result of those two options in another cell.
137 |
138 | ```{code-cell}
139 | sum(my_list) / len(my_list)
140 | ```
141 |
142 | Now go back to your list and replace the even numbers with all of the odds between zero and ten. When you rerun all the subsequent cells your statistics should update to reflect the new values.
143 |
144 | ```{code-cell}
145 | my_list = [1, 3, 5, 7, 9]
146 | ```
147 |
148 | Add a very large number like 999 to the end of the list and you should see your average value shoot way up, a common issue in statistics called an outlier or a skew.
149 |
150 | ```{code-cell}
151 | my_list = [1, 3, 5, 7, 9, 999]
152 | ```
153 |
154 | The most common way to address that problem in journalism is to substitute in a different statistic for the average, typically a median. While a skilled Python programmer could conjure up some code to run that calculation here, there's no simple built-in tool like `sum` or `len`.
155 |
156 | Everything we have done so far has been in code cells, the default cell type. We can also make text cells, which are useful for giving our notebooks some structure and organization. You can do this by manipulating the pulldown menu in the toolbar directly above the notebook. By default the input is set to "Code." Click the dropdown arrow and change it to ["Markdown,"](https://en.wikipedia.org/wiki/Markdown) a markup language for formatting text similar to HTML.
157 |
158 | These cells allow you to create headers, write descriptions, add links and more to add context to your code. ["The Ultimate Markdown Guide"](https://medium.com/analytics-vidhya/the-ultimate-markdown-guide-for-jupyter-notebook-d5e5abf728fd) is a reference on all of the styling that you can draw from. For now, let's try adding a heading and a bulleted list.
159 |
160 | ```none
161 | ## Hashes make headings
162 | - Dashes make
163 | - Bulleted lists
164 | ```
165 |
166 | ## Hashes make headings
167 |
168 | - Dashes make
169 | - Bulleted lists
170 |
171 | Once you've got the hang of making the notebook run, you’re ready to introduce pandas, the powerful Python analysis library that can do a whole lot more than add a few numbers together.
172 |
--------------------------------------------------------------------------------
/docs/src/appendix/index.md:
--------------------------------------------------------------------------------
1 | ```{include} ../_templates/nav.html
2 | ```
3 |
4 | # Advanced installation
5 |
6 | While there are numerous ways to install and configure Jupyter notebooks, advanced users like to take advantage of Python’s power tools to have more control over when and where code is installed on their system.
7 |
8 | This guide will demonstrate how to install everything your computer needs to play like the pros.
9 |
10 | ```{contents} Sections
11 | :depth: 1
12 | :local:
13 | ```
14 |
15 | ## A command-line interface
16 |
17 | Whether you know about it or not, there should be a way to open a window and directly issue commands to your operating system. Different operating systems give this tool slightly different names, but they all have some form of it.
18 |
19 | On Windows this is called the “command prompt.” On MacOS it is called the “terminal.” Other people will call this the “command line.”
20 |
21 | On Windows, we recommend you install the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) and select the Ubuntu distribution from the Windows Store. This will give you access to a generic open-source terminal without all the complications and quirks introduced by Windows. On MacOS, the standard terminal app will work fine.
22 |
23 | ## Python 3.6 or higher
24 |
25 | [Python](https://www.python.org/) is a free and open-source computer programming language. It's one of the most popular in the world and praised by its supporters as clear and easy to read.
26 |
27 | That makes it ideal for beginners and is partly why it's been adopted by professionals in many fields, ranging from engineering and web development to journalism and music.
28 |
29 | You can check if Python is already installed on your computer by visiting your command line and entering the following:
30 |
31 | ```bash
32 | python --version
33 | ```
34 |
35 | You should see something like this after you hit enter:
36 |
37 | ```bash
38 | Python 3.6.10
39 | ```
40 |
41 | If not, you'll need to install Python on your system.
42 |
43 | If you see a number starting with 2, like say ...
44 |
45 | ```bash
46 | Python 2.7.12
47 | ```
48 |
49 | ...then you have an outdated version of Python and will need to upgrade to a version starting with a 3. You can probably complete the class without doing so, but the maintainers of Python are gradually phasing out version 2 and officially recommend you upgrade.
50 |
51 | Instructions for both new installations and upgrades can be found [here](https://docs.python-guide.org/starting/installation/).
52 |
53 | ## The `pipenv` environment manager
54 |
55 | Our notebook depends on a set of Python tools that we'll need to install before we can run the code. They are the [JupyterLab](https://jupyter.org/) computational notebook, the [requests](https://docs.python-requests.org/en/latest/) library for downloading webpages and [BeautifulSoup](https://beautiful-soup-4.readthedocs.io/en/latest/), a handy utility for parsing data out of HTML.
56 |
57 | By default, Python's third-party packages are all installed in a shared "global" folder somewhere in the depths of your computer. By default, every Python project on your computer draws from this same set of installed programs.
58 |
59 | This approach is fine for your first experiments with Python, but it quickly falls apart when you start to get serious about coding.
60 |
61 | For instance, say you develop a web application today with [Flask](https://palletsprojects.com/p/flask/) version 1.1. What if, a year from now, you want to start a new project and use a newer version of Flask? Your old app is still live and requires occasional patches, but you don't have time to re-write all of your old code to make it compatible with the latest version of Flask.
62 |
63 | Open-source projects are changing every day and such conflicts are common, especially when you factor in the sub-dependencies of your project’s direct dependencies, as well as the sub-dependencies of those sub-dependencies.
64 |
65 | Programmers solve this problem by creating a [virtual environment](https://docs.python.org/3/tutorial/venv.html) for each project that isolates them into discrete, independent containers that do not rely on code in the global environment.
66 |
67 | Strictly speaking, working within a virtual environment is not required. At first, it might even feel like a hassle. But in the long run, you will be glad you did it. And you don’t have to take my word for it, you can read discussions on [StackOverflow](https://conda.io/docs/index.html) and [Reddit](https://www.reddit.com/r/Python/comments/2qq1d9/should_i_always_use_virtualenv/).
68 |
69 | Good thing [pipenv](https://pipenv.kennethreitz.org/en/latest/) can do this for us.
70 |
71 | Pipenv and its prerequisites are installed via your computer's command-line interface. You can verify it’s there by typing the following into your terminal:
72 |
73 | ```bash
74 | pipenv --version
75 | ```
76 |
77 | If you have it installed, you should see the terminal respond with the version on your machine.
78 |
79 | ```bash
80 | pipenv, version 2018.11.26
81 | ```
82 |
83 | If you get an error, you will need to install it.
84 |
85 | If you are on a Mac, Pipenv’s maintainers [recommend](https://pipenv.kennethreitz.org/en/latest/install/#homebrew-installation-of-pipenv) installing via [Homebrew](https://brew.sh/):
86 |
87 | ```bash
88 | brew install pipenv
89 | ```
90 |
91 | If you are on Windows and using the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10), you can install [Linuxbrew](https://docs.brew.sh/Homebrew-on-Linux) and use it to install Pipenv.
92 |
93 | If neither option makes sense for you, Pipenv's [docs](https://pipenv.kennethreitz.org/en/latest/install/#pragmatic-installation-of-pipenv) recommend a [user install](https://pip.pypa.io/en/stable/user_guide/#user-installs) via pip:
94 |
95 | ```bash
96 | pip install --user pipenv
97 | ```
98 |
99 | Whatever installation route you choose, you can confirm your success by testing for its version again:
100 |
101 | ```bash
102 | pipenv --version
103 | ```
104 |
105 | If you see that version number now, you know you're okay.
106 |
107 | ### Create a code directory
108 |
109 | Now let’s create a common folder where all of your projects will be stored starting with this one. This is also where our virtualenv will be configured.
110 |
111 | Depending on your operating system and personal preferences, open up a terminal program. It will start you off in your computer’s home directory, just like your file explorer. Enter the [`ls`](https://en.wikipedia.org/wiki/Ls) command and press enter to see all of the folders there now.
112 |
113 | ```bash
114 | ls
115 | ```
116 |
117 | Now let’s check where we are in our computer's file system. For this we'll use a command called [pwd](https://en.wikipedia.org/wiki/Pwd), which stands for present working directory. The output is the full path of your location in the file system, something like `/Users/palewire/`.
118 |
119 | ```bash
120 | pwd
121 | ```
122 |
123 |
124 | Use the [mkdir](https://en.wikipedia.org/wiki/Mkdir) command to create a new directory for your code. In the same style as the Desktop, Documents and Downloads folders included by most operating system, we will name this folder Code.
125 |
126 | ```bash
127 | mkdir Code
128 | ```
129 |
130 | To verify that worked, you can open in your file explorer and navigate to your home folder. Now jump into the Code directory, which is the same as double clicking on a folder to enter it in your filesystem navigator.
131 |
132 | ```bash
133 | cd Code
134 | ```
135 |
136 | ### Create a project directory
137 |
138 | Now let's make a folder for your work in this class.
139 |
140 | ```bash
141 | mkdir first-python-notebook
142 | ```
143 |
144 | Then, jump into that project directory:
145 |
146 | ```bash
147 | cd first-python-notebook
148 | ```
149 |
150 | This is where you'll store a local copy of all the code and files you create for this project.
151 |
152 | It isn't necessary to change directories one level at a time. You can also specify the full path of directory you want to change into. For instance, from your home directory you could run the following to move directly into your project directory.
153 |
154 | ```bash
155 | cd Code/first-python-notebook
156 | ```
157 |
158 | ### Install your first package
159 |
160 | Now let's install a simple Python package to see `pipenv` in action. We’ll choose [yolk3k](https://pypi.org/project/yolk3k/), a simple command-line tool that can list all your installed python packages.
161 |
162 | We can add it to our project’s private virtual environment by typing its name after Pipenv's install command.
163 |
164 | ```bash
165 | pipenv install yolk3k
166 | ```
167 |
168 | When you invoke Pipenv's `install` command, it checks for an existing virtual environment connected to your project’s directory. Finding none, it creates one, then installs your packages into it.
169 |
170 | As a result, two files are added to your project directory: `Pipfile` and `Pipfile.lock`. Open these files in a text editor and you'll see how they describe your project’s Python requirements.
171 |
172 | In the `Pipfile`, you'll see the name and exact version of any package we directed Pipenv to install. We didn't specify an exact version, so you'll see:
173 |
174 | ```bash
175 | [packages]
176 | yolk3k = "*"
177 | ```
178 |
179 | `Pipfile.lock` has a more complicated, nested structure that specifies the exact version of your project's direct dependencies along with all their sub-dependencies.
180 |
181 | Now that yolk is installed, we can execute it inside our environment using the `pipenv run` command. Let's use it to see yolk3k’s method for listing all of our currently installed tools.
182 |
183 | ```bash
184 | pipenv run yolk -l
185 | ```
186 |
187 | You should see the computer spit out everything you have installed. You’ll notice that yolk3k is on the list.
188 |
189 | ## Python packages
190 |
191 | Next we will install the extra Python packages used during the tutorial.
192 |
193 | We will return to pipenv and use it to install JupyterLab, the web-based interactive development environment for Jupyter notebooks, code and data.
194 |
195 | ```bash
196 | pipenv install jupyterlab
197 | ```
198 |
199 | We'll install pandas the same way:
200 |
201 | ```python
202 | pipenv install pandas
203 | ```
204 |
205 | Install altair too.
206 |
207 | ```python
208 | pipenv install altair
209 | ```
210 |
211 | ````{note}
212 | You can install more than one package at once. For instance, all three of the packages above could be added like so:
213 |
214 | ```bash
215 | pipenv install jupyterlab pandas altair
216 | ```
217 | ````
218 |
219 | ## Your first notebook
220 |
221 | Now we can use pipenv's run command to start JupyterLab from your terminal.
222 |
223 | ```bash
224 | pipenv run jupyter lab
225 | ```
226 |
227 | That will open up a new tab in your default web browser that looks something like this:
228 |
229 | ```{image} /_static/jupyterlabdesktop.png
230 | ```
231 |
232 | Click the "Python 3" button in the middle panel and create a new Python 3 notebook. You should now be able to pick up in [chapter two](../notebook.md) and start work from there.
233 |
--------------------------------------------------------------------------------
/docs/src/charts.md:
--------------------------------------------------------------------------------
1 | ---
2 | jupytext:
3 | text_representation:
4 | extension: .md
5 | format_name: myst
6 | format_version: '0.8'
7 | jupytext_version: '1.4.1'
8 | kernelspec:
9 | display_name: Python 3
10 | language: python
11 | name: python3
12 | ---
13 |
14 | # Charts
15 |
16 | Python has a number of charting tools that can work hand-in-hand with pandas. While [Altair](https://altair-viz.github.io/) is a relatively new package compared to classics like [matplotlib](https://matplotlib.org/), it has great documentation and is easy to configure. Let’s take it for a spin.
17 |
18 | ## Make a basic bar chart
19 |
20 | The first thing we need to do is import Altair. In the tradition of pandas, we'll import it with the alias `alt` to reduce how much we need to type later on.
21 |
22 | ```{code-cell}
23 | :tags: [hide-cell]
24 |
25 | import warnings
26 | warnings.simplefilter("ignore")
27 | import pandas as pd
28 | accident_list = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/ntsb-accidents.csv")
29 | accident_list["latimes_make_and_model"] = accident_list["latimes_make_and_model"].str.upper()
30 | accident_counts = accident_list.groupby(["latimes_make", "latimes_make_and_model"]).size().rename("accidents").reset_index()
31 | survey = pd.read_csv("https://raw.githubusercontent.com/palewire/first-python-notebook/main/docs/src/_static/faa-survey.csv")
32 | survey["latimes_make_and_model"] = survey["latimes_make_and_model"].str.upper()
33 | merged_list = pd.merge(accident_counts, survey, on="latimes_make_and_model")
34 | merged_list["per_hour"] = merged_list.accidents / merged_list.total_hours
35 | merged_list["per_100k_hours"] = (merged_list.accidents / merged_list.total_hours) * 100_000
36 | ```
37 |
38 | ```{code-cell}
39 | import altair as alt
40 | ```
41 |
42 | ```{note}
43 | If the import triggers an error that says your notebook doesn't have Altair, you can install it by running `%pip install altair` in a cell. This will download and install the library using the [pip](https://pip.pypa.io/en/stable/) package manager and Jupyter's built-in [magic command](https://ipython.readthedocs.io/en/stable/interactive/magics.html).
44 | ```
45 |
46 | In a typical analysis, you'd import all of your libraries in one cell at the top of the file. That way, if you need to install or make changes to the packages a notebook uses, you know where to find them and you won't hit errors importing a package midway through running a file.
47 |
48 | With Altair imported, we can now feed it our DataFrame to make a simple bar chart. Let's take a look at the basic building block of an Altair chart: the `Chart` object. We'll tell it that we want to create a chart from `merged_list` by passing the DataFrame in, like so:
49 |
50 | ```{code-cell}
51 | alt.Chart(merged_list)
52 | ```
53 |
54 | OK! We got an error, but don't panic. The error says that Altair needs a "mark" — that is to say, it needs to know not only what data we want to visualize, but also _how_ to represent that data visually. There are lots of different marks that Altair can use (you can [check them all out here](https://altair-viz.github.io/user_guide/marks.html)). But let's try out the most versatile mark in our visualization toolbox: the bar.
55 |
56 | ```{code-cell}
57 | alt.Chart(merged_list).mark_bar()
58 | ```
59 |
60 | That's an improvement, but we've got a new error: Altair doesn't know which columns of our DataFrame to look at! At a minimum, we also need to define the column to use for the x- and y-axes. We can do that by chaining in the `encode` method.
61 |
62 | ```{code-cell}
63 | alt.Chart(merged_list).mark_bar().encode(
64 | x="latimes_make_and_model",
65 | y="per_100k_hours"
66 | )
67 | ```
68 |
69 | That’s more like it!
70 |
71 | Here's an idea — maybe we do horizontal bars instead of vertical. How would you rewrite this chart code to reverse those bars?
72 |
73 | ```{code-cell}
74 | alt.Chart(merged_list).mark_bar().encode(
75 | x="per_100k_hours",
76 | y="latimes_make_and_model"
77 | )
78 | ```
79 |
80 | This chart is an okay start, but it's sorted alphabetically by y-axis value, which is pretty sloppy and hard to visually parse. Let's fix that.
81 |
82 | We want to sort the y-axis values by their corresponding x values. We know how to do that in Pandas, but Altair has its own opinions about how to sort a DataFrame, so it will override any sort order on the DataFrame we pass in.
83 |
84 | Until now, we've been using the shorthand syntax to create our axes, but to add more customization to our chart we'll have to switch to the longform way of defining the y-axis.
85 |
86 | To do that, we'll use a syntax like this: `alt.Y(column_name)`. Instead of passing a string to `y` and letting Altair do the rest, this lets us create a y-axis object and then give it additional instructions.
87 |
88 | ```{code-cell}
89 | alt.Chart(merged_list).mark_bar().encode(
90 | x="per_100k_hours",
91 | y=alt.Y("latimes_make_and_model")
92 | )
93 | ```
94 | This chart should look identical to our previous attempt when we created the y-axis the simpler way, but it opens up new options! Now we can instruct Altair to sort the y-axis by the x-axis values.
95 |
96 | ```{code-cell}
97 | alt.Chart(merged_list).mark_bar().encode(
98 | x="per_100k_hours",
99 | y=alt.Y("latimes_make_and_model").sort("x")
100 | )
101 | ```
102 |
103 | That's looking a lot neater! By default, the sort order will be small to large. Visually, if we want to feature the highest accident rates, it probably makes sense to reverse that order. We can do that by adding a minus before the axis name.
104 |
105 | ```{code-cell}
106 | alt.Chart(merged_list).mark_bar().encode(
107 | x="per_100k_hours",
108 | y=alt.Y("latimes_make_and_model").sort("-x")
109 | )
110 | ```
111 |
112 | And we can't have a chart without context. Let's throw in a title for good measure.
113 |
114 | ```{code-cell}
115 | alt.Chart(merged_list).mark_bar().encode(
116 | x="per_100k_hours",
117 | y=alt.Y("latimes_make_and_model").sort("-x")
118 | ).properties(
119 | title="Helicopter accident rates"
120 | )
121 | ```
122 |
123 | Yay, we made a chart!
124 |
125 | ## Other marks
126 |
127 | What if we wanted to switch it up and show this data in a slightly different form? For example, in the [Los Angeles Times story](https://www.latimes.com/projects/la-me-robinson-helicopters/), the fatal accident rate is shown as a scaled circle.
128 |
129 | We can try that out with just a few small tweaks, using Altair's `mark_circle` option. We'll keep the `y` encoding, since we still want to split out our chart by make and model. Instead of an `x` encoding, though, we'll pass in a `size` encoding, which will pin the radius of each circle to that rate calculation. And hey, while we're at it, let's throw in an interactive tooltip that displays the accident rate when users hover over a mark.
130 |
131 | ```{code-cell}
132 | alt.Chart(merged_list).mark_circle().encode(
133 | size="per_100k_hours",
134 | y="latimes_make_and_model",
135 | tooltip="per_100k_hours"
136 | )
137 | ```
138 | A nice little change from all the bar charts! But once again, the default sorting alphabetical by name. Instead, it would be really nice to sort this by rate, as we did with the bar chart. How would we go about that?
139 |
140 | ```{code-cell}
141 | alt.Chart(merged_list).mark_circle().encode(
142 | size="per_100k_hours",
143 | y=alt.Y("latimes_make_and_model").sort("-size"),
144 | tooltip="per_100k_hours"
145 | )
146 | ```
147 |
148 | ## `datetime` data
149 |
150 | One thing you'll almost certainly find yourself grappling with time and time again is date (and time) fields, so let's talk about how to handle them.
151 |
152 | Let’s see if we can do that with our original DataFrame, the `accident_list` that contains one record for every helicopter accident. We can remind ourselves what it contains with the `info` command.
153 |
154 | ```{code-cell}
155 | accident_list.info()
156 | ```
157 |
158 | When you import a CSV file with `read_csv` it will take a guess at column types — for example, `integer`, `float`, `boolean`, `datetime` or `string` — but it will default to a generic `object` type, which will generally behave like a string, or text, field. You can see the data types that pandas assigned to the accident list on the right hand side of the `info` table.
159 |
160 | Take a look above and you'll see that pandas is treating the `date` column as an object. That means we can't chart it using Python's system for working with dates.
161 |
162 | But we can fix that. The [`to_datetime`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html) method included with `pandas` can handle the conversion. Here's how to reassign the `date` column after making the change.
163 |
164 | ```{code-cell}
165 | accident_list["date"] = pd.to_datetime(accident_list["date"])
166 | ```
167 |
168 | This redefines each object in that column as a date. If your dates are in an unusual or ambiguous format, you may have to [pass in a specific formatter](https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html), but in this case pandas should be able to guess correctly.
169 |
170 | Run `info` again and you'll notice a change. The data type for `date` has changed.
171 |
172 | ```{code-cell}
173 | accident_list.info()
174 | ```
175 |
176 | Now that we've got that out of the way, let’s see if we can chart with it, tracking fatalities over time.
177 |
178 | ```{code-cell}
179 | alt.Chart(accident_list).mark_bar().encode(
180 | x="date",
181 | y="total_fatalities"
182 | )
183 | ```
184 |
185 | This is great on the x-axis, but it's not quite accurate on the y. To make sure this chart is accurate, we'll need to aggregate the y-axis in some way.
186 |
187 | ## Aggregate with Altair
188 |
189 | We could back out and create a new dataset grouped by date, but Altair actually lets us do some of that grouping on the fly. We want to add everything that happens on the same date, so we'll pop in a `sum` function on our y column.
190 |
191 | ```{code-cell}
192 | alt.Chart(accident_list).mark_bar().encode(
193 | x="date",
194 | y="sum(total_fatalities)"
195 | )
196 | ```
197 |
198 | This is getting there. But sometimes plotting on a day-by-day basis isn't all that useful — especially over a long period of time like we have here.
199 |
200 | Again, we could back out and create a new DataFrame grouping by month, but we don't have to — in addition to standard operations (sum, mean, median, etc.), Altair gives us some handy datetime aggregation options. You can find a list of options in the [library documentation](https://altair-viz.github.io/user_guide/transform/timeunit.html).
201 |
202 | ```{code-cell}
203 | alt.Chart(accident_list).mark_bar().encode(
204 | x="yearmonth(date)",
205 | y="sum(total_fatalities)",
206 | )
207 | ```
208 |
209 | This is great for showing the pattern of fatalities over time, but it doesn't give us additional information that might be useful. For example, we almost certainly want to investigate the trend for each manufacturer.
210 |
211 | What can do is facet, which will create separate charts, one for each helicopter maker.
212 |
213 | ```{code-cell}
214 | alt.Chart(accident_list).mark_bar().encode(
215 | x="yearmonth(date)",
216 | y="sum(total_fatalities)",
217 | facet="latimes_make"
218 | )
219 | ```
220 |
221 | ## Add a `color`
222 |
223 | What important fact in the data is this chart *not* showing? There are _two_ Robinson models in the ranking. It might be nice to emphasize them.
224 |
225 | We have that `latimes_make` column in our original DataFrame, but it got lost when we created our ranking because we didn't include it in our `groupby` command. We can fix that by scrolling back up our notebook and adding it to the command. You will need to replace what's there with a list containing both columns we want to keep.
226 |
227 | Make note that because we're listing more than one column in the `groupby` call now, we'll need to surround those column names in a pair of square brackets like so:
228 |
229 | ```{code-cell}
230 | accident_counts = accident_list.groupby(["latimes_make", "latimes_make_and_model"]).size().rename("accidents").reset_index()
231 | ```
232 |
233 | Rerun __all__ of the cells after that one to update everything you're working with and add the new column.
234 |
235 | ```{note}
236 | Remember: If we change a variable, future cells that use that variable won't change unless we run them again. When you go back and make these changes, make sure to run all of the cells that come after them as well, otherwise you may not get the results you're expecting.
237 |
238 | This is one reason that it can be good to clear cell outputs and rerun your analysis every so often. If you've been going back and forth editing cells and tweaking your analysis, you may have saved variables in memory that are no longer accurate. One way to do that is to clear your "kernel" and rerun the whole notebook to make sure everything still runs as you expect it to (In the Jupyter menu, `Kernel` > `Restart Kernel and Clear All Outputs`, or `Restart Kernel and Run Up to Selected Cell`).
239 | ```
240 |
241 | Now, when you inspect your `merged_list` variable, you should see the `latimes_make` column included.
242 |
243 | ```{code-cell}
244 | merged_list.info()
245 | ```
246 |
247 | Let's put that to use with an Altair option that we haven't toyed with yet: `color`.
248 |
249 | ```{code-cell}
250 | alt.Chart(merged_list).mark_bar().encode(
251 | x="per_100k_hours",
252 | y=alt.Y("latimes_make_and_model").sort("-x"),
253 | color="latimes_make"
254 | ).properties(
255 | title="Helicopter accident rates"
256 | )
257 | ```
258 |
259 | Hey now! That wasn't too hard, was it? But now there are too many colors. It would be easier to read this chart and highlight information we want readers to notice if we used one color for the Robinson bars and made everything else a different color.
260 |
261 | The simplest way to do this is to hand Altair a DataFrame with a column that has the values we want to color-code on. We already have the `latimes_make` columns, but in this case we don't want that many values; we just want that column to contain one value for the Robinson rows, and another value for all the non-Robinson rows. It doesn't really matter what those two values are!
262 |
263 | How might we go about creating that column? (Hint: We can adapt the technique we learned about in the Filters chapter!)
264 |
265 | One way to do this is to create a test for rows with an `latimes_make` value equal to "ROBINSON", like so:
266 |
267 | ```{code-cell}
268 | merged_list["latimes_make"] == "ROBINSON"
269 | ```
270 | That will give us a true/false list. In the Filters chapter, we used that list to filter the DataFrame to only rows that matched this test. But we can also simply define a new column and save that list to it. Let's call the new column `robinson`.
271 |
272 | ```{code-cell}
273 | merged_list["robinson"] = merged_list["latimes_make"] == "ROBINSON"
274 | ```
275 | If you take a look at our `merged_list` DataFrame, you should now see that new column.
276 |
277 | ```{code-cell}
278 | merged_list.head()
279 | ```
280 | Now, we can alter our chart to use that new column.
281 |
282 | ```{code-cell}
283 | alt.Chart(merged_list).mark_bar().encode(
284 | x="per_100k_hours",
285 | y=alt.Y("latimes_make_and_model").sort("-x"),
286 | color="robinson"
287 | ).properties(
288 | title="Helicopter accident rates"
289 | )
290 | ```
291 |
292 | _Bonus: This is fine for exploratory use, but we don't really need that legend, since it's adding a highlight to information that's already included in the names of the helicopters. To hide it, we can use that more advanced syntax and instruct Altair to skip creating a legend._
293 |
294 | ```{code-cell}
295 | alt.Chart(merged_list).mark_bar().encode(
296 | x="per_100k_hours",
297 | y=alt.Y("latimes_make_and_model").sort("-x"),
298 | color=alt.Color("robinson", legend=None)
299 | ).properties(
300 | title="Helicopter accident rates"
301 | )
302 | ```
303 |
304 | ## Polishing your chart
305 |
306 | These charts give us plenty of areas where we might want to dig in and ask more questions, but none are polished enough to pop into a news story quite yet. But there *are* lots of additional labeling, formatting and design options that you can dig into in the [Altair docs](https://altair-viz.github.io/index.html) — you can even create Altair themes to specify default color schemes and fonts.
307 |
308 | But you may not want to do all that tweaking in Altair, especially if you're just working on a one-off graphic. If you wanted to hand this chart off to a graphics department, all you'd have to do is head to the top right corner of your chart.
309 |
310 | See those three dots? Click on that, and you'll see lots of options. Downloading the file as an SVG will let anyone with graphics software like Adobe Illustrator take this file and tweak the design.
311 |
312 | To get the raw data out, you'll need to learn one last pandas trick. It's covered in our final chapter.
--------------------------------------------------------------------------------
/jupyterlite/stanford-winter-2023/ntsb-accidents.csv:
--------------------------------------------------------------------------------
1 | event_id,ntsb_make,ntsb_model,ntsb_number,year,date,city,state,country,total_fatalities,latimes_make,latimes_model,latimes_make_and_model
2 | 20061222X01838,BELL,407,NYC07FA048,2006,12/14/06 00:00:00,DAGSBORO,DE,USA,2,BELL,407,BELL 407
3 | 20060817X01187,ROBINSON,R22 BETA,LAX06LA257,2006,08/10/06 00:00:00,TUCSON,AZ,USA,1,ROBINSON,R22,ROBINSON R22
4 | 20060111X00044,ROBINSON,R44,MIA06FA039,2006,01/01/06 00:00:00,GRAND RIDGE,FL,USA,3,ROBINSON,R44,ROBINSON R44
5 | 20060419X00461,ROBINSON,R44 II,DFW06FA102,2006,04/13/06 00:00:00,FREDERICKSBURG,TX,USA,2,ROBINSON,R44,ROBINSON R44
6 | 20060208X00181,ROBINSON,R44,SEA06LA052,2006,02/06/06 00:00:00,HELENA,MT,USA,1,ROBINSON,R44,ROBINSON R44
7 | 20060228X00255,ROBINSON,R22,ANC06FA020,2006,02/22/06 00:00:00,SCOTTSDALE,AZ,USA,2,ROBINSON,R22,ROBINSON R22
8 | 20060824X01237,EUROCOPTER,AS-350-B3,SEA06GA158,2006,08/13/06 00:00:00,YELLOW PINE,ID,USA,4,AIRBUS,350,AIRBUS 350
9 | 20060916X01352,HUGHES,369D,LAX06LA288,2006,09/06/06 00:00:00,SOMIS,CA,USA,2,HUGHES,369,HUGHES 369
10 | 20061122X01705,HUGHES,369E,SEA07LA021,2006,11/21/06 00:00:00,JENSEN,UT,USA,1,HUGHES,369,HUGHES 369
11 | 20060306X00268,SCHWEIZER,269C-1,LAX06LA123,2006,02/25/06 00:00:00,VALENCIA,CA,USA,1,SCHWEIZER,269,SCHWEIZER 269
12 | 20060607X00691,EUROCOPTER,EC-135P1,NYC06MA131,2006,05/30/06 00:00:00,WASHINGTON,DC,USA,1,AIRBUS,135,AIRBUS 135
13 | 20060419X00457,ROBINSON,R22 BETA,CHI06FA109,2006,04/13/06 00:00:00,CHELSEA,MI,USA,2,ROBINSON,R22,ROBINSON R22
14 | 20060705X00868,BELL,206B,CHI06FA173,2006,06/30/06 00:00:00,WALFORD,IA,USA,1,BELL,206,BELL 206
15 | 20060817X01202,ROBINSON,R44 II,SEA06FA159,2006,08/13/06 00:00:00,WARRENTON,OR,USA,3,ROBINSON,R44,ROBINSON R44
16 | 20060320X00323,BELL,206L-1,DFW06FA083,2006,03/14/06 00:00:00,PATTERSON,LA,USA,2,BELL,206,BELL 206
17 | 20060209X00187,ROBINSON,R44 II,LAX06FA104,2006,02/07/06 00:00:00,MINDEN,NV,USA,1,ROBINSON,R44,ROBINSON R44
18 | 20060510X00540,ROBINSON,R44 RAVEN II,LAX06FA156,2006,05/01/06 00:00:00,DESERT CENTER,CA,USA,2,ROBINSON,R44,ROBINSON R44
19 | 20060905X01290,EUROCOPTER FRANCE,AS350 B2,ANC06GA121,2006,08/21/06 00:00:00,NUIQSUT,AK,USA,1,AIRBUS,350,AIRBUS 350
20 | 20061012X01505,ROBINSON,R44,SEA07FA006,2006,10/08/06 00:00:00,SUMNER,WA,USA,1,ROBINSON,R44,ROBINSON R44
21 | 20060605X00682,BELL,206L-3,DFW06IA145,2006,05/30/06 00:00:00,GRAND ISLE 43AA,GM,USA,1,BELL,206,BELL 206
22 | 20070612X00715,HUGHES,369D,SEA07LA135,2007,05/28/07 00:00:00,COLUMBUS,MT,USA,1,HUGHES,369,HUGHES 369
23 | 20070605X00681,HUGHES,369A,MIA07FA098,2007,05/13/07 00:00:00,MOULTON,AL,USA,1,HUGHES,369,HUGHES 369
24 | 20071119X01805,ROBINSON HELICOPTER,R44,NYC08FA026,2007,11/05/07 00:00:00,JAMESTOWN,TN,USA,3,ROBINSON,R44,ROBINSON R44
25 | 20070430X00482,ROBINSON HELICOPTER COMPANY,R44 II,CHI07FA114,2007,04/22/07 00:00:00,BASS LAKE,IN,USA,2,ROBINSON,R44,ROBINSON R44
26 | 20070322X00320,MCDONNELL DOUGLAS,369FF,CHI07MA083,2007,03/11/07 00:00:00,HAENA,HI,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
27 | 20071231X02014,BELL,206L1,DFW08FA053,2007,12/29/07 00:00:00,VENICE,LA,USA,1,BELL,206,BELL 206
28 | 20070530X00664,EUROCOPTER,AS 350 B3,DFW07GA119,2007,05/22/07 00:00:00,SAN ELIZARIO,TX,USA,1,AIRBUS,350,AIRBUS 350
29 | 20070405X00374,ROBINSON,R44 II,DEN07FA079,2007,03/27/07 00:00:00,PONTE VEDRA BCH,FL,USA,2,ROBINSON,R44,ROBINSON R44
30 | 20070321X00315,AEROSPATIALE,AS350BA,NYC07MA073,2007,03/08/07 00:00:00,PRINCEVILLE,HI,USA,4,AIRBUS,350,AIRBUS 350
31 | 20080109X00032,BELL,206L-3,NYC08FA071,2007,12/30/07 00:00:00,CHEROKEE,AL,USA,3,BELL,206,BELL 206
32 | 20070920X01418,BELL,206B,MIA07FA147,2007,09/11/07 00:00:00,NOKOMIS,FL,USA,2,BELL,206,BELL 206
33 | 20070919X01416,HUGHES,369D,LAX07LA270,2007,09/08/07 00:00:00,ELLENSBURG,WA,USA,1,HUGHES,369,HUGHES 369
34 | 20070808X01151,ROBINSON,R44 II,SEA07FA223,2007,08/02/07 00:00:00,EASTON,WA,USA,4,ROBINSON,R44,ROBINSON R44
35 | 20071227X01994,BELL,407,NYC08LA028,2007,11/09/07 00:00:00,MORRISTOWN,TN,USA,1,BELL,407,BELL 407
36 | 20070802X01089,EUROCOPTER,AS350-B2,LAX07MA231,2007,07/27/07 00:00:00,PHOENIX,AZ,USA,4,AIRBUS,350,AIRBUS 350
37 | 20070802X01089,EUROCOPTER,AS350-B2,LAX07MA231,2007,07/27/07 00:00:00,PHOENIX,AZ,USA,4,AIRBUS,350,AIRBUS 350
38 | 20080529X00746,AEROSPATIALE,AS-350-D,SEA08MA136,2008,05/24/08 00:00:00,AVALON,CA,USA,3,AIRBUS,350,AIRBUS 350
39 | 20080819X01260,ROBINSON HELICOPTER,R22 BETA II,SEA08FA185,2008,08/17/08 00:00:00,OLALLA,WA,USA,1,ROBINSON,R22,ROBINSON R22
40 | 20080715X01051,BELL,407,DEN08MA116,2008,06/29/08 00:00:00,FLAGSTAFF,AZ,USA,7,BELL,407,BELL 407
41 | 20080715X01051,BELL,407,DEN08MA116,2008,06/29/08 00:00:00,FLAGSTAFF,AZ,USA,7,BELL,407,BELL 407
42 | 20080128X00108,ROBINSON,R44,MIA08FA044,2008,01/22/08 00:00:00,OCHOPEE,FL,USA,2,ROBINSON,R44,ROBINSON R44
43 | 20081211X45825,BELL,206L-4,CEN09FA086,2008,12/11/08 00:00:00,SABINE PASS,TX,USA,5,BELL,206,BELL 206
44 | 20081019X15543,ROBINSON,R22,ERA09FA022,2008,10/16/08 00:00:00,DRYDEN,NY,USA,1,ROBINSON,R22,ROBINSON R22
45 | 20080520X00702,EUROCOPTER DEUTSCHLAND GMBH,EC 135 T2+,CHI08FA128,2008,05/10/08 00:00:00,LA CROSSE,WI,USA,3,AIRBUS,135,AIRBUS 135
46 | 20080909X01417,BELL,206L-1,CHI08FA269,2008,08/31/08 00:00:00,GREENSBURG,IN,USA,3,BELL,206,BELL 206
47 | 20080321X00357,ROBINSON,R22 BETA II,NYC08FA134,2008,03/13/08 00:00:00,WILMINGTON,NC,USA,1,ROBINSON,R22,ROBINSON R22
48 | 20081014X22933,BELL,407,WPR09TA012,2008,10/13/08 00:00:00,SEDONA,AZ,USA,1,BELL,407,BELL 407
49 | 20080505X00592,ROBINSON,R44,DFW08LA122,2008,04/28/08 00:00:00,BARTLETT,TX,USA,1,ROBINSON,R44,ROBINSON R44
50 | 20080710X01015,SCHWEIZER,269 C-1,LAX08LA213,2008,07/04/08 00:00:00,SUNOL,CA,USA,2,SCHWEIZER,269,SCHWEIZER 269
51 | 20081013X24743,BELL,206,CEN09FA012,2008,10/13/08 00:00:00,CONROE,TX,USA,2,BELL,206,BELL 206
52 | 20081104X60811,ROBINSON,R-44,ERA09FA036,2008,11/02/08 00:00:00,GALLATIN,TN,USA,1,ROBINSON,R44,ROBINSON R44
53 | 20080731X01133,HUGHES,369D,LAX08FA233,2008,07/19/08 00:00:00,PRICE,UT,USA,3,HUGHES,369,HUGHES 369
54 | 20080222X00227,EUROCOPTER FRANCE,AS350B2,DFW08FA062,2008,02/05/08 00:00:00,S. PADRE ISLAND,TX,USA,3,AIRBUS,350,AIRBUS 350
55 | 20080421X00524,EUROCOPTER,AS 350 B2,ANC08FA053,2008,04/15/08 00:00:00,CHICKALOON,AK,USA,4,AIRBUS,350,AIRBUS 350
56 | 20080613X00858,BELL,407,DEN08FA101,2008,06/08/08 00:00:00,HUNTSVILLE,TX,USA,4,BELL,407,BELL 407
57 | 20080908X01405,ROBINSON,R44 II,DFW08FA218,2008,08/29/08 00:00:00,RIDGEDALE,MO,USA,2,ROBINSON,R44,ROBINSON R44
58 | 20080925X01525,ROBINSON,R44 II,CHI08FA293,2008,09/21/08 00:00:00,KENOSHA,WI,USA,2,ROBINSON,R44,ROBINSON R44
59 | 20080201X00130,ROBINSON HELICOPTER,R22 BETA,LAX08FA052,2008,01/25/08 00:00:00,LOS ANGELES,CA,USA,1,ROBINSON,R22,ROBINSON R22
60 | 20091012X15520,MCDONNELL DOUGLAS HELI CO,369FF,WPR10FA012,2009,10/12/09 00:00:00,FOSSIL,OR,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
61 | 20090724X05537,ROBINSON HELICOPTER,R44,ERA09FA417,2009,07/23/09 00:00:00,BOONSBORO,MD,USA,4,ROBINSON,R44,ROBINSON R44
62 | 20090926X65328,EUROCOPTER,AS-350,ERA09FA537,2009,09/25/09 00:00:00,GEORGETOWN,SC,USA,3,AIRBUS,350,AIRBUS 350
63 | 20090722X34202,HUGHES,369,ERA09FA414,2009,07/22/09 00:00:00,FRANKLIN,PA,USA,1,HUGHES,369,HUGHES 369
64 | 20090808X42846,EUROCOPTER,AS 350 BA,ERA09MA447,2009,08/08/09 00:00:00,HOBOKEN,NJ,USA,9,AIRBUS,350,AIRBUS 350
65 | 20090104X12037,SIKORSKY,S-76C,CEN09MA117,2009,01/04/09 00:00:00,MORGAN CITY,LA,USA,8,SIKORSKY,76,SIKORSKY 76
66 | 20091017X64138,ROBINSON HELICOPTER,R22 BETA,CEN10FA019,2009,10/14/09 00:00:00,TAHLEQUAH,OK,USA,2,ROBINSON,R22,ROBINSON R22
67 | 20090901X80259,ROBINSON,R44,ERA09FA497,2009,09/01/09 00:00:00,JACKSON,MS,USA,1,ROBINSON,R44,ROBINSON R44
68 | 20090225X75532,HUGHES,369F,ERA09LA173,2009,02/24/09 00:00:00,MOYOCK,NC,USA,1,HUGHES,369,HUGHES 369
69 | 20090611X91250,ROBINSON HELICOPTER,R22 BETA,WPR09FA284,2009,06/11/09 00:00:00,MORRISTOWN,AZ,USA,1,ROBINSON,R22,ROBINSON R22
70 | 20090920X34134,ROBINSON HELICOPTER,R22 BETA,WPR09FA459,2009,09/20/09 00:00:00,FOREST GROVE,OR,USA,2,ROBINSON,R22,ROBINSON R22
71 | 20091114X82100,AEROSPATIALE,AS350BA,WPR10FA055,2009,11/14/09 00:00:00,DOYLE,CA,USA,3,AIRBUS,350,AIRBUS 350
72 | 20090309X04818,BELL,206-L4,CEN09FA193,2009,03/08/09 00:00:00,MOUNDRIDGE,KS,USA,1,BELL,206,BELL 206
73 | 20090201X10015,ROBINSON HELICOPTER,R22 BETA II,WPR09FA104,2009,01/31/09 00:00:00,FILLMORE,CA,USA,1,ROBINSON,R22,ROBINSON R22
74 | 20090610X23159,AGUSTA SPA,A109E,CEN09PA348,2009,06/09/09 00:00:00,SANTA FE,NM,USA,2,AGUSTA,109,AGUSTA 109
75 | 20101015X73141,BELL,206B,CEN11GA020,2010,10/15/10 00:00:00,CLARKSON VALLEY,MO,USA,1,BELL,206,BELL 206
76 | 20100806X55641,ROBINSON HELICOPTER COMPANY,R44 II,ERA10FA403,2010,08/02/10 00:00:00,BLAIRSVILLE,GA,USA,2,ROBINSON,R44,ROBINSON R44
77 | 20100105X94046,BELL,206B,WPR10GA097,2010,01/05/10 00:00:00,AUBERRY,CA,USA,4,BELL,206,BELL 206
78 | 20100728X92614,AMERICAN EUROCOPTER LLC,AS 350 B3,WPR10FA371,2010,07/28/10 00:00:00,TUCSON,AZ,USA,3,AIRBUS,350,AIRBUS 350
79 | 20100621X31143,ROBINSON HELICOPTER,R44,ANC10LA053,2010,06/19/10 00:00:00,UNALASKA,AK,USA,1,ROBINSON,R44,ROBINSON R44
80 | 20101103X83727,BELL,206,CEN11FA053,2010,11/03/10 00:00:00,MEEKER,CO,USA,1,BELL,206,BELL 206
81 | 20100705X12909,ROBINSON HELICOPTER,R44,ERA10LA348,2010,07/05/10 00:00:00,MARION,KY,USA,1,ROBINSON,R44,ROBINSON R44
82 | 20101030X30541,MD HELICOPTERS INC,369E,ERA11FA042,2010,10/30/10 00:00:00,THOMAS,WV,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
83 | 20100831X75841,BELL HELICOPTER TEXTRON,206L-1,CEN10FA509,2010,08/31/10 00:00:00,WALNUT GROVE,AR,USA,3,BELL,206,BELL 206
84 | 20100214X92140,EUROCOPTER,EC135,WPR10FA133,2010,02/14/10 00:00:00,CAVE CREEK,AZ,USA,5,AIRBUS,135,AIRBUS 135
85 | 20100526X84456,SCHWEIZER,269C-1,ERA10FA283,2010,05/26/10 00:00:00,BOXBOROUGH,MA,USA,1,SCHWEIZER,269,SCHWEIZER 269
86 | 20100306X05331,ROBINSON HELICOPTER,R22 BETA II,CEN10FA139,2010,03/06/10 00:00:00,COTULLA,TX,USA,2,ROBINSON,R22,ROBINSON R22
87 | 20100717X71900,ROBINSON HELICOPTER COMPANY,R44 II,WPR10LA354,2010,07/16/10 00:00:00,SALT LAKE CITY,UT,USA,1,ROBINSON,R44,ROBINSON R44
88 | 20100206X10511,AEROSPATIALE,AS350,CEN10FA113,2010,02/05/10 00:00:00,EL PASO,TX,USA,3,AIRBUS,350,AIRBUS 350
89 | 20110102X35752,EUROCOPTER DEUTSCHLAND GMBH,EC 135 P2,ERA11FA101,2010,12/31/10 00:00:00,WEYERS CAVE,VA,USA,2,AIRBUS,135,AIRBUS 135
90 | 20100325X93604,EUROCOPTER,AS-350-B3,ERA10MA188,2010,03/25/10 00:00:00,BROWNSVILLE,TN,USA,3,AIRBUS,350,AIRBUS 350
91 | 20100602X01732,ROBINSON,R22 BETA,WPR10FA277,2010,06/02/10 00:00:00,SPOKANE,WA,USA,1,ROBINSON,R22,ROBINSON R22
92 | 20100722X21328,EUROCOPTER,AS 350 B2,CEN10FA424,2010,07/22/10 00:00:00,KINGFISHER,OK,USA,2,AIRBUS,350,AIRBUS 350
93 | 20121010X41638,BELL,206B,CEN13FA009,2012,10/10/12 00:00:00,CROWLEY,LA,USA,1,BELL,206,BELL 206
94 | 20121010X63824,BELL,407,ERA13FA014,2012,10/09/12 00:00:00,COOLBAUGH TOWNSHIP,PA,USA,2,BELL,407,BELL 407
95 | 20121012X13500,ROBINSON HELICOPTER COMPANY,R44 II,CEN13FA010,2012,10/11/12 00:00:00,BLANCO,TX,USA,3,ROBINSON,R44,ROBINSON R44
96 | 20120910X05133,ROBINSON HELICOPTER,R22 BETA,CEN12FA621,2012,09/10/12 00:00:00,HOUSTON,TX,USA,2,ROBINSON,R22,ROBINSON R22
97 | 20120826X42003,BELL,407,ERA12FA527,2012,08/24/12 00:00:00,ABINGDON,VA,USA,1,BELL,407,BELL 407
98 | 20120216X03340,BELL,407,WPR12GA106,2012,02/15/12 00:00:00,MORAN JUNCTION,WY,USA,1,BELL,407,BELL 407
99 | 20120701X53951,AEROSPATIALE,AS350B,WPR12FA282,2012,06/30/12 00:00:00,CAMP VERDE,AZ,USA,4,AIRBUS,350,AIRBUS 350
100 | 20121130X74908,ROBINSON HELICOPTER,R22 BETA II,ERA13FA070,2012,11/30/12 00:00:00,APOLLO BEACH,FL,USA,1,ROBINSON,R22,ROBINSON R22
101 | 20120709X83554,ROBINSON HELICOPTER,R22 BETA,WPR12FA298,2012,07/09/12 00:00:00,MURRIETA,CA,USA,1,ROBINSON,R22,ROBINSON R22
102 | 20121115X43423,HUGHES,369D,ERA13LA057,2012,11/15/12 00:00:00,CORNING,NY,USA,2,HUGHES,369,HUGHES 369
103 | 20120119X92431,ROBINSON,R44 II,CEN12FA139,2012,01/19/12 00:00:00,CENTERVILLE,LA,USA,2,ROBINSON,R44,ROBINSON R44
104 | 20121128X12341,HUGHES,369,CEN13FA075,2012,11/27/12 00:00:00,CHILDRESS,TX,USA,1,HUGHES,369,HUGHES 369
105 | 20120529X90616,BELL,206-L4,CEN12FA321,2012,05/28/12 00:00:00,GULF OF MEXICO,,USA,1,BELL,206,BELL 206
106 | 20120612X20331,ROBINSON HELICOPTER COMPANY,R44 II,WPR12LA259,2012,06/12/12 00:00:00,EAST WENATCHEE,WA,USA,1,ROBINSON,R44,ROBINSON R44
107 | 20121126X75106,ROBINSON HELICOPTER COMPANY,R44 II,WPR13FA054,2012,11/25/12 00:00:00,CORONA,CA,USA,1,ROBINSON,R44,ROBINSON R44
108 | 20121005X04242,BELL,407,CEN13FA003,2012,10/05/12 00:00:00,INTRACOASTAL CITY,LA,USA,1,BELL,407,BELL 407
109 | 20130222X12624,EUROCOPTER,AS 350 B2,CEN13FA174,2013,02/22/13 00:00:00,OKLAHOMA CITY,OK,USA,2,AIRBUS,350,AIRBUS 350
110 | 20131009X50051,BELL,206L 3,CEN14FA004,2013,10/09/13 00:00:00,"VENICE, LA",GM,USA,1,BELL,206,BELL 206
111 | 20130331X41252,EUROCOPTER,AS350,ANC13GA036,2013,03/30/13 00:00:00,TALKEETNA,AK,USA,3,AIRBUS,350,AIRBUS 350
112 | 20130525X61706,ROBINSON HELICOPTER COMPANY,R44 II,CEN13FA295,2013,05/24/13 00:00:00,CROSS TIMBERS,MO,USA,2,ROBINSON,R44,ROBINSON R44
113 | 20130102X13158,BELL,206,WPR13FA080,2013,01/02/13 00:00:00,DELANO,CA,USA,1,BELL,206,BELL 206
114 | 20130727X31220,ROBINSON HELICOPTER COMPANY,R44 II,WPR13FA343,2013,07/27/13 00:00:00,THOMPSON FALLS,MT,USA,1,ROBINSON,R44,ROBINSON R44
115 | 20130210X93918,BELL,206B,WPR13FA119,2013,02/10/13 00:00:00,ACTON,CA,USA,3,BELL,206,BELL 206
116 | 20130218X22833,BELL,206B,WPR13GA128,2013,02/18/13 00:00:00,EUREKA,NV,USA,1,BELL,206,BELL 206
117 | 20130427X30522,BELL,206B,WPR13FA208,2013,04/27/13 00:00:00,SHEPHERD,MT,USA,1,BELL,206,BELL 206
118 | 20130607X04715,BELL HELICOPTER TEXTRON,206L-1,ERA13FA273,2013,06/06/13 00:00:00,MANCHESTER,KY,USA,3,BELL,206,BELL 206
119 | 20131022X92949,EUROCOPTER,AS 350 B3,ERA14FA010,2013,10/22/13 00:00:00,SOMERVILLE,TN,USA,3,AIRBUS,350,AIRBUS 350
120 | 20130102X35708,BELL HELICOPTER,407,CEN13FA122,2013,01/02/13 00:00:00,CLEAR LAKE,IA,USA,3,BELL,407,BELL 407
121 | 20130403X65155,ROBINSON,R44,ERA13FA186,2013,04/03/13 00:00:00,MIAMI,FL,USA,2,ROBINSON,R44,ROBINSON R44
122 | 20131007X44153,MCDONNELL DOUGLAS HELI CO,369,WPR14LA008,2013,10/06/13 00:00:00,PADUCAH,TX,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
123 | 20130831X54252,ROBINSON,R44 II,CEN13FA517,2013,08/31/13 00:00:00,CABALLO,NM,USA,3,ROBINSON,R44,ROBINSON R44
124 | 20130315X34542,SIKORSKY,S-76A++,CEN13FA192,2013,03/15/13 00:00:00,GRAND LAKE,LA,USA,3,SIKORSKY,76,SIKORSKY 76
125 | 20130805X31941,HUGHES,369D,CEN13LA461,2013,08/05/13 00:00:00,ACKERLY,TX,USA,2,HUGHES,369,HUGHES 369
126 | 20130612X12326,EUROCOPTER,AS350B2,CEN13FA344,2013,06/11/13 00:00:00,TALIHINA,OK,USA,1,AIRBUS,350,AIRBUS 350
127 | 20140127X44720,BELL,206L 3,CEN14FA122,2014,01/27/14 00:00:00,SILT,CO,USA,3,BELL,206,BELL 206
128 | 20140523X44003,ROBINSON HELICOPTER,R22 BETA,WPR14FA203,2014,05/23/14 00:00:00,SANTA PAULA,CA,USA,1,ROBINSON,R22,ROBINSON R22
129 | 20140318X21532,EUROCOPTER,AS 350 B2,WPR14FA137,2014,03/18/14 00:00:00,SEATTLE,WA,USA,2,AIRBUS,350,AIRBUS 350
130 | 20140529X73728,ROBINSON HELICOPTER COMPANY,R44 II,ANC14FA030,2014,05/28/14 00:00:00,CHUGIAK,AK,USA,1,ROBINSON,R44,ROBINSON R44
131 | 20140612X31159,BELL,206 L4,CEN14FA286,2014,06/11/14 00:00:00,SOUTH TIMBALIER PLATFORM,GM,USA,2,BELL,206,BELL 206
132 | 20150101X15630,BELL,206,WPR15FA072,2014,12/31/14 00:00:00,BENSON,AZ,USA,2,BELL,206,BELL 206
133 | 20140819X50947,MCDONNELL DOUGLAS HELICOPTER,369E,ERA14FA396,2014,08/19/14 00:00:00,NORTHPORT,AL,USA,2,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
134 | 20140407X83620,ROBINSON HELICOPTER,R22 BETA,WPR14FA158,2014,04/06/14 00:00:00,GREEN RIVER,UT,USA,2,ROBINSON,R22,ROBINSON R22
135 | 20140208X05221,ROBINSON HELICOPTER COMPANY,R44 II,ERA14FA115,2014,02/08/14 00:00:00,PANACEA,FL,USA,2,ROBINSON,R44,ROBINSON R44
136 | 20141023X01333,ROBINSON HELICOPTER COMPANY,R44 II,ERA15FA025,2014,10/23/14 00:00:00,FREDERICK,MD,USA,3,ROBINSON,R44,ROBINSON R44
137 | 20140518X03315,AMERICAN EUROCOPTER CORP,AS350B3,WPR14FA195,2014,05/18/14 00:00:00,PEACH SPRINGS,AZ,USA,1,AIRBUS,350,AIRBUS 350
138 | 20140723X81618,BELL,206A,WPR14FA310,2014,07/23/14 00:00:00,WENATCHEE,WA,USA,1,BELL,206,BELL 206
139 | 20141202X73240,ROBINSON HELICOPTER COMPANY,R44,WPR15FA051,2014,12/02/14 00:00:00,BOUNTIFUL,UT,USA,2,ROBINSON,R44,ROBINSON R44
140 | 20141229X15321,ROBINSON HELICOPTER,R22 BETA,ERA15FA085,2014,12/29/14 00:00:00,LAKE WORTH,FL,USA,1,ROBINSON,R22,ROBINSON R22
141 | 20141004X60516,BELL HELICOPTER TEXTRON,206L 1,CEN15FA003,2014,10/04/14 00:00:00,WICHITA FALLS,TX,USA,3,BELL,206,BELL 206
142 | 20140908X10448,ROBINSON HELICOPTER COMPANY,R44 II,CEN14LA487,2014,09/06/14 00:00:00,MACEDONIA,IA,USA,1,ROBINSON,R44,ROBINSON R44
143 | 20140717X70001,AGUSTA SPA,A109E,CEN14FA369,2014,07/17/14 00:00:00,NEWKIRK,NM,USA,3,AGUSTA,109,AGUSTA 109
144 | 20150110X10017,ROBINSON HELICOPTER,R22 BETA,ERA15FA096,2015,01/10/15 00:00:00,CATANO,PR,USA,1,ROBINSON,R22,ROBINSON R22
145 | 20150703X00859,AIRBUS HELICOPTERS INC,AS350B3E,CEN15MA290,2015,07/03/15 00:00:00,FRISCO,CO,USA,1,AIRBUS,350,AIRBUS 350
146 | 20150308X10201,AIRBUS HELICOPTERS (EUROCOPTE,EC-130-B4,CEN15FA164,2015,03/06/15 00:00:00,ST LOUIS,MO,USA,1,AIRBUS,130,AIRBUS 130
147 | 20150330X73700,BELL HELICOPTER TEXTRON,206 L-1,ERA15FA173,2015,03/30/15 00:00:00,SAUCIER,MS,USA,2,BELL,206,BELL 206
148 | 20150702X24434,SCHWEIZER,269C,WPR15FA205,2015,07/01/15 00:00:00,NEWBERG,OR,USA,2,SCHWEIZER,269,SCHWEIZER 269
149 | 20150313X72113,EUROCOPTER,AS 350 B2,CEN15FA171,2015,03/12/15 00:00:00,EUFAULA,OK,USA,1,AIRBUS,350,AIRBUS 350
150 | 20151211X13514,BELL,407,WPR16FA037,2015,12/10/15 00:00:00,MCFARLAND,CA,USA,4,BELL,407,BELL 407
151 | 20150322X92548,ROBINSON HELICOPTER COMPANY,R44 II,ERA15FA164,2015,03/22/15 00:00:00,ORLANDO,FL,USA,3,ROBINSON,R44,ROBINSON R44
152 | 20151216X13718,AIRBUS HELICOPTERS,AS350,WPR16FA040,2015,12/15/15 00:00:00,SUPERIOR,AZ,USA,2,AIRBUS,350,AIRBUS 350
153 | 20150407X12857,HUGHES,369D,ERA15FA178,2015,04/06/15 00:00:00,CHEROKEE,AL,USA,1,HUGHES,369,HUGHES 369
154 | 20151118X05037,AIRBUS HELICOPTERS,AS350B3E,WPR16FA029,2015,11/18/15 00:00:00,CARLSBAD,CA,USA,2,AIRBUS,350,AIRBUS 350
155 | 20161116X00108,HUGHES,369D/500D,WPR17FA021,2016,11/15/16 00:00:00,PUKOO,HI,USA,2,HUGHES,369,HUGHES 369
156 | 20160326X80544,EUROCOPTER,AS 350 B2,ERA16FA140,2016,03/26/16 00:00:00,ENTERPRISE,AL,USA,4,AIRBUS,350,AIRBUS 350
157 | 20160504X30424,MCDONNELL DOUGLAS HELICOPTER,369E,CEN16FA171,2016,05/04/16 00:00:00,REEDSVILLE,WI,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
158 | 20160328X03918,ROBINSON,R44,ERA16FA143,2016,03/27/16 00:00:00,CANADENSIS,PA,USA,1,ROBINSON,R44,ROBINSON R44
159 | 20160218X71040,BELL,206B,WPR16FA072,2016,02/18/16 00:00:00,HONOLULU,HI,USA,1,BELL,206,BELL 206
160 | 20160711X32921,BELL HELICOPTER TEXTRON CANADA,407,ERA16FA248,2016,07/11/16 00:00:00,HICKORY,KY,USA,1,BELL,407,BELL 407
161 | 20160804X45514,SCHWEIZER,269C 1,CEN16FA304,2016,08/03/16 00:00:00,JEANERETTE,LA,USA,1,SCHWEIZER,269,SCHWEIZER 269
162 | 20160404X74644,BELL,206,ERA16FA144,2016,04/04/16 00:00:00,PIGEON FORGE,TN,USA,5,BELL,206,BELL 206
163 | 20160507X31120,AIRBUS,AS350,ANC16FA023,2016,05/06/16 00:00:00,SKAGWAY,AK,USA,1,AIRBUS,350,AIRBUS 350
164 | 20160612X85856,ROBINSON HELICOPTER COMPANY,R44 II,CEN16FA215,2016,06/12/16 00:00:00,JONESBORO,AR,USA,1,ROBINSON,R44,ROBINSON R44
165 |
--------------------------------------------------------------------------------
/docs/src/_static/ntsb-accidents.csv:
--------------------------------------------------------------------------------
1 | event_id,ntsb_make,ntsb_model,ntsb_number,year,date,city,state,country,total_fatalities,latimes_make,latimes_model,latimes_make_and_model
2 | 20061222X01838,BELL,407,NYC07FA048,2006,12/14/2006 00:00:00,DAGSBORO,DE,USA,2,BELL,407,BELL 407
3 | 20060817X01187,ROBINSON,R22 BETA,LAX06LA257,2006,08/10/2006 00:00:00,TUCSON,AZ,USA,1,ROBINSON,R22,ROBINSON R22
4 | 20060111X00044,ROBINSON,R44,MIA06FA039,2006,01/01/2006 00:00:00,GRAND RIDGE,FL,USA,3,ROBINSON,R44,ROBINSON R44
5 | 20060419X00461,ROBINSON,R44 II,DFW06FA102,2006,04/13/2006 00:00:00,FREDERICKSBURG,TX,USA,2,ROBINSON,R44,ROBINSON R44
6 | 20060208X00181,ROBINSON,R44,SEA06LA052,2006,02/06/2006 00:00:00,HELENA,MT,USA,1,ROBINSON,R44,ROBINSON R44
7 | 20060228X00255,ROBINSON,R22,ANC06FA020,2006,02/22/2006 00:00:00,SCOTTSDALE,AZ,USA,2,ROBINSON,R22,ROBINSON R22
8 | 20060824X01237,EUROCOPTER,AS-350-B3,SEA06GA158,2006,08/13/2006 00:00:00,YELLOW PINE,ID,USA,4,AIRBUS,350,AIRBUS 350
9 | 20060916X01352,HUGHES,369D,LAX06LA288,2006,09/06/2006 00:00:00,SOMIS,CA,USA,2,HUGHES,369,HUGHES 369
10 | 20061122X01705,HUGHES,369E,SEA07LA021,2006,11/21/2006 00:00:00,JENSEN,UT,USA,1,HUGHES,369,HUGHES 369
11 | 20060306X00268,SCHWEIZER,269C-1,LAX06LA123,2006,02/25/2006 00:00:00,VALENCIA,CA,USA,1,SCHWEIZER,269,SCHWEIZER 269
12 | 20060607X00691,EUROCOPTER,EC-135P1,NYC06MA131,2006,05/30/2006 00:00:00,WASHINGTON,DC,USA,1,AIRBUS,135,AIRBUS 135
13 | 20060419X00457,ROBINSON,R22 BETA,CHI06FA109,2006,04/13/2006 00:00:00,CHELSEA,MI,USA,2,ROBINSON,R22,ROBINSON R22
14 | 20060705X00868,BELL,206B,CHI06FA173,2006,06/30/2006 00:00:00,WALFORD,IA,USA,1,BELL,206,bell 206
15 | 20060817X01202,ROBINSON,R44 II,SEA06FA159,2006,08/13/2006 00:00:00,WARRENTON,OR,USA,3,ROBINSON,R44,ROBINSON R44
16 | 20060320X00323,BELL,206L-1,DFW06FA083,2006,03/14/2006 00:00:00,PATTERSON,LA,USA,2,BELL,206,bell 206
17 | 20060209X00187,ROBINSON,R44 II,LAX06FA104,2006,02/07/2006 00:00:00,MINDEN,NV,USA,1,ROBINSON,R44,ROBINSON R44
18 | 20060510X00540,ROBINSON,R44 RAVEN II,LAX06FA156,2006,05/01/2006 00:00:00,DESERT CENTER,CA,USA,2,ROBINSON,R44,ROBINSON R44
19 | 20060905X01290,EUROCOPTER FRANCE,AS350 B2,ANC06GA121,2006,08/21/2006 00:00:00,NUIQSUT,AK,USA,1,AIRBUS,350,AIRBUS 350
20 | 20061012X01505,ROBINSON,R44,SEA07FA006,2006,10/08/2006 00:00:00,SUMNER,WA,USA,1,ROBINSON,R44,ROBINSON R44
21 | 20060605X00682,BELL,206L-3,DFW06IA145,2006,05/30/2006 00:00:00,GRAND ISLE 43AA,GM,USA,1,BELL,206,BELL 206
22 | 20070612X00715,HUGHES,369D,SEA07LA135,2007,05/28/2007 00:00:00,COLUMBUS,MT,USA,1,HUGHES,369,HUGHES 369
23 | 20070605X00681,HUGHES,369A,MIA07FA098,2007,05/13/2007 00:00:00,MOULTON,AL,USA,1,HUGHES,369,HUGHES 369
24 | 20071119X01805,ROBINSON HELICOPTER,R44,NYC08FA026,2007,11/05/2007 00:00:00,JAMESTOWN,TN,USA,3,ROBINSON,R44,ROBINSON R44
25 | 20070430X00482,ROBINSON HELICOPTER COMPANY,R44 II,CHI07FA114,2007,04/22/2007 00:00:00,BASS LAKE,IN,USA,2,ROBINSON,R44,ROBINSON R44
26 | 20070322X00320,MCDONNELL DOUGLAS,369FF,CHI07MA083,2007,03/11/2007 00:00:00,HAENA,HI,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
27 | 20071231X02014,BELL,206L1,DFW08FA053,2007,12/29/2007 00:00:00,VENICE,LA,USA,1,BELL,206,BELL 206
28 | 20070530X00664,EUROCOPTER,AS 350 B3,DFW07GA119,2007,05/22/2007 00:00:00,SAN ELIZARIO,TX,USA,1,AIRBUS,350,AIRBUS 350
29 | 20070405X00374,ROBINSON,R44 II,DEN07FA079,2007,03/27/2007 00:00:00,PONTE VEDRA BCH,FL,USA,2,ROBINSON,R44,ROBINSON R44
30 | 20070321X00315,AEROSPATIALE,AS350BA,NYC07MA073,2007,03/08/2007 00:00:00,PRINCEVILLE,HI,USA,4,AIRBUS,350,AIRBUS 350
31 | 20080109X00032,BELL,206L-3,NYC08FA071,2007,12/30/2007 00:00:00,CHEROKEE,AL,USA,3,BELL,206,BELL 206
32 | 20070920X01418,BELL,206B,MIA07FA147,2007,09/11/2007 00:00:00,NOKOMIS,FL,USA,2,BELL,206,BELL 206
33 | 20070919X01416,HUGHES,369D,LAX07LA270,2007,09/08/2007 00:00:00,ELLENSBURG,WA,USA,1,HUGHES,369,HUGHES 369
34 | 20070808X01151,ROBINSON,R44 II,SEA07FA223,2007,08/02/2007 00:00:00,EASTON,WA,USA,4,ROBINSON,R44,ROBINSON R44
35 | 20071227X01994,BELL,407,NYC08LA028,2007,11/09/2007 00:00:00,MORRISTOWN,TN,USA,1,BELL,407,BELL 407
36 | 20070802X01089,EUROCOPTER,AS350-B2,LAX07MA231,2007,07/27/2007 00:00:00,PHOENIX,AZ,USA,4,AIRBUS,350,AIRBUS 350
37 | 20070802X01089,EUROCOPTER,AS350-B2,LAX07MA231,2007,07/27/2007 00:00:00,PHOENIX,AZ,USA,4,AIRBUS,350,AIRBUS 350
38 | 20080529X00746,AEROSPATIALE,AS-350-D,SEA08MA136,2008,05/24/2008 00:00:00,AVALON,CA,USA,3,AIRBUS,350,AIRBUS 350
39 | 20080819X01260,ROBINSON HELICOPTER,R22 BETA II,SEA08FA185,2008,08/17/2008 00:00:00,OLALLA,WA,USA,1,ROBINSON,R22,ROBINSON R22
40 | 20080715X01051,BELL,407,DEN08MA116,2008,06/29/2008 00:00:00,FLAGSTAFF,AZ,USA,7,BELL,407,BELL 407
41 | 20080715X01051,BELL,407,DEN08MA116,2008,06/29/2008 00:00:00,FLAGSTAFF,AZ,USA,7,BELL,407,BELL 407
42 | 20080128X00108,ROBINSON,R44,MIA08FA044,2008,01/22/2008 00:00:00,OCHOPEE,FL,USA,2,ROBINSON,R44,ROBINSON R44
43 | 20081211X45825,BELL,206L-4,CEN09FA086,2008,12/11/2008 00:00:00,SABINE PASS,TX,USA,5,BELL,206,BELL 206
44 | 20081019X15543,ROBINSON,R22,ERA09FA022,2008,10/16/2008 00:00:00,DRYDEN,NY,USA,1,ROBINSON,R22,ROBINSON R22
45 | 20080520X00702,EUROCOPTER DEUTSCHLAND GMBH,EC 135 T2+,CHI08FA128,2008,05/10/2008 00:00:00,LA CROSSE,WI,USA,3,AIRBUS,135,AIRBUS 135
46 | 20080909X01417,BELL,206L-1,CHI08FA269,2008,08/31/2008 00:00:00,GREENSBURG,IN,USA,3,BELL,206,BELL 206
47 | 20080321X00357,ROBINSON,R22 BETA II,NYC08FA134,2008,03/13/2008 00:00:00,WILMINGTON,NC,USA,1,ROBINSON,R22,ROBINSON R22
48 | 20081014X22933,BELL,407,WPR09TA012,2008,10/13/2008 00:00:00,SEDONA,AZ,USA,1,BELL,407,BELL 407
49 | 20080505X00592,ROBINSON,R44,DFW08LA122,2008,04/28/2008 00:00:00,BARTLETT,TX,USA,1,ROBINSON,R44,ROBINSON R44
50 | 20080710X01015,SCHWEIZER,269 C-1,LAX08LA213,2008,07/04/2008 00:00:00,SUNOL,CA,USA,2,SCHWEIZER,269,SCHWEIZER 269
51 | 20081013X24743,BELL,206,CEN09FA012,2008,10/13/2008 00:00:00,CONROE,TX,USA,2,BELL,206,BELL 206
52 | 20081104X60811,ROBINSON,R-44,ERA09FA036,2008,11/02/2008 00:00:00,GALLATIN,TN,USA,1,ROBINSON,R44,ROBINSON R44
53 | 20080731X01133,HUGHES,369D,LAX08FA233,2008,07/19/2008 00:00:00,PRICE,UT,USA,3,HUGHES,369,HUGHES 369
54 | 20080222X00227,EUROCOPTER FRANCE,AS350B2,DFW08FA062,2008,02/05/2008 00:00:00,S. PADRE ISLAND,TX,USA,3,AIRBUS,350,AIRBUS 350
55 | 20080421X00524,EUROCOPTER,AS 350 B2,ANC08FA053,2008,04/15/2008 00:00:00,CHICKALOON,AK,USA,4,AIRBUS,350,AIRBUS 350
56 | 20080613X00858,BELL,407,DEN08FA101,2008,06/08/2008 00:00:00,HUNTSVILLE,TX,USA,4,BELL,407,BELL 407
57 | 20080908X01405,ROBINSON,R44 II,DFW08FA218,2008,08/29/2008 00:00:00,RIDGEDALE,MO,USA,2,ROBINSON,R44,ROBINSON R44
58 | 20080925X01525,ROBINSON,R44 II,CHI08FA293,2008,09/21/2008 00:00:00,KENOSHA,WI,USA,2,ROBINSON,R44,ROBINSON R44
59 | 20080201X00130,ROBINSON HELICOPTER,R22 BETA,LAX08FA052,2008,01/25/2008 00:00:00,LOS ANGELES,CA,USA,1,ROBINSON,R22,ROBINSON R22
60 | 20091012X15520,MCDONNELL DOUGLAS HELI CO,369FF,WPR10FA012,2009,10/12/2009 00:00:00,FOSSIL,OR,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
61 | 20090724X05537,ROBINSON HELICOPTER,R44,ERA09FA417,2009,07/23/2009 00:00:00,BOONSBORO,MD,USA,4,ROBINSON,R44,ROBINSON R44
62 | 20090926X65328,EUROCOPTER,AS-350,ERA09FA537,2009,09/25/2009 00:00:00,GEORGETOWN,SC,USA,3,AIRBUS,350,AIRBUS 350
63 | 20090722X34202,HUGHES,369,ERA09FA414,2009,07/22/2009 00:00:00,FRANKLIN,PA,USA,1,HUGHES,369,HUGHES 369
64 | 20090808X42846,EUROCOPTER,AS 350 BA,ERA09MA447,2009,08/08/2009 00:00:00,HOBOKEN,NJ,USA,9,AIRBUS,350,AIRBUS 350
65 | 20090104X12037,SIKORSKY,S-76C,CEN09MA117,2009,01/04/2009 00:00:00,MORGAN CITY,LA,USA,8,SIKORSKY,76,SIKORSKY 76
66 | 20091017X64138,ROBINSON HELICOPTER,R22 BETA,CEN10FA019,2009,10/14/2009 00:00:00,TAHLEQUAH,OK,USA,2,ROBINSON,R22,ROBINSON R22
67 | 20090901X80259,ROBINSON,R44,ERA09FA497,2009,09/01/2009 00:00:00,JACKSON,MS,USA,1,ROBINSON,R44,ROBINSON R44
68 | 20090225X75532,HUGHES,369F,ERA09LA173,2009,02/24/2009 00:00:00,MOYOCK,NC,USA,1,HUGHES,369,HUGHES 369
69 | 20090611X91250,ROBINSON HELICOPTER,R22 BETA,WPR09FA284,2009,06/11/2009 00:00:00,MORRISTOWN,AZ,USA,1,ROBINSON,R22,ROBINSON R22
70 | 20090920X34134,ROBINSON HELICOPTER,R22 BETA,WPR09FA459,2009,09/20/2009 00:00:00,FOREST GROVE,OR,USA,2,ROBINSON,R22,ROBINSON R22
71 | 20091114X82100,AEROSPATIALE,AS350BA,WPR10FA055,2009,11/14/2009 00:00:00,DOYLE,CA,USA,3,AIRBUS,350,AIRBUS 350
72 | 20090309X04818,BELL,206-L4,CEN09FA193,2009,03/08/2009 00:00:00,MOUNDRIDGE,KS,USA,1,BELL,206,BELL 206
73 | 20090201X10015,ROBINSON HELICOPTER,R22 BETA II,WPR09FA104,2009,01/31/2009 00:00:00,FILLMORE,CA,USA,1,ROBINSON,R22,ROBINSON R22
74 | 20090610X23159,AGUSTA SPA,A109E,CEN09PA348,2009,06/09/2009 00:00:00,SANTA FE,NM,USA,2,AGUSTA,109,AGUSTA 109
75 | 20101015X73141,BELL,206B,CEN11GA020,2010,10/15/2010 00:00:00,CLARKSON VALLEY,MO,USA,1,BELL,206,BELL 206
76 | 20100806X55641,ROBINSON HELICOPTER COMPANY,R44 II,ERA10FA403,2010,08/02/2010 00:00:00,BLAIRSVILLE,GA,USA,2,ROBINSON,R44,ROBINSON R44
77 | 20100105X94046,BELL,206B,WPR10GA097,2010,01/05/2010 00:00:00,AUBERRY,CA,USA,4,BELL,206,BELL 206
78 | 20100728X92614,AMERICAN EUROCOPTER LLC,AS 350 B3,WPR10FA371,2010,07/28/2010 00:00:00,TUCSON,AZ,USA,3,AIRBUS,350,AIRBUS 350
79 | 20100621X31143,ROBINSON HELICOPTER,R44,ANC10LA053,2010,06/19/2010 00:00:00,UNALASKA,AK,USA,1,ROBINSON,R44,ROBINSON R44
80 | 20101103X83727,BELL,206,CEN11FA053,2010,11/03/2010 00:00:00,MEEKER,CO,USA,1,BELL,206,BELL 206
81 | 20100705X12909,ROBINSON HELICOPTER,R44,ERA10LA348,2010,07/05/2010 00:00:00,MARION,KY,USA,1,ROBINSON,R44,ROBINSON R44
82 | 20101030X30541,MD HELICOPTERS INC,369E,ERA11FA042,2010,10/30/2010 00:00:00,THOMAS,WV,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
83 | 20100831X75841,BELL HELICOPTER TEXTRON,206L-1,CEN10FA509,2010,08/31/2010 00:00:00,WALNUT GROVE,AR,USA,3,BELL,206,BELL 206
84 | 20100214X92140,EUROCOPTER,EC135,WPR10FA133,2010,02/14/2010 00:00:00,CAVE CREEK,AZ,USA,5,AIRBUS,135,AIRBUS 135
85 | 20100526X84456,SCHWEIZER,269C-1,ERA10FA283,2010,05/26/2010 00:00:00,BOXBOROUGH,MA,USA,1,SCHWEIZER,269,SCHWEIZER 269
86 | 20100306X05331,ROBINSON HELICOPTER,R22 BETA II,CEN10FA139,2010,03/06/2010 00:00:00,COTULLA,TX,USA,2,ROBINSON,R22,ROBINSON R22
87 | 20100717X71900,ROBINSON HELICOPTER COMPANY,R44 II,WPR10LA354,2010,07/16/2010 00:00:00,SALT LAKE CITY,UT,USA,1,ROBINSON,R44,ROBINSON R44
88 | 20100206X10511,AEROSPATIALE,AS350,CEN10FA113,2010,02/05/2010 00:00:00,EL PASO,TX,USA,3,AIRBUS,350,AIRBUS 350
89 | 20110102X35752,EUROCOPTER DEUTSCHLAND GMBH,EC 135 P2,ERA11FA101,2010,12/31/2010 00:00:00,WEYERS CAVE,VA,USA,2,AIRBUS,135,AIRBUS 135
90 | 20100325X93604,EUROCOPTER,AS-350-B3,ERA10MA188,2010,03/25/2010 00:00:00,BROWNSVILLE,TN,USA,3,AIRBUS,350,AIRBUS 350
91 | 20100602X01732,ROBINSON,R22 BETA,WPR10FA277,2010,06/02/2010 00:00:00,SPOKANE,WA,USA,1,ROBINSON,R22,ROBINSON R22
92 | 20100722X21328,EUROCOPTER,AS 350 B2,CEN10FA424,2010,07/22/2010 00:00:00,KINGFISHER,OK,USA,2,AIRBUS,350,AIRBUS 350
93 | 20121010X41638,BELL,206B,CEN13FA009,2012,10/10/2012 00:00:00,CROWLEY,LA,USA,1,BELL,206,BELL 206
94 | 20121010X63824,BELL,407,ERA13FA014,2012,10/09/2012 00:00:00,COOLBAUGH TOWNSHIP,PA,USA,2,BELL,407,BELL 407
95 | 20121012X13500,ROBINSON HELICOPTER COMPANY,R44 II,CEN13FA010,2012,10/11/2012 00:00:00,BLANCO,TX,USA,3,ROBINSON,R44,ROBINSON R44
96 | 20120910X05133,ROBINSON HELICOPTER,R22 BETA,CEN12FA621,2012,09/10/2012 00:00:00,HOUSTON,TX,USA,2,ROBINSON,R22,ROBINSON R22
97 | 20120826X42003,BELL,407,ERA12FA527,2012,08/24/2012 00:00:00,ABINGDON,VA,USA,1,BELL,407,BELL 407
98 | 20120216X03340,BELL,407,WPR12GA106,2012,02/15/2012 00:00:00,MORAN JUNCTION,WY,USA,1,BELL,407,BELL 407
99 | 20120701X53951,AEROSPATIALE,AS350B,WPR12FA282,2012,06/30/2012 00:00:00,CAMP VERDE,AZ,USA,4,AIRBUS,350,AIRBUS 350
100 | 20121130X74908,ROBINSON HELICOPTER,R22 BETA II,ERA13FA070,2012,11/30/2012 00:00:00,APOLLO BEACH,FL,USA,1,ROBINSON,R22,ROBINSON R22
101 | 20120709X83554,ROBINSON HELICOPTER,R22 BETA,WPR12FA298,2012,07/09/2012 00:00:00,MURRIETA,CA,USA,1,ROBINSON,R22,ROBINSON R22
102 | 20121115X43423,HUGHES,369D,ERA13LA057,2012,11/15/2012 00:00:00,CORNING,NY,USA,2,HUGHES,369,HUGHES 369
103 | 20120119X92431,ROBINSON,R44 II,CEN12FA139,2012,01/19/2012 00:00:00,CENTERVILLE,LA,USA,2,ROBINSON,R44,ROBINSON R44
104 | 20121128X12341,HUGHES,369,CEN13FA075,2012,11/27/2012 00:00:00,CHILDRESS,TX,USA,1,HUGHES,369,HUGHES 369
105 | 20120529X90616,BELL,206-L4,CEN12FA321,2012,05/28/2012 00:00:00,GULF OF MEXICO,,USA,1,BELL,206,BELL 206
106 | 20120612X20331,ROBINSON HELICOPTER COMPANY,R44 II,WPR12LA259,2012,06/12/2012 00:00:00,EAST WENATCHEE,WA,USA,1,ROBINSON,R44,ROBINSON R44
107 | 20121126X75106,ROBINSON HELICOPTER COMPANY,R44 II,WPR13FA054,2012,11/25/2012 00:00:00,CORONA,CA,USA,1,ROBINSON,R44,ROBINSON R44
108 | 20121005X04242,BELL,407,CEN13FA003,2012,10/05/2012 00:00:00,INTRACOASTAL CITY,LA,USA,1,BELL,407,BELL 407
109 | 20130222X12624,EUROCOPTER,AS 350 B2,CEN13FA174,2013,02/22/2013 00:00:00,OKLAHOMA CITY,OK,USA,2,AIRBUS,350,AIRBUS 350
110 | 20131009X50051,BELL,206L 3,CEN14FA004,2013,10/09/2013 00:00:00,"VENICE, LA",GM,USA,1,BELL,206,BELL 206
111 | 20130331X41252,EUROCOPTER,AS350,ANC13GA036,2013,03/30/2013 00:00:00,TALKEETNA,AK,USA,3,AIRBUS,350,AIRBUS 350
112 | 20130525X61706,ROBINSON HELICOPTER COMPANY,R44 II,CEN13FA295,2013,05/24/2013 00:00:00,CROSS TIMBERS,MO,USA,2,ROBINSON,R44,ROBINSON R44
113 | 20130102X13158,BELL,206,WPR13FA080,2013,01/02/2013 00:00:00,DELANO,CA,USA,1,BELL,206,BELL 206
114 | 20130727X31220,ROBINSON HELICOPTER COMPANY,R44 II,WPR13FA343,2013,07/27/2013 00:00:00,THOMPSON FALLS,MT,USA,1,ROBINSON,R44,ROBINSON R44
115 | 20130210X93918,BELL,206B,WPR13FA119,2013,02/10/2013 00:00:00,ACTON,CA,USA,3,BELL,206,BELL 206
116 | 20130218X22833,BELL,206B,WPR13GA128,2013,02/18/2013 00:00:00,EUREKA,NV,USA,1,BELL,206,BELL 206
117 | 20130427X30522,BELL,206B,WPR13FA208,2013,04/27/2013 00:00:00,SHEPHERD,MT,USA,1,BELL,206,BELL 206
118 | 20130607X04715,BELL HELICOPTER TEXTRON,206L-1,ERA13FA273,2013,06/06/2013 00:00:00,MANCHESTER,KY,USA,3,BELL,206,BELL 206
119 | 20131022X92949,EUROCOPTER,AS 350 B3,ERA14FA010,2013,10/22/2013 00:00:00,SOMERVILLE,TN,USA,3,AIRBUS,350,AIRBUS 350
120 | 20130102X35708,BELL HELICOPTER,407,CEN13FA122,2013,01/02/2013 00:00:00,CLEAR LAKE,IA,USA,3,BELL,407,BELL 407
121 | 20130403X65155,ROBINSON,R44,ERA13FA186,2013,04/03/2013 00:00:00,MIAMI,FL,USA,2,ROBINSON,R44,ROBINSON R44
122 | 20131007X44153,MCDONNELL DOUGLAS HELI CO,369,WPR14LA008,2013,10/06/2013 00:00:00,PADUCAH,TX,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
123 | 20130831X54252,ROBINSON,R44 II,CEN13FA517,2013,08/31/2013 00:00:00,CABALLO,NM,USA,3,ROBINSON,R44,ROBINSON R44
124 | 20130315X34542,SIKORSKY,S-76A++,CEN13FA192,2013,03/15/2013 00:00:00,GRAND LAKE,LA,USA,3,SIKORSKY,76,SIKORSKY 76
125 | 20130805X31941,HUGHES,369D,CEN13LA461,2013,08/05/2013 00:00:00,ACKERLY,TX,USA,2,HUGHES,369,HUGHES 369
126 | 20130612X12326,EUROCOPTER,AS350B2,CEN13FA344,2013,06/11/2013 00:00:00,TALIHINA,OK,USA,1,AIRBUS,350,AIRBUS 350
127 | 20140127X44720,BELL,206L 3,CEN14FA122,2014,01/27/2014 00:00:00,SILT,CO,USA,3,BELL,206,BELL 206
128 | 20140523X44003,ROBINSON HELICOPTER,R22 BETA,WPR14FA203,2014,05/23/2014 00:00:00,SANTA PAULA,CA,USA,1,ROBINSON,R22,ROBINSON R22
129 | 20140318X21532,EUROCOPTER,AS 350 B2,WPR14FA137,2014,03/18/2014 00:00:00,SEATTLE,WA,USA,2,AIRBUS,350,AIRBUS 350
130 | 20140529X73728,ROBINSON HELICOPTER COMPANY,R44 II,ANC14FA030,2014,05/28/2014 00:00:00,CHUGIAK,AK,USA,1,ROBINSON,R44,ROBINSON R44
131 | 20140612X31159,BELL,206 L4,CEN14FA286,2014,06/11/2014 00:00:00,SOUTH TIMBALIER PLATFORM,GM,USA,2,BELL,206,BELL 206
132 | 20150101X15630,BELL,206,WPR15FA072,2014,12/31/2014 00:00:00,BENSON,AZ,USA,2,BELL,206,BELL 206
133 | 20140819X50947,MCDONNELL DOUGLAS HELICOPTER,369E,ERA14FA396,2014,08/19/2014 00:00:00,NORTHPORT,AL,USA,2,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
134 | 20140407X83620,ROBINSON HELICOPTER,R22 BETA,WPR14FA158,2014,04/06/2014 00:00:00,GREEN RIVER,UT,USA,2,ROBINSON,R22,ROBINSON R22
135 | 20140208X05221,ROBINSON HELICOPTER COMPANY,R44 II,ERA14FA115,2014,02/08/2014 00:00:00,PANACEA,FL,USA,2,ROBINSON,R44,ROBINSON R44
136 | 20141023X01333,ROBINSON HELICOPTER COMPANY,R44 II,ERA15FA025,2014,10/23/2014 00:00:00,FREDERICK,MD,USA,3,ROBINSON,R44,ROBINSON R44
137 | 20140518X03315,AMERICAN EUROCOPTER CORP,AS350B3,WPR14FA195,2014,05/18/2014 00:00:00,PEACH SPRINGS,AZ,USA,1,AIRBUS,350,AIRBUS 350
138 | 20140723X81618,BELL,206A,WPR14FA310,2014,07/23/2014 00:00:00,WENATCHEE,WA,USA,1,BELL,206,BELL 206
139 | 20141202X73240,ROBINSON HELICOPTER COMPANY,R44,WPR15FA051,2014,12/02/2014 00:00:00,BOUNTIFUL,UT,USA,2,ROBINSON,R44,ROBINSON R44
140 | 20141229X15321,ROBINSON HELICOPTER,R22 BETA,ERA15FA085,2014,12/29/2014 00:00:00,LAKE WORTH,FL,USA,1,ROBINSON,R22,ROBINSON R22
141 | 20141004X60516,BELL HELICOPTER TEXTRON,206L 1,CEN15FA003,2014,10/04/2014 00:00:00,WICHITA FALLS,TX,USA,3,BELL,206,BELL 206
142 | 20140908X10448,ROBINSON HELICOPTER COMPANY,R44 II,CEN14LA487,2014,09/06/2014 00:00:00,MACEDONIA,IA,USA,1,ROBINSON,R44,ROBINSON R44
143 | 20140717X70001,AGUSTA SPA,A109E,CEN14FA369,2014,07/17/2014 00:00:00,NEWKIRK,NM,USA,3,AGUSTA,109,AGUSTA 109
144 | 20150110X10017,ROBINSON HELICOPTER,R22 BETA,ERA15FA096,2015,01/10/2015 00:00:00,CATANO,PR,USA,1,ROBINSON,R22,ROBINSON R22
145 | 20150703X00859,AIRBUS HELICOPTERS INC,AS350B3E,CEN15MA290,2015,07/03/2015 00:00:00,FRISCO,CO,USA,1,AIRBUS,350,AIRBUS 350
146 | 20150308X10201,AIRBUS HELICOPTERS (EUROCOPTE,EC-130-B4,CEN15FA164,2015,03/06/2015 00:00:00,ST LOUIS,MO,USA,1,AIRBUS,130,AIRBUS 130
147 | 20150330X73700,BELL HELICOPTER TEXTRON,206 L-1,ERA15FA173,2015,03/30/2015 00:00:00,SAUCIER,MS,USA,2,BELL,206,BELL 206
148 | 20150702X24434,SCHWEIZER,269C,WPR15FA205,2015,07/01/2015 00:00:00,NEWBERG,OR,USA,2,SCHWEIZER,269,SCHWEIZER 269
149 | 20150313X72113,EUROCOPTER,AS 350 B2,CEN15FA171,2015,03/12/2015 00:00:00,EUFAULA,OK,USA,1,AIRBUS,350,AIRBUS 350
150 | 20151211X13514,BELL,407,WPR16FA037,2015,12/10/2015 00:00:00,MCFARLAND,CA,USA,4,BELL,407,BELL 407
151 | 20150322X92548,ROBINSON HELICOPTER COMPANY,R44 II,ERA15FA164,2015,03/22/2015 00:00:00,ORLANDO,FL,USA,3,ROBINSON,R44,ROBINSON R44
152 | 20151216X13718,AIRBUS HELICOPTERS,AS350,WPR16FA040,2015,12/15/2015 00:00:00,SUPERIOR,AZ,USA,2,AIRBUS,350,AIRBUS 350
153 | 20150407X12857,HUGHES,369D,ERA15FA178,2015,04/06/2015 00:00:00,CHEROKEE,AL,USA,1,HUGHES,369,HUGHES 369
154 | 20151118X05037,AIRBUS HELICOPTERS,AS350B3E,WPR16FA029,2015,11/18/2015 00:00:00,CARLSBAD,CA,USA,2,AIRBUS,350,AIRBUS 350
155 | 20161116X00108,HUGHES,369D/500D,WPR17FA021,2016,11/15/2016 00:00:00,PUKOO,HI,USA,2,HUGHES,369,HUGHES 369
156 | 20160326X80544,EUROCOPTER,AS 350 B2,ERA16FA140,2016,03/26/2016 00:00:00,ENTERPRISE,AL,USA,4,AIRBUS,350,AIRBUS 350
157 | 20160504X30424,MCDONNELL DOUGLAS HELICOPTER,369E,CEN16FA171,2016,05/04/2016 00:00:00,REEDSVILLE,WI,USA,1,MCDONNELL DOUGLAS,369,MCDONNELL DOUGLAS 369
158 | 20160328X03918,ROBINSON,R44,ERA16FA143,2016,03/27/2016 00:00:00,CANADENSIS,PA,USA,1,ROBINSON,R44,ROBINSON R44
159 | 20160218X71040,BELL,206B,WPR16FA072,2016,02/18/2016 00:00:00,HONOLULU,HI,USA,1,BELL,206,BELL 206
160 | 20160711X32921,BELL HELICOPTER TEXTRON CANADA,407,ERA16FA248,2016,07/11/2016 00:00:00,HICKORY,KY,USA,1,BELL,407,BELL 407
161 | 20160804X45514,SCHWEIZER,269C 1,CEN16FA304,2016,08/03/2016 00:00:00,JEANERETTE,LA,USA,1,SCHWEIZER,269,SCHWEIZER 269
162 | 20160404X74644,BELL,206,ERA16FA144,2016,04/04/2016 00:00:00,PIGEON FORGE,TN,USA,5,BELL,206,BELL 206
163 | 20160507X31120,AIRBUS,AS350,ANC16FA023,2016,05/06/2016 00:00:00,SKAGWAY,AK,USA,1,AIRBUS,350,AIRBUS 350
164 | 20160612X85856,ROBINSON HELICOPTER COMPANY,R44 II,CEN16FA215,2016,06/12/2016 00:00:00,JONESBORO,AR,USA,1,ROBINSON,R44,ROBINSON R44
165 |
--------------------------------------------------------------------------------
/docs/src/_static/committees.csv:
--------------------------------------------------------------------------------
1 | ocd_prop_id,calaccess_prop_id,ccdc_prop_id,prop_name,ccdc_committee_id,calaccess_committee_id,committee_name,committee_position
2 | ocd-contest/b51dc64d-3562-4913-a190-69f5088c22a6,1376258,70,PROPOSITION 051 - SCHOOL BONDS. FUNDING FOR K-12 SCHOOL AND COMMUNITY COLLEGE FACILITIES. INITIATIVE STATUTORY AMENDMENT.,382,1374469,"YES ON PROPOSITION 51 - CALIFORNIANS FOR QUALITY SCHOOLS, SPONSORED AND FUNDED BY COALITION FOR ADEQUATE SCHOOL HOUSING ISSUES COMMITTEE AND CALIFORNIA BUILDING INDUSTRY ASSOCIATION ISSUES COMMITTEE",SUPPORT
3 | ocd-contest/b51dc64d-3562-4913-a190-69f5088c22a6,1376258,70,PROPOSITION 051 - SCHOOL BONDS. FUNDING FOR K-12 SCHOOL AND COMMUNITY COLLEGE FACILITIES. INITIATIVE STATUTORY AMENDMENT.,383,1220380,"COMMUNITY COLLEGE FACILITY COALITION ISSUES COMMITTEE, YES ON 51",SUPPORT
4 | ocd-contest/b51dc64d-3562-4913-a190-69f5088c22a6,1376258,70,PROPOSITION 051 - SCHOOL BONDS. FUNDING FOR K-12 SCHOOL AND COMMUNITY COLLEGE FACILITIES. INITIATIVE STATUTORY AMENDMENT.,384,1282321,"TORLAKSON'S INVEST IN CALIFORNIA A BALLOT MEASURE COMMITTEE TO SUPPORT PROPOSITION 51, SUPERINTENDENT TOM",SUPPORT
5 | ocd-contest/b51dc64d-3562-4913-a190-69f5088c22a6,1376258,70,PROPOSITION 051 - SCHOOL BONDS. FUNDING FOR K-12 SCHOOL AND COMMUNITY COLLEGE FACILITIES. INITIATIVE STATUTORY AMENDMENT.,385,1382843,CALIFORNIA TAXPAYERS AND EDUCATORS OPPOSED TO SPRAWL AND DEVELOPER ABUSE,OPPOSE
6 | ocd-contest/85990193-9d6f-4600-b8e7-bf1317841d82,1362198,71,PROPOSITION 052 - STATE FEES ON HOSPITALS. FEDERAL MEDI-CAL MATCHING FUNDS. INITIATIVE STATUTORY AND CONSTITUTIONAL AMENDMENT.,386,1362973,YES ON PROPOSITION 52 - A COALITION OF CALIFORNIA ASSOCIATION OF HOSPITALS AND HEALTH SYSTEMS AND NON-PROFIT HEALTH CARE ORGANIZATIONS,SUPPORT
7 | ocd-contest/85990193-9d6f-4600-b8e7-bf1317841d82,1362198,71,PROPOSITION 052 - STATE FEES ON HOSPITALS. FEDERAL MEDI-CAL MATCHING FUNDS. INITIATIVE STATUTORY AND CONSTITUTIONAL AMENDMENT.,387,1381488,"CALIFORNIANS FOR HOSPITAL ACCOUNTABILITY AND QUALITY CARE - NO ON 52, SPONSORED BY SERVICE EMPLOYEES INTERNATIONAL UNION - UNITED HEALTHCARE WORKERS WEST",OPPOSE
8 | ocd-contest/85990193-9d6f-4600-b8e7-bf1317841d82,1362198,71,PROPOSITION 052 - STATE FEES ON HOSPITALS. FEDERAL MEDI-CAL MATCHING FUNDS. INITIATIVE STATUTORY AND CONSTITUTIONAL AMENDMENT.,388,1373047,"SERVICE EMPLOYEES INTERNATIONAL UNION, UNITED HEALTHCARE WORKERS WEST (NONPROFIT 501 (C)(5))",OPPOSE
9 | ocd-contest/9fb6a199-7520-433c-a290-83e016a9d389,1376142,72,PROPOSITION 053 - REVENUE BONDS. STATEWIDE VOTER APPROVAL. INITIATIVE CONSTITUTIONAL AMENDMENT.,389,1376040,YES ON 53 - STOP BLANK CHECKS,SUPPORT
10 | ocd-contest/9fb6a199-7520-433c-a290-83e016a9d389,1376142,72,PROPOSITION 053 - REVENUE BONDS. STATEWIDE VOTER APPROVAL. INITIATIVE CONSTITUTIONAL AMENDMENT.,390,1378875,"NO ON PROP 53 - CALIFORNIANS TO PROTECT LOCAL CONTROL, A COALITION OF PUBLIC SAFETY, LOCAL GOVERNMENT, BUSINESS AND LABOR ORGANIZATIONS, GOVERNOR BROWN AND TAXPAYERS",OPPOSE
11 | ocd-contest/9fb6a199-7520-433c-a290-83e016a9d389,1376142,72,PROPOSITION 053 - REVENUE BONDS. STATEWIDE VOTER APPROVAL. INITIATIVE CONSTITUTIONAL AMENDMENT.,391,761010,"CA BUSINESS PAC, SP0NSORED BY CA CHAMBER OF COMMERCE (AKA CALBUSPAC)",OPPOSE
12 | ocd-contest/9fb6a199-7520-433c-a290-83e016a9d389,1376142,72,PROPOSITION 053 - REVENUE BONDS. STATEWIDE VOTER APPROVAL. INITIATIVE CONSTITUTIONAL AMENDMENT.,392,1389930,"NO ON 53, NEIGHBORS DEFENDING LOCAL CONTROL",OPPOSE
13 | ocd-contest/e0c5f9f0-63a9-4c15-9a5c-017e20ac15bc,1381642,73,PROPOSITION 054 - LEGISLATURE. LEGISLATION AND PROCEEDINGS. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,396,1389997,CALIFORNIA COMMON CAUSE -- YES ON 54 AND 59 (NONPROFIT 501(C)(4),SUPPORT
14 | ocd-contest/e0c5f9f0-63a9-4c15-9a5c-017e20ac15bc,1381642,73,PROPOSITION 054 - LEGISLATURE. LEGISLATION AND PROCEEDINGS. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,393,1381029,"YES ON 54 - VOTERS FIRST, NOT SPECIAL INTERESTS - SPONSORED BY HOLD POLITICIANS ACCOUNTABLE",SUPPORT
15 | ocd-contest/e0c5f9f0-63a9-4c15-9a5c-017e20ac15bc,1381642,73,PROPOSITION 054 - LEGISLATURE. LEGISLATION AND PROCEEDINGS. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,394,1386494,"PROTEUS ACTION LEAGUE NON-PROFIT 501 (C)(4) ORGANIZATION, OPPOSING MEASURE 66 AND SUPPORTING MEASURES 54 AND 59",SUPPORT
16 | ocd-contest/e0c5f9f0-63a9-4c15-9a5c-017e20ac15bc,1381642,73,PROPOSITION 054 - LEGISLATURE. LEGISLATION AND PROCEEDINGS. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,395,1385928,CALIFORNIANS FOR AN EFFECTIVE LEGISLATURE,OPPOSE
17 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,397,1384591,"MILLION VOTER PROJECT ACTION FUND - YES ON 55 AND 57, SPONSORED BY SOCIAL JUSTICE ORGANIZATIONS",SUPPORT
18 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,398,1381382,"YES ON 55 - CALIFORNIANS FOR BUDGET STABILITY, SPONSORED BY TEACHERS, HEALTH CARE PROVIDERS, DOCTORS AND LABOR ORGANIZATIONS",SUPPORT
19 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,399,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
20 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,400,1390602,"COMMON SENSE KIDS ACTION, INC., YES ON PROPS. 55 AND 56 (NONPROFIT 501 (C) (4))",SUPPORT
21 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,401,1385538,"CALIFORNIA KIDS CAMPAIGN, YES ON PROPS 55 & 56, SPONSORED AND MAJOR FUNDING BY COMMON SENSE KIDS ACTION, INC.",SUPPORT
22 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,402,1385886,"NO ON PROPOSITION 55, CALIFORNIA'S FUTURE PAC, SPONSORED BY THE KERSTEN INSTITUTE FOR GOVERNANCE & PUBLIC POLICY",OPPOSE
23 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,403,1372760,"PICO CALIFORNIA - YES ON 55, 56, AND 57 (NON PROFIT 501 (C) (3))",SUPPORT
24 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,404,931704,"UNITED TEACHERS LOS ANGELES-POLITICAL ACTION COUNCIL OF EDUCATORS (PACE) ISSUES, A COMMITTEE FOR PROPOSITIONS 55 AND 58",SUPPORT
25 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",405,1388865,"PROTECT SMALL BUSINESS AND SMOKE FREE ALTERNATIVES, NO ON 56; SPONSORED BY SMOKE-FREE ALTERNATIVES TRADE ASSOCIATION",OPPOSE
26 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",406,1383858,"FIGHT CANCER - YES ON 56, SPONSORED BY AMERICAN CANCER SOCIETY, INC. AND AMERICAN CANCER SOCIETY CANCER ACTION NETWORK, INC.",SUPPORT
27 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",407,1386637,"NO ON 56 - STOP THE SPECIAL INTEREST TAX GRAB. MAJOR FUNDING BY PHILIP MORRIS USA INC. AND R.J. REYNOLDS TOBACCO COMPANY, WITH A COALITION OF TAXPAYERS, EDUCATORS, HEALTHCARE PROFESSIONALS, LAW ...",OPPOSE
28 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",408,1377991,"YES ON 56 - SAVES LIVES CALIFORNIA, A COALITION OF DOCTORS, DENTISTS, HEALTH PLANS, LABOR, HOSPITALS, LAW ENFORCEMENT, AND NON-PROFIT HEALTH ADVOCATE ORGANIZATIONS",SUPPORT
29 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",409,1384591,"MILLION VOTER PROJECT ACTION FUND - YES ON 55 AND 57, SPONSORED BY SOCIAL JUSTICE ORGANIZATIONS",SUPPORT
30 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",410,1385538,"CALIFORNIA KIDS CAMPAIGN, YES ON PROPS 55 & 56, SPONSORED AND MAJOR FUNDING BY COMMON SENSE KIDS ACTION, INC.",SUPPORT
31 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",411,1372760,"PICO CALIFORNIA - YES ON 55, 56, AND 57 (NON PROFIT 501 (C) (3))",SUPPORT
32 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",412,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
33 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",413,1389668,YES ON 56 STOP CANCER - PLANNED PARENTHOOD OF ORANGE AND SAN BERNARDINO COUNTIES' COMMUNITY ACTION FUND (NON PROFIT 501(C)(4)),SUPPORT
34 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",414,1389484,"CALIFORNIA CITIZENS AGAINST SPECIAL INTERESTS AND WASTEFUL TAXES, NO ON PROP. 56",OPPOSE
35 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",415,1388518,YES ON 56 STOP CANCER - PLANNED PARENTHOOD ADVOCATES MAR MONTE (NON PROFIT 501 (C)(4)),SUPPORT
36 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",416,1390602,"COMMON SENSE KIDS ACTION, INC., YES ON PROPS. 55 AND 56 (NONPROFIT 501 (C) (4))",SUPPORT
37 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,417,1385745,FUND FOR POLICY REFORM (NONPROFIT 501(C)(4)),SUPPORT
38 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,418,1392066,FWD.US (NONPROFIT 501(C)(4)) IN SUPPORT OF PROPOSITION 57 WITH HELP FROM CITIZENS FOR PUBLIC SAFETY AND OPPORTUNITY,SUPPORT
39 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,419,1382912,"YES ON PROP. 57, CALIFORNIANS AND GOVERNOR BROWN FOR PUBLIC SAFETY AND REHABILITATION",SUPPORT
40 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,420,1384591,"MILLION VOTER PROJECT ACTION FUND - YES ON 55 AND 57, SPONSORED BY SOCIAL JUSTICE ORGANIZATIONS",SUPPORT
41 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,421,1387575,CIVIC PARTICIPATION ACTION FUND - YES ON 57 (NONPROFIT 501(C)(4)),SUPPORT
42 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,422,1386627,NO ON 57 - STOP EARLY RELEASE OF VIOLENT CRIMINALS (SERVC),OPPOSE
43 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,423,1387648,CALIFORNIA CALLS ACTION FUND - YES ON 57 (NONPROFIT 501(C)(4)),SUPPORT
44 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,424,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
45 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,425,1391327,OPEN PHILANTHROPY ACTION FUND YES ON 57 (NONPROFIT 501(C)(4)),SUPPORT
46 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,426,1336580,"LOS ANGELES POLICE PROTECTIVE LEAGUE ISSUES PAC - YES ON 66, NO ON 57",OPPOSE
47 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,427,1378703,CALIFORNIA CALLS ACTION FUND (NONPROFIT 501(C)(4)),SUPPORT
48 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,428,1346267,CALIFORNIA STATEWIDE LAW ENFORCEMENT ASSOCIATION ISSUES COMMITTEE (NON-PROFIT 501 (C) 5): YES ON PROPOSITION 57,SUPPORT
49 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,429,1372760,"PICO CALIFORNIA - YES ON 55, 56, AND 57 (NON PROFIT 501 (C) (3))",SUPPORT
50 | ocd-contest/7476a546-1615-41f7-8c7a-f07256c81303,1382395,77,"PROPOSITION 058 - SB 1174 (CHAPTER 753, STATUTES OF 2014), LARA. ENGLISH LANGUAGE EDUCATION",430,1386477,"YES ON 58, CALIFORNIANS FOR ENGLISH PROFICIENCY SPONSORED BY TEACHERS AND SERVICE EMPLOYEES ORGANIZATIONS",SUPPORT
51 | ocd-contest/7476a546-1615-41f7-8c7a-f07256c81303,1382395,77,"PROPOSITION 058 - SB 1174 (CHAPTER 753, STATUTES OF 2014), LARA. ENGLISH LANGUAGE EDUCATION",431,1374153,"LARA BALLOT MEASURE COMMITTEE; CALIFORNIANS FOR A 21ST CENTURY ECONOMY - YES ON 58, A RICARDO",SUPPORT
52 | ocd-contest/7476a546-1615-41f7-8c7a-f07256c81303,1382395,77,"PROPOSITION 058 - SB 1174 (CHAPTER 753, STATUTES OF 2014), LARA. ENGLISH LANGUAGE EDUCATION",432,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
53 | ocd-contest/7476a546-1615-41f7-8c7a-f07256c81303,1382395,77,"PROPOSITION 058 - SB 1174 (CHAPTER 753, STATUTES OF 2014), LARA. ENGLISH LANGUAGE EDUCATION",433,931704,"UNITED TEACHERS LOS ANGELES-POLITICAL ACTION COUNCIL OF EDUCATORS (PACE) ISSUES, A COMMITTEE FOR PROPOSITIONS 55 AND 58",SUPPORT
54 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",434,1387856,MAKE THEM LISTEN - YES ON 59,SUPPORT
55 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",435,1381423,"YES ON 59, CALIFORNIA CLEAN MONEY ACTION FUND TO OVERTURN CITIZENS UNITED (NON PROFIT 501(C)4)",SUPPORT
56 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",436,1386494,"PROTEUS ACTION LEAGUE NON-PROFIT 501 (C)(4) ORGANIZATION, OPPOSING MEASURE 66 AND SUPPORTING MEASURES 54 AND 59",SUPPORT
57 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",437,1360075,CALIFORNIA MOVE TO AMEND,SUPPORT
58 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",438,1389997,CALIFORNIA COMMON CAUSE -- YES ON 54 AND 59 (NONPROFIT 501(C)(4),SUPPORT
59 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",439,1386909,"OVERTURN CITIZENS UNITED, YES ON 59",SUPPORT
60 | ocd-contest/9cee6ef5-cd54-4423-9c29-66c7823c1c3a,1376195,79,PROPOSITION 060- ADULT FILMS. CONDOMS. HEALTH REQUIREMENTS. INITIATIVE STATUTE.,440,1356566,"YES ON PROP 60, FOR ADULT INDUSTRY RESPONSIBILITY (FAIR) COMMITTEE, WITH MAJOR FUNDING BY AIDS HEALTHCARE FOUNDATION",SUPPORT
61 | ocd-contest/9cee6ef5-cd54-4423-9c29-66c7823c1c3a,1376195,79,PROPOSITION 060- ADULT FILMS. CONDOMS. HEALTH REQUIREMENTS. INITIATIVE STATUTE.,441,1385139,"NO ON PROPOSITION 60, CALIFORNIANS AGAINST WORKER HARASSMENT, SPONSORED BY THE FREE SPEECH COALITION",OPPOSE
62 | ocd-contest/6b264272-925d-4d31-a69f-4543fa63a819,1377343,80,PROPOSITION 061- STATE PRESCRIPTION DRUG PURCHASES. PRICING STANDARDS. INITIATIVE STATUTE.,442,1379198,"NO ON PROP 61 - CALIFORNIANS AGAINST THE DECEPTIVE RX PROPOSITION, A COALITION OF VETERANS DOCTORS PATIENT ADVOCATES SENIORS TAXPAYERS AND MEMBERS OF PHARMACEUTICAL RESEARCH AND MANUFACTURERS OF AMER.",OPPOSE
63 | ocd-contest/6b264272-925d-4d31-a69f-4543fa63a819,1377343,80,PROPOSITION 061- STATE PRESCRIPTION DRUG PURCHASES. PRICING STANDARDS. INITIATIVE STATUTE.,443,1376791,"YES ON PROP 61, CALIFORNIANS FOR LOWER DRUG PRICES, WITH MAJOR FUNDING BY AIDS HEALTHCARE FOUNDATION AND CALIFORNIA NURSES ASSOCIATION PAC",SUPPORT
64 | ocd-contest/6b264272-925d-4d31-a69f-4543fa63a819,1377343,80,PROPOSITION 061- STATE PRESCRIPTION DRUG PURCHASES. PRICING STANDARDS. INITIATIVE STATUTE.,444,1387641,"CONSUMER WATCHDOG CAMPAIGN - YES ON 61, MAJOR FUNDING BY YES ON PROP 61, CALIFORNIANS FOR LOWER DRUG PRICES, WITH MAJOR FUNDING BY AIDS HEALTHCARE FOUNDATION AND CALIFORNIA NURSES ASSOCIATION PAC",SUPPORT
65 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,445,1380590,"YES ON 62, NO ON 66. REPLACE THE COSTLY, FAILED DEATH PENALTY SYSTEM. SPONSORED BY TAXPAYERS FOR SENTENCING REFORM",SUPPORT
66 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,446,1302403,"CALIFORNIA CORRECTIONAL PEACE OFFICERS ASSOCIATION TRUTH IN AMERICAN GOVERNMENT FUND; NO ON PROPOSITION 62, YES ON PROPOSITION 66 (NON-PROFIT 501 (C) 5)",OPPOSE
67 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,447,1346266,"CALIFORNIANS TO MEND, NOT END, THE DEATH PENALTY. NO ON PROP 62, YES ON PROP 66. SUPPORTED BY PROSECUTORS, LAW ENFORCEMENT, AND FAMILIES OF VICTIMS.",OPPOSE
68 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,448,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
69 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,449,1385745,FUND FOR POLICY REFORM (NONPROFIT 501(C)(4)),SUPPORT
70 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,450,1317554,"SAN FRANCISCO POLICE OFFICERS ASSOCIATION ISSUES PAC - YES ON 66, NO ON 62",OPPOSE
71 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,451,1390529,VOLUNTEERS FOR YES ON 62,SUPPORT
72 | ocd-contest/e02dc48a-2ed3-4a87-859b-26c90f0539e7,1381803,82,PROPOSITION 063- FIREARMS. AMMUNITION SALES. INTIATIVE STATUTE.,452,1382067,"COALITION FOR CIVIL LIBERTIES - NO ON 63, A PROJECT OF CALIFORNIA RIFLE & PISTOL ASSOCIATION",OPPOSE
73 | ocd-contest/e02dc48a-2ed3-4a87-859b-26c90f0539e7,1381803,82,PROPOSITION 063- FIREARMS. AMMUNITION SALES. INTIATIVE STATUTE.,453,1380746,"STOP PROP 63, A GRASSROOTS, COMMON-SENSE EFFORT FOR RATIONAL POLICY SPONSORED BY FIREARMS POLICY COALITION",OPPOSE
74 | ocd-contest/e02dc48a-2ed3-4a87-859b-26c90f0539e7,1381803,82,PROPOSITION 063- FIREARMS. AMMUNITION SALES. INTIATIVE STATUTE.,454,1380675,"NEWSOM BALLOT MEASURE COMMITTEE; SAFETY FOR ALL, YES ON PROP. 63,",SUPPORT
75 | ocd-contest/e02dc48a-2ed3-4a87-859b-26c90f0539e7,1381803,82,PROPOSITION 063- FIREARMS. AMMUNITION SALES. INTIATIVE STATUTE.,455,1387279,"VETO GUNMAGEDDON, CITIZENS WHO ARE OPPOSED TO PROPOSITION 63, ASSEMBLY BILLS 1135, 1511, 1695, 857 AND SENATE BILLS 880, 1235 AND 1446",OPPOSE
76 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,456,1381808,"YES ON 64, CALIFORNIANS TO CONTROL, REGULATE AND TAX ADULT USE OF MARIJUANA WHILE PROTECTING CHILDREN, SPONSORED BY BUSINESS, PHYSICIANS, ENVIRONMENTAL AND SOCIAL-JUSTICE ADVOCATE ORGANIZATIONS",SUPPORT
77 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,457,1382525,NEW APPROACH PAC (MPO),SUPPORT
78 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,458,1376077,"CALIFORNIANS FOR SENSIBLE REFORM, SPONSORED BY GHOST MANAGEMENT GROUP, LLC DBA WEEDMAPS",SUPPORT
79 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,459,1382568,"PUBLIC AND MENTAL HEALTH ADVOCATES AGAINST 64, SPONSORED AND MAJOR FUNDING BY SAM ACTION, INC. AND CALIFORNIA PUBLIC SAFETY INSTITUTE",OPPOSE
80 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,460,1371855,"MARIJUANA POLICY PROJECT OF CALIFORNIA, YES ON 64",SUPPORT
81 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,461,1343793,"CALIFORNIANS FOR RESPONSIBLE MARIJUANA REFORM, SPONSORED BY DRUG POLICY ACTION, YES ON PROP. 64",SUPPORT
82 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,462,1386560,ADULT USE CAMPAIGN FOR PROPOSITION 64; THE,SUPPORT
83 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,463,1387789,"SAM ACTION, INC., A COMMITTEE AGAINST PROPOSITION 64 WITH HELP FROM CITIZENS (NONPROFIT 501 (C)(4))",OPPOSE
84 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,464,1385506,"DRUG POLICY ACTION - NON PROFIT 501C4, YES ON PROP. 64",SUPPORT
85 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,465,1385745,FUND FOR POLICY REFORM (NONPROFIT 501(C)(4)),SUPPORT
86 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,466,1390962,MOMS STRONG AGAINST PROP 64,OPPOSE
87 | ocd-contest/cac74f20-f59f-4857-8750-5f832a3549c9,1381520,84,PROPOSITION 065- CARRY-OUT BAGS. CHARGES. INITIATIVE STATUTE.,467,1372902,"AMERICAN PROGRESSIVE BAG ALLIANCE, A PROJECT OF THE SOCIETY OF THE PLASTICS INDUSTRY (NON-PROFIT 501 (C) (6)), YES ON 65 AND NO ON 67",SUPPORT
88 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,468,1346266,"CALIFORNIANS TO MEND, NOT END, THE DEATH PENALTY. NO ON PROP 62, YES ON PROP 66. SUPPORTED BY PROSECUTORS, LAW ENFORCEMENT, AND FAMILIES OF VICTIMS.",SUPPORT
89 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,469,1302403,"CALIFORNIA CORRECTIONAL PEACE OFFICERS ASSOCIATION TRUTH IN AMERICAN GOVERNMENT FUND; NO ON PROPOSITION 62, YES ON PROPOSITION 66 (NON-PROFIT 501 (C) 5)",SUPPORT
90 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,470,1385745,FUND FOR POLICY REFORM (NONPROFIT 501(C)(4)),OPPOSE
91 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,471,1386494,"PROTEUS ACTION LEAGUE NON-PROFIT 501 (C)(4) ORGANIZATION, OPPOSING MEASURE 66 AND SUPPORTING MEASURES 54 AND 59",OPPOSE
92 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,472,1380590,"YES ON 62, NO ON 66. REPLACE THE COSTLY, FAILED DEATH PENALTY SYSTEM. SPONSORED BY TAXPAYERS FOR SENTENCING REFORM",OPPOSE
93 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,473,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",OPPOSE
94 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,474,1317554,"SAN FRANCISCO POLICE OFFICERS ASSOCIATION ISSUES PAC - YES ON 66, NO ON 62",SUPPORT
95 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,475,1336580,"LOS ANGELES POLICE PROTECTIVE LEAGUE ISSUES PAC - YES ON 66, NO ON 57",SUPPORT
96 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,476,1383946,"NO ON PROP 66, CALIFORNIANS FOR FAIR JUSTICE, SPONSORED BY SOCIAL JUSTICE ORGANIZATIONS",OPPOSE
97 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,477,1372900,"YES ON 67 - PROTECT THE PLASTIC BAG BAN, SPONSORED BY ENVIRONMENTAL AND OCEAN PROTECTION ORGANIZATIONS, BUSINESSES INCLUDING GROCERS AND REUSABLE BAG MAKERS, AND OTHER NONPROFIT ORGANIZATIONS",SUPPORT
98 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,478,1372902,"AMERICAN PROGRESSIVE BAG ALLIANCE, A PROJECT OF THE SOCIETY OF THE PLASTICS INDUSTRY (NON-PROFIT 501 (C) (6)), YES ON 65 AND NO ON 67",OPPOSE
99 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,479,1329332,"SAVE THE BAG BAN, YES ON 67, SPONSORED BY ENVIRONMENT CALIFORNIA",SUPPORT
100 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,480,1374885,YES ON 67 - CALIFORNIANS AGAINST WASTE - PROTECT THE PLASTIC BAN (NON-PROFIT 501 (C) (4)),SUPPORT
101 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,481,1346973,CALIFORNIA GROCERS ASSOCIATION ISSUES COMMITTEE (NON-PROFIT 501(C) 6): YES ON PROPOSITION 67,SUPPORT
102 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,482,1381938,SAVE THE BAY ACTION FUND PAC - YES ON PROP 67,SUPPORT
103 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,483,1389817,SAVE THE BAY ACTION FUND COMMITTEE TO SUPPORT PROPOSITION 67,SUPPORT
104 |
--------------------------------------------------------------------------------
/docs/src/_static/prop-committees.csv:
--------------------------------------------------------------------------------
1 | ocd_prop_id,calaccess_prop_id,ccdc_prop_id,prop_name,ccdc_committee_id,calaccess_committee_id,committee_name,committee_position
2 | ocd-contest/b51dc64d-3562-4913-a190-69f5088c22a6,1376258,70,PROPOSITION 051 - SCHOOL BONDS. FUNDING FOR K-12 SCHOOL AND COMMUNITY COLLEGE FACILITIES. INITIATIVE STATUTORY AMENDMENT.,382,1374469,"YES ON PROPOSITION 51 - CALIFORNIANS FOR QUALITY SCHOOLS, SPONSORED AND FUNDED BY COALITION FOR ADEQUATE SCHOOL HOUSING ISSUES COMMITTEE AND CALIFORNIA BUILDING INDUSTRY ASSOCIATION ISSUES COMMITTEE",SUPPORT
3 | ocd-contest/b51dc64d-3562-4913-a190-69f5088c22a6,1376258,70,PROPOSITION 051 - SCHOOL BONDS. FUNDING FOR K-12 SCHOOL AND COMMUNITY COLLEGE FACILITIES. INITIATIVE STATUTORY AMENDMENT.,383,1220380,"COMMUNITY COLLEGE FACILITY COALITION ISSUES COMMITTEE, YES ON 51",SUPPORT
4 | ocd-contest/b51dc64d-3562-4913-a190-69f5088c22a6,1376258,70,PROPOSITION 051 - SCHOOL BONDS. FUNDING FOR K-12 SCHOOL AND COMMUNITY COLLEGE FACILITIES. INITIATIVE STATUTORY AMENDMENT.,384,1282321,"TORLAKSON'S INVEST IN CALIFORNIA A BALLOT MEASURE COMMITTEE TO SUPPORT PROPOSITION 51, SUPERINTENDENT TOM",SUPPORT
5 | ocd-contest/b51dc64d-3562-4913-a190-69f5088c22a6,1376258,70,PROPOSITION 051 - SCHOOL BONDS. FUNDING FOR K-12 SCHOOL AND COMMUNITY COLLEGE FACILITIES. INITIATIVE STATUTORY AMENDMENT.,385,1382843,CALIFORNIA TAXPAYERS AND EDUCATORS OPPOSED TO SPRAWL AND DEVELOPER ABUSE,OPPOSE
6 | ocd-contest/85990193-9d6f-4600-b8e7-bf1317841d82,1362198,71,PROPOSITION 052 - STATE FEES ON HOSPITALS. FEDERAL MEDI-CAL MATCHING FUNDS. INITIATIVE STATUTORY AND CONSTITUTIONAL AMENDMENT.,386,1362973,YES ON PROPOSITION 52 - A COALITION OF CALIFORNIA ASSOCIATION OF HOSPITALS AND HEALTH SYSTEMS AND NON-PROFIT HEALTH CARE ORGANIZATIONS,SUPPORT
7 | ocd-contest/85990193-9d6f-4600-b8e7-bf1317841d82,1362198,71,PROPOSITION 052 - STATE FEES ON HOSPITALS. FEDERAL MEDI-CAL MATCHING FUNDS. INITIATIVE STATUTORY AND CONSTITUTIONAL AMENDMENT.,387,1381488,"CALIFORNIANS FOR HOSPITAL ACCOUNTABILITY AND QUALITY CARE - NO ON 52, SPONSORED BY SERVICE EMPLOYEES INTERNATIONAL UNION - UNITED HEALTHCARE WORKERS WEST",OPPOSE
8 | ocd-contest/85990193-9d6f-4600-b8e7-bf1317841d82,1362198,71,PROPOSITION 052 - STATE FEES ON HOSPITALS. FEDERAL MEDI-CAL MATCHING FUNDS. INITIATIVE STATUTORY AND CONSTITUTIONAL AMENDMENT.,388,1373047,"SERVICE EMPLOYEES INTERNATIONAL UNION, UNITED HEALTHCARE WORKERS WEST (NONPROFIT 501 (C)(5))",OPPOSE
9 | ocd-contest/9fb6a199-7520-433c-a290-83e016a9d389,1376142,72,PROPOSITION 053 - REVENUE BONDS. STATEWIDE VOTER APPROVAL. INITIATIVE CONSTITUTIONAL AMENDMENT.,389,1376040,YES ON 53 - STOP BLANK CHECKS,SUPPORT
10 | ocd-contest/9fb6a199-7520-433c-a290-83e016a9d389,1376142,72,PROPOSITION 053 - REVENUE BONDS. STATEWIDE VOTER APPROVAL. INITIATIVE CONSTITUTIONAL AMENDMENT.,390,1378875,"NO ON PROP 53 - CALIFORNIANS TO PROTECT LOCAL CONTROL, A COALITION OF PUBLIC SAFETY, LOCAL GOVERNMENT, BUSINESS AND LABOR ORGANIZATIONS, GOVERNOR BROWN AND TAXPAYERS",OPPOSE
11 | ocd-contest/9fb6a199-7520-433c-a290-83e016a9d389,1376142,72,PROPOSITION 053 - REVENUE BONDS. STATEWIDE VOTER APPROVAL. INITIATIVE CONSTITUTIONAL AMENDMENT.,391,761010,"CA BUSINESS PAC, SP0NSORED BY CA CHAMBER OF COMMERCE (AKA CALBUSPAC)",OPPOSE
12 | ocd-contest/9fb6a199-7520-433c-a290-83e016a9d389,1376142,72,PROPOSITION 053 - REVENUE BONDS. STATEWIDE VOTER APPROVAL. INITIATIVE CONSTITUTIONAL AMENDMENT.,392,1389930,"NO ON 53, NEIGHBORS DEFENDING LOCAL CONTROL",OPPOSE
13 | ocd-contest/e0c5f9f0-63a9-4c15-9a5c-017e20ac15bc,1381642,73,PROPOSITION 054 - LEGISLATURE. LEGISLATION AND PROCEEDINGS. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,396,1389997,CALIFORNIA COMMON CAUSE -- YES ON 54 AND 59 (NONPROFIT 501(C)(4),SUPPORT
14 | ocd-contest/e0c5f9f0-63a9-4c15-9a5c-017e20ac15bc,1381642,73,PROPOSITION 054 - LEGISLATURE. LEGISLATION AND PROCEEDINGS. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,393,1381029,"YES ON 54 - VOTERS FIRST, NOT SPECIAL INTERESTS - SPONSORED BY HOLD POLITICIANS ACCOUNTABLE",SUPPORT
15 | ocd-contest/e0c5f9f0-63a9-4c15-9a5c-017e20ac15bc,1381642,73,PROPOSITION 054 - LEGISLATURE. LEGISLATION AND PROCEEDINGS. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,394,1386494,"PROTEUS ACTION LEAGUE NON-PROFIT 501 (C)(4) ORGANIZATION, OPPOSING MEASURE 66 AND SUPPORTING MEASURES 54 AND 59",SUPPORT
16 | ocd-contest/e0c5f9f0-63a9-4c15-9a5c-017e20ac15bc,1381642,73,PROPOSITION 054 - LEGISLATURE. LEGISLATION AND PROCEEDINGS. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,395,1385928,CALIFORNIANS FOR AN EFFECTIVE LEGISLATURE,OPPOSE
17 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,397,1384591,"MILLION VOTER PROJECT ACTION FUND - YES ON 55 AND 57, SPONSORED BY SOCIAL JUSTICE ORGANIZATIONS",SUPPORT
18 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,398,1381382,"YES ON 55 - CALIFORNIANS FOR BUDGET STABILITY, SPONSORED BY TEACHERS, HEALTH CARE PROVIDERS, DOCTORS AND LABOR ORGANIZATIONS",SUPPORT
19 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,399,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
20 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,400,1390602,"COMMON SENSE KIDS ACTION, INC., YES ON PROPS. 55 AND 56 (NONPROFIT 501 (C) (4))",SUPPORT
21 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,401,1385538,"CALIFORNIA KIDS CAMPAIGN, YES ON PROPS 55 & 56, SPONSORED AND MAJOR FUNDING BY COMMON SENSE KIDS ACTION, INC.",SUPPORT
22 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,402,1385886,"NO ON PROPOSITION 55, CALIFORNIA'S FUTURE PAC, SPONSORED BY THE KERSTEN INSTITUTE FOR GOVERNANCE & PUBLIC POLICY",OPPOSE
23 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,403,1372760,"PICO CALIFORNIA - YES ON 55, 56, AND 57 (NON PROFIT 501 (C) (3))",SUPPORT
24 | ocd-contest/446ec3da-7de1-45f0-9f97-228e53c6a9f6,1382647,74,PROPOSITION 055 - TAX EXTENSION TO FUND EDUCATION AND HEALTHCARE. INITIATIVE CONSTITUTIONAL AMENDMENT.,404,931704,"UNITED TEACHERS LOS ANGELES-POLITICAL ACTION COUNCIL OF EDUCATORS (PACE) ISSUES, A COMMITTEE FOR PROPOSITIONS 55 AND 58",SUPPORT
25 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",405,1388865,"PROTECT SMALL BUSINESS AND SMOKE FREE ALTERNATIVES, NO ON 56; SPONSORED BY SMOKE-FREE ALTERNATIVES TRADE ASSOCIATION",OPPOSE
26 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",406,1383858,"FIGHT CANCER - YES ON 56, SPONSORED BY AMERICAN CANCER SOCIETY, INC. AND AMERICAN CANCER SOCIETY CANCER ACTION NETWORK, INC.",SUPPORT
27 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",407,1386637,"NO ON 56 - STOP THE SPECIAL INTEREST TAX GRAB. MAJOR FUNDING BY PHILIP MORRIS USA INC. AND R.J. REYNOLDS TOBACCO COMPANY, WITH A COALITION OF TAXPAYERS, EDUCATORS, HEALTHCARE PROFESSIONALS, LAW ...",OPPOSE
28 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",408,1377991,"YES ON 56 - SAVES LIVES CALIFORNIA, A COALITION OF DOCTORS, DENTISTS, HEALTH PLANS, LABOR, HOSPITALS, LAW ENFORCEMENT, AND NON-PROFIT HEALTH ADVOCATE ORGANIZATIONS",SUPPORT
29 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",409,1384591,"MILLION VOTER PROJECT ACTION FUND - YES ON 55 AND 57, SPONSORED BY SOCIAL JUSTICE ORGANIZATIONS",SUPPORT
30 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",410,1385538,"CALIFORNIA KIDS CAMPAIGN, YES ON PROPS 55 & 56, SPONSORED AND MAJOR FUNDING BY COMMON SENSE KIDS ACTION, INC.",SUPPORT
31 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",411,1372760,"PICO CALIFORNIA - YES ON 55, 56, AND 57 (NON PROFIT 501 (C) (3))",SUPPORT
32 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",412,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
33 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",413,1389668,YES ON 56 STOP CANCER - PLANNED PARENTHOOD OF ORANGE AND SAN BERNARDINO COUNTIES' COMMUNITY ACTION FUND (NON PROFIT 501(C)(4)),SUPPORT
34 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",414,1389484,"CALIFORNIA CITIZENS AGAINST SPECIAL INTERESTS AND WASTEFUL TAXES, NO ON PROP. 56",OPPOSE
35 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",415,1388518,YES ON 56 STOP CANCER - PLANNED PARENTHOOD ADVOCATES MAR MONTE (NON PROFIT 501 (C)(4)),SUPPORT
36 | ocd-contest/c2efe0d3-e9f4-4dfd-a0b7-a35757ef4ae9,1381640,75,"PROPOSITION 056 - CIGARETTE TAX TO FUND HEALTHCARE, TOBACCO USE PREVENTION, RESEARCH, AND LAW ENFORCEMENT. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.",416,1390602,"COMMON SENSE KIDS ACTION, INC., YES ON PROPS. 55 AND 56 (NONPROFIT 501 (C) (4))",SUPPORT
37 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,417,1385745,FUND FOR POLICY REFORM (NONPROFIT 501(C)(4)),SUPPORT
38 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,418,1392066,FWD.US (NONPROFIT 501(C)(4)) IN SUPPORT OF PROPOSITION 57 WITH HELP FROM CITIZENS FOR PUBLIC SAFETY AND OPPORTUNITY,SUPPORT
39 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,419,1382912,"YES ON PROP. 57, CALIFORNIANS AND GOVERNOR BROWN FOR PUBLIC SAFETY AND REHABILITATION",SUPPORT
40 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,420,1384591,"MILLION VOTER PROJECT ACTION FUND - YES ON 55 AND 57, SPONSORED BY SOCIAL JUSTICE ORGANIZATIONS",SUPPORT
41 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,421,1387575,CIVIC PARTICIPATION ACTION FUND - YES ON 57 (NONPROFIT 501(C)(4)),SUPPORT
42 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,422,1386627,NO ON 57 - STOP EARLY RELEASE OF VIOLENT CRIMINALS (SERVC),OPPOSE
43 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,423,1387648,CALIFORNIA CALLS ACTION FUND - YES ON 57 (NONPROFIT 501(C)(4)),SUPPORT
44 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,424,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
45 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,425,1391327,OPEN PHILANTHROPY ACTION FUND YES ON 57 (NONPROFIT 501(C)(4)),SUPPORT
46 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,426,1336580,"LOS ANGELES POLICE PROTECTIVE LEAGUE ISSUES PAC - YES ON 66, NO ON 57",OPPOSE
47 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,427,1378703,CALIFORNIA CALLS ACTION FUND (NONPROFIT 501(C)(4)),SUPPORT
48 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,428,1346267,CALIFORNIA STATEWIDE LAW ENFORCEMENT ASSOCIATION ISSUES COMMITTEE (NON-PROFIT 501 (C) 5): YES ON PROPOSITION 57,SUPPORT
49 | ocd-contest/d2dc34aa-0d9e-4a71-a40d-1aff71fcaf34,1383319,76,PROPOSITION 057 - CRIMINAL SENTENCES. JUVENILE CRIMINAL PROCEEDINGS AND SENTENCING. INITIATIVE CONSTITUTIONAL AMENDMENT AND STATUTE.,429,1372760,"PICO CALIFORNIA - YES ON 55, 56, AND 57 (NON PROFIT 501 (C) (3))",SUPPORT
50 | ocd-contest/7476a546-1615-41f7-8c7a-f07256c81303,1382395,77,"PROPOSITION 058 - SB 1174 (CHAPTER 753, STATUTES OF 2014), LARA. ENGLISH LANGUAGE EDUCATION",430,1386477,"YES ON 58, CALIFORNIANS FOR ENGLISH PROFICIENCY SPONSORED BY TEACHERS AND SERVICE EMPLOYEES ORGANIZATIONS",SUPPORT
51 | ocd-contest/7476a546-1615-41f7-8c7a-f07256c81303,1382395,77,"PROPOSITION 058 - SB 1174 (CHAPTER 753, STATUTES OF 2014), LARA. ENGLISH LANGUAGE EDUCATION",431,1374153,"LARA BALLOT MEASURE COMMITTEE; CALIFORNIANS FOR A 21ST CENTURY ECONOMY - YES ON 58, A RICARDO",SUPPORT
52 | ocd-contest/7476a546-1615-41f7-8c7a-f07256c81303,1382395,77,"PROPOSITION 058 - SB 1174 (CHAPTER 753, STATUTES OF 2014), LARA. ENGLISH LANGUAGE EDUCATION",432,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
53 | ocd-contest/7476a546-1615-41f7-8c7a-f07256c81303,1382395,77,"PROPOSITION 058 - SB 1174 (CHAPTER 753, STATUTES OF 2014), LARA. ENGLISH LANGUAGE EDUCATION",433,931704,"UNITED TEACHERS LOS ANGELES-POLITICAL ACTION COUNCIL OF EDUCATORS (PACE) ISSUES, A COMMITTEE FOR PROPOSITIONS 55 AND 58",SUPPORT
54 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",434,1387856,MAKE THEM LISTEN - YES ON 59,SUPPORT
55 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",435,1381423,"YES ON 59, CALIFORNIA CLEAN MONEY ACTION FUND TO OVERTURN CITIZENS UNITED (NON PROFIT 501(C)4)",SUPPORT
56 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",436,1386494,"PROTEUS ACTION LEAGUE NON-PROFIT 501 (C)(4) ORGANIZATION, OPPOSING MEASURE 66 AND SUPPORTING MEASURES 54 AND 59",SUPPORT
57 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",437,1360075,CALIFORNIA MOVE TO AMEND,SUPPORT
58 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",438,1389997,CALIFORNIA COMMON CAUSE -- YES ON 54 AND 59 (NONPROFIT 501(C)(4),SUPPORT
59 | ocd-contest/fbffc731-c1a5-4fd8-b7ce-f0623a278ab5,1386783,78,"PROPOSITION 059- SB 254 (CHAPTER 20, STATUTES OF 2016), ALLEN. CAMPAIGN FINANCE: VOTER INSTRUCTION",439,1386909,"OVERTURN CITIZENS UNITED, YES ON 59",SUPPORT
60 | ocd-contest/9cee6ef5-cd54-4423-9c29-66c7823c1c3a,1376195,79,PROPOSITION 060- ADULT FILMS. CONDOMS. HEALTH REQUIREMENTS. INITIATIVE STATUTE.,440,1356566,"YES ON PROP 60, FOR ADULT INDUSTRY RESPONSIBILITY (FAIR) COMMITTEE, WITH MAJOR FUNDING BY AIDS HEALTHCARE FOUNDATION",SUPPORT
61 | ocd-contest/9cee6ef5-cd54-4423-9c29-66c7823c1c3a,1376195,79,PROPOSITION 060- ADULT FILMS. CONDOMS. HEALTH REQUIREMENTS. INITIATIVE STATUTE.,441,1385139,"NO ON PROPOSITION 60, CALIFORNIANS AGAINST WORKER HARASSMENT, SPONSORED BY THE FREE SPEECH COALITION",OPPOSE
62 | ocd-contest/6b264272-925d-4d31-a69f-4543fa63a819,1377343,80,PROPOSITION 061- STATE PRESCRIPTION DRUG PURCHASES. PRICING STANDARDS. INITIATIVE STATUTE.,442,1379198,"NO ON PROP 61 - CALIFORNIANS AGAINST THE DECEPTIVE RX PROPOSITION, A COALITION OF VETERANS DOCTORS PATIENT ADVOCATES SENIORS TAXPAYERS AND MEMBERS OF PHARMACEUTICAL RESEARCH AND MANUFACTURERS OF AMER.",OPPOSE
63 | ocd-contest/6b264272-925d-4d31-a69f-4543fa63a819,1377343,80,PROPOSITION 061- STATE PRESCRIPTION DRUG PURCHASES. PRICING STANDARDS. INITIATIVE STATUTE.,443,1376791,"YES ON PROP 61, CALIFORNIANS FOR LOWER DRUG PRICES, WITH MAJOR FUNDING BY AIDS HEALTHCARE FOUNDATION AND CALIFORNIA NURSES ASSOCIATION PAC",SUPPORT
64 | ocd-contest/6b264272-925d-4d31-a69f-4543fa63a819,1377343,80,PROPOSITION 061- STATE PRESCRIPTION DRUG PURCHASES. PRICING STANDARDS. INITIATIVE STATUTE.,444,1387641,"CONSUMER WATCHDOG CAMPAIGN - YES ON 61, MAJOR FUNDING BY YES ON PROP 61, CALIFORNIANS FOR LOWER DRUG PRICES, WITH MAJOR FUNDING BY AIDS HEALTHCARE FOUNDATION AND CALIFORNIA NURSES ASSOCIATION PAC",SUPPORT
65 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,445,1380590,"YES ON 62, NO ON 66. REPLACE THE COSTLY, FAILED DEATH PENALTY SYSTEM. SPONSORED BY TAXPAYERS FOR SENTENCING REFORM",SUPPORT
66 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,446,1302403,"CALIFORNIA CORRECTIONAL PEACE OFFICERS ASSOCIATION TRUTH IN AMERICAN GOVERNMENT FUND; NO ON PROPOSITION 62, YES ON PROPOSITION 66 (NON-PROFIT 501 (C) 5)",OPPOSE
67 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,447,1346266,"CALIFORNIANS TO MEND, NOT END, THE DEATH PENALTY. NO ON PROP 62, YES ON PROP 66. SUPPORTED BY PROSECUTORS, LAW ENFORCEMENT, AND FAMILIES OF VICTIMS.",OPPOSE
68 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,448,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",SUPPORT
69 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,449,1385745,FUND FOR POLICY REFORM (NONPROFIT 501(C)(4)),SUPPORT
70 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,450,1317554,"SAN FRANCISCO POLICE OFFICERS ASSOCIATION ISSUES PAC - YES ON 66, NO ON 62",OPPOSE
71 | ocd-contest/cad98dde-416b-4cb3-8565-c1e8079511b3,1381268,81,PROPOSITION 062- DEATH PENALTY. INITIATIVE STATUTE.,451,1390529,VOLUNTEERS FOR YES ON 62,SUPPORT
72 | ocd-contest/e02dc48a-2ed3-4a87-859b-26c90f0539e7,1381803,82,PROPOSITION 063- FIREARMS. AMMUNITION SALES. INTIATIVE STATUTE.,452,1382067,"COALITION FOR CIVIL LIBERTIES - NO ON 63, A PROJECT OF CALIFORNIA RIFLE & PISTOL ASSOCIATION",OPPOSE
73 | ocd-contest/e02dc48a-2ed3-4a87-859b-26c90f0539e7,1381803,82,PROPOSITION 063- FIREARMS. AMMUNITION SALES. INTIATIVE STATUTE.,453,1380746,"STOP PROP 63, A GRASSROOTS, COMMON-SENSE EFFORT FOR RATIONAL POLICY SPONSORED BY FIREARMS POLICY COALITION",OPPOSE
74 | ocd-contest/e02dc48a-2ed3-4a87-859b-26c90f0539e7,1381803,82,PROPOSITION 063- FIREARMS. AMMUNITION SALES. INTIATIVE STATUTE.,454,1380675,"NEWSOM BALLOT MEASURE COMMITTEE; SAFETY FOR ALL, YES ON PROP. 63,",SUPPORT
75 | ocd-contest/e02dc48a-2ed3-4a87-859b-26c90f0539e7,1381803,82,PROPOSITION 063- FIREARMS. AMMUNITION SALES. INTIATIVE STATUTE.,455,1387279,"VETO GUNMAGEDDON, CITIZENS WHO ARE OPPOSED TO PROPOSITION 63, ASSEMBLY BILLS 1135, 1511, 1695, 857 AND SENATE BILLS 880, 1235 AND 1446",OPPOSE
76 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,456,1381808,"YES ON 64, CALIFORNIANS TO CONTROL, REGULATE AND TAX ADULT USE OF MARIJUANA WHILE PROTECTING CHILDREN, SPONSORED BY BUSINESS, PHYSICIANS, ENVIRONMENTAL AND SOCIAL-JUSTICE ADVOCATE ORGANIZATIONS",SUPPORT
77 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,457,1382525,NEW APPROACH PAC (MPO),SUPPORT
78 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,458,1376077,"CALIFORNIANS FOR SENSIBLE REFORM, SPONSORED BY GHOST MANAGEMENT GROUP, LLC DBA WEEDMAPS",SUPPORT
79 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,459,1382568,"PUBLIC AND MENTAL HEALTH ADVOCATES AGAINST 64, SPONSORED AND MAJOR FUNDING BY SAM ACTION, INC. AND CALIFORNIA PUBLIC SAFETY INSTITUTE",OPPOSE
80 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,460,1371855,"MARIJUANA POLICY PROJECT OF CALIFORNIA, YES ON 64",SUPPORT
81 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,461,1343793,"CALIFORNIANS FOR RESPONSIBLE MARIJUANA REFORM, SPONSORED BY DRUG POLICY ACTION, YES ON PROP. 64",SUPPORT
82 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,462,1386560,ADULT USE CAMPAIGN FOR PROPOSITION 64; THE,SUPPORT
83 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,463,1387789,"SAM ACTION, INC., A COMMITTEE AGAINST PROPOSITION 64 WITH HELP FROM CITIZENS (NONPROFIT 501 (C)(4))",OPPOSE
84 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,464,1385506,"DRUG POLICY ACTION - NON PROFIT 501C4, YES ON PROP. 64",SUPPORT
85 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,465,1385745,FUND FOR POLICY REFORM (NONPROFIT 501(C)(4)),SUPPORT
86 | ocd-contest/232cb72c-1b11-4293-b4e2-a181e80d172e,1381868,83,PROPOSITION 064- MARIJUANA LEGALIZATION. INITIATIVE STATUTE.,466,1390962,MOMS STRONG AGAINST PROP 64,OPPOSE
87 | ocd-contest/cac74f20-f59f-4857-8750-5f832a3549c9,1381520,84,PROPOSITION 065- CARRY-OUT BAGS. CHARGES. INITIATIVE STATUTE.,467,1372902,"AMERICAN PROGRESSIVE BAG ALLIANCE, A PROJECT OF THE SOCIETY OF THE PLASTICS INDUSTRY (NON-PROFIT 501 (C) (6)), YES ON 65 AND NO ON 67",SUPPORT
88 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,468,1346266,"CALIFORNIANS TO MEND, NOT END, THE DEATH PENALTY. NO ON PROP 62, YES ON PROP 66. SUPPORTED BY PROSECUTORS, LAW ENFORCEMENT, AND FAMILIES OF VICTIMS.",SUPPORT
89 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,469,1302403,"CALIFORNIA CORRECTIONAL PEACE OFFICERS ASSOCIATION TRUTH IN AMERICAN GOVERNMENT FUND; NO ON PROPOSITION 62, YES ON PROPOSITION 66 (NON-PROFIT 501 (C) 5)",SUPPORT
90 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,470,1385745,FUND FOR POLICY REFORM (NONPROFIT 501(C)(4)),OPPOSE
91 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,471,1386494,"PROTEUS ACTION LEAGUE NON-PROFIT 501 (C)(4) ORGANIZATION, OPPOSING MEASURE 66 AND SUPPORTING MEASURES 54 AND 59",OPPOSE
92 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,472,1380590,"YES ON 62, NO ON 66. REPLACE THE COSTLY, FAILED DEATH PENALTY SYSTEM. SPONSORED BY TAXPAYERS FOR SENTENCING REFORM",OPPOSE
93 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,473,1391170,"MILLION VOTER PROJECT ACTION FUND - YES ON 55, 56, 57, 58, 62, AND NO ON 66, SPONSORED BY SOCIAL JUSTICE ADVOCATES AND ORGANIZATIONS",OPPOSE
94 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,474,1317554,"SAN FRANCISCO POLICE OFFICERS ASSOCIATION ISSUES PAC - YES ON 66, NO ON 62",SUPPORT
95 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,475,1336580,"LOS ANGELES POLICE PROTECTIVE LEAGUE ISSUES PAC - YES ON 66, NO ON 57",SUPPORT
96 | ocd-contest/19eca91d-e494-4ee0-a345-8f96eeec8a3e,1381724,85,PROPOSITION 066- DEATH PENALTY. PROCEDURES. INITIATIVE STATUTE.,476,1383946,"NO ON PROP 66, CALIFORNIANS FOR FAIR JUSTICE, SPONSORED BY SOCIAL JUSTICE ORGANIZATIONS",OPPOSE
97 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,477,1372900,"YES ON 67 - PROTECT THE PLASTIC BAG BAN, SPONSORED BY ENVIRONMENTAL AND OCEAN PROTECTION ORGANIZATIONS, BUSINESSES INCLUDING GROCERS AND REUSABLE BAG MAKERS, AND OTHER NONPROFIT ORGANIZATIONS",SUPPORT
98 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,478,1372902,"AMERICAN PROGRESSIVE BAG ALLIANCE, A PROJECT OF THE SOCIETY OF THE PLASTICS INDUSTRY (NON-PROFIT 501 (C) (6)), YES ON 65 AND NO ON 67",OPPOSE
99 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,479,1329332,"SAVE THE BAG BAN, YES ON 67, SPONSORED BY ENVIRONMENT CALIFORNIA",SUPPORT
100 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,480,1374885,YES ON 67 - CALIFORNIANS AGAINST WASTE - PROTECT THE PLASTIC BAN (NON-PROFIT 501 (C) (4)),SUPPORT
101 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,481,1346973,CALIFORNIA GROCERS ASSOCIATION ISSUES COMMITTEE (NON-PROFIT 501(C) 6): YES ON PROPOSITION 67,SUPPORT
102 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,482,1381938,SAVE THE BAY ACTION FUND PAC - YES ON PROP 67,SUPPORT
103 | ocd-contest/7495cdbe-1aa7-4c26-9a55-aa4130347b95,1372638,86,PROPOSITION 067- REFERENDUM TO OVERTURN BAN ON SINGLE-USE PLASTIC BAGS.,483,1389817,SAVE THE BAY ACTION FUND COMMITTEE TO SUPPORT PROPOSITION 67,SUPPORT
104 |
--------------------------------------------------------------------------------