From feee367e9ad4a33838614a89073349db80ed0626 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Wed, 9 Oct 2024 23:47:03 +0000 Subject: [PATCH 01/12] brainstorming starter_kit --- starter_kit/2024_basics_01.ipynb | 173 +++++++++++++++++++++++++++++++ starter_kit/2024_basics_02.ipynb | 43 ++++++++ 2 files changed, 216 insertions(+) create mode 100644 starter_kit/2024_basics_01.ipynb create mode 100644 starter_kit/2024_basics_02.ipynb diff --git a/starter_kit/2024_basics_01.ipynb b/starter_kit/2024_basics_01.ipynb new file mode 100644 index 000000000..656f5da4c --- /dev/null +++ b/starter_kit/2024_basics_01.ipynb @@ -0,0 +1,173 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "247e773f-0e29-4ed6-ab4d-5856325611b4", + "metadata": {}, + "source": [ + "# Exercise 1: Familiarize yourself with `pandas`\n", + "If you are new to Python, check out the introductory Python courses available through Caltrans's LinkedIn Learning Library:\n", + "* https://www.linkedin.com/learning/search?keywords=python&u=36029164\n", + "\n", + "Skills: \n", + "* `pandas` is one of the base Python packages for working with tabular data.\n", + "* Do some grouping and aggregation. Many ways to do this!\n", + "* Export to Google Cloud Storage\n", + "* Practice committing on GitHub\n", + "\n", + "References: \n", + "* https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html\n", + "* https://docs.calitp.org/data-infra/analytics_tools/saving_code.html" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "50199af7-04a8-43c5-ba1b-4127940749bd", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import altair as alt" + ] + }, + { + "cell_type": "markdown", + "id": "5d887390-b5b7-4032-b6c3-06142c847f40", + "metadata": {}, + "source": [ + "## Read in an Excel file from GCS\n", + "* F-String\n", + "* How to open a workbook with multiple sheets" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b3e2e69d-c8e6-45b7-ba98-fa5b3514e4a6", + "metadata": {}, + "outputs": [], + "source": [ + "GCS_FILE_PATH = \"gs://calitp-analytics-data/data-analyses/starter_kit/\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24c414d7-3adb-4e68-82ac-ca5016178bc7", + "metadata": {}, + "outputs": [], + "source": [ + "FILE = \"starter_kit_csis_scoring_workbook.xlsx\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f05337cd-4317-41c1-a911-35fc3872ef65", + "metadata": {}, + "outputs": [], + "source": [ + "# Combine to get the proper file name " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2ea4704-b96e-4157-942a-15276a240bee", + "metadata": {}, + "outputs": [], + "source": [ + "sheet_names = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e09456e0-dfd2-4388-85de-eb9e95f983fa", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_excel()" + ] + }, + { + "cell_type": "markdown", + "id": "10bcfd10-f1d3-49a9-a46a-36c697c02cf4", + "metadata": {}, + "source": [ + "## Merge" + ] + }, + { + "cell_type": "markdown", + "id": "e7367dc4-6380-445e-b486-903491927183", + "metadata": {}, + "source": [ + "## Groupby / Aggregation\n", + "\n", + "* By Caltrans District, calculate the average CSIS score and find difference between max and min score.\n", + "* Hint: for `pandas`: `groupby / agg`, `pivot_table`, `groupby / transform`." + ] + }, + { + "cell_type": "markdown", + "id": "cbded66f-05fc-4a1e-bc21-7c55e011df7f", + "metadata": {}, + "source": [ + "## Export to Google Cloud Storage (GCS)\n", + "\n", + "* Make sure credential works\n", + "* Use this path: \"gs://calitp-analytics-data/data-analyses/FILENAME\"\n", + "* Export using `df.to_parquet()` and `df.to_csv()`" + ] + }, + { + "cell_type": "markdown", + "id": "00305dfc-4eb2-4c8e-bea0-e9d5021f20b6", + "metadata": {}, + "source": [ + "## Make a Chart \n", + "* Read in the parquet file from GCS using F Strings.\n", + "* Make a visualization using one `Altair`\n", + " * Requirements: use a color palette from Cal-ITP\n", + " * The chart must be in Century-Gothic font.\n", + " * Size it to be 600 pixels wide, 400 pixels high" + ] + }, + { + "cell_type": "markdown", + "id": "69d211b4-89f0-4b2c-9093-1118114ba649", + "metadata": {}, + "source": [ + "## You're almost done!\n", + "* Name this notebook `YOURNAME_exercise1.ipynb`\n", + " * If you need to rename because you already named it, do it within the terminal.\n", + " * `git mv OLDNAME.ipynb NEWNAME.ipynb`. \n", + " * The `mv` stands for move, and renaming a file is basically \"moving\" its path. Doing it this way retains the git history associated with the notebook. If you rename directly with right click, rename, you destroy the git history.\n", + "* Use a descriptive commit message (ex: adding chart, etc). GitHub already tracks who makes the commit, the date, the timestamp of it, the files being affected, so your commit message should be more descriptive than the metadata already stored." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/starter_kit/2024_basics_02.ipynb b/starter_kit/2024_basics_02.ipynb new file mode 100644 index 000000000..93b865f2b --- /dev/null +++ b/starter_kit/2024_basics_02.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "685c09c1-4d11-42a8-a213-8267137eede8", + "metadata": {}, + "source": [ + "# Exercise 2: Merging and Deriving New Columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf79dda1-8860-4841-be55-4aa144541fee", + "metadata": {}, + "outputs": [], + "source": [ + "# Use GTFS Digest " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From dcc0da8fc809e5400e297564d8858de9b65a937b Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Thu, 10 Oct 2024 21:57:21 +0000 Subject: [PATCH 02/12] done with ex 1 --- starter_kit/2024_basics_01.ipynb | 488 ++++++++++++++++++++++++++++--- starter_kit/2024_basics_02.ipynb | 58 +++- 2 files changed, 505 insertions(+), 41 deletions(-) diff --git a/starter_kit/2024_basics_01.ipynb b/starter_kit/2024_basics_01.ipynb index 656f5da4c..0f34bab0a 100644 --- a/starter_kit/2024_basics_01.ipynb +++ b/starter_kit/2024_basics_01.ipynb @@ -12,127 +12,537 @@ "Skills: \n", "* `pandas` is one of the base Python packages for working with tabular data.\n", "* Do some grouping and aggregation. Many ways to do this!\n", + "* F-strings\n", "* Export to Google Cloud Storage\n", "* Practice committing on GitHub\n", "\n", "References: \n", "* https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html\n", - "* https://docs.calitp.org/data-infra/analytics_tools/saving_code.html" + "* https://docs.calitp.org/data-infra/analytics_tools/saving_code.html\n", + "\n", + "## What are we working with today? \n", + "* Today we will be working on Caltrans System Investment Strategy (CSIS) today. Per this [description](https://dot.ca.gov/programs/transportation-planning/division-of-transportation-planning/corridor-and-system-planning/csis)\n", + "> The California Department of Transportation (Caltrans) is committed to leading climate action and advancing social equity in the transportation sector set forth by the California State Transportation Agency (CalSTA) Climate Action Plan for Transportation Infrastructure (CAPTI, 2021)...Caltrans is in a significant leadership role to carry out meaningful measures that advance state’s goals and priorities through the development and implementation of the Caltrans System Investment Strategy (CSIS). The CSIS, which implements one of CAPTI’s key actions, is envisioned to be an investment framework through a data and performance-driven approach that guides transportation investments and decisions.\n", + "* One way DDS is working on CSIS is by automating the scoring of projects using Python. We score each project based on how well they do in various categories, aka metrics such as Zero Emmission Vehicles, Vehicle Miles Traveled, and more. \n", + "* While the values in we are working with today are all fake, the exercise really is based on actual datasets and assignments. " ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "50199af7-04a8-43c5-ba1b-4127940749bd", "metadata": {}, "outputs": [], "source": [ - "import pandas as pd\n", - "import altair as alt" + "import altair as alt\n", + "import pandas as pd" ] }, { "cell_type": "markdown", - "id": "5d887390-b5b7-4032-b6c3-06142c847f40", + "id": "cc30cb7d-77d3-465b-9831-8810096af9b1", "metadata": {}, "source": [ - "## Read in an Excel file from GCS\n", - "* F-String\n", - "* How to open a workbook with multiple sheets" + "## Check out the data \n", + "* Download the Excel workbook containing all the CSIS data from Google Cloud Storage [here](https://console.cloud.google.com/storage/browser/_details/calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx;tab=live_object?project=cal-itp-data-infra). \n", + " * Open it up in Excel and take a look.\n", + "### Read in the data\n", + "* We are reading our Excel Workbook into a Pandas dataframe.\n", + "* While there is a very [technical definition](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) of what a dataframe is, you can think of it as an Excel sheet that holds your data. A pandas dataframe merely allows you to clean the data programatically." ] }, { "cell_type": "code", - "execution_count": 3, - "id": "b3e2e69d-c8e6-45b7-ba98-fa5b3514e4a6", + "execution_count": 4, + "id": "5950cb87-75ab-4871-ab4b-a8f1c41f0a4a", "metadata": {}, "outputs": [], "source": [ - "GCS_FILE_PATH = \"gs://calitp-analytics-data/data-analyses/starter_kit/\"" + "url = \"gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx\"" ] }, { "cell_type": "code", - "execution_count": null, - "id": "24c414d7-3adb-4e68-82ac-ca5016178bc7", + "execution_count": 5, + "id": "e09456e0-dfd2-4388-85de-eb9e95f983fa", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_excel(url)" + ] + }, + { + "cell_type": "markdown", + "id": "179960a3-6c9b-42af-a8f1-d6156c4be2d2", + "metadata": {}, + "source": [ + "### Previewing Data \n", + "* Often, you want to get a sneak preview of your data. \n", + "* Thankfully, Python provides many methods for you to do so. \n", + "* Below are a couple of very common methods we use. \n", + " * `.head()` shows the first five rows, while `.tail()` shows the last five.\n", + " * `.sample()` shows you a random row.\n", + " * Want to see or less than five? Specify it in the parantheses: `.head(10)`.\n", + "* Try everything yourself below." + ] + }, + { + "cell_type": "markdown", + "id": "3386e9d8-15cd-48bc-8b1f-cf6f95512ad5", + "metadata": {}, + "source": [ + "### Reviewing the Data - More Methods!\n", + "* `df.shape` gives you the number of rows and columns in your dataset.\n", + "* `df.columns` returns all of the column names.\n", + "* `df.info()` per the [pandas docs](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.info.html#pandas.DataFrame.info) prints information about a DataFrame including the index dtype and columns, non-null values and memory usage.\n", + "* Experiment below. \n", + "* More food for thought:\n", + " * `Dtype` is critical. There are integers, objects, booleans, floats...\n", + " * Does the `dtype` of each column below make sense to you? \n", + " * The `dtype` of object is a catchall term." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7f55b33e-d402-473b-815a-92ad935d35d7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 29 entries, 0 to 28\n", + "Data columns (total 3 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 ct_district 29 non-null object\n", + " 1 project_name 29 non-null object\n", + " 2 Scope of Work 29 non-null object\n", + "dtypes: object(3)\n", + "memory usage: 824.0+ bytes\n" + ] + } + ], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "markdown", + "id": "d117908f-af05-4e95-8042-39a3e0557d6f", + "metadata": {}, + "source": [ + "### Deeper Dive\n", + "* We now know a good amount about our dataset, but the # of rows and columns are not always so thrilling. \n", + "* Let's take a look at each column." + ] + }, + { + "cell_type": "markdown", + "id": "55cece73-c3d5-4cd7-8896-f97d43fc1114", + "metadata": {}, + "source": [ + "#### `.value_counts()` helps you see how many times the same value appears. \n", + "* Notice something repetitive? " + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "63f21ab5-0920-4310-afce-2ea657556912", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "10 5\n", + "11 4\n", + "1 3\n", + "9 3\n", + "2 3\n", + "5 2\n", + "3 2\n", + "7 2\n", + "4 and 12 1\n", + "4 1\n", + "three 1\n", + "12 1\n", + "nine 1\n", + "Name: ct_district, dtype: int64" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.ct_district.value_counts()" + ] + }, + { + "cell_type": "markdown", + "id": "55baf38e-3776-4448-b375-9e124030bae2", + "metadata": {}, + "source": [ + "#### `.nunique()` displays the number of distinct values in your column\n", + "* This is particulary useful because there are many times when the number of unique values of a column should match the number of rows of your dataset exactly.\n", + "* In our case, our dataframe has 29 rows and we should have 29 unique project names and scope of work descriptions." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "1d832308-a425-404d-83a0-53ce8bfae279", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "29" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.project_name.nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "4e232324-f75f-46a0-962d-76ed9273dac7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "29" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Notice that when you have spaces in between each string of your column name,\n", + "# you need to refer the column using brackets []. \n", + "df[\"Scope of Work\"].nunique()" + ] + }, + { + "cell_type": "markdown", + "id": "06ee15f6-ee2e-4e3e-91b2-115875292042", + "metadata": {}, + "source": [ + "## Something missing? \n", + "* Open up our dataset using Excel. \n", + "* Take a look at the sheets: how many are there in the Excel worbook? \n", + "* Which sheet is loaded into `df` above? " + ] + }, + { + "cell_type": "markdown", + "id": "5302dd99-acb2-40d7-b00d-4f0493ee5e09", + "metadata": {}, + "source": [ + "### Lists" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "02380fb6-c55b-477f-acfb-8b483e83beac", "metadata": {}, "outputs": [], "source": [ - "FILE = \"starter_kit_csis_scoring_workbook.xlsx\"" + "# Enter in all the sheets you are interested in loading into Python.\n", + "# By the way, they always need to be strings.\n", + "my_sheets = [\"projects_auto\",\n", + " \"overall_score\"]" ] }, { "cell_type": "code", "execution_count": null, - "id": "f05337cd-4317-41c1-a911-35fc3872ef65", + "id": "8a9a1a3e-e10d-4447-96dd-92ecb2fe6357", "metadata": {}, "outputs": [], "source": [ - "# Combine to get the proper file name " + "len(my_sheets)" ] }, { "cell_type": "code", "execution_count": null, - "id": "f2ea4704-b96e-4157-942a-15276a240bee", + "id": "a3be037d-b21b-4192-9099-25bfcb660f01", "metadata": {}, "outputs": [], "source": [ - "sheet_names = []" + "# Index\n", + "my_sheets[0]" ] }, { "cell_type": "code", "execution_count": null, - "id": "e09456e0-dfd2-4388-85de-eb9e95f983fa", + "id": "ebf91535-a466-446a-9f7a-606503d78b6a", + "metadata": {}, + "outputs": [], + "source": [ + "my_sheets[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "2e2578bc-db1f-41f5-bc07-3cb82998420e", + "metadata": {}, + "outputs": [], + "source": [ + "# Open the workbook in a dictionary\n", + "df2 = pd.read_excel(\n", + " url,\n", + " sheet_name=my_sheets,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "6059f491-3966-4343-b000-0830fa3559d6", + "metadata": {}, + "source": [ + "### Specificity is beautiful.\n", + "* Grab out each individual sheet into its own dataframe using `df2.get(my_sheets[enter in the number])`. \n", + "* Make sure your `dataframe` is titled descriptively.\n", + "* `df` is not exactly very telling. " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "4c6f8fdb-33d3-4c44-bb00-6d1447d49feb", "metadata": {}, "outputs": [], "source": [ - "df = pd.read_excel()" + "projects_df = df2.get(my_sheets[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "167af2f1-b09d-476d-87b4-b9374ad445c2", + "metadata": {}, + "outputs": [], + "source": [ + "scores_df = df2.get(my_sheets[1])" ] }, { "cell_type": "markdown", - "id": "10bcfd10-f1d3-49a9-a46a-36c697c02cf4", + "id": "cd0d51ea-b7da-41d0-bb03-5432b4de1a1b", + "metadata": {}, + "source": [ + "## Add a new column\n", + "* Oops! Us analysts were so wrapped up in scoring, we forgot to to total up all the metrics to find the overall_score for the project. \n", + "* Do so and place your results in a column called `\"overall_score\"`\n", + "* There are a couple of ways to do this.\n", + "* More food for thought:\n", + " * What does `axis = 1` mean?\n", + " * What happens if you do `.sum(axis=0)`?\n", + " * Try everything once.\n", + " * You don't always have to save everything into a dataframe. You can do something like `df.sum(axis=0)` just to see what happens. \n", + " * Just make sure your dataframe isn't too large or else you will run out of memory!\n", + " * What happens when you create a new column with `scores_df.overall_score`? " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "e9321f90-8c99-46fb-9d50-8571f3d94fc8", "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_8038/1686633536.py:1: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError. Select only valid columns before calling the reduction.\n", + " scores_df[\"overall_score\"] = scores_df.sum(axis = 1)\n" + ] + } + ], "source": [ - "## Merge" + "# scores_df[\"overall_score\"] = scores_df.sum(axis = 1)" ] }, { "cell_type": "markdown", - "id": "e7367dc4-6380-445e-b486-903491927183", + "id": "246437eb-f284-49b8-960d-d601a66f6362", "metadata": {}, "source": [ - "## Groupby / Aggregation\n", - "\n", - "* By Caltrans District, calculate the average CSIS score and find difference between max and min score.\n", - "* Hint: for `pandas`: `groupby / agg`, `pivot_table`, `groupby / transform`." + "## Less is More\n", + "* Your manager asks for the `project_name` and `overall_score`. \n", + "* Subset the dataframe and save it into a new dataframe.\n", + "* There are many ways to do the same thing in Python. \n", + " * While this isn't always true, the best way is usually the one with the least amount of text and code." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "812207f4-7448-45a9-8d9f-7652aeaa7fd9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['project_name', 'accessibility_score', 'dac_accessibility_score',\n", + " 'dac_traffic_impacts_score', 'freight_efficiency_score',\n", + " 'freight_sustainability_score', 'mode_shift_score',\n", + " 'lu_natural_resources_score', 'safety_score', 'vmt_score', 'zev_score',\n", + " 'public_engagement_score', 'climate_resilience_score',\n", + " 'program_fit_score', 'overall_score', 'sample_sentence'],\n", + " dtype='object')" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scores_df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e6d8e70-ae57-46c5-a5aa-9972be77f415", + "metadata": {}, + "outputs": [], + "source": [ + "columns_to_keep = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c64cdcf-9598-4f4a-b077-5caec0cfe264", + "metadata": {}, + "outputs": [], + "source": [ + "columns_to_drop = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47a96b86-e5d1-4fcd-ba73-7db5badae28b", + "metadata": {}, + "outputs": [], + "source": [ + "df.drop(columns = columns_to_drop)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48ee899b-3db9-464f-802f-d431189176b7", + "metadata": {}, + "outputs": [], + "source": [ + "df[columns_to_keep]" ] }, { "cell_type": "markdown", - "id": "cbded66f-05fc-4a1e-bc21-7c55e011df7f", + "id": "e641185d-295d-4c42-ace1-16d33f2da0fa", "metadata": {}, "source": [ "## Export to Google Cloud Storage (GCS)\n", - "\n", - "* Make sure credential works\n", - "* Use this path: \"gs://calitp-analytics-data/data-analyses/FILENAME\"\n", - "* Export using `df.to_parquet()` and `df.to_csv()`" + "* Our original Excel workbook's file path is `\"gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx\"`\n", + "* Save your subsetted dataframe from above back into the `starter_kit` folder. \n", + "* Sure you could do `\"gs://calitp-analytics-data/data-analyses/starter_kit/aggregated_csis.xlsx\"` but that is an eyesore.\n", + "* Essentially, the only difference between these two file paths are `aggregated_csis.xlsx` and `starter_kit_csis_scoring_workbook.xlsx` because the file_path `gs://calitp-analytics-data/data-analyses/starter_kit/` remains the same. \n", + "* This is where f-strings come in. What are f-strings? \n", + "> Python f-strings provide a quick way to interpolate and format strings. They’re readable, concise, and less prone to error than traditional string interpolation and formatting tools...\n", + " * Read more about them [here](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python).\n", + "* Let's practice ." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "4c9c53a5-dbf3-4dc0-aea0-832f3a91414d", + "metadata": {}, + "outputs": [], + "source": [ + "# My file_path is always going to be `gs://calitp-analytics-data/data-analyses/starter_kit/`.\n", + "GCS_FILE_PATH = \"gs://calitp-analytics-data/data-analyses/starter_kit/\"" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "db111f34-08b8-42f9-96fe-6852c4af50ad", + "metadata": {}, + "outputs": [], + "source": [ + "# However my file is going to change.\n", + "# I want to name my subsetted dataframe as \"aggregated\" and I want it to be saved as an Excel workbook.\n", + "AGG_FILE = \"aggregated.xlsx\"" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "edff403c-ef37-48d8-8c7a-60b388752a51", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'gs://calitp-analytics-data/data-analyses/starter_kit/amanda_aggregated'" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Put them together using a f-string\n", + "f\"{GCS_FILE_PATH}{AGG_FILE}\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf37fc2d-ac6c-4134-94de-79a9a4141ffc", + "metadata": {}, + "outputs": [], + "source": [ + "# What if I wanted to read back the original file using f-strings? \n", + "OLD_FILE = \n", + "f\"\"" ] }, { "cell_type": "markdown", - "id": "00305dfc-4eb2-4c8e-bea0-e9d5021f20b6", + "id": "17c17adb-404e-4e54-bdb4-c3295e0e2be2", "metadata": {}, "source": [ - "## Make a Chart \n", - "* Read in the parquet file from GCS using F Strings.\n", - "* Make a visualization using one `Altair`\n", - " * Requirements: use a color palette from Cal-ITP\n", - " * The chart must be in Century-Gothic font.\n", - " * Size it to be 600 pixels wide, 400 pixels high" + "### So many options!\n", + "* Export using `df.to_parquet()`. We typically use prefer saving to `parquets` and you can read why [here](https://docs.calitp.org/data-infra/analytics_new_analysts/03-data-management.html#parquet).\n", + "* Export `df.to_excel()`. Open up your new Excel workbook and see if it's what you expect.\n", + " * Hint: you will probably get a very annoying extra column! \n", + " * Try out some of the arguments [listed](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html#pandas.DataFrame.to_excel)." ] }, { diff --git a/starter_kit/2024_basics_02.ipynb b/starter_kit/2024_basics_02.ipynb index 93b865f2b..bd0e15d7e 100644 --- a/starter_kit/2024_basics_02.ipynb +++ b/starter_kit/2024_basics_02.ipynb @@ -10,12 +10,66 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "cf79dda1-8860-4841-be55-4aa144541fee", "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (3914705476.py, line 2)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m Cell \u001b[0;32mIn[1], line 2\u001b[0;36m\u001b[0m\n\u001b[0;31m * We can read in the Excel workbook above using the URL:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "### Now open data in this notebook: An Intro to F Strings\n", + "* We can read in the Excel workbook above using the URL:\n", + "`df = pd.read_excel(\"gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx\")`\n", + "* However, this is a bit of an eyesore. Additionally, you might want to save your finished work into the folder `starter_kit`. \n", + "* This is where f-strings come in. Wht are f-strings? \n", + "> Python f-strings provide a quick way to interpolate and format strings. They’re readable, concise, and less prone to error than traditional string interpolation and formatting tools...\n", + " * Read more about them [here](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python).\n", + "\n", + "* Here's an example:\n", + "`base_url = \"https://www.instagram.com/\"` \n", + "`first_profile = \"zendaya\"`\n", + " * When you combine them, as `f\"{base_url}{first_profile}\"` it will yield `https://www.instagram.com/zendaya`.\n", + " * What if you want another instagram profile? Simply combine your second_profile with the base_url. \n", + " `second_profile = anyataylorjoy`\n", + " `f\"{base_url}{second_profile}\"`\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47ba0b17-609b-4013-bb31-a3ebd4e82a9a", + "metadata": {}, + "outputs": [], + "source": [ + "## Merging \n", + "* Your manager asks you to present the average overall score, the max score, and the min score by each Caltrans District.\n", + "* Annoyingly enough, the `overall_score` column and the `ct_district` are in two different dataframes.\n", + "* Welcome to DDS! This will happen to you all the time starting now. \n", + "* Thankfully, merging couldn't be simpler...some of the time..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ded8924-d42a-4d21-a79d-a8d70b01d43f", + "metadata": {}, "outputs": [], "source": [ - "# Use GTFS Digest " + "## Make a Chart \n", + "* Read in the parquet file from GCS using F Strings.\n", + "* Make a visualization using one `Altair` (link to Altair)\n", + " * Requirements: use color blind friendly palette (link to doc)\n", + " * The chart must be in Century-Gothic font (link to CSIS example)\n", + " * Size it to be 600 pixels wide, 400 pixels high" ] } ], From 2ffe8f5b66b6c16aab3df2bfd9960eaa3c7a0e70 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Thu, 10 Oct 2024 23:09:34 +0000 Subject: [PATCH 03/12] began exercise 2 --- starter_kit/2024_basics_01.ipynb | 304 ++++++++---- starter_kit/2024_basics_02.ipynb | 805 +++++++++++++++++++++++++++++-- 2 files changed, 982 insertions(+), 127 deletions(-) diff --git a/starter_kit/2024_basics_01.ipynb b/starter_kit/2024_basics_01.ipynb index 0f34bab0a..a28a57ea6 100644 --- a/starter_kit/2024_basics_01.ipynb +++ b/starter_kit/2024_basics_01.ipynb @@ -11,7 +11,6 @@ "\n", "Skills: \n", "* `pandas` is one of the base Python packages for working with tabular data.\n", - "* Do some grouping and aggregation. Many ways to do this!\n", "* F-strings\n", "* Export to Google Cloud Storage\n", "* Practice committing on GitHub\n", @@ -29,15 +28,28 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "50199af7-04a8-43c5-ba1b-4127940749bd", "metadata": {}, "outputs": [], "source": [ - "import altair as alt\n", + "\n", "import pandas as pd" ] }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8e18d8d7-2cce-4854-b6c4-56a7e7bdf636", + "metadata": {}, + "outputs": [], + "source": [ + "pd.options.display.max_columns = 100\n", + "pd.options.display.float_format = \"{:.2f}\".format\n", + "pd.set_option(\"display.max_rows\", None)\n", + "pd.set_option(\"display.max_colwidth\", None)" + ] + }, { "cell_type": "markdown", "id": "cc30cb7d-77d3-465b-9831-8810096af9b1", @@ -53,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "5950cb87-75ab-4871-ab4b-a8f1c41f0a4a", "metadata": {}, "outputs": [], @@ -63,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "e09456e0-dfd2-4388-85de-eb9e95f983fa", "metadata": {}, "outputs": [], @@ -104,7 +116,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "7f55b33e-d402-473b-815a-92ad935d35d7", "metadata": {}, "outputs": [ @@ -117,10 +129,10 @@ "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", - " 0 ct_district 29 non-null object\n", + " 0 ct_district 29 non-null int64 \n", " 1 project_name 29 non-null object\n", " 2 Scope of Work 29 non-null object\n", - "dtypes: object(3)\n", + "dtypes: int64(1), object(2)\n", "memory usage: 824.0+ bytes\n" ] } @@ -144,36 +156,34 @@ "id": "55cece73-c3d5-4cd7-8896-f97d43fc1114", "metadata": {}, "source": [ - "#### `.value_counts()` helps you see how many times the same value appears. \n", - "* Notice something repetitive? " + "#### `.value_counts()` helps you see how many times the same value appears. " ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 6, "id": "63f21ab5-0920-4310-afce-2ea657556912", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "10 5\n", - "11 4\n", - "1 3\n", - "9 3\n", - "2 3\n", - "5 2\n", - "3 2\n", - "7 2\n", - "4 and 12 1\n", - "4 1\n", - "three 1\n", - "12 1\n", - "nine 1\n", + "9 5\n", + "10 3\n", + "8 3\n", + "3 3\n", + "1 3\n", + "12 3\n", + "4 3\n", + "2 2\n", + "5 1\n", + "7 1\n", + "11 1\n", + "6 1\n", "Name: ct_district, dtype: int64" ] }, - "execution_count": 31, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -194,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 7, "id": "1d832308-a425-404d-83a0-53ce8bfae279", "metadata": {}, "outputs": [ @@ -204,7 +214,7 @@ "29" ] }, - "execution_count": 32, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -215,7 +225,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 8, "id": "4e232324-f75f-46a0-962d-76ed9273dac7", "metadata": {}, "outputs": [ @@ -225,7 +235,7 @@ "29" ] }, - "execution_count": 33, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -257,7 +267,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 9, "id": "02380fb6-c55b-477f-acfb-8b483e83beac", "metadata": {}, "outputs": [], @@ -270,20 +280,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "8a9a1a3e-e10d-4447-96dd-92ecb2fe6357", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "len(my_sheets)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "a3be037d-b21b-4192-9099-25bfcb660f01", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'projects_auto'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Index\n", "my_sheets[0]" @@ -291,17 +323,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "ebf91535-a466-446a-9f7a-606503d78b6a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'overall_score'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "my_sheets[1]" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "id": "2e2578bc-db1f-41f5-bc07-3cb82998420e", "metadata": {}, "outputs": [], @@ -326,7 +369,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 14, "id": "4c6f8fdb-33d3-4c44-bb00-6d1447d49feb", "metadata": {}, "outputs": [], @@ -336,7 +379,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 15, "id": "167af2f1-b09d-476d-87b4-b9374ad445c2", "metadata": {}, "outputs": [], @@ -364,60 +407,140 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 16, "id": "e9321f90-8c99-46fb-9d50-8571f3d94fc8", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_8038/1686633536.py:1: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError. Select only valid columns before calling the reduction.\n", - " scores_df[\"overall_score\"] = scores_df.sum(axis = 1)\n" - ] - } - ], - "source": [ - "# scores_df[\"overall_score\"] = scores_df.sum(axis = 1)" - ] - }, - { - "cell_type": "markdown", - "id": "246437eb-f284-49b8-960d-d601a66f6362", - "metadata": {}, + "outputs": [], "source": [ - "## Less is More\n", - "* Your manager asks for the `project_name` and `overall_score`. \n", - "* Subset the dataframe and save it into a new dataframe.\n", - "* There are many ways to do the same thing in Python. \n", - " * While this isn't always true, the best way is usually the one with the least amount of text and code." + "scores_df[\"overall_score\"] = scores_df.select_dtypes(include=['int64', 'float64']).sum(axis=1)" ] }, { "cell_type": "code", - "execution_count": 44, - "id": "812207f4-7448-45a9-8d9f-7652aeaa7fd9", + "execution_count": 17, + "id": "1562bdc4-6fdd-462b-8839-8c1c52eedc7c", "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_nameaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_score
0Meadow Magic Multi-Use Path10348361092452268
1Bunny Hop Bike Boulevard8958781085113982
\n", + "
" + ], "text/plain": [ - "Index(['project_name', 'accessibility_score', 'dac_accessibility_score',\n", - " 'dac_traffic_impacts_score', 'freight_efficiency_score',\n", - " 'freight_sustainability_score', 'mode_shift_score',\n", - " 'lu_natural_resources_score', 'safety_score', 'vmt_score', 'zev_score',\n", - " 'public_engagement_score', 'climate_resilience_score',\n", - " 'program_fit_score', 'overall_score', 'sample_sentence'],\n", - " dtype='object')" + " project_name accessibility_score dac_accessibility_score \\\n", + "0 Meadow Magic Multi-Use Path 10 3 \n", + "1 Bunny Hop Bike Boulevard 8 9 \n", + "\n", + " dac_traffic_impacts_score freight_efficiency_score \\\n", + "0 4 8 \n", + "1 5 8 \n", + "\n", + " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", + "0 3 6 10 \n", + "1 7 8 10 \n", + "\n", + " safety_score vmt_score zev_score public_engagement_score \\\n", + "0 9 2 4 5 \n", + "1 8 5 1 1 \n", + "\n", + " climate_resilience_score program_fit_score overall_score \n", + "0 2 2 68 \n", + "1 3 9 82 " ] }, - "execution_count": 44, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "scores_df.columns" + "scores_df.head(2)" + ] + }, + { + "cell_type": "markdown", + "id": "246437eb-f284-49b8-960d-d601a66f6362", + "metadata": {}, + "source": [ + "## Less is More\n", + "* Your manager asks for the `overall_score` for each project. They do not want to see the other metrics, only the project's name and its total score.\n", + "* Subset the dataframe and save it into a new dataframe.\n", + "* There are many ways to do the same thing in Python. \n", + " * While this isn't always true, the best way is usually the one with the least amount of text and code." ] }, { @@ -427,6 +550,7 @@ "metadata": {}, "outputs": [], "source": [ + "# Enter in the columns you want to keep\n", "columns_to_keep = []" ] }, @@ -437,6 +561,7 @@ "metadata": {}, "outputs": [], "source": [ + "# Enter in the columns you want to drop\n", "columns_to_drop = []" ] }, @@ -444,10 +569,14 @@ "cell_type": "code", "execution_count": null, "id": "47a96b86-e5d1-4fcd-ba73-7db5badae28b", - "metadata": {}, + "metadata": { + "scrolled": true, + "tags": [] + }, "outputs": [], "source": [ - "df.drop(columns = columns_to_drop)" + "\n", + "scores_df.drop(columns = columns_to_drop)" ] }, { @@ -457,7 +586,7 @@ "metadata": {}, "outputs": [], "source": [ - "df[columns_to_keep]" + "scores_df[columns_to_keep]" ] }, { @@ -478,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 21, "id": "4c9c53a5-dbf3-4dc0-aea0-832f3a91414d", "metadata": {}, "outputs": [], @@ -489,48 +618,47 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 19, "id": "db111f34-08b8-42f9-96fe-6852c4af50ad", "metadata": {}, "outputs": [], "source": [ "# However my file is going to change.\n", "# I want to name my subsetted dataframe as \"aggregated\" and I want it to be saved as an Excel workbook.\n", - "AGG_FILE = \"aggregated.xlsx\"" + "FILE = \"final_scores.xlsx\"" ] }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 22, "id": "edff403c-ef37-48d8-8c7a-60b388752a51", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'gs://calitp-analytics-data/data-analyses/starter_kit/amanda_aggregated'" + "'gs://calitp-analytics-data/data-analyses/starter_kit/final_scores.xlsx'" ] }, - "execution_count": 53, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Put them together using a f-string\n", - "f\"{GCS_FILE_PATH}{AGG_FILE}\"" + "f\"{GCS_FILE_PATH}{FILE}\"" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "bf37fc2d-ac6c-4134-94de-79a9a4141ffc", "metadata": {}, "outputs": [], "source": [ "# What if I wanted to read back the original file using f-strings? \n", - "OLD_FILE = \n", - "f\"\"" + "scores_df[[\"project_name\",\"overall_score\"]].to_excel(f\"{GCS_FILE_PATH}{FILE}\")" ] }, { @@ -539,7 +667,7 @@ "metadata": {}, "source": [ "### So many options!\n", - "* Export using `df.to_parquet()`. We typically use prefer saving to `parquets` and you can read why [here](https://docs.calitp.org/data-infra/analytics_new_analysts/03-data-management.html#parquet).\n", + "* Export using `df.to_parquet()`. We typically prefer saving to `parquets` and you can read why [here](https://docs.calitp.org/data-infra/analytics_new_analysts/03-data-management.html#parquet).\n", "* Export `df.to_excel()`. Open up your new Excel workbook and see if it's what you expect.\n", " * Hint: you will probably get a very annoying extra column! \n", " * Try out some of the arguments [listed](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html#pandas.DataFrame.to_excel)." diff --git a/starter_kit/2024_basics_02.ipynb b/starter_kit/2024_basics_02.ipynb index bd0e15d7e..fddebe129 100644 --- a/starter_kit/2024_basics_02.ipynb +++ b/starter_kit/2024_basics_02.ipynb @@ -5,71 +5,798 @@ "id": "685c09c1-4d11-42a8-a213-8267137eede8", "metadata": {}, "source": [ - "# Exercise 2: Merging and Deriving New Columns" + "# Exercise 2: Merging, Aggregating, Filtering, and Visualizing" ] }, { "cell_type": "code", - "execution_count": 1, - "id": "cf79dda1-8860-4841-be55-4aa144541fee", + "execution_count": 3, + "id": "6cbbfb96-1e9e-400a-9884-72f08d1191f3", + "metadata": {}, + "outputs": [], + "source": [ + "import altair as alt\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3da62b06-24b4-4791-a073-185ee3765152", + "metadata": {}, + "outputs": [], + "source": [ + "pd.options.display.max_columns = 100\n", + "pd.options.display.float_format = \"{:.2f}\".format\n", + "pd.set_option(\"display.max_rows\", None)\n", + "pd.set_option(\"display.max_colwidth\", None)" + ] + }, + { + "cell_type": "markdown", + "id": "616f1aed-d082-4e49-8eae-5c3acf87155f", + "metadata": {}, + "source": [ + "## Read back in the two files you'll need using f'strings" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e7e4cafe-eb24-477b-a45c-88bfcaff37f3", + "metadata": {}, + "outputs": [], + "source": [ + "GCS_FILE_PATH = \"gs://calitp-analytics-data/data-analyses/starter_kit/\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2c4af22f-91ac-4e03-8b80-2121adc9a348", + "metadata": {}, + "outputs": [], + "source": [ + "OG_FILE = \"starter_kit_csis_scoring_workbook.xlsx\"" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "873bfb72-9b47-472c-a18b-248be7f8c694", + "metadata": {}, + "outputs": [], + "source": [ + "OVERALL_SCORE_FILE = \"final_scores.xlsx\"" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6cf0c667-b81a-430f-afb8-68f4e0f0a147", + "metadata": {}, + "outputs": [], + "source": [ + "projects_df = pd.read_excel(f\"{GCS_FILE_PATH}{FILE1}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "7de4e3b1-15bb-4f37-a392-36c3c0d3e39d", "metadata": {}, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (3914705476.py, line 2)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m Cell \u001b[0;32mIn[1], line 2\u001b[0;36m\u001b[0m\n\u001b[0;31m * We can read in the Excel workbook above using the URL:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_nameScope of Work
010Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.
18Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 10 Meadow Magic Multi-Use Path \n", + "1 8 Bunny Hop Bike Boulevard \n", + "\n", + " Scope of Work \n", + "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "### Now open data in this notebook: An Intro to F Strings\n", - "* We can read in the Excel workbook above using the URL:\n", - "`df = pd.read_excel(\"gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx\")`\n", - "* However, this is a bit of an eyesore. Additionally, you might want to save your finished work into the folder `starter_kit`. \n", - "* This is where f-strings come in. Wht are f-strings? \n", - "> Python f-strings provide a quick way to interpolate and format strings. They’re readable, concise, and less prone to error than traditional string interpolation and formatting tools...\n", - " * Read more about them [here](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python).\n", - "\n", - "* Here's an example:\n", - "`base_url = \"https://www.instagram.com/\"` \n", - "`first_profile = \"zendaya\"`\n", - " * When you combine them, as `f\"{base_url}{first_profile}\"` it will yield `https://www.instagram.com/zendaya`.\n", - " * What if you want another instagram profile? Simply combine your second_profile with the base_url. \n", - " `second_profile = anyataylorjoy`\n", - " `f\"{base_url}{second_profile}\"`\n", - " \n", - " " + "projects_df.head(2)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "47ba0b17-609b-4013-bb31-a3ebd4e82a9a", + "execution_count": 20, + "id": "8a5e10d5-f978-408d-87d9-05f930038a47", "metadata": {}, "outputs": [], + "source": [ + "overall_scores_df = pd.read_excel(f\"{GCS_FILE_PATH}{OVERALL_SCORE_FILE}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "898592ba-7655-41c9-a982-251491bd9083", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0project_nameoverall_score
00Meadow Magic Multi-Use Path136
11Bunny Hop Bike Boulevard164
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 project_name overall_score\n", + "0 0 Meadow Magic Multi-Use Path 136\n", + "1 1 Bunny Hop Bike Boulevard 164" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "overall_scores_df.head(2)" + ] + }, + { + "cell_type": "markdown", + "id": "58e35b64-d192-4c6c-8f5d-044a3414ca68", + "metadata": {}, "source": [ "## Merging \n", - "* Your manager asks you to present the average overall score, the max score, and the min score by each Caltrans District.\n", - "* Annoyingly enough, the `overall_score` column and the `ct_district` are in two different dataframes.\n", - "* Welcome to DDS! This will happen to you all the time starting now. \n", - "* Thankfully, merging couldn't be simpler...some of the time..." + "* Your manager asks you to aggregate the average overall score, the max score, and the min score for each Caltrans District.\n", + "* Annoyingly enough, the `overall_score` column and the `ct_district` are in two different dataframes. You'll have to merge it. \n", + "* Welcome to DDS! This will happen to you all the time starting now. " + ] + }, + { + "cell_type": "markdown", + "id": "512d4282-545b-4c89-977c-8dfd47724d07", + "metadata": {}, + "source": [ + "### Food for thought \n", + "* Which do columns the two dataframes have in common?\n", + " * You can merge on more than one column. In fact, it's best practice to! \n", + "* What type of merge will achieve my goal?\n", + " * Inner, outer, left, or right\n", + "* What do I expect out of the merge?\n", + " * Do I expect all the values of the merge keys to be 1:1? Or m:1? \n", + " * Do I expect a project to correspond with multiple districts? Maybe, projects can and do cross multiple boundaries.\n", + " * Do I expect a project to correspond with only one total cost estimate value? Yes, there shouldn't be multiple cost estimates for the same project!\n", + "* How do I go about checking the data after the merge?\n", + " * Which arguments are available to help me per the [docs](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html)?" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ad4962ca-ed83-48a3-b1e6-79e5d5b1042b", + "metadata": {}, + "outputs": [], + "source": [ + "m1 = pd.merge(projects_df, overall_scores_df, on = [\"project_name\"])" + ] + }, + { + "cell_type": "markdown", + "id": "8ddf0077-061c-4d67-8881-36c9792d6e62", + "metadata": {}, + "source": [ + "### Double Checking\n", + "* How many rows do you expect?\n", + "* How many unique projects are there? \n", + "* Hint: check your original dataframes as well" + ] + }, + { + "cell_type": "markdown", + "id": "94e866f0-bc46-43d3-92b7-dce71dc31c02", + "metadata": {}, + "source": [ + "#### The Beauty of Outer Joins \n", + "* To save you some grief and time, `outer` joins are very useful.\n", + "* Merge your dataframes again using an `outer` join and with `indicator = True` on.\n", + "* Using `.value_counts()` check out how many rows are found in both dataframes, the left only, and the right only" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "98e92c3f-ccd4-45f8-b6a6-523ddcb4a7ac", + "metadata": {}, + "outputs": [], + "source": [ + "m2 = pd.merge(projects_df, overall_scores_df, on = [\"project_name\"], indicator = True, how = \"outer\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "f134cddf-5220-44f9-9e15-1c5171cbedfd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "both 26\n", + "left_only 3\n", + "right_only 3\n", + "Name: _merge, dtype: int64" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m2._merge.value_counts()" + ] + }, + { + "cell_type": "markdown", + "id": "aa04599b-805e-4813-ab1a-c4b9fe77cc9e", + "metadata": {}, + "source": [ + "### Filtering\n", + "* Filter out for only the `left_only` and `right_only` values.\n", + "* AH note: link to docs page with tutorial." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "4dd07bab-4d1b-41a0-954e-4c2d59584e57", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_nameScope of WorkUnnamed: 0overall_score_merge
108.00Rainbow Rush hot LanesHigh-Occupancy Toll lanes with dynamic pricing, utilizing advanced traffic management systems to optimize congestion relief and reduce emissions.NaNNaNleft_only
1212.00Bunny Lane HOV+2 heavenA High-Occupancy Vehicle lane with comfortable waiting areas, complimentary Wi-Fi, and convenient access to nearby amenities.NaNNaNleft_only
268.00main street muffin topPedestrian-friendly improvements to a charming town center, incorporating decorative lighting, street furniture, and enhanced storefronts.NaNNaNleft_only
29NaNRainbow Rush HOT LanesNaN10.00178.00right_only
30NaNBunny Lane HOV+2 HavenNaN12.00150.00right_only
31NaNMain Street Muffin Top RevitalizationNaN26.00160.00right_only
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "10 8.00 Rainbow Rush hot Lanes \n", + "12 12.00 Bunny Lane HOV+2 heaven \n", + "26 8.00 main street muffin top \n", + "29 NaN Rainbow Rush HOT Lanes \n", + "30 NaN Bunny Lane HOV+2 Haven \n", + "31 NaN Main Street Muffin Top Revitalization \n", + "\n", + " Scope of Work \\\n", + "10 High-Occupancy Toll lanes with dynamic pricing, utilizing advanced traffic management systems to optimize congestion relief and reduce emissions. \n", + "12 A High-Occupancy Vehicle lane with comfortable waiting areas, complimentary Wi-Fi, and convenient access to nearby amenities. \n", + "26 Pedestrian-friendly improvements to a charming town center, incorporating decorative lighting, street furniture, and enhanced storefronts. \n", + "29 NaN \n", + "30 NaN \n", + "31 NaN \n", + "\n", + " Unnamed: 0 overall_score _merge \n", + "10 NaN NaN left_only \n", + "12 NaN NaN left_only \n", + "26 NaN NaN left_only \n", + "29 10.00 178.00 right_only \n", + "30 12.00 150.00 right_only \n", + "31 26.00 160.00 right_only " + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m2.loc[m2._merge != \"both\"]" + ] + }, + { + "cell_type": "markdown", + "id": "b9279e5f-4e4b-41d5-818f-56bc6932e052", + "metadata": {}, + "source": [ + "### Dictionaries: An Introduction \n", + "* String data is often entered in many different ways. BART can be entered in as bart, Bay Area Rapid Transit, BaRT, and more. \n", + "* Take a look as to why these projects are not merging. \n", + "* In Excel, it's easy to go in and manually tweak everything. However, that is not reproducible. \n", + "* Since there are essentially only a couple of names to replace, we can do it using a dictionary.\n", + "* Decide whether you want to rename the values in the left dataframe or the right one. \n", + " * AH: Link to docs\n", + " * Explain what a dictionary is\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "55709137-db8e-4bf8-8939-6f8af49b3719", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "# I highly recommend you use .unique() to find the project names. \n", + "# Often there are trailing white spaces that are naked to our human eyes.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "9dad92fe-87a6-434d-a62f-d269f3ad1054", + "metadata": {}, + "outputs": [], + "source": [ + "new_names = {'main street muffin top ':'Main Street Muffin Top Revitalization',\n", + " 'Bunny Lane HOV+2 heaven':'Bunny Lane HOV+2 Haven',\n", + " 'Rainbow Rush hot Lanes':'Rainbow Rush HOT Lanes'}" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "d8532992-771e-446a-b419-55ad757ff45f", + "metadata": {}, + "outputs": [], + "source": [ + "projects_df.project_name = projects_df.project_name.replace(new_names)" + ] + }, + { + "cell_type": "markdown", + "id": "68562b10-b9bd-4892-8780-a66cad1a06d4", + "metadata": {}, + "source": [ + "* Merge your dataframes again. This time it should work.\n", + "* Please also specify the merge type and the columns. \n", + "* Although Pandas does this automatically, it's good practice to write everything out." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "db09aa04-7a94-4b94-9ade-10b1a987e006", + "metadata": {}, + "outputs": [], + "source": [ + "final_m = pd.merge(projects_df, overall_scores_df, how = \"inner\", on = \"project_name\")" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "b83708f3-eb0a-40b7-923a-6569e1c525ff", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "28" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_m.project_name.nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "54a00f55-f6ab-4475-93b5-6772321db40b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_nameScope of WorkUnnamed: 0overall_score
010Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.0136
18Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.1164
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 10 Meadow Magic Multi-Use Path \n", + "1 8 Bunny Hop Bike Boulevard \n", + "\n", + " Scope of Work \\\n", + "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", + "\n", + " Unnamed: 0 overall_score \n", + "0 0 136 \n", + "1 1 164 " + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_m.head(2)" + ] + }, + { + "cell_type": "markdown", + "id": "1c2d76d1-37eb-405a-8834-23137a03e411", + "metadata": {}, + "source": [ + "## Groupby\n", + "* You're done merging...Oh wait, that wasn't even part of your manager's request.\n", + "* Let's revisit: they want you to \"aggregate the average overall score, the max score, and the min score for each Caltrans District.\"\n", + "* For `pandas`: there are many options. Some are `groupby / agg`, `pivot_table`, `groupby / transform`\n", + "* Hint: rename these columns to be descriptive because we are no longer looking at the `overall_scores`" ] }, { "cell_type": "code", "execution_count": null, - "id": "1ded8924-d42a-4d21-a79d-a8d70b01d43f", + "id": "48002356-070f-4bef-b039-eb3dd96178fb", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "0892a805-7d7f-47cf-b086-f5e320c5361c", + "metadata": {}, + "outputs": [], + "source": [ + "agg1 = final_m.groupby([\"ct_district\"]).agg({\"overall_score\":\"median\"}).reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "94c178b1-ff70-4d63-8820-aef101928c75", "metadata": {}, "outputs": [], "source": [ - "## Make a Chart \n", - "* Read in the parquet file from GCS using F Strings.\n", - "* Make a visualization using one `Altair` (link to Altair)\n", - " * Requirements: use color blind friendly palette (link to doc)\n", - " * The chart must be in Century-Gothic font (link to CSIS example)\n", - " * Size it to be 600 pixels wide, 400 pixels high" + "agg1 = agg1.rename(columns = {\"overall_score\":\"median_score\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "70178e81-0d11-4d19-9001-96e466d6dced", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtmedian_score
01138.00
12121.00
23144.00
34138.00
45146.00
56128.00
67156.00
78162.00
89148.00
910144.00
1011160.00
1112150.00
\n", + "
" + ], + "text/plain": [ + " ct_district median_score\n", + "0 1 138.00\n", + "1 2 121.00\n", + "2 3 144.00\n", + "3 4 138.00\n", + "4 5 146.00\n", + "5 6 128.00\n", + "6 7 156.00\n", + "7 8 162.00\n", + "8 9 148.00\n", + "9 10 144.00\n", + "10 11 160.00\n", + "11 12 150.00" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agg1" + ] + }, + { + "cell_type": "markdown", + "id": "576f14ad-40ca-4428-9845-2e577753f7a6", + "metadata": {}, + "source": [ + "## Visualizing \n", + "* While your manager is pleased with your work, they forgot to mention that they will be presenting this.\n", + "* Thus, they want a visualization of median scores by districts.\n", + "* Our preferred visualization library is `Altair` but there are many others. \n", + "* Make a chart " ] } ], From 45593a73ed92fba584897660f1e677a828c1d5e4 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Fri, 11 Oct 2024 18:11:55 +0000 Subject: [PATCH 04/12] more work on ex 2 --- starter_kit/2024_basics_01.ipynb | 1063 ++++++++++++++++++++++++++--- starter_kit/2024_basics_02.ipynb | 1097 +++++++++++++++++++++++------- 2 files changed, 1821 insertions(+), 339 deletions(-) diff --git a/starter_kit/2024_basics_01.ipynb b/starter_kit/2024_basics_01.ipynb index a28a57ea6..074ddc7a7 100644 --- a/starter_kit/2024_basics_01.ipynb +++ b/starter_kit/2024_basics_01.ipynb @@ -156,7 +156,7 @@ "id": "55cece73-c3d5-4cd7-8896-f97d43fc1114", "metadata": {}, "source": [ - "#### `.value_counts()` helps you see how many times the same value appears. " + "* `.value_counts()` helps you see how many times the same value appears. " ] }, { @@ -197,9 +197,9 @@ "id": "55baf38e-3776-4448-b375-9e124030bae2", "metadata": {}, "source": [ - "#### `.nunique()` displays the number of distinct values in your column\n", - "* This is particulary useful because there are many times when the number of unique values of a column should match the number of rows of your dataset exactly.\n", - "* In our case, our dataframe has 29 rows and we should have 29 unique project names and scope of work descriptions." + "* `.nunique()` displays the number of distinct values in your column\n", + " * This is particulary useful because there are many times when the number of unique values of a column should match the number of rows of your dataset exactly.\n", + " * In our case, our dataframe has 29 rows and we should have 29 unique project names and scope of work descriptions." ] }, { @@ -394,7 +394,7 @@ "source": [ "## Add a new column\n", "* Oops! Us analysts were so wrapped up in scoring, we forgot to to total up all the metrics to find the overall_score for the project. \n", - "* Do so and place your results in a column called `\"overall_score\"`\n", + "* Do so and place your results in a column called `overall_score`\n", "* There are a couple of ways to do this.\n", "* More food for thought:\n", " * What does `axis = 1` mean?\n", @@ -415,11 +415,48 @@ "scores_df[\"overall_score\"] = scores_df.select_dtypes(include=['int64', 'float64']).sum(axis=1)" ] }, + { + "cell_type": "markdown", + "id": "246437eb-f284-49b8-960d-d601a66f6362", + "metadata": {}, + "source": [ + "## Subsetting\n", + "* Your manager asks for the `overall_score` for each project. They do not want to see the other metrics, only the project's name and its total score.\n", + "* Subset the dataframe and save it into a new dataframe.\n", + "* There are many ways to do the same thing in Python. \n", + " * While this isn't always true, the best way is usually the one with the least amount of text and code." + ] + }, { "cell_type": "code", "execution_count": 17, - "id": "1562bdc4-6fdd-462b-8839-8c1c52eedc7c", + "id": "4e6d8e70-ae57-46c5-a5aa-9972be77f415", "metadata": {}, + "outputs": [], + "source": [ + "# Enter in the columns you want to keep\n", + "columns_to_keep = [\"overall_score\", \"project_name\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "2c64cdcf-9598-4f4a-b077-5caec0cfe264", + "metadata": {}, + "outputs": [], + "source": [ + "# Enter in the columns you want to drop\n", + "columns_to_drop = []" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "47a96b86-e5d1-4fcd-ba73-7db5badae28b", + "metadata": { + "scrolled": true, + "tags": [] + }, "outputs": [ { "data": { @@ -458,133 +495,954 @@ " program_fit_score\n", " overall_score\n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 0\n", + " Meadow Magic Multi-Use Path\n", + " 10\n", + " 3\n", + " 4\n", + " 8\n", + " 3\n", + " 6\n", + " 10\n", + " 9\n", + " 2\n", + " 4\n", + " 5\n", + " 2\n", + " 2\n", + " 68\n", + " \n", + " \n", + " 1\n", + " Bunny Hop Bike Boulevard\n", + " 8\n", + " 9\n", + " 5\n", + " 8\n", + " 7\n", + " 8\n", + " 10\n", + " 8\n", + " 5\n", + " 1\n", + " 1\n", + " 3\n", + " 9\n", + " 82\n", + " \n", + " \n", + " 2\n", + " Strawberry Shortcake Sidewalks\n", + " 1\n", + " 3\n", + " 1\n", + " 10\n", + " 5\n", + " 10\n", + " 3\n", + " 7\n", + " 4\n", + " 3\n", + " 3\n", + " 2\n", + " 3\n", + " 55\n", + " \n", + " \n", + " 3\n", + " River Ramble Rabbit Trail\n", + " 4\n", + " 2\n", + " 9\n", + " 9\n", + " 9\n", + " 10\n", + " 9\n", + " 4\n", + " 7\n", + " 1\n", + " 3\n", + " 5\n", + " 2\n", + " 74\n", + " \n", + " \n", + " 4\n", + " Lilac Lane Dream Complete Street\n", + " 10\n", + " 10\n", + " 9\n", + " 4\n", + " 9\n", + " 10\n", + " 7\n", + " 2\n", + " 1\n", + " 7\n", + " 1\n", + " 3\n", + " 3\n", + " 76\n", + " \n", + " \n", + " 5\n", + " Unicorn Expressway\n", + " 10\n", + " 4\n", + " 5\n", + " 9\n", + " 4\n", + " 5\n", + " 9\n", + " 8\n", + " 5\n", + " 4\n", + " 9\n", + " 3\n", + " 6\n", + " 81\n", + " \n", + " \n", + " 6\n", + " Sunflower Gables Intermodal Facility\n", + " 2\n", + " 8\n", + " 9\n", + " 10\n", + " 1\n", + " 6\n", + " 5\n", + " 3\n", + " 9\n", + " 9\n", + " 1\n", + " 7\n", + " 4\n", + " 74\n", + " \n", + " \n", + " 7\n", + " Seaside Strawberry Port Revitalization\n", + " 2\n", + " 7\n", + " 1\n", + " 5\n", + " 7\n", + " 3\n", + " 7\n", + " 6\n", + " 4\n", + " 1\n", + " 5\n", + " 2\n", + " 8\n", + " 58\n", + " \n", + " \n", + " 8\n", + " Countryside Clover Rail Connector\n", + " 3\n", + " 3\n", + " 1\n", + " 9\n", + " 7\n", + " 5\n", + " 7\n", + " 5\n", + " 8\n", + " 1\n", + " 7\n", + " 3\n", + " 10\n", + " 69\n", + " \n", + " \n", + " 9\n", + " Tranquil Truck Trot\n", + " 4\n", + " 5\n", + " 5\n", + " 8\n", + " 8\n", + " 1\n", + " 5\n", + " 2\n", + " 7\n", + " 4\n", + " 6\n", + " 8\n", + " 10\n", + " 73\n", + " \n", + " \n", + " 10\n", + " Rainbow Rush HOT Lanes\n", + " 4\n", + " 2\n", + " 10\n", + " 7\n", + " 8\n", + " 7\n", + " 1\n", + " 10\n", + " 6\n", + " 10\n", + " 7\n", + " 8\n", + " 9\n", + " 89\n", + " \n", + " \n", + " 11\n", + " Greenway Gables Managed Lanes\n", + " 3\n", + " 5\n", + " 5\n", + " 8\n", + " 3\n", + " 6\n", + " 10\n", + " 4\n", + " 6\n", + " 9\n", + " 5\n", + " 9\n", + " 6\n", + " 79\n", + " \n", + " \n", + " 12\n", + " Bunny Lane HOV+2 Haven\n", + " 4\n", + " 9\n", + " 6\n", + " 2\n", + " 4\n", + " 9\n", + " 10\n", + " 4\n", + " 6\n", + " 1\n", + " 5\n", + " 10\n", + " 5\n", + " 75\n", + " \n", + " \n", + " 13\n", + " Wildflower Wonders Highway Expansion\n", + " 7\n", + " 6\n", + " 1\n", + " 6\n", + " 10\n", + " 7\n", + " 9\n", + " 4\n", + " 3\n", + " 9\n", + " 3\n", + " 5\n", + " 6\n", + " 76\n", + " \n", + " \n", + " 14\n", + " Mountain View Mansion Interchange\n", + " 4\n", + " 9\n", + " 1\n", + " 7\n", + " 2\n", + " 10\n", + " 9\n", + " 6\n", + " 5\n", + " 7\n", + " 6\n", + " 7\n", + " 8\n", + " 81\n", + " \n", + " \n", + " 15\n", + " Passing Lane Paradise Found\n", + " 1\n", + " 7\n", + " 3\n", + " 4\n", + " 8\n", + " 7\n", + " 10\n", + " 8\n", + " 8\n", + " 2\n", + " 3\n", + " 4\n", + " 3\n", + " 68\n", + " \n", + " \n", + " 16\n", + " Sparkle City Smart Streets Initiative\n", + " 3\n", + " 5\n", + " 5\n", + " 4\n", + " 10\n", + " 3\n", + " 6\n", + " 7\n", + " 1\n", + " 6\n", + " 9\n", + " 3\n", + " 4\n", + " 66\n", + " \n", + " \n", + " 17\n", + " Traffic Tamer Turtle Pace\n", + " 4\n", + " 2\n", + " 4\n", + " 2\n", + " 10\n", + " 6\n", + " 3\n", + " 4\n", + " 8\n", + " 8\n", + " 7\n", + " 3\n", + " 2\n", + " 63\n", + " \n", + " \n", + " 18\n", + " Coastal Commuter Carousel\n", + " 5\n", + " 1\n", + " 4\n", + " 1\n", + " 10\n", + " 7\n", + " 9\n", + " 4\n", + " 6\n", + " 4\n", + " 2\n", + " 8\n", + " 8\n", + " 69\n", + " \n", + " \n", + " 19\n", + " Rolling Renaissance Rabbit Express\n", + " 6\n", + " 5\n", + " 4\n", + " 7\n", + " 6\n", + " 8\n", + " 8\n", + " 1\n", + " 5\n", + " 4\n", + " 2\n", + " 6\n", + " 10\n", + " 72\n", + " \n", + " \n", + " 20\n", + " Transit Treasure Transit Oasis\n", + " 9\n", + " 8\n", + " 8\n", + " 3\n", + " 3\n", + " 6\n", + " 2\n", + " 9\n", + " 1\n", + " 2\n", + " 10\n", + " 3\n", + " 8\n", + " 72\n", + " \n", + " \n", + " 21\n", + " Berry Best Bus Rapid Transit\n", + " 6\n", + " 7\n", + " 10\n", + " 7\n", + " 8\n", + " 3\n", + " 3\n", + " 9\n", + " 2\n", + " 8\n", + " 4\n", + " 8\n", + " 3\n", + " 78\n", + " \n", + " \n", + " 22\n", + " Electric Avenue Emerald Charging Stations\n", + " 1\n", + " 8\n", + " 2\n", + " 10\n", + " 7\n", + " 1\n", + " 10\n", + " 7\n", + " 1\n", + " 7\n", + " 4\n", + " 9\n", + " 2\n", + " 69\n", + " \n", " \n", - " 0\n", - " Meadow Magic Multi-Use Path\n", + " 23\n", + " Hydrogen Haven Honeycomb Fueling Station\n", + " 6\n", + " 7\n", + " 8\n", + " 9\n", + " 2\n", + " 2\n", + " 6\n", + " 2\n", + " 8\n", + " 10\n", + " 9\n", " 10\n", - " 3\n", " 4\n", + " 83\n", + " \n", + " \n", + " 24\n", + " Gingerbread Village Green Complete Street\n", + " 1\n", + " 2\n", + " 9\n", + " 10\n", " 8\n", + " 5\n", + " 9\n", + " 2\n", + " 9\n", " 3\n", + " 8\n", + " 8\n", " 6\n", - " 10\n", + " 80\n", + " \n", + " \n", + " 25\n", + " Trail of Treats and Transit Hub\n", " 9\n", + " 6\n", + " 1\n", + " 9\n", + " 4\n", " 2\n", " 4\n", - " 5\n", " 2\n", " 2\n", - " 68\n", + " 5\n", + " 9\n", + " 10\n", + " 1\n", + " 64\n", " \n", " \n", - " 1\n", - " Bunny Hop Bike Boulevard\n", - " 8\n", + " 26\n", + " Main Street Muffin Top Revitalization\n", + " 4\n", " 9\n", - " 5\n", - " 8\n", " 7\n", - " 8\n", + " 6\n", + " 1\n", + " 5\n", + " 5\n", + " 6\n", " 10\n", - " 8\n", + " 6\n", + " 5\n", + " 9\n", + " 7\n", + " 80\n", + " \n", + " \n", + " 27\n", + " Park and Ride Petal Paradise\n", " 5\n", " 1\n", + " 10\n", + " 7\n", + " 9\n", + " 2\n", " 1\n", " 3\n", + " 10\n", + " 4\n", + " 6\n", + " 6\n", + " 1\n", + " 65\n", + " \n", + " \n", + " 28\n", + " Waterfront Waffle Walk and Bike\n", + " 4\n", + " 6\n", " 9\n", - " 82\n", + " 5\n", + " 6\n", + " 9\n", + " 4\n", + " 10\n", + " 4\n", + " 3\n", + " 2\n", + " 5\n", + " 1\n", + " 68\n", " \n", " \n", "\n", "" ], "text/plain": [ - " project_name accessibility_score dac_accessibility_score \\\n", - "0 Meadow Magic Multi-Use Path 10 3 \n", - "1 Bunny Hop Bike Boulevard 8 9 \n", + " project_name accessibility_score \\\n", + "0 Meadow Magic Multi-Use Path 10 \n", + "1 Bunny Hop Bike Boulevard 8 \n", + "2 Strawberry Shortcake Sidewalks 1 \n", + "3 River Ramble Rabbit Trail 4 \n", + "4 Lilac Lane Dream Complete Street 10 \n", + "5 Unicorn Expressway 10 \n", + "6 Sunflower Gables Intermodal Facility 2 \n", + "7 Seaside Strawberry Port Revitalization 2 \n", + "8 Countryside Clover Rail Connector 3 \n", + "9 Tranquil Truck Trot 4 \n", + "10 Rainbow Rush HOT Lanes 4 \n", + "11 Greenway Gables Managed Lanes 3 \n", + "12 Bunny Lane HOV+2 Haven 4 \n", + "13 Wildflower Wonders Highway Expansion 7 \n", + "14 Mountain View Mansion Interchange 4 \n", + "15 Passing Lane Paradise Found 1 \n", + "16 Sparkle City Smart Streets Initiative 3 \n", + "17 Traffic Tamer Turtle Pace 4 \n", + "18 Coastal Commuter Carousel 5 \n", + "19 Rolling Renaissance Rabbit Express 6 \n", + "20 Transit Treasure Transit Oasis 9 \n", + "21 Berry Best Bus Rapid Transit 6 \n", + "22 Electric Avenue Emerald Charging Stations 1 \n", + "23 Hydrogen Haven Honeycomb Fueling Station 6 \n", + "24 Gingerbread Village Green Complete Street 1 \n", + "25 Trail of Treats and Transit Hub 9 \n", + "26 Main Street Muffin Top Revitalization 4 \n", + "27 Park and Ride Petal Paradise 5 \n", + "28 Waterfront Waffle Walk and Bike 4 \n", "\n", - " dac_traffic_impacts_score freight_efficiency_score \\\n", - "0 4 8 \n", - "1 5 8 \n", + " dac_accessibility_score dac_traffic_impacts_score \\\n", + "0 3 4 \n", + "1 9 5 \n", + "2 3 1 \n", + "3 2 9 \n", + "4 10 9 \n", + "5 4 5 \n", + "6 8 9 \n", + "7 7 1 \n", + "8 3 1 \n", + "9 5 5 \n", + "10 2 10 \n", + "11 5 5 \n", + "12 9 6 \n", + "13 6 1 \n", + "14 9 1 \n", + "15 7 3 \n", + "16 5 5 \n", + "17 2 4 \n", + "18 1 4 \n", + "19 5 4 \n", + "20 8 8 \n", + "21 7 10 \n", + "22 8 2 \n", + "23 7 8 \n", + "24 2 9 \n", + "25 6 1 \n", + "26 9 7 \n", + "27 1 10 \n", + "28 6 9 \n", "\n", - " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", - "0 3 6 10 \n", - "1 7 8 10 \n", + " freight_efficiency_score freight_sustainability_score mode_shift_score \\\n", + "0 8 3 6 \n", + "1 8 7 8 \n", + "2 10 5 10 \n", + "3 9 9 10 \n", + "4 4 9 10 \n", + "5 9 4 5 \n", + "6 10 1 6 \n", + "7 5 7 3 \n", + "8 9 7 5 \n", + "9 8 8 1 \n", + "10 7 8 7 \n", + "11 8 3 6 \n", + "12 2 4 9 \n", + "13 6 10 7 \n", + "14 7 2 10 \n", + "15 4 8 7 \n", + "16 4 10 3 \n", + "17 2 10 6 \n", + "18 1 10 7 \n", + "19 7 6 8 \n", + "20 3 3 6 \n", + "21 7 8 3 \n", + "22 10 7 1 \n", + "23 9 2 2 \n", + "24 10 8 5 \n", + "25 9 4 2 \n", + "26 6 1 5 \n", + "27 7 9 2 \n", + "28 5 6 9 \n", "\n", - " safety_score vmt_score zev_score public_engagement_score \\\n", - "0 9 2 4 5 \n", - "1 8 5 1 1 \n", + " lu_natural_resources_score safety_score vmt_score zev_score \\\n", + "0 10 9 2 4 \n", + "1 10 8 5 1 \n", + "2 3 7 4 3 \n", + "3 9 4 7 1 \n", + "4 7 2 1 7 \n", + "5 9 8 5 4 \n", + "6 5 3 9 9 \n", + "7 7 6 4 1 \n", + "8 7 5 8 1 \n", + "9 5 2 7 4 \n", + "10 1 10 6 10 \n", + "11 10 4 6 9 \n", + "12 10 4 6 1 \n", + "13 9 4 3 9 \n", + "14 9 6 5 7 \n", + "15 10 8 8 2 \n", + "16 6 7 1 6 \n", + "17 3 4 8 8 \n", + "18 9 4 6 4 \n", + "19 8 1 5 4 \n", + "20 2 9 1 2 \n", + "21 3 9 2 8 \n", + "22 10 7 1 7 \n", + "23 6 2 8 10 \n", + "24 9 2 9 3 \n", + "25 4 2 2 5 \n", + "26 5 6 10 6 \n", + "27 1 3 10 4 \n", + "28 4 10 4 3 \n", "\n", - " climate_resilience_score program_fit_score overall_score \n", - "0 2 2 68 \n", - "1 3 9 82 " + " public_engagement_score climate_resilience_score program_fit_score \\\n", + "0 5 2 2 \n", + "1 1 3 9 \n", + "2 3 2 3 \n", + "3 3 5 2 \n", + "4 1 3 3 \n", + "5 9 3 6 \n", + "6 1 7 4 \n", + "7 5 2 8 \n", + "8 7 3 10 \n", + "9 6 8 10 \n", + "10 7 8 9 \n", + "11 5 9 6 \n", + "12 5 10 5 \n", + "13 3 5 6 \n", + "14 6 7 8 \n", + "15 3 4 3 \n", + "16 9 3 4 \n", + "17 7 3 2 \n", + "18 2 8 8 \n", + "19 2 6 10 \n", + "20 10 3 8 \n", + "21 4 8 3 \n", + "22 4 9 2 \n", + "23 9 10 4 \n", + "24 8 8 6 \n", + "25 9 10 1 \n", + "26 5 9 7 \n", + "27 6 6 1 \n", + "28 2 5 1 \n", + "\n", + " overall_score \n", + "0 68 \n", + "1 82 \n", + "2 55 \n", + "3 74 \n", + "4 76 \n", + "5 81 \n", + "6 74 \n", + "7 58 \n", + "8 69 \n", + "9 73 \n", + "10 89 \n", + "11 79 \n", + "12 75 \n", + "13 76 \n", + "14 81 \n", + "15 68 \n", + "16 66 \n", + "17 63 \n", + "18 69 \n", + "19 72 \n", + "20 72 \n", + "21 78 \n", + "22 69 \n", + "23 83 \n", + "24 80 \n", + "25 64 \n", + "26 80 \n", + "27 65 \n", + "28 68 " ] }, - "execution_count": 17, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "scores_df.head(2)" - ] - }, - { - "cell_type": "markdown", - "id": "246437eb-f284-49b8-960d-d601a66f6362", - "metadata": {}, - "source": [ - "## Less is More\n", - "* Your manager asks for the `overall_score` for each project. They do not want to see the other metrics, only the project's name and its total score.\n", - "* Subset the dataframe and save it into a new dataframe.\n", - "* There are many ways to do the same thing in Python. \n", - " * While this isn't always true, the best way is usually the one with the least amount of text and code." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4e6d8e70-ae57-46c5-a5aa-9972be77f415", - "metadata": {}, - "outputs": [], - "source": [ - "# Enter in the columns you want to keep\n", - "columns_to_keep = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2c64cdcf-9598-4f4a-b077-5caec0cfe264", - "metadata": {}, - "outputs": [], - "source": [ - "# Enter in the columns you want to drop\n", - "columns_to_drop = []" + "\n", + "scores_df.drop(columns = columns_to_drop)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "47a96b86-e5d1-4fcd-ba73-7db5badae28b", + "execution_count": 20, + "id": "48ee899b-3db9-464f-802f-d431189176b7", "metadata": { "scrolled": true, "tags": [] }, - "outputs": [], - "source": [ - "\n", - "scores_df.drop(columns = columns_to_drop)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "48ee899b-3db9-464f-802f-d431189176b7", - "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
overall_scoreproject_name
068Meadow Magic Multi-Use Path
182Bunny Hop Bike Boulevard
255Strawberry Shortcake Sidewalks
374River Ramble Rabbit Trail
476Lilac Lane Dream Complete Street
581Unicorn Expressway
674Sunflower Gables Intermodal Facility
758Seaside Strawberry Port Revitalization
869Countryside Clover Rail Connector
973Tranquil Truck Trot
1089Rainbow Rush HOT Lanes
1179Greenway Gables Managed Lanes
1275Bunny Lane HOV+2 Haven
1376Wildflower Wonders Highway Expansion
1481Mountain View Mansion Interchange
1568Passing Lane Paradise Found
1666Sparkle City Smart Streets Initiative
1763Traffic Tamer Turtle Pace
1869Coastal Commuter Carousel
1972Rolling Renaissance Rabbit Express
2072Transit Treasure Transit Oasis
2178Berry Best Bus Rapid Transit
2269Electric Avenue Emerald Charging Stations
2383Hydrogen Haven Honeycomb Fueling Station
2480Gingerbread Village Green Complete Street
2564Trail of Treats and Transit Hub
2680Main Street Muffin Top Revitalization
2765Park and Ride Petal Paradise
2868Waterfront Waffle Walk and Bike
\n", + "
" + ], + "text/plain": [ + " overall_score project_name\n", + "0 68 Meadow Magic Multi-Use Path\n", + "1 82 Bunny Hop Bike Boulevard\n", + "2 55 Strawberry Shortcake Sidewalks\n", + "3 74 River Ramble Rabbit Trail\n", + "4 76 Lilac Lane Dream Complete Street\n", + "5 81 Unicorn Expressway\n", + "6 74 Sunflower Gables Intermodal Facility\n", + "7 58 Seaside Strawberry Port Revitalization\n", + "8 69 Countryside Clover Rail Connector\n", + "9 73 Tranquil Truck Trot\n", + "10 89 Rainbow Rush HOT Lanes\n", + "11 79 Greenway Gables Managed Lanes\n", + "12 75 Bunny Lane HOV+2 Haven\n", + "13 76 Wildflower Wonders Highway Expansion\n", + "14 81 Mountain View Mansion Interchange\n", + "15 68 Passing Lane Paradise Found\n", + "16 66 Sparkle City Smart Streets Initiative\n", + "17 63 Traffic Tamer Turtle Pace\n", + "18 69 Coastal Commuter Carousel\n", + "19 72 Rolling Renaissance Rabbit Express\n", + "20 72 Transit Treasure Transit Oasis\n", + "21 78 Berry Best Bus Rapid Transit\n", + "22 69 Electric Avenue Emerald Charging Stations\n", + "23 83 Hydrogen Haven Honeycomb Fueling Station\n", + "24 80 Gingerbread Village Green Complete Street\n", + "25 64 Trail of Treats and Transit Hub\n", + "26 80 Main Street Muffin Top Revitalization\n", + "27 65 Park and Ride Petal Paradise\n", + "28 68 Waterfront Waffle Walk and Bike" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "scores_df[columns_to_keep]" ] @@ -602,7 +1460,7 @@ "* This is where f-strings come in. What are f-strings? \n", "> Python f-strings provide a quick way to interpolate and format strings. They’re readable, concise, and less prone to error than traditional string interpolation and formatting tools...\n", " * Read more about them [here](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python).\n", - "* Let's practice ." + "* Let's practice !" ] }, { @@ -618,29 +1476,29 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "id": "db111f34-08b8-42f9-96fe-6852c4af50ad", "metadata": {}, "outputs": [], "source": [ "# However my file is going to change.\n", "# I want to name my subsetted dataframe as \"aggregated\" and I want it to be saved as an Excel workbook.\n", - "FILE = \"final_scores.xlsx\"" + "FILE = \"starter_kit_example_final_scores.xlsx\"" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "edff403c-ef37-48d8-8c7a-60b388752a51", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'gs://calitp-analytics-data/data-analyses/starter_kit/final_scores.xlsx'" + "'gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_example_final_scores.xlsx'" ] }, - "execution_count": 22, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -652,7 +1510,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "bf37fc2d-ac6c-4134-94de-79a9a4141ffc", "metadata": {}, "outputs": [], @@ -666,13 +1524,24 @@ "id": "17c17adb-404e-4e54-bdb4-c3295e0e2be2", "metadata": {}, "source": [ - "### So many options!\n", - "* Export using `df.to_parquet()`. We typically prefer saving to `parquets` and you can read why [here](https://docs.calitp.org/data-infra/analytics_new_analysts/03-data-management.html#parquet).\n", - "* Export `df.to_excel()`. Open up your new Excel workbook and see if it's what you expect.\n", + "* Export your entire dataframe with the new `overall_score` column using `df.to_parquet()`. \n", + " * We typically prefer saving to `parquets` and you can read why [here](https://docs.calitp.org/data-infra/analytics_new_analysts/03-data-management.html#parquet).\n", + "* Export your subsetted dataframe with only the `overall_score` and `project_name` columns using `df.to_excel()`. \n", + " * Open up your new Excel workbook and see if it's what you expect.\n", " * Hint: you will probably get a very annoying extra column! \n", " * Try out some of the arguments [listed](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html#pandas.DataFrame.to_excel)." ] }, + { + "cell_type": "code", + "execution_count": 25, + "id": "22562f2f-8359-4e44-951c-25e5ac033282", + "metadata": {}, + "outputs": [], + "source": [ + "scores_df.to_parquet(f\"{GCS_FILE_PATH}starter_kit_example_final_scores.parquet\")" + ] + }, { "cell_type": "markdown", "id": "69d211b4-89f0-4b2c-9093-1118114ba649", diff --git a/starter_kit/2024_basics_02.ipynb b/starter_kit/2024_basics_02.ipynb index fddebe129..0201cccbc 100644 --- a/starter_kit/2024_basics_02.ipynb +++ b/starter_kit/2024_basics_02.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "6cbbfb96-1e9e-400a-9884-72f08d1191f3", "metadata": {}, "outputs": [], @@ -21,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "3da62b06-24b4-4791-a073-185ee3765152", "metadata": {}, "outputs": [], @@ -37,12 +37,14 @@ "id": "616f1aed-d082-4e49-8eae-5c3acf87155f", "metadata": {}, "source": [ - "## Read back in the two files you'll need using f'strings" + "* Read back in the `parquet` file with the `overall_score` you created from exercise 1.\n", + "* Read the Excel sheet containing the project information (scope of work, district, and project name).\n", + "* Use f-strings." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "e7e4cafe-eb24-477b-a45c-88bfcaff37f3", "metadata": {}, "outputs": [], @@ -52,37 +54,37 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "2c4af22f-91ac-4e03-8b80-2121adc9a348", "metadata": {}, "outputs": [], "source": [ - "OG_FILE = \"starter_kit_csis_scoring_workbook.xlsx\"" + "EXCEL_FILE = \"starter_kit_csis_scoring_workbook.xlsx\"" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 5, "id": "873bfb72-9b47-472c-a18b-248be7f8c694", "metadata": {}, "outputs": [], "source": [ - "OVERALL_SCORE_FILE = \"final_scores.xlsx\"" + "OVERALL_SCORE_FILE = \"starter_kit_example_final_scores.parquet\"" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "id": "6cf0c667-b81a-430f-afb8-68f4e0f0a147", "metadata": {}, "outputs": [], "source": [ - "projects_df = pd.read_excel(f\"{GCS_FILE_PATH}{FILE1}\")" + "projects_df = pd.read_excel(f\"{GCS_FILE_PATH}{EXCEL_FILE}\")" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "id": "7de4e3b1-15bb-4f37-a392-36c3c0d3e39d", "metadata": {}, "outputs": [ @@ -139,7 +141,7 @@ "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. " ] }, - "execution_count": 14, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -150,17 +152,17 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 8, "id": "8a5e10d5-f978-408d-87d9-05f930038a47", "metadata": {}, "outputs": [], "source": [ - "overall_scores_df = pd.read_excel(f\"{GCS_FILE_PATH}{OVERALL_SCORE_FILE}\")" + "overall_scores_df = pd.read_parquet(f\"{GCS_FILE_PATH}{OVERALL_SCORE_FILE}\")" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 9, "id": "898592ba-7655-41c9-a982-251491bd9083", "metadata": {}, "outputs": [ @@ -185,35 +187,87 @@ " \n", " \n", " \n", - " Unnamed: 0\n", " project_name\n", + " accessibility_score\n", + " dac_accessibility_score\n", + " dac_traffic_impacts_score\n", + " freight_efficiency_score\n", + " freight_sustainability_score\n", + " mode_shift_score\n", + " lu_natural_resources_score\n", + " safety_score\n", + " vmt_score\n", + " zev_score\n", + " public_engagement_score\n", + " climate_resilience_score\n", + " program_fit_score\n", " overall_score\n", " \n", " \n", " \n", " \n", " 0\n", - " 0\n", " Meadow Magic Multi-Use Path\n", - " 136\n", + " 10\n", + " 3\n", + " 4\n", + " 8\n", + " 3\n", + " 6\n", + " 10\n", + " 9\n", + " 2\n", + " 4\n", + " 5\n", + " 2\n", + " 2\n", + " 68\n", " \n", " \n", " 1\n", - " 1\n", " Bunny Hop Bike Boulevard\n", - " 164\n", + " 8\n", + " 9\n", + " 5\n", + " 8\n", + " 7\n", + " 8\n", + " 10\n", + " 8\n", + " 5\n", + " 1\n", + " 1\n", + " 3\n", + " 9\n", + " 82\n", " \n", " \n", "\n", "" ], "text/plain": [ - " Unnamed: 0 project_name overall_score\n", - "0 0 Meadow Magic Multi-Use Path 136\n", - "1 1 Bunny Hop Bike Boulevard 164" + " project_name accessibility_score dac_accessibility_score \\\n", + "0 Meadow Magic Multi-Use Path 10 3 \n", + "1 Bunny Hop Bike Boulevard 8 9 \n", + "\n", + " dac_traffic_impacts_score freight_efficiency_score \\\n", + "0 4 8 \n", + "1 5 8 \n", + "\n", + " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", + "0 3 6 10 \n", + "1 7 8 10 \n", + "\n", + " safety_score vmt_score zev_score public_engagement_score \\\n", + "0 9 2 4 5 \n", + "1 8 5 1 1 \n", + "\n", + " climate_resilience_score program_fit_score overall_score \n", + "0 2 2 68 \n", + "1 3 9 82 " ] }, - "execution_count": 21, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -228,16 +282,14 @@ "metadata": {}, "source": [ "## Merging \n", - "* Your manager asks you to aggregate the average overall score, the max score, and the min score for each Caltrans District.\n", + "* Your manager asks you to aggregate the find by District:\n", + " * average overall score\n", + " * max score \n", + " * Min score\n", + " * Number of unique projects\n", "* Annoyingly enough, the `overall_score` column and the `ct_district` are in two different dataframes. You'll have to merge it. \n", - "* Welcome to DDS! This will happen to you all the time starting now. " - ] - }, - { - "cell_type": "markdown", - "id": "512d4282-545b-4c89-977c-8dfd47724d07", - "metadata": {}, - "source": [ + "* Welcome to DDS! This will happen to you all the time starting now. \n", + "\n", "### Food for thought \n", "* Which do columns the two dataframes have in common?\n", " * You can merge on more than one column. In fact, it's best practice to! \n", @@ -258,7 +310,7 @@ "metadata": {}, "outputs": [], "source": [ - "m1 = pd.merge(projects_df, overall_scores_df, on = [\"project_name\"])" + "m1 = pd.merge(projects_df, overall_scores_df, on=[\"project_name\"])" ] }, { @@ -285,17 +337,19 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 11, "id": "98e92c3f-ccd4-45f8-b6a6-523ddcb4a7ac", "metadata": {}, "outputs": [], "source": [ - "m2 = pd.merge(projects_df, overall_scores_df, on = [\"project_name\"], indicator = True, how = \"outer\")" + "m2 = pd.merge(\n", + " projects_df, overall_scores_df, on=[\"project_name\"], indicator=True, how=\"outer\"\n", + ")" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 12, "id": "f134cddf-5220-44f9-9e15-1c5171cbedfd", "metadata": {}, "outputs": [ @@ -308,7 +362,7 @@ "Name: _merge, dtype: int64" ] }, - "execution_count": 26, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -329,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 13, "id": "4dd07bab-4d1b-41a0-954e-4c2d59584e57", "metadata": {}, "outputs": [ @@ -354,67 +408,39 @@ " \n", " \n", " \n", - " ct_district\n", " project_name\n", - " Scope of Work\n", - " Unnamed: 0\n", - " overall_score\n", " _merge\n", " \n", " \n", " \n", " \n", " 10\n", - " 8.00\n", " Rainbow Rush hot Lanes\n", - " High-Occupancy Toll lanes with dynamic pricing, utilizing advanced traffic management systems to optimize congestion relief and reduce emissions.\n", - " NaN\n", - " NaN\n", " left_only\n", " \n", " \n", " 12\n", - " 12.00\n", " Bunny Lane HOV+2 heaven\n", - " A High-Occupancy Vehicle lane with comfortable waiting areas, complimentary Wi-Fi, and convenient access to nearby amenities.\n", - " NaN\n", - " NaN\n", " left_only\n", " \n", " \n", " 26\n", - " 8.00\n", " main street muffin top\n", - " Pedestrian-friendly improvements to a charming town center, incorporating decorative lighting, street furniture, and enhanced storefronts.\n", - " NaN\n", - " NaN\n", " left_only\n", " \n", " \n", " 29\n", - " NaN\n", " Rainbow Rush HOT Lanes\n", - " NaN\n", - " 10.00\n", - " 178.00\n", " right_only\n", " \n", " \n", " 30\n", - " NaN\n", " Bunny Lane HOV+2 Haven\n", - " NaN\n", - " 12.00\n", - " 150.00\n", " right_only\n", " \n", " \n", " 31\n", - " NaN\n", " Main Street Muffin Top Revitalization\n", - " NaN\n", - " 26.00\n", - " 160.00\n", " right_only\n", " \n", " \n", @@ -422,38 +448,22 @@ "" ], "text/plain": [ - " ct_district project_name \\\n", - "10 8.00 Rainbow Rush hot Lanes \n", - "12 12.00 Bunny Lane HOV+2 heaven \n", - "26 8.00 main street muffin top \n", - "29 NaN Rainbow Rush HOT Lanes \n", - "30 NaN Bunny Lane HOV+2 Haven \n", - "31 NaN Main Street Muffin Top Revitalization \n", - "\n", - " Scope of Work \\\n", - "10 High-Occupancy Toll lanes with dynamic pricing, utilizing advanced traffic management systems to optimize congestion relief and reduce emissions. \n", - "12 A High-Occupancy Vehicle lane with comfortable waiting areas, complimentary Wi-Fi, and convenient access to nearby amenities. \n", - "26 Pedestrian-friendly improvements to a charming town center, incorporating decorative lighting, street furniture, and enhanced storefronts. \n", - "29 NaN \n", - "30 NaN \n", - "31 NaN \n", - "\n", - " Unnamed: 0 overall_score _merge \n", - "10 NaN NaN left_only \n", - "12 NaN NaN left_only \n", - "26 NaN NaN left_only \n", - "29 10.00 178.00 right_only \n", - "30 12.00 150.00 right_only \n", - "31 26.00 160.00 right_only " + " project_name _merge\n", + "10 Rainbow Rush hot Lanes left_only\n", + "12 Bunny Lane HOV+2 heaven left_only\n", + "26 main street muffin top left_only\n", + "29 Rainbow Rush HOT Lanes right_only\n", + "30 Bunny Lane HOV+2 Haven right_only\n", + "31 Main Street Muffin Top Revitalization right_only" ] }, - "execution_count": 27, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "m2.loc[m2._merge != \"both\"]" + "m2.loc[m2._merge != \"both\"][[\"project_name\", \"_merge\"]]" ] }, { @@ -468,12 +478,17 @@ "* Since there are essentially only a couple of names to replace, we can do it using a dictionary.\n", "* Decide whether you want to rename the values in the left dataframe or the right one. \n", " * AH: Link to docs\n", - " * Explain what a dictionary is\n" + " * Explain what a dictionary is\n", + "* Take a look at elements \n", + " * Trailing white spaces\n", + " * Capitalization\n", + " * Spelling\n", + " * Symbols" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 14, "id": "55709137-db8e-4bf8-8939-6f8af49b3719", "metadata": { "scrolled": true, @@ -481,25 +496,27 @@ }, "outputs": [], "source": [ - "# I highly recommend you use .unique() to find the project names. \n", - "# Often there are trailing white spaces that are naked to our human eyes.\n" + "# I highly recommend you use .unique() to find the project names.\n", + "# Often there are trailing white spaces that are naked to our human eyes." ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 15, "id": "9dad92fe-87a6-434d-a62f-d269f3ad1054", "metadata": {}, "outputs": [], "source": [ - "new_names = {'main street muffin top ':'Main Street Muffin Top Revitalization',\n", - " 'Bunny Lane HOV+2 heaven':'Bunny Lane HOV+2 Haven',\n", - " 'Rainbow Rush hot Lanes':'Rainbow Rush HOT Lanes'}" + "new_names = {\n", + " \"main street muffin top \": \"Main Street Muffin Top Revitalization\",\n", + " \"Bunny Lane HOV+2 heaven\": \"Bunny Lane HOV+2 Haven\",\n", + " \"Rainbow Rush hot Lanes\": \"Rainbow Rush HOT Lanes\",\n", + "}" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 16, "id": "d8532992-771e-446a-b419-55ad757ff45f", "metadata": {}, "outputs": [], @@ -519,156 +536,81 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 17, "id": "db09aa04-7a94-4b94-9ade-10b1a987e006", "metadata": {}, "outputs": [], "source": [ - "final_m = pd.merge(projects_df, overall_scores_df, how = \"inner\", on = \"project_name\")" + "final_m = pd.merge(projects_df, overall_scores_df, how=\"inner\", on=\"project_name\")" ] }, { - "cell_type": "code", - "execution_count": 36, - "id": "b83708f3-eb0a-40b7-923a-6569e1c525ff", + "cell_type": "markdown", + "id": "1c2d76d1-37eb-405a-8834-23137a03e411", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "28" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "final_m.project_name.nunique()" + "## Groupby\n", + "* You're done merging...Oh wait, that wasn't even part of your manager's request. You still need to aggregate. \n", + "* There are many options Some are `groupby / agg`, `pivot_table`, `groupby / transform`\n", + "* Hint: rename these columns to be descriptive because we are no longer looking at the `overall_scores`" ] }, { "cell_type": "code", - "execution_count": 38, - "id": "54a00f55-f6ab-4475-93b5-6772321db40b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ct_districtproject_nameScope of WorkUnnamed: 0overall_score
010Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.0136
18Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.1164
\n", - "
" - ], - "text/plain": [ - " ct_district project_name \\\n", - "0 10 Meadow Magic Multi-Use Path \n", - "1 8 Bunny Hop Bike Boulevard \n", - "\n", - " Scope of Work \\\n", - "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", - "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", - "\n", - " Unnamed: 0 overall_score \n", - "0 0 136 \n", - "1 1 164 " - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "final_m.head(2)" - ] - }, - { - "cell_type": "markdown", - "id": "1c2d76d1-37eb-405a-8834-23137a03e411", + "execution_count": 18, + "id": "7328fcf2-ea52-46b8-8624-a7f3f39428df", "metadata": {}, + "outputs": [], "source": [ - "## Groupby\n", - "* You're done merging...Oh wait, that wasn't even part of your manager's request.\n", - "* Let's revisit: they want you to \"aggregate the average overall score, the max score, and the min score for each Caltrans District.\"\n", - "* For `pandas`: there are many options. Some are `groupby / agg`, `pivot_table`, `groupby / transform`\n", - "* Hint: rename these columns to be descriptive because we are no longer looking at the `overall_scores`" + "final_m[\"min_score\"] = final_m.overall_score" ] }, { "cell_type": "code", - "execution_count": null, - "id": "48002356-070f-4bef-b039-eb3dd96178fb", + "execution_count": 19, + "id": "8dc4063c-1150-4b67-a125-16f245f4b9c4", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "final_m[\"max_score\"] = final_m.overall_score" + ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 72, "id": "0892a805-7d7f-47cf-b086-f5e320c5361c", "metadata": {}, "outputs": [], "source": [ - "agg1 = final_m.groupby([\"ct_district\"]).agg({\"overall_score\":\"median\"}).reset_index()" + "agg1 = (\n", + " final_m.groupby([\"ct_district\"])\n", + " .agg(\n", + " {\n", + " \"overall_score\": \"median\",\n", + " \"min_score\": \"min\",\n", + " \"max_score\": \"max\",\n", + " \"project_name\": \"nunique\",\n", + " }\n", + " )\n", + " .reset_index()\n", + ")" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 73, "id": "94c178b1-ff70-4d63-8820-aef101928c75", "metadata": {}, "outputs": [], "source": [ - "agg1 = agg1.rename(columns = {\"overall_score\":\"median_score\"})" + "agg1 = agg1.rename(\n", + " columns={\"overall_score\": \"median_score\", \"project_name\": \"n_projects\"}\n", + ")" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 74, "id": "70178e81-0d11-4d19-9001-96e466d6dced", "metadata": {}, "outputs": [ @@ -695,90 +637,129 @@ " \n", " ct_district\n", " median_score\n", + " min_score\n", + " max_score\n", + " n_projects\n", " \n", " \n", " \n", " \n", " 0\n", " 1\n", - " 138.00\n", + " 69.00\n", + " 68\n", + " 81\n", + " 3\n", " \n", " \n", " 1\n", " 2\n", - " 121.00\n", + " 60.50\n", + " 55\n", + " 66\n", + " 2\n", " \n", " \n", " 2\n", " 3\n", - " 144.00\n", + " 72.00\n", + " 68\n", + " 74\n", + " 3\n", " \n", " \n", " 3\n", " 4\n", - " 138.00\n", + " 69.00\n", + " 63\n", + " 83\n", + " 3\n", " \n", " \n", " 4\n", " 5\n", - " 146.00\n", + " 73.00\n", + " 73\n", + " 73\n", + " 1\n", " \n", " \n", " 5\n", " 6\n", - " 128.00\n", + " 64.00\n", + " 64\n", + " 64\n", + " 1\n", " \n", " \n", " 6\n", " 7\n", - " 156.00\n", + " 78.00\n", + " 78\n", + " 78\n", + " 1\n", " \n", " \n", " 7\n", " 8\n", - " 162.00\n", + " 82.00\n", + " 80\n", + " 89\n", + " 3\n", " \n", " \n", " 8\n", " 9\n", - " 148.00\n", + " 74.00\n", + " 65\n", + " 81\n", + " 5\n", " \n", " \n", " 9\n", " 10\n", - " 144.00\n", + " 72.00\n", + " 68\n", + " 76\n", + " 3\n", " \n", " \n", " 10\n", " 11\n", - " 160.00\n", + " 80.00\n", + " 80\n", + " 80\n", + " 1\n", " \n", " \n", " 11\n", " 12\n", - " 150.00\n", + " 75.00\n", + " 58\n", + " 79\n", + " 3\n", " \n", " \n", "\n", "" ], "text/plain": [ - " ct_district median_score\n", - "0 1 138.00\n", - "1 2 121.00\n", - "2 3 144.00\n", - "3 4 138.00\n", - "4 5 146.00\n", - "5 6 128.00\n", - "6 7 156.00\n", - "7 8 162.00\n", - "8 9 148.00\n", - "9 10 144.00\n", - "10 11 160.00\n", - "11 12 150.00" + " ct_district median_score min_score max_score n_projects\n", + "0 1 69.00 68 81 3\n", + "1 2 60.50 55 66 2\n", + "2 3 72.00 68 74 3\n", + "3 4 69.00 63 83 3\n", + "4 5 73.00 73 73 1\n", + "5 6 64.00 64 64 1\n", + "6 7 78.00 78 78 1\n", + "7 8 82.00 80 89 3\n", + "8 9 74.00 65 81 5\n", + "9 10 72.00 68 76 3\n", + "10 11 80.00 80 80 1\n", + "11 12 75.00 58 79 3" ] }, - "execution_count": 42, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -789,14 +770,646 @@ }, { "cell_type": "markdown", - "id": "576f14ad-40ca-4428-9845-2e577753f7a6", + "id": "452b850a-7e15-473f-93d8-0133d496fa96", "metadata": {}, "source": [ "## Visualizing \n", - "* While your manager is pleased with your work, they forgot to mention that they will be presenting this.\n", - "* Thus, they want a visualization of median scores by districts.\n", - "* Our preferred visualization library is `Altair` but there are many others. \n", - "* Make a chart " + "* You're done aggregating, but the dataframe looks objectively plain.\n", + "* Unfortunately in the world of data, looks do matter. \n", + "* Let's explore a couple of ways to present your data." + ] + }, + { + "cell_type": "markdown", + "id": "ba703a21-6e54-4667-8607-d4b8900f6371", + "metadata": {}, + "source": [ + "### Styling a Dataframe\n", + "* `pandas` has quite a few options that allow you to style your dataframe.\n", + "* [This tutorial](https://betterdatascience.com/style-pandas-dataframes/) offers some great ways to jazz up your dataframe.\n", + "* You can always read the [pandas documentation](https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html) for more ideas.\n", + "* Some ideas:\n", + " * Change the font\n", + " * Turn off the index\n", + " * Use colors to indicate low-high values\n", + " * Change the alignment of the values" + ] + }, + { + "cell_type": "markdown", + "id": "c251617a-1936-4df1-b461-cc63f4be5e37", + "metadata": {}, + "source": [ + "### Altair\n", + "* While a table is great, sometimes the stakeholder prefers a chart. \n", + "* Our preferred visualization library is `Altair`, although there are other options.\n", + " * Their docs page is [here](https://altair-viz.github.io/).\n", + "* The code to create a simple bar chart goes something like this. \n", + " * `alt.Chart(source).mark_bar().encode(x='a',y='b')`\n", + " * `source` is the dataframe you want to use for your chart.\n", + " * `x` denotes the column you are plotting on the X-axis. Make sure your column name has quotation marks around it. \n", + " * `y` denotes the column you are plotting on the Y-axis. \n", + "* If you want a line chart, simply swap out `.mark_bar()` for `.mark_line`\n", + " * `alt.Chart(source).mark_line().encode(x='x',y='f(x)')`\n", + "* Make your first chart below." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "fdcece32-d053-4b32-9e76-0f5ffed9ff52", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alt.Chart(agg1).mark_bar().encode(x=\"ct_district\", y=\"n_projects\")" + ] + }, + { + "cell_type": "markdown", + "id": "ff3cf65e-174c-4ee2-bdc3-ca07f3bb951f", + "metadata": {}, + "source": [ + "#### Customizing\n", + "* `altair` offers an endless ways to amp up the personality of your chart.\n", + "* Additionally, the chart above without a title and legend is a data visualization \"taboo\" and the dull Facebook blue is uninspiring. " + ] + }, + { + "cell_type": "markdown", + "id": "7a86074c-081c-47d5-862c-5cd5af83b124", + "metadata": {}, + "source": [ + "#### Add a title" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "88e1dff9-0188-49c9-b6cc-599610aca9a7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", + " x=\"ct_district\", y=\"n_projects\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "1d7073ac-6528-4999-9c9c-94c8147c0ac6", + "metadata": {}, + "source": [ + "#### Add some color\n", + "* Explain our calitp_color_palette." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "cb8df2a3-bf37-4fe4-833e-1259a6ad7f15", + "metadata": {}, + "outputs": [], + "source": [ + "from calitp_data_analysis import calitp_color_palette" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "aa21d088-3360-4d3e-811c-8cc5bdb2d3a8", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "# To see what is inside a module, just put two question marks\n", + "# From here, you can choose another color palette\n", + "# calitp_color_palette??" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "c629f242-9b1b-49d1-b4b0-1bb956782d69", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", + " x=\"ct_district\",\n", + " y=\"n_projects\",\n", + " color=alt.Color(\n", + " \"n_projects\", # This is the column you want the color of your bar to be based on\n", + " title=\"legend_title_here\", # This is the legend of your title\n", + " scale=alt.Scale(\n", + " range=calitp_color_palette.CALITP_DIVERGING_COLORS\n", + " ), # This is where you can customize the colors,\n", + " ),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "565ba059-6e2c-4d2b-99a4-665e39c0a0e5", + "metadata": {}, + "source": [ + "#### Adjusting the Axis" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "868bdb20-e960-4161-8fba-8b0d9a7ba2f4", + "metadata": {}, + "outputs": [], + "source": [ + "ct_districts = {\n", + " 1: \"D1\",\n", + " 2: \"D2\",\n", + " 3: \"D3\",\n", + " 4: \"D4\",\n", + " 5: \"D5\",\n", + " 6: \"D6\",\n", + " 7: \"D7\",\n", + " 8: \"D8\",\n", + " 9: \"D9\",\n", + " 10: \"D10\",\n", + " 11: \"D11\",\n", + " 12: \"D12\",\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "51f2289c-0fcb-4b3e-b1c1-cfa2315d6c35", + "metadata": {}, + "outputs": [], + "source": [ + "agg1[\"ct_district\"] = agg1[\"ct_district\"].replace(ct_districts)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "9832f9fc-53a3-4c5e-ba87-4b346d6f6985", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", + " x=alt.X(\"ct_district\"),\n", + " y=alt.Y(\"n_projects\", scale=alt.Scale(domain=[0, 5])),\n", + " color=alt.Color(\n", + " \"n_projects\",\n", + " title=\"legend_title_here\",\n", + " scale=alt.Scale(range=calitp_color_palette.CALITP_DIVERGING_COLORS),\n", + " ),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "1cf6657c-f0ab-4c6f-9f83-f5cf16f84e9e", + "metadata": {}, + "source": [ + "### Finishing Touches \n", + "* Sizing\n", + "* Tooltip\n", + "* Remapping\n", + "* Saving" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "94e4c5a4-23a8-4cea-96cf-fd52c57895f2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alt.Chart(agg1, title=\"your_title_here\").mark_bar(size=20).encode(\n", + " x=alt.X(\"ct_district\"),\n", + " y=alt.Y(\"n_projects\", scale=alt.Scale(domain=[0, 5])),\n", + " color=alt.Color(\n", + " \"n_projects\",\n", + " title=\"legend_title_here\",\n", + " scale=alt.Scale(range=calitp_color_palette.CALITP_DIVERGING_COLORS),\n", + " ),\n", + " tooltip=list(agg1.columns),\n", + ").properties(width=400, height=250)" + ] + }, + { + "cell_type": "markdown", + "id": "281e37d9-8ece-471d-abc2-38e4ad9f9e83", + "metadata": {}, + "source": [ + "### We have only visualized one column of data. \n", + "* There are still a few more columns. Make a couple of other charts using your code above. " + ] + }, + { + "cell_type": "markdown", + "id": "444b6ef0-23cc-459f-977d-a62adcd96070", + "metadata": { + "tags": [] + }, + "source": [ + "### Save your work" ] } ], From 527e79791f6ba13aa44eaddc276cdcbe2ad0b518 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Fri, 11 Oct 2024 22:28:07 +0000 Subject: [PATCH 05/12] workingon ex 3 --- starter_kit/2024_basics3.ipynb | 500 +++++++++++++++++++++++++++++++ starter_kit/2024_basics_02.ipynb | 37 ++- 2 files changed, 521 insertions(+), 16 deletions(-) create mode 100644 starter_kit/2024_basics3.ipynb diff --git a/starter_kit/2024_basics3.ipynb b/starter_kit/2024_basics3.ipynb new file mode 100644 index 000000000..6df3273a3 --- /dev/null +++ b/starter_kit/2024_basics3.ipynb @@ -0,0 +1,500 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3f74a524-f90a-4ad5-8d98-368afc398b46", + "metadata": {}, + "source": [ + "# Exercise 3: Strings, Functions, If Else, For Loops" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba8a0d90-9d57-4d01-9eb4-0b255970995e", + "metadata": {}, + "outputs": [], + "source": [ + "import altair as alt\n", + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddcdbbc1-2e1b-4797-bd34-07d9a1999cb6", + "metadata": {}, + "outputs": [], + "source": [ + "pd.options.display.max_columns = 100\n", + "pd.options.display.float_format = \"{:.2f}\".format\n", + "pd.set_option(\"display.max_rows\", None)\n", + "pd.set_option(\"display.max_colwidth\", None)" + ] + }, + { + "cell_type": "markdown", + "id": "8eec9257-7578-422c-b6d1-afe496e8ca70", + "metadata": {}, + "source": [ + "* Using a f-strings, load in your merged dataframe from Exercise 3." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c52b09e-90b5-4a5d-8fda-ca19cb8fe3cd", + "metadata": {}, + "outputs": [], + "source": [ + "GCS_FILE_PATH = \"gs://calitp-analytics-data/data-analyses/starter_kit/\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0222b8c-0996-47bb-8639-fc703cfbd249", + "metadata": {}, + "outputs": [], + "source": [ + "FILE = \"starter_kit_merge.parquet\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36bbc1d2-4285-4399-a0fd-1e02c5e5d5a1", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_parquet(f\"{GCS_FILE_PATH}{FILE}\")" + ] + }, + { + "cell_type": "markdown", + "id": "673fa239-dc06-4ef8-9513-ee167e80898e", + "metadata": {}, + "source": [ + "## Categorizing\n", + "* There are 30 projects. They all vary in themes, some are transit oriented while others are focused on Active Transportation (ATP).\n", + "* Categorizing data is an important part of data cleaning and analyzing so we can present the data in a more succint and insightful way. \n", + "* Let's organize projects into three categories.\n", + " * ATP\n", + " * Transit\n", + " * Everything else will go into \"Other\"" + ] + }, + { + "cell_type": "markdown", + "id": "49486dc6-a686-47fa-8cef-e252d7ec349d", + "metadata": {}, + "source": [ + "### Task 1: Strings\n", + "* Below are some of the common keywords that fall into transit and Active Transportation in a `list`.\n", + "* Feel free to add other terms you think are relevant. \n", + "* We are going to search the `Scope of Work` column for these keywords. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a6b817f-15e2-4d1c-aeae-5d7e9661a6f0", + "metadata": {}, + "outputs": [], + "source": [ + "transit = [\"transit\", \"passenger rail\", \"bus\", \"ferry\"]\n", + "atp = [\"bike\", \"pedestrian\", \"bicycle\", \"sidewalk\", \"path\"]" + ] + }, + { + "cell_type": "markdown", + "id": "6caf3a84-fcd7-4531-befe-11e76c01c8f1", + "metadata": {}, + "source": [ + "#### Step 1: Cleaning\n", + "* Remember in Exercise 2 some of the project names didn't merge between the two dataframes?\n", + "* In the real world, a lot of string data can be spelled in different ways, different cases, abbreviated, and the like.\n", + "* What if a coworker typed in \"HOV\" lane instead of \"hov\" lane? We know that's the same thing, but if we did `str.contains(\"HOV\")` we would miss out on any entry that says \"hov\" instead.\n", + "* The easiest way to clean this up is by lowercasing, stripping the white spaces, and replacing characters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea4a4df7-61ec-430b-a827-302704857318", + "metadata": {}, + "outputs": [], + "source": [ + "df[\"Scope of Work\"] = (\n", + " df[\"Scope of Work\"]\n", + " .str.lower()\n", + " .str.strip()\n", + " .str.replace(\"-\", \" \")\n", + " .str.replace(\"+\", \" \")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c3da188c-2afe-49f4-bbbd-8fecd8dfe10f", + "metadata": {}, + "source": [ + "* `str.contains()` allows you to search through the column. \n", + "* Let's search for projects that have \"transit\" in their descriptions. \n", + "* Pro-tip\n", + " * The data we work with tends to be pretty large. Scrolling vertically and horizontally isn't easy on the eyes.\n", + " * Placing all the columns you want to temporarily work within a `list` like `preview_subset` below is a good idea. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "315228d8-a72e-4f18-a0e7-2a254c87cc23", + "metadata": {}, + "outputs": [], + "source": [ + "preview_subset = [\"project_name\", \"Scope of Work\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be843d6a-b751-4e9f-8820-b521089914d3", + "metadata": {}, + "outputs": [], + "source": [ + "transit_only_projects = df.loc[df[\"Scope of Work\"].str.contains(\"transit\")]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d9a6259-8748-41fe-a549-01bdf0e9c273", + "metadata": {}, + "outputs": [], + "source": [ + "# Let's see how many transit projects\n", + "len(transit_only_projects)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6789307c-5808-4501-a1a6-5a14a12b0219", + "metadata": {}, + "outputs": [], + "source": [ + "transit_only_projects[preview_subset]" + ] + }, + { + "cell_type": "markdown", + "id": "d3adfb74-5a24-47f8-88da-92fe5591821a", + "metadata": {}, + "source": [ + "#### Step 2: Filtering\n", + "* We've found all the projects that says \"transit\" somewhere in its description. \n", + "* Now there are just 7 more elements to go. \n", + "* However, the method we used above leaves us with 7 separate dataframes when we actually just want our one original dataframe tagged with categories. \n", + "* A faster way: join all the keywords you want.\n", + "* | designates \"or\".\n", + "* You can read this as \"I want projects that contain the word bus, transit, or rail...\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2575f75-44ac-46ba-a334-fdf984546cd3", + "metadata": {}, + "outputs": [], + "source": [ + "transit_keywords = f\"({'|'.join(transit)})\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6a2a521-c0ae-4c2d-830d-4020a13855f2", + "metadata": {}, + "outputs": [], + "source": [ + "# Print it out\n", + "transit_keywords" + ] + }, + { + "cell_type": "markdown", + "id": "937913db-407e-415c-aabb-31d3f511ef0b", + "metadata": {}, + "source": [ + "* Filter again - notice the .loc after df and how there are brackets around `df`?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5e23b6f-98b8-4219-bc52-d847ea39d121", + "metadata": {}, + "outputs": [], + "source": [ + "df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)][preview_subset]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b62f28d-7b28-4258-8efa-74d1f9a41d04", + "metadata": {}, + "outputs": [], + "source": [ + "# We can see there are actually a few more transit projects then if we just filtered for the word \"transit\"\n", + "print(len(transit_only_projects))\n", + "print(len(df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)]))" + ] + }, + { + "cell_type": "markdown", + "id": "7c6717f8-4088-4c1f-9ec6-b9959fd6d283", + "metadata": {}, + "source": [ + "### Task 2: Functions \n", + "* Let's put this all together and categorize using `.map`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47afb269-672f-44c1-8ab5-d70921c6e703", + "metadata": {}, + "outputs": [], + "source": [ + "df[\"Category\"] = (\n", + " df[\"Scope of Work\"].str.contains(transit_keywords).map({True: \"Transit\"})\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c63f2ff8-3d2f-41c6-96d1-36d35159aef8", + "metadata": {}, + "outputs": [], + "source": [ + "df.Category.value_counts()" + ] + }, + { + "cell_type": "markdown", + "id": "d1f5fb9e-f8bd-4549-9e12-3f05dded1145", + "metadata": {}, + "source": [ + "* It looks only the 9 transit projects were categorized.\n", + "* We are missing 2 categories: ATP and Other.\n", + "* We could repeat the steps above or we can use a function.\n", + "* You can think of a function as a piece of code you write only once but reuse more than once.\n", + "* In the long run, functions save you work and look neater when you present your work.\n", + "* Let's build one together.\n", + "* Start your function with def() and the name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97e597a2-8625-4f2b-8646-760c0c011208", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def categorize():" + ] + }, + { + "cell_type": "markdown", + "id": "06ccd282-cf21-462b-8930-9a3148671ff1", + "metadata": {}, + "source": [ + "* Now let's think of what are the two elements that we will repeat.\n", + "* We merely want to substitute `transit_keywords` with ATP related keywords.\n", + "* Instead of the `df[\"Category]\"==Transit`, we want our ATP projects to be categorized as \"ATP\".\n", + "* Add the two elements that need to be substituted into the argument of your function.\n", + " * It's good practice to specify the argument should be: a string/list/dataframe. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61973dc6-d99b-48f0-842f-a3c8fe74f064", + "metadata": {}, + "outputs": [], + "source": [ + "def categorize(df:pd.DataFrame, keywords:list, category:str):" + ] + }, + { + "cell_type": "markdown", + "id": "ae178f6d-0f76-419c-aab2-9924ba294605", + "metadata": {}, + "source": [ + "* It's also a nice idea to document what your function will return.\n", + "* In our case, it's a dataframe. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a794693a-3bf2-48ba-b0a7-1ca3a41e03af", + "metadata": {}, + "outputs": [], + "source": [ + "def categorize(df:pd.DataFrame, keywords:list, category:str)->pd.DataFrame:" + ] + }, + { + "cell_type": "markdown", + "id": "be820c1a-a0d2-4b2f-bf01-70e753603291", + "metadata": {}, + "source": [ + "* Think about the steps we took to categorize transit only.\n", + "* Add the sections of the code we will be reusing and sub in the original variables for the arguments.\n", + " * First, we joined the keywords from a list into a tuple.\n", + " * Second, we searched through the Scope of Work column for the keywords and tagged it with the category" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9ffb176-1f21-498f-9d78-dcd303ce4614", + "metadata": {}, + "outputs": [], + "source": [ + "df[\"Category\"] = np.nan" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4721b564-726a-4e05-9d27-8035609b5fcf", + "metadata": {}, + "outputs": [], + "source": [ + "def categorize(df: pd.DataFrame, keywords: list, category: str) -> pd.DataFrame:\n", + " joined_keywords = (\n", + " f\"({'|'.join(keywords)})\" # Remember this used to be transit_keywords\n", + " )\n", + "\n", + " df[\"Category\"] = (\n", + " df[\"Scope of Work\"].str.contains(joined_keywords).map({True: category})\n", + " ) # Remember this used to say \"Transit\". Now we want it to take whatever category is appropriate.\n", + "\n", + " return df" + ] + }, + { + "cell_type": "markdown", + "id": "81bbb109-beef-452c-b8d9-eb13e7b9ee03", + "metadata": {}, + "source": [ + "* Now let's use your function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23e31c98-17b3-41e2-883a-14dae9d6da7e", + "metadata": {}, + "outputs": [], + "source": [ + "df = categorize(df, atp, \"ATP\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5ec64cf-432c-45e2-b14d-f4ea7ca3de2a", + "metadata": {}, + "outputs": [], + "source": [ + "df.Category.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "882a02a6-ce39-4da2-b2be-7e91322624e4", + "metadata": {}, + "outputs": [], + "source": [ + "df = categorize(df, transit, \"Transit\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee56ee97-307c-44a4-a2d4-b02eff954f87", + "metadata": {}, + "outputs": [], + "source": [ + "df.Category.value_counts()" + ] + }, + { + "cell_type": "markdown", + "id": "405aac8e-4488-47fa-bbb1-a12121ed8d15", + "metadata": {}, + "source": [ + "* Let's look at the categories again" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2178925-c425-4711-ab68-37e32f98deb3", + "metadata": {}, + "outputs": [], + "source": [ + "df.Category.value_counts()" + ] + }, + { + "cell_type": "markdown", + "id": "1906639f-0769-484a-bd3d-9821e488a4c5", + "metadata": {}, + "source": [ + "## If-Else\n", + "* Now we have found all of the projects that need their scores adjusted, let's go ahead and adjust the scores. \n", + "* We're going to do this with an `if-else` statement.\n", + "* The first part of the logic is: if a project's `Scope of Work` column contains an ATP or transit element, their score gets bumped up by 3. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1426a9ae-8227-4396-b7ac-28ac256c4ede", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/starter_kit/2024_basics_02.ipynb b/starter_kit/2024_basics_02.ipynb index 0201cccbc..d4f1fc7cf 100644 --- a/starter_kit/2024_basics_02.ipynb +++ b/starter_kit/2024_basics_02.ipynb @@ -531,7 +531,7 @@ "source": [ "* Merge your dataframes again. This time it should work.\n", "* Please also specify the merge type and the columns. \n", - "* Although Pandas does this automatically, it's good practice to write everything out." + "* Although Pandas does this automatically, it's good practice to write everything out.\n" ] }, { @@ -544,6 +544,17 @@ "final_m = pd.merge(projects_df, overall_scores_df, how=\"inner\", on=\"project_name\")" ] }, + { + "cell_type": "code", + "execution_count": 87, + "id": "70410a43-62c9-467c-b777-3415f22abe01", + "metadata": {}, + "outputs": [], + "source": [ + "# Save this dataframe as a parquet to GCS\n", + "final_m.to_parquet(f\"{GCS_FILE_PATH}starter_kit_merge.parquet\")" + ] + }, { "cell_type": "markdown", "id": "1c2d76d1-37eb-405a-8834-23137a03e411", @@ -918,7 +929,8 @@ "id": "7a86074c-081c-47d5-862c-5cd5af83b124", "metadata": {}, "source": [ - "#### Add a title" + "#### Add a title\n", + "* You can do so within `.Chart()`" ] }, { @@ -1150,7 +1162,10 @@ "id": "565ba059-6e2c-4d2b-99a4-665e39c0a0e5", "metadata": {}, "source": [ - "#### Adjusting the Axis" + "#### Adjusting the Axis\n", + "* Axis domain\n", + "* Axis values:\n", + " * Caltrans districts are integers or strings? " ] }, { @@ -1291,8 +1306,7 @@ "### Finishing Touches \n", "* Sizing\n", "* Tooltip\n", - "* Remapping\n", - "* Saving" + "* Saving to a png" ] }, { @@ -1399,17 +1413,8 @@ "metadata": {}, "source": [ "### We have only visualized one column of data. \n", - "* There are still a few more columns. Make a couple of other charts using your code above. " - ] - }, - { - "cell_type": "markdown", - "id": "444b6ef0-23cc-459f-977d-a62adcd96070", - "metadata": { - "tags": [] - }, - "source": [ - "### Save your work" + "* We have only visualized one column of data, but we have a couple of columns above. \n", + "* Make a few other charts. Altair's [gallery](https://altair-viz.github.io/gallery/index.html) is a great resource to kick off your chart-making career. " ] } ], From f58654970de5e9715442591e0366779f68f85f6e Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Fri, 25 Oct 2024 23:25:39 +0000 Subject: [PATCH 06/12] working on exercise 3/4 --- starter_kit/2024_basics3.ipynb | 1008 +++++++++++++++++++++++++++--- starter_kit/2024_basics_01.ipynb | 2 +- starter_kit/2024_basics_02.ipynb | 884 ++------------------------ starter_kit/2024_basics_04.ipynb | 33 + 4 files changed, 995 insertions(+), 932 deletions(-) create mode 100644 starter_kit/2024_basics_04.ipynb diff --git a/starter_kit/2024_basics3.ipynb b/starter_kit/2024_basics3.ipynb index 6df3273a3..809da8752 100644 --- a/starter_kit/2024_basics3.ipynb +++ b/starter_kit/2024_basics3.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "ba8a0d90-9d57-4d01-9eb4-0b255970995e", "metadata": {}, "outputs": [], @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "ddcdbbc1-2e1b-4797-bd34-07d9a1999cb6", "metadata": {}, "outputs": [], @@ -43,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "7c52b09e-90b5-4a5d-8fda-ca19cb8fe3cd", "metadata": {}, "outputs": [], @@ -53,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "e0222b8c-0996-47bb-8639-fc703cfbd249", "metadata": {}, "outputs": [], @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "36bbc1d2-4285-4399-a0fd-1e02c5e5d5a1", "metadata": {}, "outputs": [], @@ -71,6 +71,237 @@ "df = pd.read_parquet(f\"{GCS_FILE_PATH}{FILE}\")" ] }, + { + "cell_type": "markdown", + "id": "7cef8684-7d90-4f7c-a4a9-3f856430662b", + "metadata": {}, + "source": [ + "### Amanda, note to self why are there min and max scores here??" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c97f0ec6-bea0-401a-bb27-f37984a762eb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_nameScope of Workaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_scoremin_scoremax_score
010Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.103483610924522686868
18Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.89587810851139828282
22Strawberry Shortcake SidewalksColorful, patterned sidewalks connecting local schools and parks, incorporating playful strawberry-themed crosswalks and decorative street furniture.131105103743323555555
33River Ramble Rabbit TrailA 5-mile Class III bike lane along a picturesque riverfront, offering stunning views, river access points, and interpretive signage sharing the area's natural and cultural history.42999109471352747474
410Lilac Lane Dream Complete StreetA vibrant Complete Street featuring bike lanes, wide sidewalks, and ample green space, prioritizing pedestrian safety and community engagement through public events and programming.1010949107217133767676
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 10 Meadow Magic Multi-Use Path \n", + "1 8 Bunny Hop Bike Boulevard \n", + "2 2 Strawberry Shortcake Sidewalks \n", + "3 3 River Ramble Rabbit Trail \n", + "4 10 Lilac Lane Dream Complete Street \n", + "\n", + " Scope of Work \\\n", + "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", + "2 Colorful, patterned sidewalks connecting local schools and parks, incorporating playful strawberry-themed crosswalks and decorative street furniture. \n", + "3 A 5-mile Class III bike lane along a picturesque riverfront, offering stunning views, river access points, and interpretive signage sharing the area's natural and cultural history. \n", + "4 A vibrant Complete Street featuring bike lanes, wide sidewalks, and ample green space, prioritizing pedestrian safety and community engagement through public events and programming. \n", + "\n", + " accessibility_score dac_accessibility_score dac_traffic_impacts_score \\\n", + "0 10 3 4 \n", + "1 8 9 5 \n", + "2 1 3 1 \n", + "3 4 2 9 \n", + "4 10 10 9 \n", + "\n", + " freight_efficiency_score freight_sustainability_score mode_shift_score \\\n", + "0 8 3 6 \n", + "1 8 7 8 \n", + "2 10 5 10 \n", + "3 9 9 10 \n", + "4 4 9 10 \n", + "\n", + " lu_natural_resources_score safety_score vmt_score zev_score \\\n", + "0 10 9 2 4 \n", + "1 10 8 5 1 \n", + "2 3 7 4 3 \n", + "3 9 4 7 1 \n", + "4 7 2 1 7 \n", + "\n", + " public_engagement_score climate_resilience_score program_fit_score \\\n", + "0 5 2 2 \n", + "1 1 3 9 \n", + "2 3 2 3 \n", + "3 3 5 2 \n", + "4 1 3 3 \n", + "\n", + " overall_score min_score max_score \n", + "0 68 68 68 \n", + "1 82 82 82 \n", + "2 55 55 55 \n", + "3 74 74 74 \n", + "4 76 76 76 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, { "cell_type": "markdown", "id": "673fa239-dc06-4ef8-9513-ee167e80898e", @@ -82,7 +313,7 @@ "* Let's organize projects into three categories.\n", " * ATP\n", " * Transit\n", - " * Everything else will go into \"Other\"" + " * General Lanes" ] }, { @@ -91,20 +322,21 @@ "metadata": {}, "source": [ "### Task 1: Strings\n", - "* Below are some of the common keywords that fall into transit and Active Transportation in a `list`.\n", + "* Below are some of the common keywords that fall into the categories detailed above. They are held in a `list`.\n", "* Feel free to add other terms you think are relevant. \n", "* We are going to search the `Scope of Work` column for these keywords. " ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "6a6b817f-15e2-4d1c-aeae-5d7e9661a6f0", "metadata": {}, "outputs": [], "source": [ "transit = [\"transit\", \"passenger rail\", \"bus\", \"ferry\"]\n", - "atp = [\"bike\", \"pedestrian\", \"bicycle\", \"sidewalk\", \"path\"]" + "atp = [\"bike\", \"pedestrian\", \"bicycle\", \"sidewalk\", \"path\"]\n", + "general_lanes = [\"general\", \"auxiliary\"]" ] }, { @@ -115,16 +347,25 @@ "#### Step 1: Cleaning\n", "* Remember in Exercise 2 some of the project names didn't merge between the two dataframes?\n", "* In the real world, a lot of string data can be spelled in different ways, different cases, abbreviated, and the like.\n", - "* What if a coworker typed in \"HOV\" lane instead of \"hov\" lane? We know that's the same thing, but if we did `str.contains(\"HOV\")` we would miss out on any entry that says \"hov\" instead.\n", - "* The easiest way to clean this up is by lowercasing, stripping the white spaces, and replacing characters." + "* The easiest way to clean this up is by lowercasing, stripping the white spaces, and replacing characters.\n", + "* Also, by simplifying a string column, we can saerch through it easier. " ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "ea4a4df7-61ec-430b-a827-302704857318", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_2119/3727765838.py:2: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.\n", + " df[\"Scope of Work\"]\n" + ] + } + ], "source": [ "df[\"Scope of Work\"] = (\n", " df[\"Scope of Work\"]\n", @@ -132,6 +373,7 @@ " .str.strip()\n", " .str.replace(\"-\", \" \")\n", " .str.replace(\"+\", \" \")\n", + " .str.replace(\"_\", \" \")\n", ")" ] }, @@ -142,14 +384,14 @@ "source": [ "* `str.contains()` allows you to search through the column. \n", "* Let's search for projects that have \"transit\" in their descriptions. \n", - "* Pro-tip\n", - " * The data we work with tends to be pretty large. Scrolling vertically and horizontally isn't easy on the eyes.\n", + "* Tip\n", + " * The data we work with tends to be pretty wide. Scrolling horizontally gets tiresome.\n", " * Placing all the columns you want to temporarily work within a `list` like `preview_subset` below is a good idea. " ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "315228d8-a72e-4f18-a0e7-2a254c87cc23", "metadata": {}, "outputs": [], @@ -159,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "be843d6a-b751-4e9f-8820-b521089914d3", "metadata": {}, "outputs": [], @@ -169,10 +411,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "0d9a6259-8748-41fe-a549-01bdf0e9c273", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Let's see how many transit projects\n", "len(transit_only_projects)" @@ -180,10 +433,93 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "6789307c-5808-4501-a1a6-5a14a12b0219", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_nameScope of Work
11Greenway Gables Managed Lanesmanaged lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices.
16Sparkle City Smart Streets Initiativean intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion.
19Rolling Renaissance Rabbit Expressnew, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities.
20Transit Treasure Transit Oasistransit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility.
25Trail of Treats and Transit Huba multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations.
27Park and Ride Petal Paradisean attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options.
\n", + "
" + ], + "text/plain": [ + " project_name \\\n", + "11 Greenway Gables Managed Lanes \n", + "16 Sparkle City Smart Streets Initiative \n", + "19 Rolling Renaissance Rabbit Express \n", + "20 Transit Treasure Transit Oasis \n", + "25 Trail of Treats and Transit Hub \n", + "27 Park and Ride Petal Paradise \n", + "\n", + " Scope of Work \n", + "11 managed lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices. \n", + "16 an intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion. \n", + "19 new, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities. \n", + "20 transit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility. \n", + "25 a multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations. \n", + "27 an attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options. " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "transit_only_projects[preview_subset]" ] @@ -204,7 +540,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "c2575f75-44ac-46ba-a334-fdf984546cd3", "metadata": {}, "outputs": [], @@ -214,10 +550,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "f6a2a521-c0ae-4c2d-830d-4020a13855f2", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'(transit|passenger rail|bus|ferry)'" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Print it out\n", "transit_keywords" @@ -233,20 +580,142 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "e5e23b6f-98b8-4219-bc52-d847ea39d121", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_2119/2441750228.py:1: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)][preview_subset]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_nameScope of Work
11Greenway Gables Managed Lanesmanaged lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices.
16Sparkle City Smart Streets Initiativean intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion.
18Coastal Commuter Carousela 30 mile passenger rail line connecting coastal towns, featuring modern train sets, enhanced station amenities, and scenic viewing cars.
19Rolling Renaissance Rabbit Expressnew, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities.
20Transit Treasure Transit Oasistransit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility.
21Berry Best Bus Rapid Transitdedicated bus lanes with comfortable stops, featuring off board fare payment, priority traffic signals, and enhanced passenger amenities.
25Trail of Treats and Transit Huba multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations.
27Park and Ride Petal Paradisean attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options.
\n", + "
" + ], + "text/plain": [ + " project_name \\\n", + "11 Greenway Gables Managed Lanes \n", + "16 Sparkle City Smart Streets Initiative \n", + "18 Coastal Commuter Carousel \n", + "19 Rolling Renaissance Rabbit Express \n", + "20 Transit Treasure Transit Oasis \n", + "21 Berry Best Bus Rapid Transit \n", + "25 Trail of Treats and Transit Hub \n", + "27 Park and Ride Petal Paradise \n", + "\n", + " Scope of Work \n", + "11 managed lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices. \n", + "16 an intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion. \n", + "18 a 30 mile passenger rail line connecting coastal towns, featuring modern train sets, enhanced station amenities, and scenic viewing cars. \n", + "19 new, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities. \n", + "20 transit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility. \n", + "21 dedicated bus lanes with comfortable stops, featuring off board fare payment, priority traffic signals, and enhanced passenger amenities. \n", + "25 a multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations. \n", + "27 an attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options. " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)][preview_subset]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "7b62f28d-7b28-4258-8efa-74d1f9a41d04", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n", + "8\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_2119/1261237332.py:3: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " print(len(df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)]))\n" + ] + } + ], "source": [ "# We can see there are actually a few more transit projects then if we just filtered for the word \"transit\"\n", "print(len(transit_only_projects))\n", @@ -258,30 +727,63 @@ "id": "7c6717f8-4088-4c1f-9ec6-b9959fd6d283", "metadata": {}, "source": [ - "### Task 2: Functions \n", - "* Let's put this all together and categorize using `.map`." + "\n", + "* Let's put this all together. \n", + "* I want any project that contains a transit component to be tagged as \"Y\" in a column called \"Transit\". If a project doesn't have a transit component, it gets tagged as a \"N\"." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "47afb269-672f-44c1-8ab5-d70921c6e703", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_2119/1837788452.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " (df[\"Scope of Work\"].str.contains(transit_keywords)),\n" + ] + } + ], "source": [ - "df[\"Category\"] = (\n", - " df[\"Scope of Work\"].str.contains(transit_keywords).map({True: \"Transit\"})\n", - ")" + "df[\"Transit\"] = np.where(\n", + " (df[\"Scope of Work\"].str.contains(transit_keywords)),\n", + " \"Y\",\n", + " \"N\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "dfe862f0-f77e-4bf5-8710-888d3a8d7a4c", + "metadata": {}, + "source": [ + "* Using `value_counts()` we can see the breakdown of transit related projects." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "c63f2ff8-3d2f-41c6-96d1-36d35159aef8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "N 21\n", + "Y 8\n", + "Name: Transit, dtype: int64" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "df.Category.value_counts()" + "df.Transit.value_counts()" ] }, { @@ -289,24 +791,28 @@ "id": "d1f5fb9e-f8bd-4549-9e12-3f05dded1145", "metadata": {}, "source": [ - "* It looks only the 9 transit projects were categorized.\n", - "* We are missing 2 categories: ATP and Other.\n", + "### Task 2: Functions \n", + "* It looks only the 8 transit projects were categorized.\n", + "* We are missing the 2 categories: ATP and Lane related projects.\n", "* We could repeat the steps above or we can use a function.\n", - "* You can think of a function as a piece of code you write only once but reuse more than once.\n", - "* In the long run, functions save you work and look neater when you present your work.\n", + " * You can think of a function as a piece of code you write only once but reuse more than once.\n", + " * In the long run, functions save you work and look neater when you present your work.\n", + " * [Please read this great tutorial.](https://www.practicalpythonfordatascience.com/00_python_crash_course_functions)\n", + " * [And refer to this page on our docs.](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)\n", "* Let's build one together.\n", - "* Start your function with def() and the name" + "* Start your function with def(): and the name\n", + "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "97e597a2-8625-4f2b-8646-760c0c011208", "metadata": {}, "outputs": [], "source": [ "\n", - "def categorize():" + "#def categorize():" ] }, { @@ -315,20 +821,20 @@ "metadata": {}, "source": [ "* Now let's think of what are the two elements that we will repeat.\n", - "* We merely want to substitute `transit_keywords` with ATP related keywords.\n", - "* Instead of the `df[\"Category]\"==Transit`, we want our ATP projects to be categorized as \"ATP\".\n", + "* We merely want to substitute `transit_keywords` with ATP or Managed Lane related keywords.\n", + "* Instead of the `df[\"Transit]\"`, we want to create two new columns called something like `df[\"ATP]\"` and `df[\"Managed_Lanes]\"` to hold our yes/no results.\n", "* Add the two elements that need to be substituted into the argument of your function.\n", - " * It's good practice to specify the argument should be: a string/list/dataframe. \n" + " * It's good practice to specify what exactly the parameter should be: a string/list/dataframe. \n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "61973dc6-d99b-48f0-842f-a3c8fe74f064", "metadata": {}, "outputs": [], "source": [ - "def categorize(df:pd.DataFrame, keywords:list, category:str):" + "#def categorize(df:pd.DataFrame, keywords:list, new_column:str):" ] }, { @@ -342,12 +848,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "a794693a-3bf2-48ba-b0a7-1ca3a41e03af", "metadata": {}, "outputs": [], "source": [ - "def categorize(df:pd.DataFrame, keywords:list, category:str)->pd.DataFrame:" + "#def categorize(df:pd.DataFrame, keywords:list, new_column:str)->pd.DataFrame:" ] }, { @@ -363,30 +869,24 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "c9ffb176-1f21-498f-9d78-dcd303ce4614", - "metadata": {}, - "outputs": [], - "source": [ - "df[\"Category\"] = np.nan" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "4721b564-726a-4e05-9d27-8035609b5fcf", "metadata": {}, "outputs": [], "source": [ - "def categorize(df: pd.DataFrame, keywords: list, category: str) -> pd.DataFrame:\n", + "def categorize(df: pd.DataFrame, keywords: list, new_column: str) -> pd.DataFrame:\n", " joined_keywords = (\n", - " f\"({'|'.join(keywords)})\" # Remember this used to be transit_keywords\n", + " f\"({'|'.join(keywords)})\" # Remember this used to be the list called transit_keywords, but it must be changed into a tuple.\n", " )\n", - "\n", - " df[\"Category\"] = (\n", - " df[\"Scope of Work\"].str.contains(joined_keywords).map({True: category})\n", - " ) # Remember this used to say \"Transit\". Now we want it to take whatever category is appropriate.\n", - "\n", + " \n", + " # We are now creating a new column: notice how parameters has no quotation marks. \n", + " df[new_column] = np.where(\n", + " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n", + " \"Y\",\n", + " \"N\",\n", + " )\n", + " \n", + " # We are returning the updated dataframe from this function\n", " return df" ] }, @@ -400,42 +900,82 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "23e31c98-17b3-41e2-883a-14dae9d6da7e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_2119/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + ] + } + ], "source": [ "df = categorize(df, atp, \"ATP\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "id": "d5ec64cf-432c-45e2-b14d-f4ea7ca3de2a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "N 19\n", + "Y 10\n", + "Name: ATP, dtype: int64" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "df.Category.value_counts()" + "df.ATP.value_counts()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "882a02a6-ce39-4da2-b2be-7e91322624e4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_2119/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + ] + } + ], "source": [ "df = categorize(df, transit, \"Transit\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "ee56ee97-307c-44a4-a2d4-b02eff954f87", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_2119/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + ] + } + ], "source": [ - "df.Category.value_counts()" + "df = categorize(df, general_lanes, \"General_Lanes\")" ] }, { @@ -443,36 +983,324 @@ "id": "405aac8e-4488-47fa-bbb1-a12121ed8d15", "metadata": {}, "source": [ - "* Let's look at the categories again" + "* Use the `groupby` technique from Exercise 2 to get the total number of projects that fall in each of these 3 new columns" + ] + }, + { + "cell_type": "markdown", + "id": "5b28fc4f-2168-4c65-9395-b141a3895b3f", + "metadata": {}, + "source": [ + "### Amanda: Add more random projects in the sample data related to general lanes." ] }, { "cell_type": "code", - "execution_count": null, - "id": "d2178925-c425-4711-ab68-37e32f98deb3", + "execution_count": 27, + "id": "62115dcb-ea34-4bb1-9bd1-e678ec015b8c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_name
General_LanesTransitATP
NNN12
Y9
YN7
Y1
\n", + "
" + ], + "text/plain": [ + " project_name\n", + "General_Lanes Transit ATP \n", + "N N N 12\n", + " Y 9\n", + " Y N 7\n", + " Y 1" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "df.Category.value_counts()" + "df.groupby(['General_Lanes',\"Transit\", \"ATP\"]).aggregate({'project_name':'nunique'})" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "2203f4c7-80b8-4a20-97d8-b7b6e5795e8e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
overall_score
General_LanesTransitATP
NNN73.50
Y76.00
YN72.00
Y64.00
\n", + "
" + ], + "text/plain": [ + " overall_score\n", + "General_Lanes Transit ATP \n", + "N N N 73.50\n", + " Y 76.00\n", + " Y N 72.00\n", + " Y 64.00" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.groupby(['General_Lanes',\"Transit\", \"ATP\"]).aggregate({'overall_score':'median'})" ] }, { "cell_type": "markdown", - "id": "1906639f-0769-484a-bd3d-9821e488a4c5", + "id": "bc935af0-4db0-4e83-92cb-0d8b34792097", "metadata": {}, "source": [ "## If-Else\n", - "* Now we have found all of the projects that need their scores adjusted, let's go ahead and adjust the scores. \n", - "* We're going to do this with an `if-else` statement.\n", - "* The first part of the logic is: if a project's `Scope of Work` column contains an ATP or transit element, their score gets bumped up by 3. \n" + "* Part of CSIS is to reward projects that create new infrastructure that isn't highway related. \n", + " * If a project contains at least one transit related element, we will add 10 points to its `overall_score`.\n", + " * If a project contains at least one ATP element, we will add 5 points.\n", + " * If a project contains a managed lane element, we will subtract 3 points.\n", + " * For everything else, we will leave the `overall_score` as is. \n", + " * We are going to use an `if-else` clause within another function. \n", + " * [Read about them here](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#if-else-statements)" + ] + }, + { + "cell_type": "markdown", + "id": "3c2b98b1-a2b7-4e88-b3ae-909308ee0973", + "metadata": {}, + "source": [ + "#### The first part of the logic is: if a project's `Scope of Work` column contains a transit element, their score gets bumped up by 10. " ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "1426a9ae-8227-4396-b7ac-28ac256c4ede", "metadata": {}, "outputs": [], + "source": [ + "def alter_score(row):\n", + " if row.Transit == \"Y\":\n", + " row.overall_score += 10\n", + " elif row.ATP == \"Y\":\n", + " row.overall_score += 5\n", + " elif row.General_Lanes == \"Y\":\n", + " row.overall_score -= 3\n", + " return row" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "65c8493e-25ce-4784-91af-604d5ac372cf", + "metadata": {}, + "outputs": [], + "source": [ + "df = df.apply(alter_score, axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "5b414d3f-71a4-4078-9d98-b9082114e2c5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
overall_score
General_LanesTransitATP
NNN73.50
Y81.00
YN82.00
Y74.00
\n", + "
" + ], + "text/plain": [ + " overall_score\n", + "General_Lanes Transit ATP \n", + "N N N 73.50\n", + " Y 81.00\n", + " Y N 82.00\n", + " Y 74.00" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.groupby(['General_Lanes',\"Transit\", \"ATP\"]).aggregate({'overall_score':'median'})" + ] + }, + { + "cell_type": "markdown", + "id": "14ba020e-e2b3-4447-89e2-abdc0579fc6b", + "metadata": {}, + "source": [ + "## For Loops + More Charts.\n", + "* Tell them to make a chart that displays overall_scores for Transit projects.\n", + "* Use a function to create the chart. \n", + "* Use a for loop to filter the dataframe for Y for the two other categories and create the chart. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae6377db-e532-46ab-a3e0-d6d702b6deae", + "metadata": {}, + "outputs": [], "source": [] } ], diff --git a/starter_kit/2024_basics_01.ipynb b/starter_kit/2024_basics_01.ipynb index 074ddc7a7..3a94021b5 100644 --- a/starter_kit/2024_basics_01.ipynb +++ b/starter_kit/2024_basics_01.ipynb @@ -424,7 +424,7 @@ "* Your manager asks for the `overall_score` for each project. They do not want to see the other metrics, only the project's name and its total score.\n", "* Subset the dataframe and save it into a new dataframe.\n", "* There are many ways to do the same thing in Python. \n", - " * While this isn't always true, the best way is usually the one with the least amount of text and code." + " * The best way is usually the one with the least amount of text and code." ] }, { diff --git a/starter_kit/2024_basics_02.ipynb b/starter_kit/2024_basics_02.ipynb index d4f1fc7cf..aca06f813 100644 --- a/starter_kit/2024_basics_02.ipynb +++ b/starter_kit/2024_basics_02.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "6cbbfb96-1e9e-400a-9884-72f08d1191f3", "metadata": {}, "outputs": [], @@ -21,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "3da62b06-24b4-4791-a073-185ee3765152", "metadata": {}, "outputs": [], @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "e7e4cafe-eb24-477b-a45c-88bfcaff37f3", "metadata": {}, "outputs": [], @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "2c4af22f-91ac-4e03-8b80-2121adc9a348", "metadata": {}, "outputs": [], @@ -64,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "873bfb72-9b47-472c-a18b-248be7f8c694", "metadata": {}, "outputs": [], @@ -74,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "6cf0c667-b81a-430f-afb8-68f4e0f0a147", "metadata": {}, "outputs": [], @@ -84,75 +84,17 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "7de4e3b1-15bb-4f37-a392-36c3c0d3e39d", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ct_districtproject_nameScope of Work
010Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.
18Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.
\n", - "
" - ], - "text/plain": [ - " ct_district project_name \\\n", - "0 10 Meadow Magic Multi-Use Path \n", - "1 8 Bunny Hop Bike Boulevard \n", - "\n", - " Scope of Work \n", - "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", - "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "projects_df.head(2)" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "8a5e10d5-f978-408d-87d9-05f930038a47", "metadata": {}, "outputs": [], @@ -162,116 +104,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "898592ba-7655-41c9-a982-251491bd9083", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
project_nameaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_score
0Meadow Magic Multi-Use Path10348361092452268
1Bunny Hop Bike Boulevard8958781085113982
\n", - "
" - ], - "text/plain": [ - " project_name accessibility_score dac_accessibility_score \\\n", - "0 Meadow Magic Multi-Use Path 10 3 \n", - "1 Bunny Hop Bike Boulevard 8 9 \n", - "\n", - " dac_traffic_impacts_score freight_efficiency_score \\\n", - "0 4 8 \n", - "1 5 8 \n", - "\n", - " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", - "0 3 6 10 \n", - "1 7 8 10 \n", - "\n", - " safety_score vmt_score zev_score public_engagement_score \\\n", - "0 9 2 4 5 \n", - "1 8 5 1 1 \n", - "\n", - " climate_resilience_score program_fit_score overall_score \n", - "0 2 2 68 \n", - "1 3 9 82 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "overall_scores_df.head(2)" ] @@ -305,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "ad4962ca-ed83-48a3-b1e6-79e5d5b1042b", "metadata": {}, "outputs": [], @@ -337,7 +173,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "98e92c3f-ccd4-45f8-b6a6-523ddcb4a7ac", "metadata": {}, "outputs": [], @@ -349,24 +185,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "f134cddf-5220-44f9-9e15-1c5171cbedfd", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "both 26\n", - "left_only 3\n", - "right_only 3\n", - "Name: _merge, dtype: int64" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "m2._merge.value_counts()" ] @@ -383,85 +205,10 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "4dd07bab-4d1b-41a0-954e-4c2d59584e57", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
project_name_merge
10Rainbow Rush hot Lanesleft_only
12Bunny Lane HOV+2 heavenleft_only
26main street muffin topleft_only
29Rainbow Rush HOT Lanesright_only
30Bunny Lane HOV+2 Havenright_only
31Main Street Muffin Top Revitalizationright_only
\n", - "
" - ], - "text/plain": [ - " project_name _merge\n", - "10 Rainbow Rush hot Lanes left_only\n", - "12 Bunny Lane HOV+2 heaven left_only\n", - "26 main street muffin top left_only\n", - "29 Rainbow Rush HOT Lanes right_only\n", - "30 Bunny Lane HOV+2 Haven right_only\n", - "31 Main Street Muffin Top Revitalization right_only" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "m2.loc[m2._merge != \"both\"][[\"project_name\", \"_merge\"]]" ] @@ -488,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "55709137-db8e-4bf8-8939-6f8af49b3719", "metadata": { "scrolled": true, @@ -502,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "9dad92fe-87a6-434d-a62f-d269f3ad1054", "metadata": {}, "outputs": [], @@ -516,7 +263,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "d8532992-771e-446a-b419-55ad757ff45f", "metadata": {}, "outputs": [], @@ -536,7 +283,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "db09aa04-7a94-4b94-9ade-10b1a987e006", "metadata": {}, "outputs": [], @@ -546,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "id": "70410a43-62c9-467c-b777-3415f22abe01", "metadata": {}, "outputs": [], @@ -568,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "7328fcf2-ea52-46b8-8624-a7f3f39428df", "metadata": {}, "outputs": [], @@ -578,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "8dc4063c-1150-4b67-a125-16f245f4b9c4", "metadata": {}, "outputs": [], @@ -588,7 +335,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": null, "id": "0892a805-7d7f-47cf-b086-f5e320c5361c", "metadata": {}, "outputs": [], @@ -609,7 +356,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "id": "94c178b1-ff70-4d63-8820-aef101928c75", "metadata": {}, "outputs": [], @@ -621,160 +368,10 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": null, "id": "70178e81-0d11-4d19-9001-96e466d6dced", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ct_districtmedian_scoremin_scoremax_scoren_projects
0169.0068813
1260.5055662
2372.0068743
3469.0063833
4573.0073731
5664.0064641
6778.0078781
7882.0080893
8974.0065815
91072.0068763
101180.0080801
111275.0058793
\n", - "
" - ], - "text/plain": [ - " ct_district median_score min_score max_score n_projects\n", - "0 1 69.00 68 81 3\n", - "1 2 60.50 55 66 2\n", - "2 3 72.00 68 74 3\n", - "3 4 69.00 63 83 3\n", - "4 5 73.00 73 73 1\n", - "5 6 64.00 64 64 1\n", - "6 7 78.00 78 78 1\n", - "7 8 82.00 80 89 3\n", - "8 9 74.00 65 81 5\n", - "9 10 72.00 68 76 3\n", - "10 11 80.00 80 80 1\n", - "11 12 75.00 58 79 3" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "agg1" ] @@ -827,89 +424,10 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "fdcece32-d053-4b32-9e76-0f5ffed9ff52", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "alt.Chart(agg1).mark_bar().encode(x=\"ct_district\", y=\"n_projects\")" ] @@ -935,89 +453,10 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "id": "88e1dff9-0188-49c9-b6cc-599610aca9a7", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", " x=\"ct_district\", y=\"n_projects\"\n", @@ -1035,7 +474,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "id": "cb8df2a3-bf37-4fe4-833e-1259a6ad7f15", "metadata": {}, "outputs": [], @@ -1045,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "id": "aa21d088-3360-4d3e-811c-8cc5bdb2d3a8", "metadata": { "scrolled": true, @@ -1060,89 +499,10 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "id": "c629f242-9b1b-49d1-b4b0-1bb956782d69", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", " x=\"ct_district\",\n", @@ -1170,7 +530,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "id": "868bdb20-e960-4161-8fba-8b0d9a7ba2f4", "metadata": {}, "outputs": [], @@ -1193,7 +553,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "id": "51f2289c-0fcb-4b3e-b1c1-cfa2315d6c35", "metadata": {}, "outputs": [], @@ -1203,89 +563,10 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": null, "id": "9832f9fc-53a3-4c5e-ba87-4b346d6f6985", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 81, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", " x=alt.X(\"ct_district\"),\n", @@ -1311,89 +592,10 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": null, "id": "94e4c5a4-23a8-4cea-96cf-fd52c57895f2", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar(size=20).encode(\n", " x=alt.X(\"ct_district\"),\n", @@ -1414,7 +616,7 @@ "source": [ "### We have only visualized one column of data. \n", "* We have only visualized one column of data, but we have a couple of columns above. \n", - "* Make a few other charts. Altair's [gallery](https://altair-viz.github.io/gallery/index.html) is a great resource to kick off your chart-making career. " + "* Make a few other charts in different styles. Altair's [gallery](https://altair-viz.github.io/gallery/index.html) is a great resource to kick off your chart-making career. " ] } ], diff --git a/starter_kit/2024_basics_04.ipynb b/starter_kit/2024_basics_04.ipynb new file mode 100644 index 000000000..fa91f6f66 --- /dev/null +++ b/starter_kit/2024_basics_04.ipynb @@ -0,0 +1,33 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "05dd29e6-ec3f-4f9d-a595-d28b578c74e3", + "metadata": {}, + "source": [ + "# Exercise 4: Practicing more functions and merges, Prettifying, Scripts, HTML -> PDF dynamics" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From dc8cd39aaafdb82b676e275efd96b52a8d5ea4e5 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Mon, 28 Oct 2024 22:43:15 +0000 Subject: [PATCH 07/12] started on ex 3 and ex 4 --- starter_kit/19319_en_1.jpg | Bin 0 -> 440228 bytes starter_kit/2024_basics3.ipynb | 1328 ---------------------- starter_kit/2024_basics_01.ipynb | 1294 ++++------------------ starter_kit/2024_basics_02.ipynb | 301 +++-- starter_kit/2024_basics_03.ipynb | 1772 ++++++++++++++++++++++++++++++ starter_kit/2024_basics_04.ipynb | 428 +++++++- starter_kit/_starterkit_utils.py | 193 ++++ 7 files changed, 2817 insertions(+), 2499 deletions(-) create mode 100644 starter_kit/19319_en_1.jpg delete mode 100644 starter_kit/2024_basics3.ipynb create mode 100644 starter_kit/2024_basics_03.ipynb create mode 100644 starter_kit/_starterkit_utils.py diff --git a/starter_kit/19319_en_1.jpg b/starter_kit/19319_en_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb30bbba48eaf1494fc27acad26eb494add69416 GIT binary patch literal 440228 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

QF1M zBcKsuZE9oY?Tt@UDTz5xS()yyd_Z5{dmT$ZhE&;nrTi zQBc+Rlan`*nPX$(U83}eiI^BfxX#(1C6nYs(sn?tV)V1#=kX5mLctv9l~eQWE#k2p zL{YiO$8qUZ4&@;muS|1F@t2b^7nTP#Ps27xDUi`z{7v$^Q*chOHDa{TBLEw3pSCuA{X&1>*ZebDogvbW^2c)|eDJhSQcy;Pp`T78 zyy_wcSN7N!-T%lo?NJ?E<|v!GG*L6T?x+ws1s^l@WMZKfdY&$?sk@N|PjJi3HZ3}# z)#}Xk+Uw42oa1Epm;`a2la+KFNQ76%y>3kWbpvKnt>tSzgrtZk zImkazdSkqSZH`E2=B90)L3MTIdrs0pueY0wMw*8Ab&u#{OfDIo@H`(YK&K|Z;i#UI zCG>MwuPjH!LlE+|w>=yyO3h4BA`PqGU%Gzon|DGYbH#>g z*F*eq1gX-K>f2JcZQ3wYqf4CKBIsMfa*kQ3titWjeRfMW!aDRW+D{i#+BfvyVhBwQ;=SteP=SS zy*uF{2R*}fnV4nVct3aMiGen;T6Otyd1_0td|=bB{yN#2Ota^6`bDIqFWTO>R6KzJ zvhSD_Kccw2cTKaTT19Ho!agtuiI*gQ&C^z_Wgc2<26(zQ`vbbj( z1xv~gLU|4QnRtC6U3~=aZav!_Fd~y)?+{#2d_u*gEW@d#R{x&KX~I$00I92e9)x3H zaPMTQ+yFaF#2#{cM^|@-3GwEu(m^oBl-2_;VfH#K1Q=jo+DHrhh(&y8=>qs@xLa$+ z9KeJ=i#suYyZxlL^ZwxT@hF+%+V2lQkJRyb((jr*0D!8EZ_Md?;(M7)hE*K^hFig{ z+wuL|h3EymTWJCz*H=8JrQ^yw#X}6(jC0UD5d41Cmb&xD&T_G-tVa`|PgSBmGenRB zXlLTqa<16|n#I-4b<6|+MOlyw7>NNW-@%1H>QeOn->`)YmjK$e+W^V?l(mDCTExms zwgA=?g8lmm&NmSbauNQ&3WqkZBZw>epTMrWJ~&m^aPxSO35QRcJw>?2f)K0VD!gOr z|C{-QpDL^ZyPWW_PJ9JI)p8Dwh4-FWKMQ^11bXBgpkdG5aEi|?UIn$v{}dM*EmoVm z@TB_-`GEW$)cy$16au^=Fu=i|BiB<=Zx>5C1E?a^lKvae+sHPTzZt?N?!mP~3opPv zKhPdUC%#3kxA7B|*!eYZM_Z-LRlt4WW-AxDEb0n~{XVLA@6A)q&9UH)>jR58(dxDx zXUO2WQZ*PUSe`2UgZHc!INV*VFG%pOkr=zbs^ zAI9yn;wNI(oNeuMSp5~SOlt66m>b%R;lfaT_nv@w31KPvj(p4>mKyR_)(op|k>rLe zm?3(0-lo$^YXL@9cv(FczJdy_1-S@#!H(zH^tWkN(v~fZwYsLDrUxh=|Hfl<#e=tH zr$-&E%M{6te_Jm-iUOXfTwB0y>Yvzyj_?o^NU=OE43oGn|202%^fVKg*-V-+hM&D^ zl=~fAtQbBC+^@W9d98pfCVa|#{R3i`nSSyMmM+=%x5cRJJ^(TJmZ66+9LZ8GucUxRm$Q9x z8+nRJ!ga@Wd4_NWJLZwP)owCxjXQwg2c2Zd*T62=9&BT~aq6 z0wM&j+otBMvpi2Px)WT&y=py{KV8tI~O+o3{(lgdT+VHL8x}l9} zqOiBlENF&pZ2YD$KDad~cwIwr;J4T#ZO)iwIt)Fs#_v%_DP4_@h0Tvhv5kZ_I6Pry zQd77j+*XEuP+%@`GbL?;KxsI=yd~*UoJKJb3EUI$6O--L(kJLD+)^mU&_pkqo1Gk} zk>;OBAbak4tk}9EGf7Q02m6itQ)KJ+1FNVeaw5Hv;Hao=h?YzvnbUgHdDu_E$&kRZ zprx?Q$ZY&*Dkzee_d{Kr)A&I*0s9_Jr_-OA@6GI?+v^#l>v!+l|MCF=X6

!X+in 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%0AJY^4HhMD%8BsQdWJLMk{fP?KKj-~adeNrI z9Lsi=<=d~<@1}N0t!({FyB{12y>3lM>r|jPswl>6Eyj@8%L|By?Q6c%%zgD*lJmY$ z#)(ENNhmoKz2xMV7d((m!U5jVkoquNZ(1$#*5S38%~R*P;I>Wo%Z`pzuEHA8*NtQo zA3l*dF{jaG#BAC*S>=`}(YOU1qRVcIUre}sugdG!yLmkIyuH4rX8214bDQKOuZ)!F z%@Q$7+glp^$Z!u1f_dw$lHz;sp$yO|-W%gs+uawwsVa%eQj7N$?h__F!Z|~Rt@-Pf zT#7%d`wvaBz@gVGktTpH&}u>Tr0vb>*a-2P)Rm|<{VKj^Jac)RB>P`SZ7M>WKTTHa zPIO~+r@Iup_4Tof8zj;>+EMZH647dzSXW%6xHzV_>RvQTTn0j z1ZFt#I;<~Oi6f_y8>=Fx=?m47t1lk#~`Si8Unjwm54myQt zKVNVnQl<_V=CM00bXxN24ZdrRHaS@~Lj}o(x%3nh5OL`y{%sYCY+{{Df?)@sLu!1KUiLo zTV(I|kaBG=Jr%ZiFeLbbO_i;ZsC9vCt`3c$PHKbDRmCOMGGkwa@GDPSY5`4PRRZD; zp9uk;od)7RG#+?yWzP!0ahO|zoInK-b_$oZ`#SN_}S=gFXoQL4nihX-jz4o!d`iV3} z&FrKJuZF7m3sby!8m8KNCnk6qvXnc8n}RBo7$ZIwp$yQ$=1~ae=;@8DV2XnFz+oLM zneNF0Jx{;iZ>N$%-48<~DqvbJhPLwT>VHxQ!yd+-x3Pf`Uc)vBOUYfHEU$O^t1)yW zotV!u**;^n9~~X;IFlH$IX*u)3`}Er*3-NEv@nU1S)TXv%f{m9m9kL-b)?KZ3&AP; z-h|&v-?m~ZyhYVS&JVR!RJ?4o@kmHz65-fxAU4UVYguZe3$; z);6n=>9ui_wOwl|-7&u*I+JDf zutB+{IzFOuZOdwc*}XgBGGZRle~NivWewBh0_mDz2DjgAeP0SLsdcnui8^}@*^PP^ zdAJglGUQMA+j-Hy?TBV~IJUuAm?k9;$Rll$VcG5!ALnQ|U7HsQeivS{-@$+rThCP~ z9d$eki>P7qfB8ER{SVsKsCHSC&yw@W1Fha302<0j{-U7K!H&2zP~Tb`wxO~dkuHB3 z8vgpOf1FS)KC1X9#I8rB`*a6eqEv1&C6QqOZ>ZDmH3BH&riU75v=uYl0~Dw6k9zyw zfa9U9ltn*)O%S39y`X~i!NuJ~aa~)Xx5qM;HBxuYP;w^G881&9@FQpJg>!K43BM8) zysCI)MyLbMVwr^Ql!D)699s>5zn)lkm^}p`K@<(Y6F`K05dIUrd3#Hdmu~=4UA#M+ zy1~ief2DQz-{4Jf`(AKd4kBJGe4ZmcL3IJ#wEw{vfDg4Gj77C8V4eSii;Vr~f5ROY zfyFioEuQ&FpF0}eS8?%K>i&ind!)AHP#f=vlHP`L$-T%g=No*@8j6b-i7 z`A_s4FEQ2(|PA!ysc+Ly%vD@;Mdt};9WiG_G{V*1~>2&+XO_D zE%WwxK72(EjYk5Ul9>_JHsZXCsSU`c>`T6arJ(Mx4ZvL$0n2VPJS-P};tYHcU=*I1_hQJ4bUZ%eFCOE6n zSP>rz{x~Fu5+d47TYI7d$`X@2C4vRW3zhr<*!mkpTIZ^Y0z`4(L5OX>(RMG;vIU`_ z`>Uv6PM{dPVFw!!0!9zJuKe42)^v!P7QHIa&owo?_V-ybO}wQ$w}2${z581G1mQ~O z0g-|JItuE1DO2DE*&qAb*7ezCiEbl+=#g1<<3%UDr~w=NAP6CL{1MzY?J2ESwh

hx%nzU!De_IKd$qHK8O7JyA%qVkXzUY!Jl0SU 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

CW&dP2$cy11QgRW5SlXY(MMgJkpL0 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

!XZp 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 z zHCVZ{YSZPaB7r8kqz-lQtrtUipRktBy@S-+Lt*)G6FQ7lZ*_^ONMX-;8HP>A--@{i zueukp(=A+lV1#qz5YWc4>!I^gHo%o{*Ta&TH@+v$kRa0vv+^bP zO~*0U89M_aUt(v0Md0fRhn~9*1$oM?V(M$;uF99h4V^7b15sN#6g=id(IukIcQqLd z@26Ju&HV_rG$a{EI`z71k%fIiyu1El$;k6j?(t-i;JiSa?50JS_aP0^#g)!f&@>>? z@6BSu>-kFML>Av=R4#?IJ#tp{A@=9pe%}={ctJrHb+?VT=iSD*yB(WVl-IZNC6*gQ zvsp-XjGI4KC2&eXGP$+G9~5RnCVF0nJ60m%9pRm)XUI4s7Gs`56RTUD?7bl&@`l$7 z`ma&V`V~n}@oUyrEb(R2sO2ssay(A zxUKx^<|fucpNO0SpOjD0ug5X5-Te!JDJI}fO#VWFn+OZaDMqnSI`^ZLYibWRw&%Kc z@hCAm<9NNO6cU$KHqFBz4+N=Caw-H`H?jEfSS18vv0Fgli)e0|-3+amzGicL)9G!+ zv}bUR6D-o>?_p3n*2L2nIO)U1=5wl;w@PGlfWkDC0B__tfcOoxtj@qhfHDDvMz+o@ zG$5O2mKFfsZQR5=#k|a69rral@8n18N$Hq866qdD#pz9REc^n_Dm4j`Se(y*pwG%D zGGHEA86O=2;)6~1ezokBPgfk;#5-3^%bfyYY53#d#*GP!%6k@IF=Qqpfj=X5U;yO< zF8}{*V?bY~aqeS45bmqx&nN6unAkP(RWzX0s%uD2>Nl{!*`xtr!phd(jm<6K#1d&I zd7!Rfjx+rV2JNamWh44zm3(5L@@1ops~#0O602I$I$l_mx-Sk|&z zi6BP#4&fpQ6OL5%AKWbS30qYFlc?sO2w1yBrgosM+$pIYu&YwgoiszpTEqy{FMSgQ zYZ3XdGiW}i%vh>e@hfk|q*RgO*T8I?zI|BOH`FMstHh0PPh9~{D!?-F(*je>lRHSU z1i;`NmbkNVf5a$7pSy^0e+1WH^n7v%7zSk*%{oobj>68FU2rh!%jQ#s-ezH_D$mcRTbw6HfGHe#*9P%ey(jYWuM~xQO zMMooKpyA0r0A}j?6=fB5nT8bts?iM+La-SeEbQAk`UrIYdh6H;F zULKctEsjz4!u~Yg3z11lbs()J)u2T1)+Jb4!`TM^YHMA7Z)X`U2)xCn`@~F z+|#YQ?X2Oemb?Q!%tzVoRgqtaP_(n{f|Z@B!};JO;IfH9J9$h z+0fDFFWn#_{-jnMiD5vy)gRc|?RU@$sWa=RjtB=nn^fJort*H+-V&lD76#LaWlDw) zYh@h$`k5+&#aeK_mQS4&jwZLDD=f~kwNRt$pJG3*dvL_+eWyrcLRG!oEQr#Q$9xEu z(9(EEers709o|JxZ26wh*3FGJi3!(*O&U$DZ-(Dfyr2C+M>1KuAX$0^JyG*_LX6Cb zdyBCnny&uGs`Z$J-s!ZF*dHy@&XbqaKm0>D_gl2;(|o8<%$O$5Wp$qzm;B4Bo`fSo zhx_JyO^&>sC|Gr%Kp6AHA&t&rX5+qJ%ii=iXVmvZVu=h*x+oWOX5XS7)XVo=suZeP z*rh#>(gma0!^WcNjwZ}e0;HW}^0^e5Ob0^SyaxM%gxkfi|m-swFev4FUL zcu*DfxVX9f-g%WMu_Dz=?Z$%7*n>!4HOctU1vH4c ziQJ1f?zOfm{Utq<=zX^%bj4@EqmXTcE~MhugOLD#4N;7YbFOIr$OcloXxDr(EplLD zV6JtX5VA5$r{i%m9dYK5oQ5gyHYBV(K4K>BF?Manpko@xfzG)r@}Vjft{Me!LZT z!RJatF~9FC0lA#-3?>~5$D#wmZ+0#u4#!s!YE`UjC7L&LKxtQgNORJ4qBkW)xdXnMek$wj~SC5hDtHP3QlG{(*S6T7@}UQxWk zO5Qxlb{~VBcJx!Gsw_Gjg+OtMX<=6RP6Zm={AbA6q|_PeFzh_olx}F3KVcAmw-&;8jP@ExuFp z;MYluq04i|)nP+V&g`1fqdj#h9oJe-YZtY;4MFDxwjZxL>5z1mXeEZl=wNAVmYh?| z`7;RvC}`DqeK(4U^Q6=g{rH(hq`t(M2E!5Yr)*Ow4;O{-43FF^$JeJ34we#vpXk@~ zgv%6E%G%@Ro1+x}b>E_vd2N!_U2Y?^HfSMYJLU+ZQ8y9Pq^D^dL~6|(q^pffNV1(# zR>_mnRb!+UX+iGc&@4k8?HB6L&1ovh%Rd!4w8>3!v~o#mOMY8$MVgUBb>4$L@$G>RA^BdsGQ3C6)d(wXeE7chzW+E+xUvX<6riN*g+oiHBd|Fux%6&)H5Xn?L&XWqj z9>Y-cyzT5qir6YK#Mkj|Wd?tKEM)*4LX9QOtP|eUT9YnysSc4Xn{yt{Z)PyvsVWsx zFP<1}l)rUl#UpG!PD}Y{gd)cM=lw}J9M0A8Ta5~ts>KP$huNj2K>swWbujWQu~hnh z1cop7V_uWS@F5cJ|D~hHc^ShI!Ymx$^Ln^oZ!V1PlJ<92ek07mx@2~zuoncDMXc%R zF%UFZ^%7E~!F8-Mitk&9p zu!OU3*WE=+nqBn)h1MC4u6|pB zjFx{^azw5Q?7%hhO0dy?6*E_*?%AJmn-JFt|1C~Tp*+JH9Ll5Q~$^7TVgz$&So(GibiJNUTnd4^m zy=4Ld)TK-RTse$anwgD)LSmt{ovMu*P0V7f`Z=7*Wdu|L;?{a!%_wD8?mQHKFk(Bd zk-tf_B=a%@ljDE!dq?1h>*Dz1`gosgRRAWpubXP-G?+4Y4dJ8<%>t1W&M>>O$T`*gVB!f_cX<_)dh@kZ(_ndh z$*DvbZQF44D80;(_qkf72c1g)ZY_^0uXEZP*EeCuYMtb8`iROOSmj@@Z+DR?5AQy0A&iMopqU9TbhfzU{WphH@4qvVQ30F06`S z5Z`bp^@&oNBI%L+n^+I+JdpXpgP|k$J}t?750vcuz4?)%tV%`@lJYsF^V?JnVcM40 z8=G0k7u0cm=yHz=41Y*&VBLL3h3E~TYghv$PgS%7#PHq+tQx#5R&==0>AoZV^*fIo zm9AZ6nIVZCAkux02H(3cAOkH2DD~76uMD2tEuJMCQ7>G(FC>-J?4oeE_|fBze&KE8 zZpV#sZNYEwiRDSt`ZT5jdRh(9p=rJb@A8O|sCUf$6xg7}RJO{Z-;c>6m%ruH`_UNk zG+Gb-WVmLcmF90w%~B#3{#@Rmo^*Hq=W(Dusf3QPlWI}-c9+$5an!qJ?AuA_aUq$f z%IJ%R=G8&^7RWtOT(YF_T`naPW!?Ae<`@Hv$fEOhh|LJoiwqOWhm=_}4ErdX*?#y` zo_1CclwOE;Vv6l$v;DPYg*WkZf5?tmg`n;Hhb6k*f!dJ<^CQI_@f9U2skMTtD^8}} z;@56abbO#h`~0cuBMj4w>m6T76f*1=DfM!lnwaf-oXekFi=tPfuXzpOUn ze|^!781L;kqZc?;jThb>Xe`n!KjC;5^ZN=E`jU_G855oFa=f|#VnwLOxBHpupk)gh za671(2Xxf{=FF@}edTt6lfdDoEC4z~_NkJ$AV4ih6 ztO~-n_2C^2KZpo}$EpXbLlg8dVL)9Of^Xgf$iY(H0$elO2xv*dlvRM@dN*TR1~j() z-%(So85?j|(JtX<~Z|?z&aQ1~LdfQh(2)-`T}LK+eJc?*~)`SfvV0)&T-yn?=!}DQ>%R zR;WWApy9qz_%0s0fg8s1H^&&h8+#!8K-j$UvlQMX1>ogM64#AwRWD}$Q_v>}l%36? z3LWnijA7n;Pl8#`ogw>RoXE<=Ie9cJZ~y?i*-dN=paR=HS<%2&bLa78z}j?KMe#iT z&?4GDz06>5X$jAofg#V(OyN5Wg#vcYru1H{_BQMQ5cUiV4Sz5;YX;o!-T!(uN|e&AZ2v!ODoDf7uP_UmrN{%lH7W4bXY)TqR|Jd3AO?Y0E|S@4?|t{q0B#p3Vfy@3rsBlEce zxH9%>O&%kvE&{oV45k;L(GMFYNgo0t2zG(p zBsqK6DE#+am?Tw|Yhd=F0Lj~XQWL4MO#%A$oiVP!s?u8|cQ`c33;6L{v=wdFUJ?E9 zO#K0qm~=QHto`XVxdnR&&DcN_oz%dmB?b*L>_3%+R3ZhIXNr*JjTe$eA+G#C_9pCS zorm80oouW$vKEzkPRzTGD9SI|n3m8u0N0I=UT47F*4W5v-Ba@cM+mZ#wM5*0fBG)< zi)e_%W&rdsrJITn_%-f!4Y_3S)v@ef29y^2#72tfQTg1p$iYkp8GPq4(|pwPda(E$ zCS}Rg@mq6-_WqOZZDtY_cS`-F5TEZ+AgU|;aT*|0Dlsi0(5-LAXDqW z43z(tVaW3e`1@A>5&pw#o)N;vabzUNJJ@WxhOX+NFOuUEeJvy5adW?Z2RwOfaj8fA zL=x7GK~zunmx;`OOh@!42an}4G&MyImGq&u3eWw94AdqkcQ<6LJ}TV^#t;{^X|)Pw z=0?cb`p47X!Ir(-URAwyFCM0Xl$T&!+-st)e1F@i%+QvJ!L^UOhr8gG(*6sP4>|VY z-}S^6A8@71zUz9-YWOn3TtLE3R5!)pJlA}5{fx;=mAy|?Xtd22QC}-czS-6Ah}|V2 z)($OW>(8LyB{i|!I>80?`}3%d=RRj2>+NM@G1CB? z;El@e-gjd)ZXXuLf>qEJTN-(XlxNi6GK#h2*HsyKb{nz=iKveZYqHRfZc9fPCNf_n zbs8iMe@c}VOW~){$%>d*<`62Y)pDY1jJj;O;db2cPkuJ3zeL6GpHP^p0mWcP7!BxSHkF+o>|6)ZOC8G zEsbZ$<%+pJ-QDBYrQ0@Vh*D=R|C;ap;KBI1`Onf7@#qEhj|d^*lBT9Oj2~0Mkj55v z+%*mXd%NzfsJpdrU`U$I)q!)pQ)twf!pc|YLwvW=x;**a?b<=_rdPZJy8KTHd518` zzGES!!>0qy8ZQ^-^=@7_{3%DpDRke+z;2k{s5Uh+e&i#IM~^3MfAT*~p4!n=Y`)ux zibX2)n>=c$PE#6An=TOkefU>^+m{5)V^OqQf z#hZP*N0t^h2Wn(uCnw*frsk_8(CvL`&u}7%7a4fzNf>KbiEUy}aNKg&(%jw2yUJr} z8dll#z*OuFojUsxya~ybwr()Uf7*+~KJ|y24gU5%|;)CF4LLANG1h#)d$$L`TM|M{)JOh0eX3bnkr(<@U&|niS;?NsIt^Th%YJ z8A)~!Kn}#}zyt)oymEc2X)Guw`RO=TF3Uey9*(hvSzDQWiHkLck1A{*?Fld5HT!6F zZ4S<>_EcW(=8}ACn#Pyc0yc$1$Qz~62rHv6lV$gPxePdl@=NXLxD&+@`Gz*`LSzod zO-v+g^(}nVaEq~}3EX;^2MsvLi;+_Qhs&diTh`Kl9d_5M`)#m|XBemvek%cF^Puf6XZ6__h2TCGPlW zy}_8CPG9pCv+T=9Vr=3%W!i)yzA<;u+)Z~WBdur_8j1HS5Yl70B|G<}^y;EylIAi+ z$08e8uU^n;Jico4Ey5r%f0W`(Ck#}=sI%bJhHC$Wv`7p&DdH8OZ#-NUQ{2Baypn~! zc6=>J-*;@DDsV@@`V;HipSx;{X-WvFpu!^u-OM$hw~JnT-a*@?=AqiX zrIIAm=1m{ukd*EG$t*kZ{ITGy|9cILkE=4b5t(Yg<8VmcE+4;LAS)MBG<6nbz@x!o zD7|fIQOU%op}=PEqdH3KKiDvwg7HDFk#447afR8qZ_fRUt9E0Y|8vN7e*N!K68=po zf*cE{QY2i)9>-j1*Iy%tV9eG@KBpu|%P<^r?ymTSnC@FOVZ(829f7vi0gfETJuU_n z-o4r6IS+FUrm?^-Y5mLBj@Y4c$(to(ICRAj%+qj%N?H!-)V-IF@sE!s{5`>Y#S4GN za_3bbQJZmwBWaYm0MCdFFXgCV-+j88&*k?_yOMLv-qxS3N4HXQ+@C_yIHaOn&JuYZ61!{oQxAMBJWQ{G)n74war z2#43(+JACjS89<(`DyRJI0z$luiv#qD$IX}5;D7YB+#{6@K;H$a~FO!G_il}8J@w= z*VgoYBzf{@szO_hgTGGrW}xIE`e}e?@=czS6was)J+`|p>KvG8u`xam#<$MwbaWHF z(IXDZc}?OGD9Y_+S01Kp{$gV;3MvJqUw5_}O=HX0w*vd11~%Mh{i(y8B@ns|EL)VV zPtpuq;q^oGgL;-zj`r|(yN-#CBYHrOu<%^YFHJY`mp={1z;_= zC6y`cw>=~h@t-d{n2>ksB4C!w)H`bK`W2HRCM4M!*hY?MF8Dc}4r41lzMlDfu@V}K z6&beJn?d#RPkw@|)N`-!gzm{5aeSediK@LZ_{wP2pI+y9@~&Ay9S6p%e zMg3IWwqMg1QTAO@+Qcm7=+zfC@#2zy+PXj6j8mvJDtNQ*#s!bv7$>YXZt`lm`7WUi z8hze?B{42FXHx!9 zCRIN(zrB7A-xX>QB@c7@?H^`~I#w#$aFY2VfzG#%N)+Mc z&wlYsrX7Mzd7_*fns2nfQ6GCQ@H96bLg4v70(4+8(@Q?>nFW6@duU(^3@6|cy0CQl zH+xaU1uE65Dj2@@PG-l-5>9*PzFe?8;L3#GvV?gZHwju)@<0?~@FnhsT_QTB2~@ml zcf)^IxVkzvn57DuD@`A5l=*yJyo7XZlzCZ$RyI8TNH(^-t(XJq=C)L>W}q3X6r`ac zlmc$jRVMF@8(#+7ffqs7pML3_uVDq>cp0=R2Vz4rq`IR`LB6PA)d?RipGC3K3bfOS>@ z-lzf#^meXQmRh&KH(L5OL13|`B4Z%ztqh=@%3Je5cPHNKxACD0+q$unb^xv_aef2a z{c+uSCt*mld3{>}5ByRcp9 zNCNQZF9?>C5cGLD!v<0i@DT?QVfcPKIaE>G5rK{Nnij1>4{$m7%Nz;^TEZ6a zy(^4vk|zUuNpfBnFh*L^{iqeYu57s*fg+cdDRT&{Xe6Y z+Mf~N(u$fw!3lf7B;G3q@dsrw1UX<3t@0qnfhuG21lLm8Rs$gQglT0!1?RiU0Vyc9 z1_S_0{vCfo1V{>U71#4`9jm^*Aq>S^0CQ zuE`@XFC~?YQVJH8>{cWDqwo(cS2pV4Cl-a@U|BBL0bpK)>Z3XXm-J0pUIuh9Qv8=8 zs6rD0V%7{QZ!l2-NcD1BN6HtFvVHC|0XvQP)+g`hWOgp{EzKomy>RweL5}1<=Ps44 zq78UI*Le4n(K-O0%Av$;Xuyn7{CEl|wgzl7v)v02IXG?lCuI)U7UkD7?~cM7rfCUT z&s}SnJ@H?TK%y>K%W*~381!Of3$o&=#Is%y6AghAYpH{K)c|KGn$Qhw!sbI1-?g+Z zOu`Gu;Z4Ig5PJZ-sl)w~N~YBh_T>4!svs{M8g{4J&K0;+!c<(?8bD(xvSj3?n432^ zVqox|To|Yu-K>;TNJxMAd-()A=4*xt$8hCTMDsUVwy~N%SRYcAXVkYJMh2B^erQ^n zWE`6RHtQqrQuOXnK&VBZN-KEb0#ogowIlvor)f6CM6=>DjqoH{{4WRzn}8pxs<~t{ z-PY$Q!^D0M6yVMjyMCGe-9&-3eJS?!l?ah=T}KZl!s4c?l1oDP8t?k3VZyKc8*#M% zHrGMu_D&*?+RM28>8*_q*|#Pi?a+MOpD#|xUJUA}9MDS%S&E!Z zx2BPXa*4FT-kZtZQ|HE(h8<;0y*9#n8-_c?pT-U!bOi-JA2Yxb(`BS^Z7@e)ebJKP z)v|TC!Bm%W9!U_)s80}{-7B@}wg zIVmR#Gg*j$+F0fo>(wAl`3k%L5zyY#{OQZiTJ4Hj{E?R-ayHCk|Jkvq(}~Y1j^Kfw zX07$q{Y~7=`?7>f1DF6#i_cw$J)sbh^1SSR*K0xADo?AA5kt=OhK?T)w|^KnkY4|= zKw3ru!X$)cc@F^x|Pj?ucR8Q6fnt8q3k2UQWjZ6$X`zEy`EE#;#O$e+{Kl? zKDm8!LwA|6duseoby6fsUw4kOZbP*fDLQ+ExuK{=vos-#o-b}nyvO5QD5NFabi(Vnr4u{VV98OVHLPxc6m*f24=D&O;QXz7?3SW&%?dz^lM zo2Y?0Yi;s-%S?bhcgb{2cQPa=P0U=nQw#cHMQSBy&q#Kg@zpO>ztSu#i_($c-|T5G z__RjblZlIm6mi`Q)9o4QRH{yuDKuxqbj~En%36u_X3*%w?*ra_D1$;tt?hmVcJWtz zI?1<1e8}TU0i$_S-`^Ma16Seg8b_4pGa_zu$Gx0*XrZfP3DaaTKyfMD;`&t$+d(6p zf@Zo#9tM9nK8SU$t$a9H*$8_fa!cs#JCFAZVk(kYm0Vv3Xc_AheJ1C;)$5OWG6g0y zMcz9i%U4O>Zor(5dMmFYpsX1*U-;ub=TZjMS7W0*LndxRnpfY@YJDY2GWLc{((`L( zTN>j`^iE-QI(@}j!Gk1RAs?T7HfuPtA!sX|l$_wg#%`J)%d!?*USasd5vD8Z68Zw9 z5;H+YQK1?iesd=aXGKTt`z(j+WnWewz)W|!GcOH=6evuk9 zQzJ`+uHtJ$7C_l@($_3G?)YcO8U(Cp!d_&I5hU2pTo>kt6FgyPnhQP=YHGkt7v(U$ zqDRcC(@0A)zVg1R{Uc*XmRV}Zw~gyxr|cN1ELki~tJgSJV$}dG;%9TOCA;tncXi$RFi3EB$2e1+i6M?d3OjedK5!w0SB#{B4+zm(R0|n{>7Jt z)r%3sFebRZVGKVMq_16#rtx-LXc@z>5OqZrB!*3;7U^;32;dhEc z_mO`y!Z;m`f@^gi>-#uSLz)BPm>!Pv)n)%Y#_qvEuOQ$83=GMb9m<5Q8VRmL=I*H^DpCr(eUJrd{onjY7cG?GjT9U6h@R42>M&g|+KKZ~QJ<#1T zl`>I$v!;nde|8i0PHDX9+Aun!j#OpX-QsAZAT!)KUJi0nR0%Tg!iB z6rm`er!N?0uAka>FVG_4hIYyM%!tj~W;fkaIKo`(897WeumNdYxFGVS##sHH)SmAJ zUwA-uUF6bAA}bzo<3hd-+e9#UHe?lzz%(xo^lBmmbd(mXL2- z=XmfIs>rX&LVz1PzGpCRWhPv~bQ zsZ5v@{hU_`lAxj_G?DB(7iborm{t$zd!$eieL*H;>#(!3lIBtUd->gEjMN_z9MfLb zZ!IB{TBg-Rc#RtdDLp*p+$#nsa8W}=d`!6UvpRl*>2LRmwd$q6QtKnavEtlTlk1k; zV{8R=YE$h!VL=`jH4?_PjxklG?4{5AzWS@Ny%$~Y65J6$=JirhJuzNxDAR?eArvi> zM)gDA;_|r_(k~lEjejaDK^kYXk-ZAy>#SnC@C-0X?B69F^)=17V(yvPqkXFhlI5sT z$+sxRl}BOd9%71`g=yVFtK-02_x;kOT ztp)6@wo)|taT7!6H3>$E#6EjHi5}^e`H!_FQs2t>nYVlU44+P{-f)t^=;St+lUC3$ zXU$0&REMqTCAxCnl2o{byH;#^2ql6(HO}Y3r&0 z2We~xyCIf_Dn_zcG*o>nA|O`r#{7%WCP-0*rK-+~=(ksc#EnPZhs%9LB~J3aI}4MF zYt$(Vl<&Ws;Fh6d|K7$$pq|SF!vg)4ZxgN#G{U!c-fFFWaTk(lEyDI0uV*+{Z8bAd85M6?5)EUhzW)iSt?S3pN1;Anx9;sTk8hqI2r?g~v@3{VVNOsj>g$ zy~(k=l|o5j4kYj0BvhuuFh8i(p9W|^kZT6lDuYf9tgFaz^(`9{AhF=vqC;eSvxPF| zKd$Rqc>w4)`_Db2djRil@j)Js$XFO>N2WGfPp0t%o2}gl{6A21pYRa;HviQ7+@CTF z406{A=qt@CAIyU!F7Z!nSJ)!#YBj)F3)9aR&1-IhuoqCegL4AhP;;Buc?5_97w}|_ zT+O$Hz{VRU)|Yjd*d^>%Q&SFjTD8CM8neckR+8cKzCU_(*JHazV0e0|wf476X_X17 zHf4fqyQ$4yP7vDEgfb}i)Iy+vwQ%IBxsd))aCHO+f%8Ct73n-G;y-7Qav=<8`YF5f zWO)SYT62=N({D683=OQ2mR!dU&YK486nfnC_b4fDfV0b4Ph0IUF0MjqOf3Kmg7gmp zywL^{#z$dg(XDFHS&-H(;u$X(b{9-h3&;YnW1RHzvZx&G!Bm*&0Pp>##^!(*?12rI zk{mZ(-&b~Xumh3gt}Wmo_oMLGZ(jH7ejx04u;*{K#z zy+5>&TpU9rP#*{+S#ka*3V>yW+6f+-dih}2*S`Z(7FtVF(|O>{65GP;1u$H9QzFCy z(`^E#yXd3oTcGNkuwvRTRxq#pf>@}>G!AWvw4S7uf{5(RvN6l&RnZD2l_B~>cvxtm z2Q;x;Pb%9$6W{H^mYtHy*9PxF*P!L|SAW~UjMq{EJ{11&4(BTVi4BkAE|c-*tIbRm z_*IdZ+OZ7&CB)};fY!{`U5=qYx9|$fwW13z+&(OHT0eS>c@n@_c+s>2)xT{ z;+o7(yLuo8z-Is!sOYBS!Jc{`4FF}0*j^`%Jzzn4flZioc#vz598c_^6IV8nuw zMoq%X-861RL*O{mfBJaHUou6j^#CEWRfa6TrNVLvsJ!NK-di^c2uI;VyNoBtK>)6r z??%`Tmo_QDDa&bWZNJXnG(>iJ7}$_2U$0)@4csN{vOPdo0SxJv7P|hkDG1~SxV4qv z3hghLZGpm`uB)aH#$+hFoq3*rIx_aku;Xg^-LiA(FPL~9%)b73VtE7*b}O?13@g3B zfb%5(lVwYLdv)Cdv)B!w!c_)>DhWsrn2~fX7!2RK=m8QWunv~MP+N^KlF0^5SH|YP?ucr zBR$$wV!dk<5OrvNtWjg8lA@w~m8YQjhzHw)gvT4IdLA#96j~~`C@$)ZSnhH^LflSg zP9yyvfrcXMrLVx;c4ZdlL_p^Q4DolRg70%~-xH!bE07Y{MDB5;Cym9f--5*BLq1)u zr+$N2pA_DRkNVo}pR0}XYW(FPg9P-VnXGeU%jxsT*G-2ctka%UrZT4Yx1(4dvi3g+@lIm{E zhyIRc{^qQtU*IdYWf(_Y7_j{zS-jT)3a_-jM;8@Rb|QY zQ3|MCOJdYJrqPsl78qdm($FvdVkc^w$wk)tD?*(W$O@9i>XSL6W;Zi)n3;VT;<*tw zYHM03O7fjn2M5pwS~ykoub#KZI(i%f#~Mgx=FfQvnmpXDQ3pvA{kN$~Zr5)A&Wqtr z>J#wcB8KL18*&>@KC{d-GvgMUFkV@^SCVNjKFOGh-8WSDoL^HLPDnvGVJ)^4xopA5 zQ)kbr7$Gns(Sj9zbM@ju)Ohq|aeA*Y{0n@Y)54U%hZlVyLYGAEgsI+(nY4cAO;$KE z?OMpy$NhP-IdG!8rX~LKYly&`POWiQ{WY3`=*dv^tgwgMI;^4}PT$L}0_NlG#71@i zoK?40HJOz&6FOI946GHSaxyDnrIUQmQhcgfFlz~td2;;UO6bTo6N(Xwu#uikJ{pNG ze*Pn@WP%a5a$qNo`KzTVHz6`#U$(F5EvvB*sDXNqt8EY>?$FhD z4xulrr-phi_2lQmxF-ZPDRMUpXGo+WH}BhAdp-_*=fSG_xhP3%qQVCS@1xDPa5ghY z&DybXKI|3nx0dnz{5E0m^q%2y#8KsJVc5B!rk%y1Rr#I8>n27U{m^K(3DOkWm){cKRqG6D zM=#@=S#kGJYw5+;`UMJz*ULCx>)oWa;O-L6B4I(6aFSBIR4gG!Hz3O%*5&+KX$9X#$97n&-jwl|Jk(_qzUIpc+jb;+ zxS5|^P@`;o~@%-??L~yqjppyI1{M4{PjI#acvVKfD<_enXC0 zh;#jv?JaIuq&?>}v1XlYux@Fyxk){IH(npw_=S8dRMu2Rifg`#uCYHtBF%M&TJ2`q zk3#ZOj*K_ATd5J`$G`ktNeqd2T6@LjH13})yCcaNCZ3%A_FqZAW=x^GO6Q3HJkV!K z!e&`lvfk1ahhqKi9E$jQGGp(k>!?q@GLGqAHDlr2!oNdx3xmV|D4_=n!^V_1Y=$9| z-^#rYE*?85xsr{wu7L)ws8oL0R4PFu%7OJuc8QupZ^jjn>s~?;m?$)<8?n)eLLsD& zG_kvM+YA;r=Zs;=j@pHKgJdK6jPGtW#e%w1 z;wN~^zgFR3D!dL$$#UlODZDJXrUo?px2_3U=-NP$&2M&ON~%oKvM=!@P;9f}p)fu6 zb6%|F35X~;&b+ae|UMm#j^lxsYpxM-vfK&*fxFI5cs=tZtD5; zSQN}-rmaHGQp*%y*ed>CXID%rFfgn#x%J?$+b9NeZtHN&+VIFq9KDHcExW_K@Y8D^ ziAxv+wInX)O%Cuye2otlIGYj%w*)P!$N?L)(KhJ1P!B^Te1o=VeHuEn zWvfo+=aFbFuESQ-!edN%J2$= zAiyhm7@7o7xWl_aGRSjxr<^&ka(>wI?t`0bsc3nML#s7QFg|()h(EOqJiNJ6C=z0vY@{smSuO`l^ zLY1pi0NtVa6zWco-Jbe`A^=vnqV6^mrzOF88mi2uuuSic=WZYiY9dfgQsz?*XMdYzX z3mXey-fO=cKo>IZ%DX`srFm-gqWhSsw5oRJ{uCG(&_Zc!>rX=>fr$|*WBcEt1sB{+ zy6=B2HTE|NePnMFa-|WKl^ECPG4$M!IM{pPUl{#;7?WqEXQ}w^o_|q{arN&Y9}d;# z?i9$rS{A9bro|Uk!yqRz{-PXAY9?HhbU;pNA04ny?_8dkYFiv%khOIDX+E)|L+V3= z#GsiHC$GKAdnbm8ge|(IJk8kGlA7jY!e_rhFH2jy5llTHr&Unssm+}FgAWbZchvTC zQoT%xWhbl`u@_kXSV<7PqLBmCI}+t@>@X zYp*&-*0BtK$6IOlLv;iZ?=46DGhy+^K> z#4nxU;{gQ~x^3|x{pORN+Yt5>HsOB5R}w!h;USs71kNrK%6lY!j6rL{GC4-I(bZP5 z^BIll`+F;PF07CS`GRkcc2BvyJGg9TLX3vZ5J}s72n^qH;Y;ORgLQsoWx@?%d9{m! zaZ!?4^sq3wldXjV%B;II>V5G{g5AK2>}S{QdK4d*PB|v9VUv{op6GBI9X|X?fG!n2 z&U-G9K{|5dr!M`=bFUk5Y+obE^D_IXHSEk7xb^)enfg+`+|VG{DxaP_=FA~R%PoAJ z6S`CAzLetg^PE>K2DyEz-A*rE;`NEy@tQ-@EuR~V!xPQ2mn#?PjI~Lv@pAn4!i`0q zCch`|d1?I9Cpb{e;tK`!jaMbY3qetxHo5|yghih*J-Fu;*$<0+hU<(Z(gJMwhXuQ6 zCq;{s5zi||Zco5qkMo*sp51|c)(F$}lPwuqKgdRyx(Ys-6oT8m8ivU?(CQ)#Mqe?Ec7qz`8psb;J>J{8p$)Pr2t#EpE!Cljke=8q<_kn^4Funge z)a@cmF2H-cvvYvTz($~g)6P#UbXS}JinBNJ7~-$@o+#CnPI=<%xT7fZj^Fd_En&Eh zBPOXWGZ%49iC@BpddRI|+*`}}gJZLJ>3;KR7e9-j!>3lgvqvQXam93|60rXf6b?79 z(<3E3*eV{w)8sb0*X%FT=sGfW4>Sxo`+ICBY>m5+PVkXCha7#?&vqo$DlypBnC()5 zbS4_cCzN+X;mV=4#;UrT&K3ilmZ79eGUZhDGfqjYd`{Z~Cj703k#L7E#)HaVW9TKu zN0H2jLUjV4(xXr`uU+Iw_t3+aVg69jA}xNBD{Zlr=Bhg7SG4$OxiGIK8F>cNZ#A)@J< z4veKkqGlEox>VQh1-`nonsiw&^3iuoHNHPxQr2(%e*^+h-Un(DZoj-Hq^n(omQQ6h znV|W99=kOYJXhk45*AhEw3v9}N}rA$e@N4mD*SzU?@?Wpvs1AH10%@aK!T;GMl&zQa`$;1ATj%pZDp2k$lJu#JLUNqya+5#IJjV6z@zSPl%k8{h0id`Uwp{>kT8n$(Gq3>4qyVLP*Y7sq4KMv9-JXGGIbpC9dhVaw zh_5r5;?Z_hET9ejHSa9Y-2+<#XycFIKb|RqXpP&1D9}Do=s@>jia4ii2a;-35gn}n z9dW$!W(NDSCR_xM>_eWP2ew=hgSKrfNNiU9h8npcXk-KOtX`GfWE`OooVS=A*#Xs- zCbMUn732U!6HDT&k^gH%0k5nZ&Ni_{HFS!s=jNc%9#qfZ+IM>J+x!u{Kf!Q31n?WV zG{xXISjGPJ(qCKQa^NlJ0}!1)TLI0D?VXkXqN3cntnr@~pRx1;6%G9F6}EhuCiDVC z&2}DuZU6ddhL#ENUpY_np0#U(rO5K1)zw}Wo|pWp*)s%P?reC75Jr0AirIH%1r z4@=V^G6=jJK!WosZ2U zGS=kzO;V87y%L2hEY6=m0{>}(ZhRLEG#}LRCPYI4cCaLn+68ZiEUkk*aG<{Wuj9we z6<-Xy-&5Wmg*ko%tp*K2ZofbSi*>mQkr23ne)WW)=-JsKkOSjftpy9zA9Lu$oDf(p zxUeW^{ZwP4G`6q$w+s~Kj8`{dDjC{Y-q zNk5jb#9BGGFx^&7CR|&F1s`BHY{xdIDzYxhShm%H`moN5P7+ko4FI=PSq0eP*Fc9L zzD_OrPdC@8rswK{Ifi^z)`P$>Kk)O0T)XWL#8xoZip%QA8N+PqO#xM-Z zRwRirvM*7_mR%*!@7(&n@B8~_xbL~=y07b8%Q@$BHn|!oM&^X9EIgM?wg4i0HbC>{;w7Jz0_cm^FB&@^4*A zXX}wP!^Zmi%^32?`-Mo{9C?Nx4&IK#G>=Ud8cyVzAHOXO9F*|US37;pyzu3F$}MZv znr$QQ{z|kqBjB^Iej_(y*T)S&b)k;FS~Yv>o$UFdj7L1j2xf)BIh4<E~u#ShVT;GAqq}2nfp~ub}Zfo3RtDm$!cy=~4;@_e@$I26m z%Q=tMq&FP67PKVOnhZ3mxh1o7uPR)8bg1{UQC#oB1;s6IE99jULYuZ4dC^3TR``Y) z=gD83nTj&|_bdioY4t7W=0f^L$K&|(d`&ZB#p`C}(!qm){HWafJ1*!G&YNYoM+G8= zRf{Y8(vO`)m!%EO@DsIaZz^kU&J!M!EgN?*Bi;Q>NgjMpVU3IXmX{l3bI*S6J9qE2 zSh=|H9~pnP$bmo{- zI{)neyGjn6;;eVRr(5hYmUcRD;{(C;KcRCyUwXp^cV#|q!Eao5y{~QS#Adzc26Lmw zjY`_)zrDVOSx+|k_VNCC{mFAhsVe4YDX$8~S3lZGFRNOJcZivA5K%cUr_rR^D0j5L zJJL?^oz#8S@37v}blPj;M3MQWw-@g*c3ya}Z}=a-vYGrZoA2Cp3-BRQ9xJLu06|86l2edp5W_#nJa>`(XGq4ufwuBQsAQQGI&*MDt$o3L%+ zg4!09;jZEAggSjf<1eGT;kJ>(*0aQ;g=p-w#0Qc@PV5HS*)?TGbeg+*UDFfAu+!dM zisG*V_lWMx^5KqEuX8<4-rumpdwa9m8JwD?zUm=KFXHMmmD+F5Iz-yrz}rXMP*TFx zvK5$imrl>OF*47GWkIHUg*VmcfOp5`A}z4GhA6FL2K&BBN1s!#PNKHYw{^0-oF z;)%`8XKZBy*}lGA)kji9eExOP+VyGh*IB72gT1HFKOC##BlZRMR~2kgunJNq+w{JE zJ>Ii_w`;uY{ugD5M^+~9e9@q>wW4Rg>H3&?wx+?vC|i9M6lwI(voqbC9sO`!k#ujfwe5 zqJ4H^YP$$(y`xfE+9p{_YAy{Z>mg;zdGXW1xrTeKXNVluzFf!MN&c(}U`Dys8ikdJ ziQH<%M2<|e6XW(IMRE>O%qmPPsn_p}R*zg2Kb2K&yYA@}YO9IuLa=axb>H#qwL;q` z8k%Qi_J@oCLt8ac>Lcvr_2iU<*q!nII7bR+bCMiJrG3n*J!5eO*q(+(%+K!-$eTJ( zueY|RzS%!B-7*-gC`zoWCUDk9Ksk@l%~K)U~A?3cqGsWsq2CupyPj$$fjjRURm!1MMrNZ34_mud}?VI0iTo_24GL^ zEAWEQwXFm6s>@FmseMAbu=*!tlUmL)?0#W;KD5M3g7mfEXORFYnkWPL+(#{Zitcek zeHNkQ)o)!>2`>5;dn>Wt$N}wF5)P$Py%>_t5Qpr8u1@nsVUc1g`3Ld|Ak&4x5d46vQLjf0*Ng;M2J6Vs5tn(}Iy_XKY{Bnb z~nKrbVSeLJ|CRc`0jxPTrco@o4sv zRR1$$qEhi8TTv0iR*-B zBTn)K%YnozBXr@5iTd(LFE_>p?3T=~qAnlwyJwU9#LKMH^Qmk334Cfy@nw{tAAR{z z6V)uFj)%{7nCejDRVhpk;(24fKOkzFIMv8bSE8cYk_PH{>&X4qUmBWOZ)-Cs4gLk; zVFH#P%-EY~B*H#u9=bN(h#<0KIg3Z07@)}mpw>|rbpHh#fEuuQV@LX+%i(obd<~qKVHQYN`qKlE{Rp|l;9_DK zdGAKgf~N{I?1(tB(B)OTp!4pU4)DK|2}0iaRJM*>H?(@)0YQUzZd)1nV{mH$%XX9# zAM!1wfQ_mc?KF|$67V1WaD)tD zd!Ul*?kBw>kl3ilE*A<5=cZd)Dff15sOY#wwRU`MnP5M(B;`MaH?p*oR9m@L9;<(r zhfi$^Pqbp9x<5rAL_D?vhLWAxBK+#Yo4tjPW<#ZXLLZ2Ac!vT^`0;*Yu`SfFrI2%L z?is{pY-_OKHv9~-=1FF2?k2_m4sEcpK4W?Ha`lge$%a#0)aPc&;`53XD;m6*TTwmr zYX^P{Mfdg9ecq$!8OJfYaTF@2jf%K7T1l+U9@dmy8n*0VUnx(gSl38h8dPYB&Yepz zqz3SgyWM}wT$8AG!(k(dX}PEBWp??!x}$UXOR#Q}Sr1}#t#T(e&pTw$eX>SJwj~9Q zfxsJ7bzHlL?1?78YAd2;V5Z z)qzb4jz_ftnNB!}5_w=Un0xe~UGBdr*!iXR<*}eFs#u7v@>kq7C+z9lSLa1H3tqt1 znT`K$(vIy9^J=BUVAFcL?f0x*R}S7UjzKHE*Xv&FQjvCW>Pj+z!oW+^rUvnpXHsqL zUl&D`k7~8qF#>mzQpu7z=YmGPSFBpd(0151X}67!PWAhmbg}-1i^=Y!gb80cEJxxz zjXZpyb(`X5Q*iFQQlYgV&?WSu!w1aox`duQ{-bu#zI{(@7e1h?g1+7CtheIb6x^*H zp#=QY<4??x>n-H7sxgn=4CdyS6&`t&F&^VfEm|##anW%DiRp z!#)+Z@v4yR?C-7r300;j(s%y(+o{>=9>T2cy6Sa~>YksZkaa%D9&q|oL4Q9K}PW>_p zx62uw015q){Z%hm}zr zRcxP#teIEA`?#1h@oi3vT+*FGg*y5lFne8|b6?Acs8G13HwVdXCp2A`3UgAFJS)vN zoy@V$QE@UmbodUprnF1h?9^u4wQV6F6Ws4P5OWW#JIS_l%x%`qIQ?fiuQKQj;TJ)` zH}jvm-_ee2ZYSpwSEiaG3-vY0VMXqoKjgRAzb>J!?8Y~9NV(_u^GqXX>c_QKg3fEl zs8R-9f0#j503%zG4R*6cv7nXmBOW=GZ8s;zI+2(Z{GFIEK}*AVRSj1-o6_LGgY)to znug#G^&U|ja6nyiFhh9cZhPnmHiaGujBf`sDM`nS59I-JV($Ng{A8|UxPh0=aWR45 zG+MYg>@B2P8WW>^JRCgzkj(l2WBu~b2%Mx~o&C z2n5?xCc#chtvT2mMxpx!>IDr6-qSq(4M(y}B&0z-Htfo@mT7S5+)%a)d^!zGhYB%N zs=Tj`1I=3$#Vu{Ehzu^?8O z`C^xjCe9*!bKNl0iwPlukN&z>GPE6f$Y0Rp+2nLsI)!9Ua1BjJhG}1xpjaX2mob*@ z171}A)fGJnJk^p>)=YJD9Nume_6to*8ED@P&fv z0%q6=ID@kxd3)>PET(A88kStgb|8(ya&?Jp5R0hmhYNv#Xr_>OERb=pCuFD`W=LAV zg!5nj4Z(~>oh1(=l>+Gy6$csjnLc2UGz&c??i0rGFV=SfcUHBVM-ATrF4mu(_y~yo zstbv_q+f$K$v#I=x$FDk+txp)xg!!HQa12>z7Ra`kC69sQ4Dt@Xxx30hC-P1dUOW|k|XUe+Ga9qcU z;U-okDtcK4ByiM`qMfhHLB_>M#t7pAf=<{;oREGDv6z8^uaUP`UU9w%pH2*SKS}+- z^+gObH;tMZD4Wq|8v^LMs*TJUaP}h0V@S zTlE{Nci^cbk&u@aelTR;k8EIaUpTy>YG05Dl6&`ms))bhFS*WHQr0mcwJW|lr<1MR zZ#w(l`bMqGxm0lrZPL;v=XI|+Udly#i`gv5NR(YM-8RmaIgs5n^WoJr1$&@Yan&bk z+wUw{5d)_j?QD&msTmzNIPfMftyXvStNmTE#972dE?95msovV`5FREV6xE+nbX691 zzjSoG9Ff$gs@3n^d=SkbU#@~ILOHwFV*Mojyd!i?vS)3+XKqnGF~%y>XZfPtNe+)k z)6V~~FmU48WmfiONIXuhxM#MgJ=~FzO*tDHv2kDK?}V}mUl92zC(hN-{#n1~ld0kE z1?Rp7Bjwy}GcA+33Z8RGJp=XF+%GO$OiM*2Cl?}g^G%1}JAKF(NEqE;F*Y8VT*s#x zocm|zeW5C!xiR4krj^psMokY%u{MwvXNjp>veei6c0Q5+4s^U}!_`W!=#132w0}9} zhPsz;=QJ|<1Lic3c0NXYLRlvtk&kb=d&*TfJ0nNd-GP6uZViC`L5k6>A+9r%k5f1S zFB062JNhokdK;GesyXFqwM>b0_s;{tbFD234iYNI`6KXC@vT)mt-ZayMSOkvwJ2<^ zg!&k!B7b-Cz^IHr%dSs#t%DcnlYwJG>sN;CwQe*zV%HVIC{$XU?7&Fe7S@w}9E&pd z&c3z!D`X^7O38A?g^uar;_e`#b(1vWtiu1x%!W@~HT{L`k$gCGmT}>+Fk1-|2E88B zU-B0_|6lfF+*>Fb0b5V?%0}2P&ILf8aQBV9Fr_2lq0tG)v>rj9r)yixA#fCA;am6d zwYy+BGa>hKZX>r!>XH%8x6zY{4FP1+3C>K){I+IZ?JWUR`y9$O2=^R>okr9tD}CVw z0oIvdfdIaPcnam`Il~)~)jba!>aXX$A#?!-aqCVpWX8ohNRyYNv~f7cz@ZVhJlo&8 zkaysy!B2a)qA)x}I^-XS?r|byFr;l@u~uQgy_-~YM?4Z5L5_b&d8G_UKi76Fn+$KM zsS`pV1BNfea-(OlB2t%h1(OGDZ@B_sFh}_w-3?*DvslUFdI2_rZtVuK=^$X&*d#9U zobpn3!&zjB3)TUfh&00HSDUm=}|*eAOIiyK%PD;cDoFJITaG z>!?;WaD+F<(h$d${6qQ3>%BA@F*hXIKqp|^)@?ypbjWKcfC9>DIM6njat!&uwA>d6 z9OiQ+FrZmNF!xq31MfpBY3~+Er<##!_)0KNe22*>qBTb0M;eTL(L|RpPSZihF<$%kJGH1|C@9o9? zacD>B4)eX)eA_ulv0+MAD)x471CASxh$^>hs(SA8oS5FOHPoOc5DA_@e^{kq{dgW9 z(vqFrGdsY+qubW?)$^&*!oJeY5H~tzX)-rW^5S)+r8L{OsKsxrOkJrK)LJt*!W%0f z(ovi~0+j11Vb`X_%@V&ouKI4#+m~|-!hcwbNu~#VRN@r6YIT*GPkdkmi=eMVPUI_$e|q zsM2N7lsp>*5$;}yI1@I87R;t~G(eonCiWl;I4rd;8Q>4MDHdn&RUcB9Xmno=9M)&E zihdRK*D-_9G9@gg?)qj4;EH9mmKIyV%hP;q)IjfxjDrn>Po$ zneU`_+0NL&%#@+AaRegetth=N`m=fz?$>dLfR-;c52!z;j^T;An@uFiE+qWps^D+A zE2%Pmo%7|dz~?O4h=>Pg6sr8aoa3mW+=p@Btyk~92Q{nwy-t1NL`MQfb6mQEoSlMu zu_vJo(qp6e%GHaykeifI_`Acxz=rAV(*b+og3Ukh>AxOgd@yl!P04LUBddIG!d`mo znU$!CY6;4O*JT8xa$5OK0L!wwBSi+1(Hn1heRZgHz>D78;-~s@mt$ym`|SDCc*Ajf zHQuAW+$(YfsLd&XxF}C+;7zYpNy%Jd_Y!!MTT9{`}TR;G~hV z>H1ebF5bwNeY7{KX#0w2gEyZpN6eDazuoE;YVVdua=r=fULtGENiX{LLqvcYT2eXr zqo_jrKD|i;!V~uwH%|L%{P`mJYteV$2hf)GBWw3fo;M_&7?HXLYMtPlzNPm2)o)E- z-(6w@qvjphmbjxmHQeWpgh-oxuY7q1(>icnVJ7;rM&BfI!YJAvd#NhUp$5!=Z_uo% z?FZsk{F93YPPv;O%AwIRmi8~iRuSt$>ghMGb@T;P&2o}%NoejU(OA@vEF*DEEoB8q z4~Lr~94*t_+r-DWP0SGPn;p2b^Yg){V?b3whLX@ueW3j5e_zH2F+gl(V(d~b^@@tI zS!K%!9&T;(5^50y>CckxYqjKi3wsuiT5N3{xlRFQygjI71gdonJirNIW`-nvnA#Z+h-lfr@5b3ulY9%ifdU~#VI~l zT$mcBH)tKEyz}jdTV*vfN^|4yy`O_G7lUyJy%t7@_k%lXR16k;FcrhWP_!xuPCSN- z5V%YV2F8V94Mq#4?}uB^)sp3!+K5rK0b4Z(f9fw4>kJ8Ql#09tgP>P|tdO2DJo)f} z^j7#?(qGQmKeuv`=Wqc62NPk{0!@MlB&q~o2hD_}l%` zl9uFlQ}|F(3`=Fe;31I9lXm_t6tfoe`d$gYt;%vFa(Llz9u#F~&@LRCsG9W}sWitF~m#-w0Bia1%(D5Cn?iwlbM6 zJ5)Suz3O8v(>AS?n%;fSGdj#$4GCPwO$ZCb?eyNKOQB&7#Kh`g7<;?6%Vc3P^EsD0 zxrBV#N(4-M6w={UIEVBv_6#}aS~9)W;0Xd6Vl)bWABIdSA+O~CwGd3N z7P&N3O)3=v!(Vk6Y@Go|&!V1kC=33t!$>3g7$`OT5G1S&xLGHkhOo47X>h2ZR+~VU z5)V#31eIyFUi67PX%B2*IiWFp!*h*YCJ*I(Ei(2&I z;K7;J+4Tbx&Rqj6PT$1hp$xXuJOV2grQm_4*&`;N@U^ze9*O&Y!<&*FvoeHUz7?=UC^cJr;^>olm#RZqKhNjzd6Op`OGbQ|FpfPW0kU?vxLe9QhH z-{5adOstv{?d-ZE&NBdt6ni^)CG%x7JD_j4IOa_d5&f09QLqOD-(yyGk|<_@+x?o$ zb<9$*;YqMAa97);p*X}-w|ofS)WPzdrk3<)v1roUKgEJV&d|1vowMOaA&u57UKGT_ zVys?9%3Bzis%784<_Z-X_EpSlfYTNLh71sI2np=R!B|r+&qd$t+b=- zsxg@s=80={zTG54wu3?Ru3fThR>>s!R95q)+dW*!oP+h*!9ud_#9w%Qc%v7%2c2Jc zB`_FDkXYeaR?p255cau$kipL}l-J0GhBxJ??1ynxn~p^4*fTZ&Zow0zQr*@8l3;Su zN@t@ET9y2HfgVv_*Z!jD)PK8|LJ;eSG~+`rwf9(U*$hrMCrlko#_?s!LwGkeGH zI(!9KzUAPJ3C=IM11B*f8%!qi6&$_~1_PkH?rrU5Hs;eGIE}cDHYV0b31uG-k=qzs zB=+E5vTGC3_|>0Hxs{ao#pQ z6EJs@&+O(2sqKVsZ{R%6sXYDcjIp0>oAaBEj+QCbC~fV|PPOc{8|`sVXUaUMKv=8H+LnYjU9t(o&gW9UtjTT5)?niCeb4t=%?!UrqaA`)>X3smQ?YyD}kzi zkkTk;=}x_lM%+i>|9?;~UMB!p=8rwbz{mJo2)=NrbbulcO1eCtEV<(kYm*7BL&H`S z*CWr=%K#92*bzCd@?w}F?fj+QliJ|l;W`2C67;wM_t8OBUSd^(UI5RI_RIk}^|E&h zpckReuxKIsvfAS?#EzH{3-nYMA;QUH$2huWKRlNy2E|33nE$GJhY4~SvBU-*UV~?p z2C~TDyg5v#?L5AXXh7hoSB1c`1;bKI&_pr}pI6N~2W=A9TR@XvEFu?S4XuZopIm21 z+12!A-6x{dC1YI3-dBlOYR_}{Y3)p;2y`Vpg|&Bj01CI<%yc*bby{i~Mv<$UMG!;7 z?qn=_uyFc+ZEkGv`J=|}SE8fFt*B1@WDt{I5MUAGbbU^d$&j;|H4fc-cyv4Hg*5&~ zD?0A~SjAP<`xt9La6P!DsYwWukdT^!XS=XVP0N{RS zVm8`yaVCRiwmTT~22dis)3o*5C;~>|a0BR$h5re~XV8;z%b2GMWx}P4a4D`U><;vu ziIo<=2!r}(g|S?(j9`xJhWEW^ z{d81h;Yza?0s_oE8FHtmgHDeshCXS80XbM#Ekyu!)cw!EPk40V!_7HloY(Kpi^5Ct zRTJMgm^qsff5!YLBm~*K@JSin>ve~z!;FVt=T)dH5?OyZA$Ag^(OUPNeSE?62b=KxdhFXbo~ja6#` zAbKqvNr-?GON{NPYUw@b2nuTHS%TCXk;Rfr|jH~uTi;?%Rsb8f#(sM>$uo^%VM&##W)rE~-4;Y{S zwJ2dil_Vp_%S|;r2U;tBOp3_q3Rtz(ZC$$R4$Tpy4&WZ2j@le)FS{;}yxHHH zdg57G50q(w{XZbKHc(Ol$mV@d+C*#y@=|cER~>y!?^;m~tU=7`f z;0dFpDW9n8GiaL7WVgW2435tIBf>c+%&c{SPP#oFOuM9GvoMdiC7&$`yKv67j0Sb7 znKtWhov<@0zxu~|otS-lt0Tcmqa(4IRng`p4%0>RflfM(olApe`Eb4G z7-Dz0yXq2*J8*R(a%8p2zJo8TjY~k^q1MaBEOe7+18u;T1X#w&{QhE#0@y&huAJhLCodT}Ql zmc_cejBG?bfE+3%x4s)A$HhD13k+c__-ReNo6PKs+kp>s;QJ2xiv=9j% zm7Y+QVh_RuwN<9e9)ImmhNI1xUwhbTFSR5Tnn^S>Kpx$3RSY7+5JeBUs=kUi-R8@d zmo&6CAX?e=tNn{z-k6O5Nj^3`?Ekvj1##K#gi?32ZmK;NKpc3!)auVqJ32-QiG1wx zgJvrJ!y^t2|Ef90O+uZ;N+*)o5}&NhYJutE;IL8l z0~Uf&yHf;0wATbQ6r}?OFDthac;AozQz#sRbknip47}^FOFJE5K2K!mHkY%~iJX?d z%3e|=sZ@o+pL+(4#n%smEe``8#HsSxQM*`Pj-bk+ZsL_?*o=Z{Q>AziV$zD{5#N%n zcIpI^etUZ0>IRrJKL^iQBHF&h)jfv|WzO+;Hh@)Qjxw19MGbYVRZm;9K&BgUKmm_K@gfJcfgXwoprg2tiomTeqU*Z97{2X8xBS0lUh8~`pbTo z?fL!j>gU{~%VC*{={K`OVp_h$qDG&GHhf*XsW86gBfrwOzx6Bt5Bl^{FsV=x|;pIi_FHGozWV|ewE&z2Ix~?;YbN0 zHu)*;dy%Ou3lA8Y*ffwod4)X$p6TwAGck%Tf89BeWdOCbmy0eSo76;-+9;EsQbK@Npj)dFKY zZq@c*KLxYLQ-y~%bxT2`nYF~dTyU;xnLo4reu(D01H1AIAaWlk-!;893clm(+K-%> zTi$;9SM}+QPd)7AWK%a2?w$JeyP|C&331CZ$my}%+9I0#Oin6Z76xoT=KocFXL8iE;#8x` zCWw(wa=yb!>XE&nsh~QROsNEBgYKFaT%LEKzhE*>2aDJ*&3qjJZPB zJ76N1|6bIA1q&{w$Vz%}+^WAP1g7WuZZN!ZarOtaU|>y-<(uKlxThKjeJ3Tg;a-2q z>rq`G(z7p54Ss?vVFjk9Y6MIp53y%@*dT3Wu7GuycU`-ja1fkQy<3Imz-jO;|1i?P z@;UU-om;8}_yHOs>Z=PEhz4s%VEZsmBmiDGN#=zFAPb@51{=Cz8w^KT$p_%7kU{DLHQ`tksGapLr<7Q0gniw-F|KGJ7SP% zBihIhG{7du&RLt*Er2beml4Zlw9xi}9kl9~XYi9VSC;^;9^kC14@3CB-mHE^ARuPn zU&goWhKkW%^J^Myjnj^Xa44_8?yuhbHF?1OWBgR5Eg?}e!|FapsaSF__aQ@{ZeY7Z zXdl9_7{IOaQSaxbgX|Chkxa#65Cj6@Xu-$U)WQHg=b$r0puk;p^s=^w?M86$kxlzy zh)F=FW2VTg-4dFIyS>Y96tI4g!m7ZGFnZw~#hd^$_X~y3GpPLV5D=$H#jDr|dD7sw zrTO8Ad*NJDBf6jaI)L|`f%9kE?&$1EXdS6rhqPO@$vfI662T*25sph zK?PD;gXjyo(?r=Lx-w&Xa=UI(HVez#`+7N}T4gw(nVL>rkv5~?FG2wHj8dE)3U)}p z?otpi#^b-#Tamu{^lCuo_Ntv$O9JQ}8L*4VV07F?v`hZnQiP=q?U`-pqz0xq8acWV z`6S-;Tdt!&GW#KUp;Mndbr0HV>%i*VpEe1s1G$nzp71eMBOS0 zK)=E{lxwTTG4#8v5UTZTBo&GUYfqycPnDF{rbAi@{aJhDi)7J}Wz+c49s<;Tg*;i` zQqZL0Xm@5F$Pa->khS_8d7xKI9%}&BLq0eq&PsjQ+SQyv!Jf`WFfE1yavm1SmLN0k zN*^N-UgD{uTk!!rO2y*^fXqww2UM}_zfy#Xm&HoHHN2Mrdm&nAQ3D02QPsv|1y${$j-XPsn-(HeyxN_^1ywrlNzK=3vx> z&szh>In$OX!P}Y1!{0R;jkJzto4(w&>Pb@MK~r;yYlEMpl?Oc!m~^N|}{cJjFz zrJV@K-04k*WrX`SPr}kWC;8;8+3Jc_TW4WTrj$M}8}JXEVk>t24CKWe`ls1>qk*|i zrm2}86VNL!kAjnSS(u5-$AH<4to^f}L&&;ZoBl##&(}8d*1|`YXj*_x7|n$keyysd zK?`k+Hu~5-epibMc47o;XiINc5vBG)wr*WrL(1_|4&( zuT{J5h}9YN_t4X44^mH2S^v3pDQ&7$V!acg|*(Lvrfg7??MPy z@&ExAa`>@BWZ+MjD7LF?yfy3B2hKIp(*efrwVpP~2?J*&&^loUlwVH1ZJ80+1 zXGcPSpxV1}qKN;5^6djR5Pm+Nx*{KWQMlVUSdK^XrT!#?=z$g9`2*x$EX2E3r?w~V zeI|=&Gyi{uYq;$FU~?hcGBlHooJWnfRF}cO`Y7*E1`{>$FBJb~90-x=y41Rl#In=+ zF$OBw2rR?_Fp|wfKhCb5sNd_OiPQbd+^#>aH9$+mXHWt8GXN8^0fwe79)M5@R+Y#Y zY$u$y4*a{vwWl!$Q12f4C#*jeA z*%87Z=|W}WaS>jRFE%A)Hut1jw5PQ{l}<(p>sWI)}jBeZZ|7 zJM^2V*(Knxi_cp(Ru73u#gkMDxj3Ve=vqavT6H)P$c&S}#i8E92oZ5dDTW}!i03LsgY!GH6OCaM zW{~I-_27fqY~SqYqaO^q&l8k6U$(Q;nnaD4Mv|7c?g}51{VAA4Ri#e{9rq}<|ARzr zLqHG=)=ex)6$zZF|G!1?_EnDdgX^EMb9o#@J&Q=A38m~p?oT5hN_F`B62pq^@!VP%3KeLz?o?u#!pw#}@(TNOF1 zp1^H*05}-N*uPb7Igw}tusoFnEn*~O$N8Y#UehX4nf}?U87KL8-WGgVt6Ds1*E}a0 ztS?xa1sK#;-pZ9qK}E+T_SI^AKK!S0#HCo{xyUOVOQ*A{oV|2 zbL4i!kE&QgVT1{NgP>?Yt&b-o!=(J~h=r>-+b2n2uB*vky{iwN&m(sr{8sTP!ay@n z7xHC@sC>KY*X3jPZ<{s0dWAIdbBgSlshD-D=15rN`>`wHmj;6D{p_p`C^=Qx0u`O^ zR{Yr^W%#H|nO3n?s_susEbzfMjTy8ZJ@c_VP$z}kU+j0CLp&wc)&{U^i@=a(_WWeQ zaLM9{^qk@9Pt^){gHAk?N7(AiWQDu8-G@cyh%bC7szt{nKIMP9+flI?+GSOoWwx;< z@`I`5FCeGs)PB9lCql)9QIAKTGM;wA9$VqW?#{rc}J`1W3W>mKkt#+ z?g}Ld!bR9fUf`HLT2B>4UtM}W3>S|-#NF76@BRvL&tR`ueAjSLY~McPfKmCQ(8cq9 zk_Yx@lOsd`Vl-0N$H$Ku3eRPbXeu?K)~=m_vMsWPuLc^LTav03*Y|f%8br;3di(UV z>%F?}NdVlw(SX>YA_Ny0GQdQd~=Oo+?M1Y@0Smif!XcP7HtIs2U$`RmH; z@9*_Tq|t-c`~DO9Y~en@l>SW(I_Ph_)n*0$j!1LI_&^E;KUMnH-RbSuCmnT4Tr&yw z=JC5e1vyajLF#CD;$d>$OFi#2eSf;6(9xBhpo33} zy}xp6;4RBaHe6oRpGS#zE0}Ege4qTWJ)yoQ(Ym)GKuAmk&Sa-yNnuzJC?OcUB{7M>P$s$yh4Y6Db%%RgGHnXqFUz>L6s%Y$gbkbKWm72w69>@4YJNk|BH&pc{H zPfE`B(yvF*OOH9}=_&;T;}0{lytb=#Ges6 z(h^NEJ1SPCP7Q=CsOD=6We_N5t=x0Dj>F}~KkB?KUbfLf{afo?vf|Gt+t_^ARved_ zx;jj-d#$KM!j72LH}m#pti+#&LJ7&u89C?Wm=^*+%4%0VtM(g8y|f{putxWpTk

Z~UI;T4qEwnH>Cv_nC~@?LTj8YLOH){RlOGKwMx@w2e}vb)2gN& zXLkeSp&th=XnpqIKqG^A#|}VH5r`DYU~JQ(mPrvYz|wR;XASC+rrVfe!R#9{^xT!lzEcY1`6j=mq*J$I=Om{*=DG z#JbiPH_%Jlz~93x2$a%mK8WBR535Fg{uo%rpiwT;=->Fs>(69=atbK}u8rVRe+WX% z1T_6FJ)C%l3>;b@t5hI%B*d$<<{V-n&nrkoPA526ZG$tsynf-gf>?A37jt$?9AUQEdL5DDfs;au$~AL$HA4mIQSEENl=jvEslzc!v6#LmmhVu z4iyWD5WLbcbv1t$2JMT$tb#Oi9ISw(|Amj(?*5I-&l!nb9w=wzm6j) zWnjDLG%pViAUk+{01bNpT@7$+pStmqJOU}xYT>?7ILJ#;2-{%1+jRndU*7}J@N~#G zY7GY<6qqTe_O)Gb|5Z)1J%c75sq4V>0qB;B8bX(=f@d@M*LZdL|8G)R3+;IHAou45 zZzdMUA|Ry7+uw+(V9Wt=+wn26ukJUS@zoH|kXj>1Dqzc&^P*F@OdT@;6E}_K2JwnH z49fTK@S7n{%byIigIZ8y4}>^uZKXczh@-?Ya6C+&X-_&B@YdHRP=MRJ6TwjeG3EhC z2q4gGKt3Xp_S-x*gj@LvdPV&ZBN#LH`w(Oz$;+P8pY_5kh(ehsh90(Pf&jy_Y(wyy zj3)La7(@?nU7-FvkfWlQ4Z@)982u;bMW|;E+>xDuWGVgy30by?jie%>rV?2@d#v=~ zwLxzC2O^=hwa7)VWKA!00_x>ZVT~bFxTC#FT<-rZ1cj{lM7Vm#nShxrT2TyOiy6`9 zXt@rW5uFd_mf7$R;aju@vtOUJIh<=^B+9IF~z8l*HUgVv2<70`sUd>{+cBjo~ENjaWQm!EPiy* z4IFTiQYqy&iC*!}xRW>c_2v zIPbARH?}$P-A=X=#oMA{GR`flZoA)?Ig3Gn^8^^xin~1)^@t*;C!zHt|Hu`PW-vBp zJ)EP16=dGYvY$e(Odarlc|bu|);@E<{}z{lt&kzLbkRTDc^b%3T96{k(9I-wo$lEd za@)c3r@Y+WY}LcggDGoXICRN77K5CbGw-!NfsiF1Q}YNy8$K+Zb<>s_b6Bx>XzCP& z<8|DGlKv+R{d;x*b-H1Ejk>8%X5}!jT>lvT;rGt3vQy zQF3P}1XXPNSobyK`>Wu=+ybTSf7(yjgI_;7w^i>Fq!+#N96;C`z0`mX_-l6T#>JBF zPlJbUl3VMhs%pI+iw7INX;>k_5m?Nms&jU`TjbP^3_=|2Gu2FuZ5xNW8s`I!VsqnO zuiH~3C-|<*Y171A^4yv9puY~q2hZr4h6^v-CQ~iPrz?zXtv$`&Rym~QsCC%Smt8Xl z`LkkP7i1aHVv$eq*FED%XuR#T`}!#}<0P|n1HBFEW*4CluM!6keXpX!#nNfWa#j$M zM#Pnfzw7o!4{33h^x)Nnji_6L-WFo@DT+y(UuM0GOMN;QcQGMVMJ&2W=33hvRMR%Y z*MB}c+_W*>EkAI8Zg3>xjHY$OWAz>04@y;THZ@gVtv=y+%{VG+U`th`N7>=nHBzQ8 z@i7(+Eoc>w_NN0zDhe*fngzORXiUSvbXvoLD=*L^Q)OiOQJ9qa;q27)*LF|W-8V_m z(rj6o?RoyT{>n4gcF9&<tj7no z29<9~r~PCfunNNLd)i{@s(VGW#;esd@1Wz?zN0P{D$kSGq=|nqxPZOu(v9EQdf}Xo z#JQ9GXB$iEGoyS>9-k77tMNJ?-t_2fHv1DwelERKa$)Afp{2by>++j(k(B|YFVSf)d z9p_$@d*Q7T^F_R-CD*`E`g;Gig4%KGV>?2x9{y+QF0)@X*YDlzfMNT=?xg>OXkUDF zeg)Ked}y1~v}`F$b+cu-E%_wyu`e8bv~+_rGjiTjQu^a;6VAVrLt)P2b>02F7>0ql zrCPJMFSmqF?~?gXXhcL~@b1N|;ic8s2dYLBh2=Xu|9zxEZ?nIrZX(}3Uro~?_`1B< zD-jm3@Cn~at4`tAjhs*na;LKVTpv2&@*nt}-eAQ+C&tBZ&!tyVB8olk+{_(hyohPl z-NBep$rKA&-?1YuGcjc)Nlf@MZbaVf;FYt)M?Fopf;{!R=qGukvwh?r=TzLPzMu6o zy5*+zAVGAo(mE?%41!Fzwck=P4SsgVcD>K(Rjvg@t@R9)9l1(ZKKo&b3}e`156@e8 z!yBS1E|N=rwK09=y$EOVteRCr6zT?vx_7ia7p%(;WxX~n=!wxe7 zBKY?I@WTkYE`rijO(r`q{aKv1CsqX1LkePuYe1UV0&&SBW->nTjlWSpYt98B zmXYCW8#}=tS@Jn>NgCF$+l!8R6D@B67cO@61}P4{4D*;FEt2&2@ZuD*;hn(F8CSso z!NkU0Ltq%`y|0kCov&{PQcxs_$w+ZLj>Ox}J#%U=?c}r8*IaIGPM7c+!OL$9<)N@i z0rh_im>{MDus1RQXn~##xFWDPV%WBrgOMN+Fo>K4f4-~&!HEaa4^)pLi11_Cj$bZ) zjiGk3NJZ=~`m?rJ9Ap*y`?w`UJ#s-Zc!gjZU~R`(97IrphPhY+j6_%TL`{Q%?M!)P zq7`X0y6_u9yc6cykhg6Q5^?J_O6lf*qdaZ!Cv;K@F(Yx5#~_6fudtwnXFVyHI$p>) zBtq%(5V9YDUy6+D3UX=S4@XboOmr?x@i>Ej(}qA-(o$YXB$Q0Gya$|t9<Q1(pG zP#DnvTQ{`RVlxYnwKw4JuyHq4km-mN&Y;Kj$;a}lQ6OLM`M=6SF$i$Q)jr(EMk92JyOxV!Lb&_)g4i(0(7n**AZBO)S-}7MqmYHb z`~K#LSYB}tnYE8Xvhbbz2B`bU$>N6-)Y~T;Q1;Ucm-VOMk?=7lK?kj*x-D7VzQek~ z>Hx*}Zaufr;4JyA4TSWesdAO@?mNfkVk1Fz58n=NvUkW>c^@0TZTh4YN${&9HD`p} zb9C*X8KL-QrGuk|hCTDZ>cUDUtmZ2h&AoE73%*1yLD|yv8TAMqM3p5G|Ev-#lj6bE zns&R&lL$^v7#j>mkg@UBDYjn&#DTQSXGMuTlH||SdRuh*DL6~h_@tW8#;G90I(Pq`*5*~W zZP~74NQRJyV(TmAp7>O(ZjAX@2yaZK)%03fvr+=x44!`h$JweE601BaR``o-g_@&^ zXFqg*^99dpYx8rbXeHepMiXQDL8wfR#ycdJzl1v9`*;sczZeO^+=qmMX+~2m$#m;Q#9(qc6)icezAzQ zi+cw(RMlJpji;Nd*D<2&&sVB-Gg*i{^?IZjx3LS)RYfvLjHiz#mvF3+mVa}{m#-qQ zmXI}x=c<~Gb-n)p#m`r@8tgl6u{`yAQK@|ODX8ww4Tn8UD!7Jwi=O=TdsRppkfJ*ClVQ(N zI^f%s+<5cV>XaA=`RaKU*xFmZzRr4{tTj|rc!eX;*Tj> zffkyXRw&Q~RZsv`0>A(?01n*sB(7*kHt^@E)Yg4RZhD`u6(oSY&plqOa*eC6d-K%F G>;KuV<$2ct literal 0 HcmV?d00001 diff --git a/starter_kit/2024_basics3.ipynb b/starter_kit/2024_basics3.ipynb deleted file mode 100644 index 809da8752..000000000 --- a/starter_kit/2024_basics3.ipynb +++ /dev/null @@ -1,1328 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3f74a524-f90a-4ad5-8d98-368afc398b46", - "metadata": {}, - "source": [ - "# Exercise 3: Strings, Functions, If Else, For Loops" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "ba8a0d90-9d57-4d01-9eb4-0b255970995e", - "metadata": {}, - "outputs": [], - "source": [ - "import altair as alt\n", - "import numpy as np\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "ddcdbbc1-2e1b-4797-bd34-07d9a1999cb6", - "metadata": {}, - "outputs": [], - "source": [ - "pd.options.display.max_columns = 100\n", - "pd.options.display.float_format = \"{:.2f}\".format\n", - "pd.set_option(\"display.max_rows\", None)\n", - "pd.set_option(\"display.max_colwidth\", None)" - ] - }, - { - "cell_type": "markdown", - "id": "8eec9257-7578-422c-b6d1-afe496e8ca70", - "metadata": {}, - "source": [ - "* Using a f-strings, load in your merged dataframe from Exercise 3." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "7c52b09e-90b5-4a5d-8fda-ca19cb8fe3cd", - "metadata": {}, - "outputs": [], - "source": [ - "GCS_FILE_PATH = \"gs://calitp-analytics-data/data-analyses/starter_kit/\"" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "e0222b8c-0996-47bb-8639-fc703cfbd249", - "metadata": {}, - "outputs": [], - "source": [ - "FILE = \"starter_kit_merge.parquet\"" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "36bbc1d2-4285-4399-a0fd-1e02c5e5d5a1", - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_parquet(f\"{GCS_FILE_PATH}{FILE}\")" - ] - }, - { - "cell_type": "markdown", - "id": "7cef8684-7d90-4f7c-a4a9-3f856430662b", - "metadata": {}, - "source": [ - "### Amanda, note to self why are there min and max scores here??" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "c97f0ec6-bea0-401a-bb27-f37984a762eb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ct_districtproject_nameScope of Workaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_scoremin_scoremax_score
010Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.103483610924522686868
18Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.89587810851139828282
22Strawberry Shortcake SidewalksColorful, patterned sidewalks connecting local schools and parks, incorporating playful strawberry-themed crosswalks and decorative street furniture.131105103743323555555
33River Ramble Rabbit TrailA 5-mile Class III bike lane along a picturesque riverfront, offering stunning views, river access points, and interpretive signage sharing the area's natural and cultural history.42999109471352747474
410Lilac Lane Dream Complete StreetA vibrant Complete Street featuring bike lanes, wide sidewalks, and ample green space, prioritizing pedestrian safety and community engagement through public events and programming.1010949107217133767676
\n", - "
" - ], - "text/plain": [ - " ct_district project_name \\\n", - "0 10 Meadow Magic Multi-Use Path \n", - "1 8 Bunny Hop Bike Boulevard \n", - "2 2 Strawberry Shortcake Sidewalks \n", - "3 3 River Ramble Rabbit Trail \n", - "4 10 Lilac Lane Dream Complete Street \n", - "\n", - " Scope of Work \\\n", - "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", - "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", - "2 Colorful, patterned sidewalks connecting local schools and parks, incorporating playful strawberry-themed crosswalks and decorative street furniture. \n", - "3 A 5-mile Class III bike lane along a picturesque riverfront, offering stunning views, river access points, and interpretive signage sharing the area's natural and cultural history. \n", - "4 A vibrant Complete Street featuring bike lanes, wide sidewalks, and ample green space, prioritizing pedestrian safety and community engagement through public events and programming. \n", - "\n", - " accessibility_score dac_accessibility_score dac_traffic_impacts_score \\\n", - "0 10 3 4 \n", - "1 8 9 5 \n", - "2 1 3 1 \n", - "3 4 2 9 \n", - "4 10 10 9 \n", - "\n", - " freight_efficiency_score freight_sustainability_score mode_shift_score \\\n", - "0 8 3 6 \n", - "1 8 7 8 \n", - "2 10 5 10 \n", - "3 9 9 10 \n", - "4 4 9 10 \n", - "\n", - " lu_natural_resources_score safety_score vmt_score zev_score \\\n", - "0 10 9 2 4 \n", - "1 10 8 5 1 \n", - "2 3 7 4 3 \n", - "3 9 4 7 1 \n", - "4 7 2 1 7 \n", - "\n", - " public_engagement_score climate_resilience_score program_fit_score \\\n", - "0 5 2 2 \n", - "1 1 3 9 \n", - "2 3 2 3 \n", - "3 3 5 2 \n", - "4 1 3 3 \n", - "\n", - " overall_score min_score max_score \n", - "0 68 68 68 \n", - "1 82 82 82 \n", - "2 55 55 55 \n", - "3 74 74 74 \n", - "4 76 76 76 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.head()" - ] - }, - { - "cell_type": "markdown", - "id": "673fa239-dc06-4ef8-9513-ee167e80898e", - "metadata": {}, - "source": [ - "## Categorizing\n", - "* There are 30 projects. They all vary in themes, some are transit oriented while others are focused on Active Transportation (ATP).\n", - "* Categorizing data is an important part of data cleaning and analyzing so we can present the data in a more succint and insightful way. \n", - "* Let's organize projects into three categories.\n", - " * ATP\n", - " * Transit\n", - " * General Lanes" - ] - }, - { - "cell_type": "markdown", - "id": "49486dc6-a686-47fa-8cef-e252d7ec349d", - "metadata": {}, - "source": [ - "### Task 1: Strings\n", - "* Below are some of the common keywords that fall into the categories detailed above. They are held in a `list`.\n", - "* Feel free to add other terms you think are relevant. \n", - "* We are going to search the `Scope of Work` column for these keywords. " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "6a6b817f-15e2-4d1c-aeae-5d7e9661a6f0", - "metadata": {}, - "outputs": [], - "source": [ - "transit = [\"transit\", \"passenger rail\", \"bus\", \"ferry\"]\n", - "atp = [\"bike\", \"pedestrian\", \"bicycle\", \"sidewalk\", \"path\"]\n", - "general_lanes = [\"general\", \"auxiliary\"]" - ] - }, - { - "cell_type": "markdown", - "id": "6caf3a84-fcd7-4531-befe-11e76c01c8f1", - "metadata": {}, - "source": [ - "#### Step 1: Cleaning\n", - "* Remember in Exercise 2 some of the project names didn't merge between the two dataframes?\n", - "* In the real world, a lot of string data can be spelled in different ways, different cases, abbreviated, and the like.\n", - "* The easiest way to clean this up is by lowercasing, stripping the white spaces, and replacing characters.\n", - "* Also, by simplifying a string column, we can saerch through it easier. " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "ea4a4df7-61ec-430b-a827-302704857318", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_2119/3727765838.py:2: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.\n", - " df[\"Scope of Work\"]\n" - ] - } - ], - "source": [ - "df[\"Scope of Work\"] = (\n", - " df[\"Scope of Work\"]\n", - " .str.lower()\n", - " .str.strip()\n", - " .str.replace(\"-\", \" \")\n", - " .str.replace(\"+\", \" \")\n", - " .str.replace(\"_\", \" \")\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "c3da188c-2afe-49f4-bbbd-8fecd8dfe10f", - "metadata": {}, - "source": [ - "* `str.contains()` allows you to search through the column. \n", - "* Let's search for projects that have \"transit\" in their descriptions. \n", - "* Tip\n", - " * The data we work with tends to be pretty wide. Scrolling horizontally gets tiresome.\n", - " * Placing all the columns you want to temporarily work within a `list` like `preview_subset` below is a good idea. " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "315228d8-a72e-4f18-a0e7-2a254c87cc23", - "metadata": {}, - "outputs": [], - "source": [ - "preview_subset = [\"project_name\", \"Scope of Work\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "be843d6a-b751-4e9f-8820-b521089914d3", - "metadata": {}, - "outputs": [], - "source": [ - "transit_only_projects = df.loc[df[\"Scope of Work\"].str.contains(\"transit\")]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "0d9a6259-8748-41fe-a549-01bdf0e9c273", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Let's see how many transit projects\n", - "len(transit_only_projects)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "6789307c-5808-4501-a1a6-5a14a12b0219", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
project_nameScope of Work
11Greenway Gables Managed Lanesmanaged lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices.
16Sparkle City Smart Streets Initiativean intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion.
19Rolling Renaissance Rabbit Expressnew, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities.
20Transit Treasure Transit Oasistransit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility.
25Trail of Treats and Transit Huba multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations.
27Park and Ride Petal Paradisean attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options.
\n", - "
" - ], - "text/plain": [ - " project_name \\\n", - "11 Greenway Gables Managed Lanes \n", - "16 Sparkle City Smart Streets Initiative \n", - "19 Rolling Renaissance Rabbit Express \n", - "20 Transit Treasure Transit Oasis \n", - "25 Trail of Treats and Transit Hub \n", - "27 Park and Ride Petal Paradise \n", - "\n", - " Scope of Work \n", - "11 managed lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices. \n", - "16 an intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion. \n", - "19 new, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities. \n", - "20 transit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility. \n", - "25 a multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations. \n", - "27 an attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options. " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "transit_only_projects[preview_subset]" - ] - }, - { - "cell_type": "markdown", - "id": "d3adfb74-5a24-47f8-88da-92fe5591821a", - "metadata": {}, - "source": [ - "#### Step 2: Filtering\n", - "* We've found all the projects that says \"transit\" somewhere in its description. \n", - "* Now there are just 7 more elements to go. \n", - "* However, the method we used above leaves us with 7 separate dataframes when we actually just want our one original dataframe tagged with categories. \n", - "* A faster way: join all the keywords you want.\n", - "* | designates \"or\".\n", - "* You can read this as \"I want projects that contain the word bus, transit, or rail...\"" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "c2575f75-44ac-46ba-a334-fdf984546cd3", - "metadata": {}, - "outputs": [], - "source": [ - "transit_keywords = f\"({'|'.join(transit)})\"" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "f6a2a521-c0ae-4c2d-830d-4020a13855f2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'(transit|passenger rail|bus|ferry)'" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Print it out\n", - "transit_keywords" - ] - }, - { - "cell_type": "markdown", - "id": "937913db-407e-415c-aabb-31d3f511ef0b", - "metadata": {}, - "source": [ - "* Filter again - notice the .loc after df and how there are brackets around `df`?" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "e5e23b6f-98b8-4219-bc52-d847ea39d121", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_2119/2441750228.py:1: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)][preview_subset]\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
project_nameScope of Work
11Greenway Gables Managed Lanesmanaged lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices.
16Sparkle City Smart Streets Initiativean intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion.
18Coastal Commuter Carousela 30 mile passenger rail line connecting coastal towns, featuring modern train sets, enhanced station amenities, and scenic viewing cars.
19Rolling Renaissance Rabbit Expressnew, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities.
20Transit Treasure Transit Oasistransit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility.
21Berry Best Bus Rapid Transitdedicated bus lanes with comfortable stops, featuring off board fare payment, priority traffic signals, and enhanced passenger amenities.
25Trail of Treats and Transit Huba multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations.
27Park and Ride Petal Paradisean attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options.
\n", - "
" - ], - "text/plain": [ - " project_name \\\n", - "11 Greenway Gables Managed Lanes \n", - "16 Sparkle City Smart Streets Initiative \n", - "18 Coastal Commuter Carousel \n", - "19 Rolling Renaissance Rabbit Express \n", - "20 Transit Treasure Transit Oasis \n", - "21 Berry Best Bus Rapid Transit \n", - "25 Trail of Treats and Transit Hub \n", - "27 Park and Ride Petal Paradise \n", - "\n", - " Scope of Work \n", - "11 managed lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices. \n", - "16 an intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion. \n", - "18 a 30 mile passenger rail line connecting coastal towns, featuring modern train sets, enhanced station amenities, and scenic viewing cars. \n", - "19 new, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities. \n", - "20 transit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility. \n", - "21 dedicated bus lanes with comfortable stops, featuring off board fare payment, priority traffic signals, and enhanced passenger amenities. \n", - "25 a multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations. \n", - "27 an attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options. " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)][preview_subset]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "7b62f28d-7b28-4258-8efa-74d1f9a41d04", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6\n", - "8\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_2119/1261237332.py:3: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " print(len(df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)]))\n" - ] - } - ], - "source": [ - "# We can see there are actually a few more transit projects then if we just filtered for the word \"transit\"\n", - "print(len(transit_only_projects))\n", - "print(len(df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)]))" - ] - }, - { - "cell_type": "markdown", - "id": "7c6717f8-4088-4c1f-9ec6-b9959fd6d283", - "metadata": {}, - "source": [ - "\n", - "* Let's put this all together. \n", - "* I want any project that contains a transit component to be tagged as \"Y\" in a column called \"Transit\". If a project doesn't have a transit component, it gets tagged as a \"N\"." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "47afb269-672f-44c1-8ab5-d70921c6e703", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_2119/1837788452.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " (df[\"Scope of Work\"].str.contains(transit_keywords)),\n" - ] - } - ], - "source": [ - "df[\"Transit\"] = np.where(\n", - " (df[\"Scope of Work\"].str.contains(transit_keywords)),\n", - " \"Y\",\n", - " \"N\",\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "dfe862f0-f77e-4bf5-8710-888d3a8d7a4c", - "metadata": {}, - "source": [ - "* Using `value_counts()` we can see the breakdown of transit related projects." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "c63f2ff8-3d2f-41c6-96d1-36d35159aef8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "N 21\n", - "Y 8\n", - "Name: Transit, dtype: int64" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.Transit.value_counts()" - ] - }, - { - "cell_type": "markdown", - "id": "d1f5fb9e-f8bd-4549-9e12-3f05dded1145", - "metadata": {}, - "source": [ - "### Task 2: Functions \n", - "* It looks only the 8 transit projects were categorized.\n", - "* We are missing the 2 categories: ATP and Lane related projects.\n", - "* We could repeat the steps above or we can use a function.\n", - " * You can think of a function as a piece of code you write only once but reuse more than once.\n", - " * In the long run, functions save you work and look neater when you present your work.\n", - " * [Please read this great tutorial.](https://www.practicalpythonfordatascience.com/00_python_crash_course_functions)\n", - " * [And refer to this page on our docs.](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)\n", - "* Let's build one together.\n", - "* Start your function with def(): and the name\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "97e597a2-8625-4f2b-8646-760c0c011208", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "#def categorize():" - ] - }, - { - "cell_type": "markdown", - "id": "06ccd282-cf21-462b-8930-9a3148671ff1", - "metadata": {}, - "source": [ - "* Now let's think of what are the two elements that we will repeat.\n", - "* We merely want to substitute `transit_keywords` with ATP or Managed Lane related keywords.\n", - "* Instead of the `df[\"Transit]\"`, we want to create two new columns called something like `df[\"ATP]\"` and `df[\"Managed_Lanes]\"` to hold our yes/no results.\n", - "* Add the two elements that need to be substituted into the argument of your function.\n", - " * It's good practice to specify what exactly the parameter should be: a string/list/dataframe. \n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "61973dc6-d99b-48f0-842f-a3c8fe74f064", - "metadata": {}, - "outputs": [], - "source": [ - "#def categorize(df:pd.DataFrame, keywords:list, new_column:str):" - ] - }, - { - "cell_type": "markdown", - "id": "ae178f6d-0f76-419c-aab2-9924ba294605", - "metadata": {}, - "source": [ - "* It's also a nice idea to document what your function will return.\n", - "* In our case, it's a dataframe. " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "a794693a-3bf2-48ba-b0a7-1ca3a41e03af", - "metadata": {}, - "outputs": [], - "source": [ - "#def categorize(df:pd.DataFrame, keywords:list, new_column:str)->pd.DataFrame:" - ] - }, - { - "cell_type": "markdown", - "id": "be820c1a-a0d2-4b2f-bf01-70e753603291", - "metadata": {}, - "source": [ - "* Think about the steps we took to categorize transit only.\n", - "* Add the sections of the code we will be reusing and sub in the original variables for the arguments.\n", - " * First, we joined the keywords from a list into a tuple.\n", - " * Second, we searched through the Scope of Work column for the keywords and tagged it with the category" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "4721b564-726a-4e05-9d27-8035609b5fcf", - "metadata": {}, - "outputs": [], - "source": [ - "def categorize(df: pd.DataFrame, keywords: list, new_column: str) -> pd.DataFrame:\n", - " joined_keywords = (\n", - " f\"({'|'.join(keywords)})\" # Remember this used to be the list called transit_keywords, but it must be changed into a tuple.\n", - " )\n", - " \n", - " # We are now creating a new column: notice how parameters has no quotation marks. \n", - " df[new_column] = np.where(\n", - " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n", - " \"Y\",\n", - " \"N\",\n", - " )\n", - " \n", - " # We are returning the updated dataframe from this function\n", - " return df" - ] - }, - { - "cell_type": "markdown", - "id": "81bbb109-beef-452c-b8d9-eb13e7b9ee03", - "metadata": {}, - "source": [ - "* Now let's use your function" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "23e31c98-17b3-41e2-883a-14dae9d6da7e", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_2119/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" - ] - } - ], - "source": [ - "df = categorize(df, atp, \"ATP\")" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "d5ec64cf-432c-45e2-b14d-f4ea7ca3de2a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "N 19\n", - "Y 10\n", - "Name: ATP, dtype: int64" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.ATP.value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "882a02a6-ce39-4da2-b2be-7e91322624e4", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_2119/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" - ] - } - ], - "source": [ - "df = categorize(df, transit, \"Transit\")" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "ee56ee97-307c-44a4-a2d4-b02eff954f87", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_2119/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" - ] - } - ], - "source": [ - "df = categorize(df, general_lanes, \"General_Lanes\")" - ] - }, - { - "cell_type": "markdown", - "id": "405aac8e-4488-47fa-bbb1-a12121ed8d15", - "metadata": {}, - "source": [ - "* Use the `groupby` technique from Exercise 2 to get the total number of projects that fall in each of these 3 new columns" - ] - }, - { - "cell_type": "markdown", - "id": "5b28fc4f-2168-4c65-9395-b141a3895b3f", - "metadata": {}, - "source": [ - "### Amanda: Add more random projects in the sample data related to general lanes." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "62115dcb-ea34-4bb1-9bd1-e678ec015b8c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
project_name
General_LanesTransitATP
NNN12
Y9
YN7
Y1
\n", - "
" - ], - "text/plain": [ - " project_name\n", - "General_Lanes Transit ATP \n", - "N N N 12\n", - " Y 9\n", - " Y N 7\n", - " Y 1" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.groupby(['General_Lanes',\"Transit\", \"ATP\"]).aggregate({'project_name':'nunique'})" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "2203f4c7-80b8-4a20-97d8-b7b6e5795e8e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
overall_score
General_LanesTransitATP
NNN73.50
Y76.00
YN72.00
Y64.00
\n", - "
" - ], - "text/plain": [ - " overall_score\n", - "General_Lanes Transit ATP \n", - "N N N 73.50\n", - " Y 76.00\n", - " Y N 72.00\n", - " Y 64.00" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.groupby(['General_Lanes',\"Transit\", \"ATP\"]).aggregate({'overall_score':'median'})" - ] - }, - { - "cell_type": "markdown", - "id": "bc935af0-4db0-4e83-92cb-0d8b34792097", - "metadata": {}, - "source": [ - "## If-Else\n", - "* Part of CSIS is to reward projects that create new infrastructure that isn't highway related. \n", - " * If a project contains at least one transit related element, we will add 10 points to its `overall_score`.\n", - " * If a project contains at least one ATP element, we will add 5 points.\n", - " * If a project contains a managed lane element, we will subtract 3 points.\n", - " * For everything else, we will leave the `overall_score` as is. \n", - " * We are going to use an `if-else` clause within another function. \n", - " * [Read about them here](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#if-else-statements)" - ] - }, - { - "cell_type": "markdown", - "id": "3c2b98b1-a2b7-4e88-b3ae-909308ee0973", - "metadata": {}, - "source": [ - "#### The first part of the logic is: if a project's `Scope of Work` column contains a transit element, their score gets bumped up by 10. " - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "1426a9ae-8227-4396-b7ac-28ac256c4ede", - "metadata": {}, - "outputs": [], - "source": [ - "def alter_score(row):\n", - " if row.Transit == \"Y\":\n", - " row.overall_score += 10\n", - " elif row.ATP == \"Y\":\n", - " row.overall_score += 5\n", - " elif row.General_Lanes == \"Y\":\n", - " row.overall_score -= 3\n", - " return row" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "65c8493e-25ce-4784-91af-604d5ac372cf", - "metadata": {}, - "outputs": [], - "source": [ - "df = df.apply(alter_score, axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "5b414d3f-71a4-4078-9d98-b9082114e2c5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
overall_score
General_LanesTransitATP
NNN73.50
Y81.00
YN82.00
Y74.00
\n", - "
" - ], - "text/plain": [ - " overall_score\n", - "General_Lanes Transit ATP \n", - "N N N 73.50\n", - " Y 81.00\n", - " Y N 82.00\n", - " Y 74.00" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.groupby(['General_Lanes',\"Transit\", \"ATP\"]).aggregate({'overall_score':'median'})" - ] - }, - { - "cell_type": "markdown", - "id": "14ba020e-e2b3-4447-89e2-abdc0579fc6b", - "metadata": {}, - "source": [ - "## For Loops + More Charts.\n", - "* Tell them to make a chart that displays overall_scores for Transit projects.\n", - "* Use a function to create the chart. \n", - "* Use a for loop to filter the dataframe for Y for the two other categories and create the chart. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ae6377db-e532-46ab-a3e0-d6d702b6deae", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/starter_kit/2024_basics_01.ipynb b/starter_kit/2024_basics_01.ipynb index 3a94021b5..cc5206469 100644 --- a/starter_kit/2024_basics_01.ipynb +++ b/starter_kit/2024_basics_01.ipynb @@ -5,25 +5,37 @@ "id": "247e773f-0e29-4ed6-ab4d-5856325611b4", "metadata": {}, "source": [ - "# Exercise 1: Familiarize yourself with `pandas`\n", - "If you are new to Python, check out the introductory Python courses available through Caltrans's LinkedIn Learning Library:\n", - "* https://www.linkedin.com/learning/search?keywords=python&u=36029164\n", + "# Exercise 1: Familiarize yourself with `pandas` and `python`\n", + "If you are new to Python, there are many resources!\n", + "* There are introductory Python courses available through [Caltrans's LinkedIn Learning Library](https://www.linkedin.com/learning/search?keywords=python&u=36029164).\n", + "* If videos aren't for you, [Practical Python for Data Science](https://www.practicalpythonfordatascience.com/00_python_crash_course) is an incredibly helpful book.\n", "\n", - "Skills: \n", + "## Skills \n", "* `pandas` is one of the base Python packages for working with tabular data.\n", "* F-strings\n", "* Export to Google Cloud Storage\n", "* Practice committing on GitHub\n", "\n", - "References: \n", - "* https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html\n", - "* https://docs.calitp.org/data-infra/analytics_tools/saving_code.html\n", + "## How to use the tutorials\n", + "* The tutorials are divided by skills/concepts we are going to learn.\n", + "* There are hints and instructions on the top.\n", + "* There are links to references and it is highly recommended to read through them and practice them in this notebook, in addition to these exercises. \n", "\n", "## What are we working with today? \n", "* Today we will be working on Caltrans System Investment Strategy (CSIS) today. Per this [description](https://dot.ca.gov/programs/transportation-planning/division-of-transportation-planning/corridor-and-system-planning/csis)\n", - "> The California Department of Transportation (Caltrans) is committed to leading climate action and advancing social equity in the transportation sector set forth by the California State Transportation Agency (CalSTA) Climate Action Plan for Transportation Infrastructure (CAPTI, 2021)...Caltrans is in a significant leadership role to carry out meaningful measures that advance state’s goals and priorities through the development and implementation of the Caltrans System Investment Strategy (CSIS). The CSIS, which implements one of CAPTI’s key actions, is envisioned to be an investment framework through a data and performance-driven approach that guides transportation investments and decisions.\n", - "* One way DDS is working on CSIS is by automating the scoring of projects using Python. We score each project based on how well they do in various categories, aka metrics such as Zero Emmission Vehicles, Vehicle Miles Traveled, and more. \n", - "* While the values in we are working with today are all fake, the exercise really is based on actual datasets and assignments. " + "> The California Department of Transportation (Caltrans) is committed to leading climate action and advancing social equity in the transportation sector set forth by the California State Transportation Agency (CalSTA) Climate Action Plan for Transportation Infrastructure (CAPTI, 2021)...Caltrans is in a significant leadership role to carry out meaningful measures that advance state’s goals and priorities through the development and implementation of the Caltrans System Investment Strategy (CSIS). The CSIS, which implements one of CAPTI’s key actions, is envisioned to be an investment framework through a data and performance-driven approach that guides transportation investments and decisions.\n", + "* DDS is working on CSIS is by automating the scoring of projects using Python. We score each project based on how well they do in various categories, aka metrics such as Zero Emmission Vehicles, Vehicle Miles Traveled, and more. \n", + "* While the values in we are working with today are all fake, the exercise is based on actual datasets and assignments. " + ] + }, + { + "cell_type": "markdown", + "id": "4dd32eed-55a4-4fd1-874b-02f9b4bd94a7", + "metadata": {}, + "source": [ + "## Import Pandas\n", + "* You are importing the package `pandas` that is the backbone of all data analysis work. \n", + "* You can import countless packages. `numpy` and `geopandas` are also popular. " ] }, { @@ -50,6 +62,17 @@ "pd.set_option(\"display.max_colwidth\", None)" ] }, + { + "cell_type": "markdown", + "id": "ff74b143-6ff2-46e9-ae88-4a208155e990", + "metadata": {}, + "source": [ + "## Jupyter Notebook\n", + "* You're using a Jupyter Notebook right now.\n", + "* Take some time to get used to this interface. \n", + "* AMANDA TO DO: find a tutorial." + ] + }, { "cell_type": "markdown", "id": "cc30cb7d-77d3-465b-9831-8810096af9b1", @@ -60,7 +83,8 @@ " * Open it up in Excel and take a look.\n", "### Read in the data\n", "* We are reading our Excel Workbook into a Pandas dataframe.\n", - "* While there is a very [technical definition](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) of what a dataframe is, you can think of it as an Excel sheet that holds your data. A pandas dataframe merely allows you to clean the data programatically." + "* While there is a very [technical definition](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) of what a dataframe is, you can think of it as an Excel sheet that holds your data. \n", + "* Resource: [This page of the Practical Python for Data Science](https://www.practicalpythonfordatascience.com/02_loading_data)" ] }, { @@ -94,7 +118,7 @@ "* Below are a couple of very common methods we use. \n", " * `.head()` shows the first five rows, while `.tail()` shows the last five.\n", " * `.sample()` shows you a random row.\n", - " * Want to see or less than five? Specify it in the parantheses: `.head(10)`.\n", + " * Want to see or less than five? Specify it in the parantheses: `.head(10)` allows you to see the first 10 rows and `.head(2)` allows you to see the first 2.\n", "* Try everything yourself below." ] }, @@ -103,7 +127,7 @@ "id": "3386e9d8-15cd-48bc-8b1f-cf6f95512ad5", "metadata": {}, "source": [ - "### Reviewing the Data - More Methods!\n", + "### More Methods!\n", "* `df.shape` gives you the number of rows and columns in your dataset.\n", "* `df.columns` returns all of the column names.\n", "* `df.info()` per the [pandas docs](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.info.html#pandas.DataFrame.info) prints information about a DataFrame including the index dtype and columns, non-null values and memory usage.\n", @@ -125,15 +149,16 @@ "output_type": "stream", "text": [ "\n", - "RangeIndex: 29 entries, 0 to 28\n", - "Data columns (total 3 columns):\n", + "RangeIndex: 44 entries, 0 to 43\n", + "Data columns (total 4 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", - " 0 ct_district 29 non-null int64 \n", - " 1 project_name 29 non-null object\n", - " 2 Scope of Work 29 non-null object\n", - "dtypes: int64(1), object(2)\n", - "memory usage: 824.0+ bytes\n" + " 0 ct_district 44 non-null int64 \n", + " 1 project_name 44 non-null object\n", + " 2 Scope of Work 44 non-null object\n", + " 3 Project Cost 44 non-null int64 \n", + "dtypes: int64(2), object(2)\n", + "memory usage: 1.5+ KB\n" ] } ], @@ -168,18 +193,18 @@ { "data": { "text/plain": [ - "9 5\n", - "10 3\n", - "8 3\n", - "3 3\n", - "1 3\n", + "3 7\n", + "2 6\n", + "6 6\n", + "11 6\n", + "7 5\n", + "9 3\n", "12 3\n", - "4 3\n", - "2 2\n", + "1 2\n", + "4 2\n", + "8 2\n", + "10 1\n", "5 1\n", - "7 1\n", - "11 1\n", - "6 1\n", "Name: ct_district, dtype: int64" ] }, @@ -198,8 +223,8 @@ "metadata": {}, "source": [ "* `.nunique()` displays the number of distinct values in your column\n", - " * This is particulary useful because there are many times when the number of unique values of a column should match the number of rows of your dataset exactly.\n", - " * In our case, our dataframe has 29 rows and we should have 29 unique project names and scope of work descriptions." + " * This is useful because there are many occassions when the number of unique values of a column should match the number of rows of your dataset exactly.\n", + " * In our case, our dataframe has 44 rows and we should have 44 unique project names and scope of work descriptions." ] }, { @@ -211,7 +236,7 @@ { "data": { "text/plain": [ - "29" + "44" ] }, "execution_count": 7, @@ -225,24 +250,51 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, + "id": "55d2140f-feab-496b-b9b1-90bbe5701a9a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(44, 4)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "markdown", + "id": "7c0c499e-fa7b-4f01-a357-db7b0ec41416", + "metadata": {}, + "source": [ + "* Notice that when you have spaces in between each string of your column name, you need to refer the column using brackets []. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, "id": "4e232324-f75f-46a0-962d-76ed9273dac7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "29" + "44" ] }, - "execution_count": 8, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Notice that when you have spaces in between each string of your column name,\n", - "# you need to refer the column using brackets []. \n", "df[\"Scope of Work\"].nunique()" ] }, @@ -253,7 +305,7 @@ "source": [ "## Something missing? \n", "* Open up our dataset using Excel. \n", - "* Take a look at the sheets: how many are there in the Excel worbook? \n", + "* Take a look at the bottom: how many sheets are there in the Excel worbook? \n", "* Which sheet is loaded into `df` above? " ] }, @@ -262,25 +314,28 @@ "id": "5302dd99-acb2-40d7-b00d-4f0493ee5e09", "metadata": {}, "source": [ - "### Lists" + "### Lists: An Introduction\n", + "* We can load in all of the sheets in an Excel workbook using a list\n", + "* Per [Practical Python for Data Science](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#list): \"lists represent a collection of objects and are constructed with square brackets, separating items with commas. A list can contain a collection of one datatype...It can also contain a collection of mixed datatypes\".\"\n", + " * Play around with some of the examples in the link above in this notebook.\n", + "* Notice that the items in this list are strings. Read about strings [here](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#string)." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 14, "id": "02380fb6-c55b-477f-acfb-8b483e83beac", "metadata": {}, "outputs": [], "source": [ - "# Enter in all the sheets you are interested in loading into Python.\n", - "# By the way, they always need to be strings.\n", + "\n", "my_sheets = [\"projects_auto\",\n", " \"overall_score\"]" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 15, "id": "8a9a1a3e-e10d-4447-96dd-92ecb2fe6357", "metadata": {}, "outputs": [ @@ -290,7 +345,7 @@ "2" ] }, - "execution_count": 10, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -299,9 +354,17 @@ "len(my_sheets)" ] }, + { + "cell_type": "markdown", + "id": "21a32ab4-bfb2-4e7a-b90a-6fa05b7ceb89", + "metadata": {}, + "source": [ + "* You can access each element of the list using an index. " + ] + }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 16, "id": "a3be037d-b21b-4192-9099-25bfcb660f01", "metadata": {}, "outputs": [ @@ -311,7 +374,7 @@ "'projects_auto'" ] }, - "execution_count": 11, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -323,7 +386,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 17, "id": "ebf91535-a466-446a-9f7a-606503d78b6a", "metadata": {}, "outputs": [ @@ -333,7 +396,7 @@ "'overall_score'" ] }, - "execution_count": 12, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -342,14 +405,22 @@ "my_sheets[1]" ] }, + { + "cell_type": "markdown", + "id": "75df89d0-92fb-4e4e-aaa3-54f4944c55c3", + "metadata": {}, + "source": [ + "* Read the in the Excel workbook into a dataframe.\n", + "* Using the argument `sheet_name` you can open up a specific sheet in an Excel workbook or multiple sheets that is held in a list." + ] + }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 18, "id": "2e2578bc-db1f-41f5-bc07-3cb82998420e", "metadata": {}, "outputs": [], "source": [ - "# Open the workbook in a dictionary\n", "df2 = pd.read_excel(\n", " url,\n", " sheet_name=my_sheets,\n", @@ -362,14 +433,14 @@ "metadata": {}, "source": [ "### Specificity is beautiful.\n", - "* Grab out each individual sheet into its own dataframe using `df2.get(my_sheets[enter in the number])`. \n", + "* Grab out each individual sheet into its own dataframe using `df2.get(my_sheets[enter in the index number])`. \n", "* Make sure your `dataframe` is titled descriptively.\n", "* `df` is not exactly very telling. " ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 19, "id": "4c6f8fdb-33d3-4c44-bb00-6d1447d49feb", "metadata": {}, "outputs": [], @@ -379,7 +450,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 20, "id": "167af2f1-b09d-476d-87b4-b9374ad445c2", "metadata": {}, "outputs": [], @@ -394,20 +465,19 @@ "source": [ "## Add a new column\n", "* Oops! Us analysts were so wrapped up in scoring, we forgot to to total up all the metrics to find the overall_score for the project. \n", - "* Do so and place your results in a column called `overall_score`\n", - "* There are a couple of ways to do this.\n", - "* More food for thought:\n", + "* Place your results in a column called `overall_score`\n", + "* There are a couple of ways to do this: expeirment!\n", + "* Food for thought:\n", " * What does `axis = 1` mean?\n", " * What happens if you do `.sum(axis=0)`?\n", - " * Try everything once.\n", " * You don't always have to save everything into a dataframe. You can do something like `df.sum(axis=0)` just to see what happens. \n", " * Just make sure your dataframe isn't too large or else you will run out of memory!\n", - " * What happens when you create a new column with `scores_df.overall_score`? " + " * What happens when you create a new column with `scores_df.overall_score` instead of `scores_df[\"overall_score\"]`? " ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 21, "id": "e9321f90-8c99-46fb-9d50-8571f3d94fc8", "metadata": {}, "outputs": [], @@ -418,29 +488,52 @@ { "cell_type": "markdown", "id": "246437eb-f284-49b8-960d-d601a66f6362", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "## Subsetting\n", "* Your manager asks for the `overall_score` for each project. They do not want to see the other metrics, only the project's name and its total score.\n", "* Subset the dataframe and save it into a new dataframe.\n", - "* There are many ways to do the same thing in Python. \n", - " * The best way is usually the one with the least amount of text and code." + "* Again, there are many ways to do the same thing in Python. \n", + "* Method 1: Enter in all the columns you want to keep in a list and place the list in another set of brackets." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 23, "id": "4e6d8e70-ae57-46c5-a5aa-9972be77f415", "metadata": {}, "outputs": [], "source": [ "# Enter in the columns you want to keep\n", - "columns_to_keep = [\"overall_score\", \"project_name\"]" + "columns_to_keep = [\"project_name\",\"overall_score\"]" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 30, + "id": "48ee899b-3db9-464f-802f-d431189176b7", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "subsetted_df1 = scores_df[columns_to_keep]" + ] + }, + { + "cell_type": "markdown", + "id": "56865911-994c-4fb5-afe4-1fdc1d752d8b", + "metadata": {}, + "source": [ + "* Method 2: You can enter in all the columns in a list you want to drop and use `.drop()`" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "2c64cdcf-9598-4f4a-b077-5caec0cfe264", "metadata": {}, "outputs": [], @@ -451,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 24, "id": "47a96b86-e5d1-4fcd-ba73-7db5badae28b", "metadata": { "scrolled": true, @@ -459,992 +552,20 @@ }, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
project_nameaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_score
0Meadow Magic Multi-Use Path10348361092452268
1Bunny Hop Bike Boulevard8958781085113982
2Strawberry Shortcake Sidewalks13110510374332355
3River Ramble Rabbit Trail4299910947135274
4Lilac Lane Dream Complete Street101094910721713376
5Unicorn Expressway1045945985493681
6Sunflower Gables Intermodal Facility2891016539917474
7Seaside Strawberry Port Revitalization271573764152858
8Countryside Clover Rail Connector3319757581731069
9Tranquil Truck Trot4558815274681073
10Rainbow Rush HOT Lanes421078711061078989
11Greenway Gables Managed Lanes3558361046959679
12Bunny Lane HOV+2 Haven49624910461510575
13Wildflower Wonders Highway Expansion7616107943935676
14Mountain View Mansion Interchange4917210965767881
15Passing Lane Paradise Found1734871088234368
16Sparkle City Smart Streets Initiative3554103671693466
17Traffic Tamer Turtle Pace4242106348873263
18Coastal Commuter Carousel5141107946428869
19Rolling Renaissance Rabbit Express6547688154261072
20Transit Treasure Transit Oasis9883362912103872
21Berry Best Bus Rapid Transit6710783392848378
22Electric Avenue Emerald Charging Stations18210711071749269
23Hydrogen Haven Honeycomb Fueling Station67892262810910483
24Gingerbread Village Green Complete Street1291085929388680
25Trail of Treats and Transit Hub9619424225910164
26Main Street Muffin Top Revitalization4976155610659780
27Park and Ride Petal Paradise51107921310466165
28Waterfront Waffle Walk and Bike4695694104325168
\n", - "
" - ], - "text/plain": [ - " project_name accessibility_score \\\n", - "0 Meadow Magic Multi-Use Path 10 \n", - "1 Bunny Hop Bike Boulevard 8 \n", - "2 Strawberry Shortcake Sidewalks 1 \n", - "3 River Ramble Rabbit Trail 4 \n", - "4 Lilac Lane Dream Complete Street 10 \n", - "5 Unicorn Expressway 10 \n", - "6 Sunflower Gables Intermodal Facility 2 \n", - "7 Seaside Strawberry Port Revitalization 2 \n", - "8 Countryside Clover Rail Connector 3 \n", - "9 Tranquil Truck Trot 4 \n", - "10 Rainbow Rush HOT Lanes 4 \n", - "11 Greenway Gables Managed Lanes 3 \n", - "12 Bunny Lane HOV+2 Haven 4 \n", - "13 Wildflower Wonders Highway Expansion 7 \n", - "14 Mountain View Mansion Interchange 4 \n", - "15 Passing Lane Paradise Found 1 \n", - "16 Sparkle City Smart Streets Initiative 3 \n", - "17 Traffic Tamer Turtle Pace 4 \n", - "18 Coastal Commuter Carousel 5 \n", - "19 Rolling Renaissance Rabbit Express 6 \n", - "20 Transit Treasure Transit Oasis 9 \n", - "21 Berry Best Bus Rapid Transit 6 \n", - "22 Electric Avenue Emerald Charging Stations 1 \n", - "23 Hydrogen Haven Honeycomb Fueling Station 6 \n", - "24 Gingerbread Village Green Complete Street 1 \n", - "25 Trail of Treats and Transit Hub 9 \n", - "26 Main Street Muffin Top Revitalization 4 \n", - "27 Park and Ride Petal Paradise 5 \n", - "28 Waterfront Waffle Walk and Bike 4 \n", - "\n", - " dac_accessibility_score dac_traffic_impacts_score \\\n", - "0 3 4 \n", - "1 9 5 \n", - "2 3 1 \n", - "3 2 9 \n", - "4 10 9 \n", - "5 4 5 \n", - "6 8 9 \n", - "7 7 1 \n", - "8 3 1 \n", - "9 5 5 \n", - "10 2 10 \n", - "11 5 5 \n", - "12 9 6 \n", - "13 6 1 \n", - "14 9 1 \n", - "15 7 3 \n", - "16 5 5 \n", - "17 2 4 \n", - "18 1 4 \n", - "19 5 4 \n", - "20 8 8 \n", - "21 7 10 \n", - "22 8 2 \n", - "23 7 8 \n", - "24 2 9 \n", - "25 6 1 \n", - "26 9 7 \n", - "27 1 10 \n", - "28 6 9 \n", - "\n", - " freight_efficiency_score freight_sustainability_score mode_shift_score \\\n", - "0 8 3 6 \n", - "1 8 7 8 \n", - "2 10 5 10 \n", - "3 9 9 10 \n", - "4 4 9 10 \n", - "5 9 4 5 \n", - "6 10 1 6 \n", - "7 5 7 3 \n", - "8 9 7 5 \n", - "9 8 8 1 \n", - "10 7 8 7 \n", - "11 8 3 6 \n", - "12 2 4 9 \n", - "13 6 10 7 \n", - "14 7 2 10 \n", - "15 4 8 7 \n", - "16 4 10 3 \n", - "17 2 10 6 \n", - "18 1 10 7 \n", - "19 7 6 8 \n", - "20 3 3 6 \n", - "21 7 8 3 \n", - "22 10 7 1 \n", - "23 9 2 2 \n", - "24 10 8 5 \n", - "25 9 4 2 \n", - "26 6 1 5 \n", - "27 7 9 2 \n", - "28 5 6 9 \n", - "\n", - " lu_natural_resources_score safety_score vmt_score zev_score \\\n", - "0 10 9 2 4 \n", - "1 10 8 5 1 \n", - "2 3 7 4 3 \n", - "3 9 4 7 1 \n", - "4 7 2 1 7 \n", - "5 9 8 5 4 \n", - "6 5 3 9 9 \n", - "7 7 6 4 1 \n", - "8 7 5 8 1 \n", - "9 5 2 7 4 \n", - "10 1 10 6 10 \n", - "11 10 4 6 9 \n", - "12 10 4 6 1 \n", - "13 9 4 3 9 \n", - "14 9 6 5 7 \n", - "15 10 8 8 2 \n", - "16 6 7 1 6 \n", - "17 3 4 8 8 \n", - "18 9 4 6 4 \n", - "19 8 1 5 4 \n", - "20 2 9 1 2 \n", - "21 3 9 2 8 \n", - "22 10 7 1 7 \n", - "23 6 2 8 10 \n", - "24 9 2 9 3 \n", - "25 4 2 2 5 \n", - "26 5 6 10 6 \n", - "27 1 3 10 4 \n", - "28 4 10 4 3 \n", - "\n", - " public_engagement_score climate_resilience_score program_fit_score \\\n", - "0 5 2 2 \n", - "1 1 3 9 \n", - "2 3 2 3 \n", - "3 3 5 2 \n", - "4 1 3 3 \n", - "5 9 3 6 \n", - "6 1 7 4 \n", - "7 5 2 8 \n", - "8 7 3 10 \n", - "9 6 8 10 \n", - "10 7 8 9 \n", - "11 5 9 6 \n", - "12 5 10 5 \n", - "13 3 5 6 \n", - "14 6 7 8 \n", - "15 3 4 3 \n", - "16 9 3 4 \n", - "17 7 3 2 \n", - "18 2 8 8 \n", - "19 2 6 10 \n", - "20 10 3 8 \n", - "21 4 8 3 \n", - "22 4 9 2 \n", - "23 9 10 4 \n", - "24 8 8 6 \n", - "25 9 10 1 \n", - "26 5 9 7 \n", - "27 6 6 1 \n", - "28 2 5 1 \n", - "\n", - " overall_score \n", - "0 68 \n", - "1 82 \n", - "2 55 \n", - "3 74 \n", - "4 76 \n", - "5 81 \n", - "6 74 \n", - "7 58 \n", - "8 69 \n", - "9 73 \n", - "10 89 \n", - "11 79 \n", - "12 75 \n", - "13 76 \n", - "14 81 \n", - "15 68 \n", - "16 66 \n", - "17 63 \n", - "18 69 \n", - "19 72 \n", - "20 72 \n", - "21 78 \n", - "22 69 \n", - "23 83 \n", - "24 80 \n", - "25 64 \n", - "26 80 \n", - "27 65 \n", - "28 68 " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" + "ename": "NameError", + "evalue": "name 'columns_to_drop' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[24], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m scores_df\u001b[38;5;241m.\u001b[39mdrop(columns \u001b[38;5;241m=\u001b[39m \u001b[43mcolumns_to_drop\u001b[49m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'columns_to_drop' is not defined" + ] } ], "source": [ "\n", - "scores_df.drop(columns = columns_to_drop)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "48ee899b-3db9-464f-802f-d431189176b7", - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
overall_scoreproject_name
068Meadow Magic Multi-Use Path
182Bunny Hop Bike Boulevard
255Strawberry Shortcake Sidewalks
374River Ramble Rabbit Trail
476Lilac Lane Dream Complete Street
581Unicorn Expressway
674Sunflower Gables Intermodal Facility
758Seaside Strawberry Port Revitalization
869Countryside Clover Rail Connector
973Tranquil Truck Trot
1089Rainbow Rush HOT Lanes
1179Greenway Gables Managed Lanes
1275Bunny Lane HOV+2 Haven
1376Wildflower Wonders Highway Expansion
1481Mountain View Mansion Interchange
1568Passing Lane Paradise Found
1666Sparkle City Smart Streets Initiative
1763Traffic Tamer Turtle Pace
1869Coastal Commuter Carousel
1972Rolling Renaissance Rabbit Express
2072Transit Treasure Transit Oasis
2178Berry Best Bus Rapid Transit
2269Electric Avenue Emerald Charging Stations
2383Hydrogen Haven Honeycomb Fueling Station
2480Gingerbread Village Green Complete Street
2564Trail of Treats and Transit Hub
2680Main Street Muffin Top Revitalization
2765Park and Ride Petal Paradise
2868Waterfront Waffle Walk and Bike
\n", - "
" - ], - "text/plain": [ - " overall_score project_name\n", - "0 68 Meadow Magic Multi-Use Path\n", - "1 82 Bunny Hop Bike Boulevard\n", - "2 55 Strawberry Shortcake Sidewalks\n", - "3 74 River Ramble Rabbit Trail\n", - "4 76 Lilac Lane Dream Complete Street\n", - "5 81 Unicorn Expressway\n", - "6 74 Sunflower Gables Intermodal Facility\n", - "7 58 Seaside Strawberry Port Revitalization\n", - "8 69 Countryside Clover Rail Connector\n", - "9 73 Tranquil Truck Trot\n", - "10 89 Rainbow Rush HOT Lanes\n", - "11 79 Greenway Gables Managed Lanes\n", - "12 75 Bunny Lane HOV+2 Haven\n", - "13 76 Wildflower Wonders Highway Expansion\n", - "14 81 Mountain View Mansion Interchange\n", - "15 68 Passing Lane Paradise Found\n", - "16 66 Sparkle City Smart Streets Initiative\n", - "17 63 Traffic Tamer Turtle Pace\n", - "18 69 Coastal Commuter Carousel\n", - "19 72 Rolling Renaissance Rabbit Express\n", - "20 72 Transit Treasure Transit Oasis\n", - "21 78 Berry Best Bus Rapid Transit\n", - "22 69 Electric Avenue Emerald Charging Stations\n", - "23 83 Hydrogen Haven Honeycomb Fueling Station\n", - "24 80 Gingerbread Village Green Complete Street\n", - "25 64 Trail of Treats and Transit Hub\n", - "26 80 Main Street Muffin Top Revitalization\n", - "27 65 Park and Ride Petal Paradise\n", - "28 68 Waterfront Waffle Walk and Bike" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "scores_df[columns_to_keep]" + "subsetted_df2 = scores_df.drop(columns = columns_to_drop)" ] }, { @@ -1453,42 +574,59 @@ "metadata": {}, "source": [ "## Export to Google Cloud Storage (GCS)\n", - "* Our original Excel workbook's file path is `\"gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx\"`\n", - "* Save your subsetted dataframe from above back into the `starter_kit` folder. \n", - "* Sure you could do `\"gs://calitp-analytics-data/data-analyses/starter_kit/aggregated_csis.xlsx\"` but that is an eyesore.\n", - "* Essentially, the only difference between these two file paths are `aggregated_csis.xlsx` and `starter_kit_csis_scoring_workbook.xlsx` because the file_path `gs://calitp-analytics-data/data-analyses/starter_kit/` remains the same. \n", - "* This is where f-strings come in. What are f-strings? \n", + "* Save your subsetted dataframe from above back into the `starter_kit` folder. The file path should be something like this `\"gs://calitp-analytics-data/data-analyses/starter_kit/aggregated_csis.xlsx\"`.\n", + "* However, remember our original Excel workbook's file path? It was`\"gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx\"`\n", + "* Essentially, the only difference between these two file paths are `aggregated_csis.xlsx` and `starter_kit_csis_scoring_workbook.xlsx` because the folder path `gs://calitp-analytics-data/data-analyses/starter_kit/` remains the same. \n", + "* This is where f-strings come in.\n", "> Python f-strings provide a quick way to interpolate and format strings. They’re readable, concise, and less prone to error than traditional string interpolation and formatting tools...\n", " * Read more about them [here](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python).\n", - "* Let's practice !" + "* Reference\n", + " * [Saving Code](https://docs.calitp.org/data-infra/analytics_tools/saving_code.html)\n", + "* Let's practice !\n", + " * My file_path is always going to be `gs://calitp-analytics-data/data-analyses/starter_kit/`." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 26, "id": "4c9c53a5-dbf3-4dc0-aea0-832f3a91414d", "metadata": {}, "outputs": [], "source": [ - "# My file_path is always going to be `gs://calitp-analytics-data/data-analyses/starter_kit/`.\n", "GCS_FILE_PATH = \"gs://calitp-analytics-data/data-analyses/starter_kit/\"" ] }, + { + "cell_type": "markdown", + "id": "11a088a5-e8e2-4a12-9736-44ae46c2d771", + "metadata": {}, + "source": [ + "* However the file is going to change.\n", + "* Save the file name in an object called `FILE`." + ] + }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 27, "id": "db111f34-08b8-42f9-96fe-6852c4af50ad", "metadata": {}, "outputs": [], "source": [ - "# However my file is going to change.\n", - "# I want to name my subsetted dataframe as \"aggregated\" and I want it to be saved as an Excel workbook.\n", + "\n", "FILE = \"starter_kit_example_final_scores.xlsx\"" ] }, + { + "cell_type": "markdown", + "id": "bf96d0cf-7225-4a44-9955-988d982a0f7f", + "metadata": {}, + "source": [ + "* Using `f-string`, combine `GCS_FILE_PATH` and `FILE` together." + ] + }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 28, "id": "edff403c-ef37-48d8-8c7a-60b388752a51", "metadata": {}, "outputs": [ @@ -1498,7 +636,7 @@ "'gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_example_final_scores.xlsx'" ] }, - "execution_count": 23, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1508,14 +646,24 @@ "f\"{GCS_FILE_PATH}{FILE}\"" ] }, + { + "cell_type": "markdown", + "id": "5504c416-b65b-4c74-a2ba-95688cf8e77a", + "metadata": {}, + "source": [ + "* Now go open up your new Excel workbook and see if it's what you expect.\n", + " * Hint: you will probably get a very annoying extra column! \n", + " * Try out some of the arguments [listed](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html#pandas.DataFrame.to_excel) and save your file again." + ] + }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 29, "id": "bf37fc2d-ac6c-4134-94de-79a9a4141ffc", "metadata": {}, "outputs": [], "source": [ - "# What if I wanted to read back the original file using f-strings? \n", + "\n", "scores_df[[\"project_name\",\"overall_score\"]].to_excel(f\"{GCS_FILE_PATH}{FILE}\")" ] }, @@ -1524,17 +672,14 @@ "id": "17c17adb-404e-4e54-bdb4-c3295e0e2be2", "metadata": {}, "source": [ - "* Export your entire dataframe with the new `overall_score` column using `df.to_parquet()`. \n", - " * We typically prefer saving to `parquets` and you can read why [here](https://docs.calitp.org/data-infra/analytics_new_analysts/03-data-management.html#parquet).\n", - "* Export your subsetted dataframe with only the `overall_score` and `project_name` columns using `df.to_excel()`. \n", - " * Open up your new Excel workbook and see if it's what you expect.\n", - " * Hint: you will probably get a very annoying extra column! \n", - " * Try out some of the arguments [listed](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html#pandas.DataFrame.to_excel)." + "* Export the entire (not subsetted) dataframe with the new `overall_score` column using `df.to_parquet()`. \n", + " * We typically prefer saving to `parquets`. Why? Read below. Text taken from [here](https://docs.calitp.org/data-infra/analytics_new_analysts/03-data-management.html#parquet).\n", + " * Parquet is an “open source columnar storage format for use in data analysis systems.” Columnar storage is more efficient as it is easily compressed and the data is more homogenous. CSV files utilize a row-based storage format which is harder to compress, a reason why Parquets files are preferable for larger datasets. Parquet files are faster to read than CSVs, as they have a higher querying speed and preserve datatypes (i.e. Number, Timestamps, Points). They are best for intermediate data storage and large datasets (1GB+) on most any on-disk storage. This file format is also good for passing dataframes between Python and R. A similar option is feather." ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 31, "id": "22562f2f-8359-4e44-951c-25e5ac033282", "metadata": {}, "outputs": [], @@ -1549,9 +694,10 @@ "source": [ "## You're almost done!\n", "* Name this notebook `YOURNAME_exercise1.ipynb`\n", - " * If you need to rename because you already named it, do it within the terminal.\n", - " * `git mv OLDNAME.ipynb NEWNAME.ipynb`. \n", - " * The `mv` stands for move, and renaming a file is basically \"moving\" its path. Doing it this way retains the git history associated with the notebook. If you rename directly with right click, rename, you destroy the git history.\n", + " * You can't right click and rename the file, since this notebook is tracked with Git. \n", + " * Rename it using `git mv OLDNAME.ipynb NEWNAME.ipynb`. \n", + " * The `mv` stands for move, and renaming a file is basically \"moving\" its path. \n", + " * Doing it this way retains the git history associated with the notebook. If you rename directly with right click, rename, you destroy the git history.\n", "* Use a descriptive commit message (ex: adding chart, etc). GitHub already tracks who makes the commit, the date, the timestamp of it, the files being affected, so your commit message should be more descriptive than the metadata already stored." ] } diff --git a/starter_kit/2024_basics_02.ipynb b/starter_kit/2024_basics_02.ipynb index aca06f813..4b5310998 100644 --- a/starter_kit/2024_basics_02.ipynb +++ b/starter_kit/2024_basics_02.ipynb @@ -118,17 +118,21 @@ "metadata": {}, "source": [ "## Merging \n", - "* Your manager asks you to aggregate the find by District:\n", - " * average overall score\n", - " * max score \n", - " * Min score\n", + "* Your manager asks you to aggregate the dataframe by Caltrans District to find:\n", + " * Median overall score\n", + " * Max overall score \n", + " * Min overall score\n", " * Number of unique projects\n", - "* Annoyingly enough, the `overall_score` column and the `ct_district` are in two different dataframes. You'll have to merge it. \n", + "* Annoyingly enough, the `overall_score` column and the `ct_district` are in two different dataframes. \n", + "* You'll have to merge it on the common column(s) the two dataframes share.\n", "* Welcome to DDS! This will happen to you all the time starting now. \n", "\n", + "### Relevant Resources\n", + "* If needed, read about merges before diving in. \n", + " * [Resource #1 is a great tutorial for beginners](https://www.practicalpythonfordatascience.com/03_cleaning_data.html?highlight=merge#merging-dataframes-together).\n", + " * [Resource #2 is written by our own Tiffany Ku, but it contains some geospatial references so it's a bit more to digest](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#merge-tabular-and-geospatial-data-for-data-analysis).\n", "### Food for thought \n", - "* Which do columns the two dataframes have in common?\n", - " * You can merge on more than one column. In fact, it's best practice to! \n", + "* Which columns do the two dataframes have in common?\n", "* What type of merge will achieve my goal?\n", " * Inner, outer, left, or right\n", "* What do I expect out of the merge?\n", @@ -157,7 +161,37 @@ "### Double Checking\n", "* How many rows do you expect?\n", "* How many unique projects are there? \n", - "* Hint: check your original dataframes as well" + "* Hint: check your original dataframes as well" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e820d7af-17d4-4b2a-8007-5d958a3f7d9e", + "metadata": {}, + "outputs": [], + "source": [ + "m1.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3642de14-3bf4-47c0-bd80-3502819ea14d", + "metadata": {}, + "outputs": [], + "source": [ + "m1.project_name.nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b5be67a-f579-4f22-97cb-b6b31d7b8433", + "metadata": {}, + "outputs": [], + "source": [ + "projects_df.project_name.nunique()" ] }, { @@ -165,8 +199,9 @@ "id": "94e866f0-bc46-43d3-92b7-dce71dc31c02", "metadata": {}, "source": [ - "#### The Beauty of Outer Joins \n", - "* To save you some grief and time, `outer` joins are very useful.\n", + "### The Beauty of Outer Joins \n", + "* As you have noticed, we are missing a couple of projects.\n", + "* This is where `outer` joins are very useful.\n", "* Merge your dataframes again using an `outer` join and with `indicator = True` on.\n", "* Using `.value_counts()` check out how many rows are found in both dataframes, the left only, and the right only" ] @@ -200,7 +235,8 @@ "source": [ "### Filtering\n", "* Filter out for only the `left_only` and `right_only` values.\n", - "* AH note: link to docs page with tutorial." + " * `!=` means does not equal to. \n", + " " ] }, { @@ -215,18 +251,58 @@ }, { "cell_type": "markdown", - "id": "b9279e5f-4e4b-41d5-818f-56bc6932e052", + "id": "044330d9-8562-4510-ae62-268f240ec3bc", "metadata": {}, "source": [ - "### Dictionaries: An Introduction \n", + "* You could also use `isin([list of elements you want to keep])`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c47ef38d-6db5-4bf1-bd87-62b7d84943b6", + "metadata": {}, + "outputs": [], + "source": [ + "m2.loc[m2._merge.isin([\"left_only\",\"right_only\"])][[\"project_name\", \"_merge\"]]" + ] + }, + { + "cell_type": "markdown", + "id": "e0a6bd58-734e-4f96-b150-9a53bef7d1aa", + "metadata": {}, + "source": [ + "### Dictionaries\n", "* String data is often entered in many different ways. BART can be entered in as bart, Bay Area Rapid Transit, BaRT, and more. \n", - "* Take a look as to why these projects are not merging. \n", - "* In Excel, it's easy to go in and manually tweak everything. However, that is not reproducible. \n", - "* Since there are essentially only a couple of names to replace, we can do it using a dictionary.\n", - "* Decide whether you want to rename the values in the left dataframe or the right one. \n", - " * AH: Link to docs\n", - " * Explain what a dictionary is\n", - "* Take a look at elements \n", + "* Often, strings are the reason why your dataframe is not merging properly.\n", + "* In Excel, it's easy to go in and manually tweak everything. However, that is not reproducible and time consuming. \n", + "* Since there are essentially only a couple of names to replace, we can do it using a dictionary.\n", + "\n", + "#### What is a dictionary?\n", + "* Per Practical Python for Data Science, a dictionary is Dictionaries are used to store data values in key:value pairs. Similar to the list, a dictionary is a collection of objects. It is also mutable, meaning that you can add, remove, change values inside of it...With the list, we access elements using the index. With the dictionary, we access elements using keys..\n", + " * Read more [here](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#dictionary) and experiment with the example in the docs in this notebook.\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df6fa95e-cc25-4142-8c2b-ee254863e609", + "metadata": {}, + "outputs": [], + "source": [ + "# Practice Here" + ] + }, + { + "cell_type": "markdown", + "id": "76e42f11-fdcb-48f3-8951-2f2cea0384c0", + "metadata": {}, + "source": [ + "#### Replacing Values\n", + "* [Relevanting Reading](https://www.practicalpythonfordatascience.com/03_cleaning_data#recoding-column-values).\n", + "* Step 1: Filter out for the rows that didn't merge. Find the unique values of the `project_name` column using `.unique()`\n", + "* Take a look at elements using \n", " * Trailing white spaces\n", " * Capitalization\n", " * Spelling\n", @@ -236,15 +312,20 @@ { "cell_type": "code", "execution_count": null, - "id": "55709137-db8e-4bf8-8939-6f8af49b3719", - "metadata": { - "scrolled": true, - "tags": [] - }, + "id": "5601fd36-d221-41da-ab76-b88c616e5e62", + "metadata": {}, "outputs": [], "source": [ - "# I highly recommend you use .unique() to find the project names.\n", - "# Often there are trailing white spaces that are naked to our human eyes." + "m2.loc[m2._merge.isin([\"left_only\",\"right_only\"])].project_name.unique()" + ] + }, + { + "cell_type": "markdown", + "id": "21f38614-3b49-45fd-97f6-7161a59ab367", + "metadata": {}, + "source": [ + "* Step 2: Decide whether you want to rename the values in the left dataframe or the right one. \n", + "* Step 3: The keys, are the values you want to replace. The values, are what you want to replace these values with. " ] }, { @@ -261,6 +342,14 @@ "}" ] }, + { + "cell_type": "markdown", + "id": "abe24864-66bd-4ce4-bb46-38a13c8bb64a", + "metadata": {}, + "source": [ + "* Step 4: Use your dictionary in `.replace()` to recode the values." + ] + }, { "cell_type": "code", "execution_count": null, @@ -276,9 +365,7 @@ "id": "68562b10-b9bd-4892-8780-a66cad1a06d4", "metadata": {}, "source": [ - "* Merge your dataframes again. This time it should work.\n", - "* Please also specify the merge type and the columns. \n", - "* Although Pandas does this automatically, it's good practice to write everything out.\n" + "#### Merge your dataframes again. This time it should work.\n" ] }, { @@ -291,6 +378,34 @@ "final_m = pd.merge(projects_df, overall_scores_df, how=\"inner\", on=\"project_name\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "04f4f6d8-55b6-460c-8a52-8626dcfd1cb9", + "metadata": {}, + "outputs": [], + "source": [ + "final_m.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39d74f54-a72b-4acc-91b0-b3dcb4539a92", + "metadata": {}, + "outputs": [], + "source": [ + "final_m.head(1)" + ] + }, + { + "cell_type": "markdown", + "id": "3965dc2d-9603-4a95-a1fd-ef0b7a80eaaa", + "metadata": {}, + "source": [ + "* Save this dataframe as a parquet to GCS under a new name" + ] + }, { "cell_type": "code", "execution_count": null, @@ -298,19 +413,25 @@ "metadata": {}, "outputs": [], "source": [ - "# Save this dataframe as a parquet to GCS\n", - "final_m.to_parquet(f\"{GCS_FILE_PATH}starter_kit_merge.parquet\")" + "\n", + "final_m.to_parquet(f\"{GCS_FILE_PATH}starter_kit_example_merge.parquet\")" ] }, { "cell_type": "markdown", - "id": "1c2d76d1-37eb-405a-8834-23137a03e411", + "id": "8bf3c941-3f75-4a09-af3b-ded004a65cab", "metadata": {}, "source": [ "## Groupby\n", "* You're done merging...Oh wait, that wasn't even part of your manager's request. You still need to aggregate. \n", + "* The refresh your memory: by Caltrans District to find\n", + " * Median overall score\n", + " * Max overall score \n", + " * Min overall score\n", + " * Number of unique projects\n", "* There are many options Some are `groupby / agg`, `pivot_table`, `groupby / transform`\n", - "* Hint: rename these columns to be descriptive because we are no longer looking at the `overall_scores`" + "* Resources:[DDS Docs](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#aggregating)\n", + " * Use the space below and explore these tutorials. Then, apply your new knowledge to the prompt above." ] }, { @@ -417,8 +538,6 @@ " * `source` is the dataframe you want to use for your chart.\n", " * `x` denotes the column you are plotting on the X-axis. Make sure your column name has quotation marks around it. \n", " * `y` denotes the column you are plotting on the Y-axis. \n", - "* If you want a line chart, simply swap out `.mark_bar()` for `.mark_line`\n", - " * `alt.Chart(source).mark_line().encode(x='x',y='f(x)')`\n", "* Make your first chart below." ] }, @@ -439,26 +558,41 @@ "source": [ "#### Customizing\n", "* `altair` offers an endless ways to amp up the personality of your chart.\n", - "* Additionally, the chart above without a title and legend is a data visualization \"taboo\" and the dull Facebook blue is uninspiring. " + "* Additionally, the chart above without a title and legend is a data visualization \"taboo\" and the dull blue is uninspiring. \n", + "\n", + "##### Add a title\n", + "* You can do so within `.Chart()`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88e1dff9-0188-49c9-b6cc-599610aca9a7", + "metadata": {}, + "outputs": [], + "source": [ + "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", + " x=\"ct_district\", y=\"n_projects\"\n", + ")" ] }, { "cell_type": "markdown", - "id": "7a86074c-081c-47d5-862c-5cd5af83b124", + "id": "03fa6313-cbf7-4c3a-af76-8012b0a927ef", "metadata": {}, "source": [ - "#### Add a title\n", - "* You can do so within `.Chart()`" + "### Different Charts\n", + "* If you want something that isn't a bar chart, simply swap out `.mark_bar()` for `.mark_line` or `mark_circle`.\n" ] }, { "cell_type": "code", "execution_count": null, - "id": "88e1dff9-0188-49c9-b6cc-599610aca9a7", + "id": "d43cae4f-1faf-48fb-8c21-559feb5243b1", "metadata": {}, "outputs": [], "source": [ - "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", + "alt.Chart(agg1, title=\"your_title_here\").mark_circle().encode(\n", " x=\"ct_district\", y=\"n_projects\"\n", ")" ] @@ -468,8 +602,8 @@ "id": "1d7073ac-6528-4999-9c9c-94c8147c0ac6", "metadata": {}, "source": [ - "#### Add some color\n", - "* Explain our calitp_color_palette." + "#### Add some color/DDS's Python Library\n", + "* We have some default color palettes that are already in our [internal library of functions](https://docs.calitp.org/data-infra/analytics_tools/python_libraries.html#calitp-data-analysis)." ] }, { @@ -479,9 +613,19 @@ "metadata": {}, "outputs": [], "source": [ + "# Import the color palettes like so \n", "from calitp_data_analysis import calitp_color_palette" ] }, + { + "cell_type": "markdown", + "id": "102dac58-605a-4bfb-88f8-b9a11ea86b83", + "metadata": {}, + "source": [ + "* To see what is inside a module, put two question marks behind it.\n", + "* From here, you can choose another color palette." + ] + }, { "cell_type": "code", "execution_count": null, @@ -492,9 +636,7 @@ }, "outputs": [], "source": [ - "# To see what is inside a module, just put two question marks\n", - "# From here, you can choose another color palette\n", - "# calitp_color_palette??" + "calitp_color_palette??" ] }, { @@ -511,8 +653,8 @@ " \"n_projects\", # This is the column you want the color of your bar to be based on\n", " title=\"legend_title_here\", # This is the legend of your title\n", " scale=alt.Scale(\n", - " range=calitp_color_palette.CALITP_DIVERGING_COLORS\n", - " ), # This is where you can customize the colors,\n", + " range=calitp_color_palette.CALITP_DIVERGING_COLORS # This is where you can customize the colors,\n", + " ), \n", " ),\n", ")" ] @@ -523,42 +665,9 @@ "metadata": {}, "source": [ "#### Adjusting the Axis\n", - "* Axis domain\n", - "* Axis values:\n", - " * Caltrans districts are integers or strings? " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "868bdb20-e960-4161-8fba-8b0d9a7ba2f4", - "metadata": {}, - "outputs": [], - "source": [ - "ct_districts = {\n", - " 1: \"D1\",\n", - " 2: \"D2\",\n", - " 3: \"D3\",\n", - " 4: \"D4\",\n", - " 5: \"D5\",\n", - " 6: \"D6\",\n", - " 7: \"D7\",\n", - " 8: \"D8\",\n", - " 9: \"D9\",\n", - " 10: \"D10\",\n", - " 11: \"D11\",\n", - " 12: \"D12\",\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "51f2289c-0fcb-4b3e-b1c1-cfa2315d6c35", - "metadata": {}, - "outputs": [], - "source": [ - "agg1[\"ct_district\"] = agg1[\"ct_district\"].replace(ct_districts)" + "* Sometimes, we want to adjust the axis to have a min and max value.\n", + "* You do so using the `scale=alt.Scale(domain=[min_value, max_value]))` argument behind the X and Y axis.\n", + "* `alt.X()` and `alt.Y` gives you many more customization options." ] }, { @@ -569,8 +678,8 @@ "outputs": [], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", - " x=alt.X(\"ct_district\"),\n", - " y=alt.Y(\"n_projects\", scale=alt.Scale(domain=[0, 5])),\n", + " x=alt.X(\"ct_district\", scale=alt.Scale(domain=[1, 12])),\n", + " y=alt.Y(\"n_projects\", scale=alt.Scale(domain=[0, 10])),\n", " color=alt.Color(\n", " \"n_projects\",\n", " title=\"legend_title_here\",\n", @@ -585,27 +694,27 @@ "metadata": {}, "source": [ "### Finishing Touches \n", - "* Sizing\n", - "* Tooltip\n", - "* Saving to a png" + "* `.properties(width=400, height=250)` adjusts the size of your chart. \n", + "* `tooltip=[columns you want]` gives you additional details on the columns you specify when you hover over each bar/circle/etc.\n", + "* `.mark_bar(size=30)` adjusts the size of the bar/circle/etc." ] }, { "cell_type": "code", "execution_count": null, - "id": "94e4c5a4-23a8-4cea-96cf-fd52c57895f2", + "id": "8b85dd29-88cb-4b4b-b3b7-20ee1851335e", "metadata": {}, "outputs": [], "source": [ - "alt.Chart(agg1, title=\"your_title_here\").mark_bar(size=20).encode(\n", - " x=alt.X(\"ct_district\"),\n", - " y=alt.Y(\"n_projects\", scale=alt.Scale(domain=[0, 5])),\n", + "alt.Chart(agg1, title=\"your_title_here\").mark_bar(size = 10).encode(\n", + " x=alt.X(\"ct_district\", scale=alt.Scale(domain=[1, 12])),\n", + " y=alt.Y(\"n_projects\", scale=alt.Scale(domain=[0, 10])),\n", " color=alt.Color(\n", " \"n_projects\",\n", " title=\"legend_title_here\",\n", " scale=alt.Scale(range=calitp_color_palette.CALITP_DIVERGING_COLORS),\n", " ),\n", - " tooltip=list(agg1.columns),\n", + " tooltip=[\"ct_district\", \"n_projects\"]\n", ").properties(width=400, height=250)" ] }, @@ -616,7 +725,7 @@ "source": [ "### We have only visualized one column of data. \n", "* We have only visualized one column of data, but we have a couple of columns above. \n", - "* Make a few other charts in different styles. Altair's [gallery](https://altair-viz.github.io/gallery/index.html) is a great resource to kick off your chart-making career. " + "* Make a few other charts in different styles. Altair's [gallery](https://altair-viz.github.io/gallery/index.html) is a great resource for inspiration." ] } ], diff --git a/starter_kit/2024_basics_03.ipynb b/starter_kit/2024_basics_03.ipynb new file mode 100644 index 000000000..9329e4625 --- /dev/null +++ b/starter_kit/2024_basics_03.ipynb @@ -0,0 +1,1772 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3f74a524-f90a-4ad5-8d98-368afc398b46", + "metadata": {}, + "source": [ + "# Exercise 3: Strings, Functions, If Else, For Loops" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "ba8a0d90-9d57-4d01-9eb4-0b255970995e", + "metadata": {}, + "outputs": [], + "source": [ + "import altair as alt\n", + "import numpy as np\n", + "import pandas as pd\n", + "from calitp_data_analysis import calitp_color_palette" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ddcdbbc1-2e1b-4797-bd34-07d9a1999cb6", + "metadata": {}, + "outputs": [], + "source": [ + "pd.options.display.max_columns = 100\n", + "pd.options.display.float_format = \"{:.2f}\".format\n", + "pd.set_option(\"display.max_rows\", None)\n", + "pd.set_option(\"display.max_colwidth\", None)" + ] + }, + { + "cell_type": "markdown", + "id": "8eec9257-7578-422c-b6d1-afe496e8ca70", + "metadata": {}, + "source": [ + "* Using a f-strings, load in your merged dataframe from Exercise 3." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7c52b09e-90b5-4a5d-8fda-ca19cb8fe3cd", + "metadata": {}, + "outputs": [], + "source": [ + "GCS_FILE_PATH = \"gs://calitp-analytics-data/data-analyses/starter_kit/\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e0222b8c-0996-47bb-8639-fc703cfbd249", + "metadata": {}, + "outputs": [], + "source": [ + "FILE = \"starter_kit_example_merge.parquet\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "36bbc1d2-4285-4399-a0fd-1e02c5e5d5a1", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_parquet(f\"{GCS_FILE_PATH}{FILE}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "c97f0ec6-bea0-401a-bb27-f37984a762eb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_nameScope of WorkProject Costaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_score
02Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.626552518931038221042466
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 2 Meadow Magic Multi-Use Path \n", + "\n", + " Scope of Work \\\n", + "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "\n", + " Project Cost accessibility_score dac_accessibility_score \\\n", + "0 6265525 1 8 \n", + "\n", + " dac_traffic_impacts_score freight_efficiency_score \\\n", + "0 9 3 \n", + "\n", + " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", + "0 10 3 8 \n", + "\n", + " safety_score vmt_score zev_score public_engagement_score \\\n", + "0 2 2 10 4 \n", + "\n", + " climate_resilience_score program_fit_score overall_score \n", + "0 2 4 66 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head(1)" + ] + }, + { + "cell_type": "markdown", + "id": "673fa239-dc06-4ef8-9513-ee167e80898e", + "metadata": {}, + "source": [ + "## Categorizing\n", + "* There are 30 projects. They all vary in themes, some are transit oriented while others are focused on Active Transportation (ATP).\n", + "* Categorizing data is an important part of data cleaning and analyzing so we can present the data in a more succint and insightful way. \n", + "* Let's organize projects into three categories.\n", + " * ATP\n", + " * Transit\n", + " * General Lanes" + ] + }, + { + "cell_type": "markdown", + "id": "49486dc6-a686-47fa-8cef-e252d7ec349d", + "metadata": {}, + "source": [ + "### Task 1: Strings\n", + "* Below are some of the common keywords that fall into the categories detailed above. They are held in a `list`.\n", + "* Feel free to add other terms you think are relevant. \n", + "* We are going to search the `Scope of Work` column for these keywords. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6a6b817f-15e2-4d1c-aeae-5d7e9661a6f0", + "metadata": {}, + "outputs": [], + "source": [ + "transit = [\"transit\", \"passenger rail\", \"bus\", \"ferry\"]\n", + "atp = [\"bike\", \"pedestrian\", \"bicycle\", \"sidewalk\", \"path\"]\n", + "general_lanes = [\"general\", \"auxiliary\"]" + ] + }, + { + "cell_type": "markdown", + "id": "6caf3a84-fcd7-4531-befe-11e76c01c8f1", + "metadata": {}, + "source": [ + "#### Step 1: Cleaning\n", + "* Remember in Exercise 2 some of the project names didn't merge between the two dataframes?\n", + "* In the real world, a lot of string data can be spelled in different ways, different cases, abbreviated, and the like.\n", + "* The easiest way to clean this up is by lowercasing, stripping the white spaces, and replacing characters.\n", + "* Also, by simplifying a string column, we can search through it easier. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ea4a4df7-61ec-430b-a827-302704857318", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_359/3727765838.py:2: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.\n", + " df[\"Scope of Work\"]\n" + ] + } + ], + "source": [ + "df[\"Scope of Work\"] = (\n", + " df[\"Scope of Work\"]\n", + " .str.lower()\n", + " .str.strip()\n", + " .str.replace(\"-\", \" \")\n", + " .str.replace(\"+\", \" \")\n", + " .str.replace(\"_\", \" \")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c3da188c-2afe-49f4-bbbd-8fecd8dfe10f", + "metadata": {}, + "source": [ + "* `str.contains()` allows you to search through the column. \n", + "* Let's search for projects that have \"transit\" in their descriptions. \n", + "* Tip\n", + " * The data we work with tends to be pretty wide. Scrolling horizontally gets tiresome.\n", + " * Placing all the columns you want to temporarily work within a `list` like `preview_subset` below is a good idea. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "315228d8-a72e-4f18-a0e7-2a254c87cc23", + "metadata": {}, + "outputs": [], + "source": [ + "preview_subset = [\"project_name\", \"Scope of Work\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "be843d6a-b751-4e9f-8820-b521089914d3", + "metadata": {}, + "outputs": [], + "source": [ + "transit_only_projects = df.loc[df[\"Scope of Work\"].str.contains(\"transit\")]" + ] + }, + { + "cell_type": "markdown", + "id": "ec68f286-cdeb-4b7b-86ef-6d35c8ee9587", + "metadata": {}, + "source": [ + "* Let's see how many transit projects are in this dataset.\n", + "* Let's read through the Scope of Work to make sure it's what we expect." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0d9a6259-8748-41fe-a549-01bdf0e9c273", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "7" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(transit_only_projects)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "6789307c-5808-4501-a1a6-5a14a12b0219", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_nameScope of Work
11Greenway Gables Managed Lanesmanaged lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices.
16Sparkle City Smart Streets Initiativean intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion.
19Rolling Renaissance Rabbit Expressnew, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities.
20Transit Treasure Transit Oasistransit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility.
25Trail of Treats and Transit Huba multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations.
27Park and Ride Petal Paradisean attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options.
43Brookside Bus Blossom Laneprioritize public transportation and enhance air quality by dedicating lanes to buses and hovs on brookside boulevard, integrating smart traffic signals and real time transit information inspired by the ancient elves.
\n", + "
" + ], + "text/plain": [ + " project_name \\\n", + "11 Greenway Gables Managed Lanes \n", + "16 Sparkle City Smart Streets Initiative \n", + "19 Rolling Renaissance Rabbit Express \n", + "20 Transit Treasure Transit Oasis \n", + "25 Trail of Treats and Transit Hub \n", + "27 Park and Ride Petal Paradise \n", + "43 Brookside Bus Blossom Lane \n", + "\n", + " Scope of Work \n", + "11 managed lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices. \n", + "16 an intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion. \n", + "19 new, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities. \n", + "20 transit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility. \n", + "25 a multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations. \n", + "27 an attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options. \n", + "43 prioritize public transportation and enhance air quality by dedicating lanes to buses and hovs on brookside boulevard, integrating smart traffic signals and real time transit information inspired by the ancient elves. " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "transit_only_projects[preview_subset]" + ] + }, + { + "cell_type": "markdown", + "id": "d3adfb74-5a24-47f8-88da-92fe5591821a", + "metadata": {}, + "source": [ + "#### Step 2: Filtering\n", + "* We've found all the projects that says \"transit\" somewhere in its description. \n", + "* Now there are just many more elements to go. We forgot about bikes, bus, rail..\n", + "* However, the method we used above leaves us with multiple dataframes. We actually just want our one original dataframe tagged with categories. \n", + "* A faster way: join all the keywords you want.\n", + "* | designates \"or\".\n", + "* You can read this as \"I want projects that contain the word bus, transit, or rail...\"" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c2575f75-44ac-46ba-a334-fdf984546cd3", + "metadata": {}, + "outputs": [], + "source": [ + "transit_keywords = f\"({'|'.join(transit)})\"" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "f6a2a521-c0ae-4c2d-830d-4020a13855f2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'(transit|passenger rail|bus|ferry)'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Print it out\n", + "transit_keywords" + ] + }, + { + "cell_type": "markdown", + "id": "937913db-407e-415c-aabb-31d3f511ef0b", + "metadata": {}, + "source": [ + "* Filter again - notice the .loc after df and how there are brackets around `df`?\n", + "* How many more projects appear when we filter for 3 additional transit related keywords, compared to only transit?" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "e5e23b6f-98b8-4219-bc52-d847ea39d121", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_359/2441750228.py:1: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)][preview_subset]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_nameScope of Work
11Greenway Gables Managed Lanesmanaged lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices.
16Sparkle City Smart Streets Initiativean intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion.
18Coastal Commuter Carousela 30 mile passenger rail line connecting coastal towns, featuring modern train sets, enhanced station amenities, and scenic viewing cars.
19Rolling Renaissance Rabbit Expressnew, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities.
20Transit Treasure Transit Oasistransit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility.
21Berry Best Bus Rapid Transitdedicated bus lanes with comfortable stops, featuring off board fare payment, priority traffic signals, and enhanced passenger amenities.
25Trail of Treats and Transit Huba multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations.
27Park and Ride Petal Paradisean attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options.
43Brookside Bus Blossom Laneprioritize public transportation and enhance air quality by dedicating lanes to buses and hovs on brookside boulevard, integrating smart traffic signals and real time transit information inspired by the ancient elves.
\n", + "
" + ], + "text/plain": [ + " project_name \\\n", + "11 Greenway Gables Managed Lanes \n", + "16 Sparkle City Smart Streets Initiative \n", + "18 Coastal Commuter Carousel \n", + "19 Rolling Renaissance Rabbit Express \n", + "20 Transit Treasure Transit Oasis \n", + "21 Berry Best Bus Rapid Transit \n", + "25 Trail of Treats and Transit Hub \n", + "27 Park and Ride Petal Paradise \n", + "43 Brookside Bus Blossom Lane \n", + "\n", + " Scope of Work \n", + "11 managed lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices. \n", + "16 an intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion. \n", + "18 a 30 mile passenger rail line connecting coastal towns, featuring modern train sets, enhanced station amenities, and scenic viewing cars. \n", + "19 new, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities. \n", + "20 transit supportive features, including shelters, wi fi, and real time information displays, prioritizing passenger convenience and accessibility. \n", + "21 dedicated bus lanes with comfortable stops, featuring off board fare payment, priority traffic signals, and enhanced passenger amenities. \n", + "25 a multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations. \n", + "27 an attractive park and ride facility with amenities like ev charging, wi fi, and convenient access to nearby transit options. \n", + "43 prioritize public transportation and enhance air quality by dedicating lanes to buses and hovs on brookside boulevard, integrating smart traffic signals and real time transit information inspired by the ancient elves. " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)][preview_subset]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "7b62f28d-7b28-4258-8efa-74d1f9a41d04", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7\n", + "9\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_359/1261237332.py:3: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " print(len(df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)]))\n" + ] + } + ], + "source": [ + "print(len(transit_only_projects))\n", + "print(len(df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)]))" + ] + }, + { + "cell_type": "markdown", + "id": "7c6717f8-4088-4c1f-9ec6-b9959fd6d283", + "metadata": {}, + "source": [ + "\n", + "* Let's put this all together. \n", + "* I want any project that contains a transit component to be tagged as \"Y\" in a column called \"Transit\". If a project doesn't have a transit component, it gets tagged as a \"N\"." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "47afb269-672f-44c1-8ab5-d70921c6e703", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_359/1837788452.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " (df[\"Scope of Work\"].str.contains(transit_keywords)),\n" + ] + } + ], + "source": [ + "df[\"Transit\"] = np.where(\n", + " (df[\"Scope of Work\"].str.contains(transit_keywords)),\n", + " \"Y\",\n", + " \"N\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "dfe862f0-f77e-4bf5-8710-888d3a8d7a4c", + "metadata": {}, + "source": [ + "* Using `value_counts()` we can see the breakdown of transit related projects." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "c63f2ff8-3d2f-41c6-96d1-36d35159aef8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "N 35\n", + "Y 9\n", + "Name: Transit, dtype: int64" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.Transit.value_counts()" + ] + }, + { + "cell_type": "markdown", + "id": "651cf0bd-3bb1-44a7-a436-8f9b4d90a488", + "metadata": { + "tags": [] + }, + "source": [ + "### Task 2: Functions \n", + "* It looks only the 9 transit projects were categorized.\n", + "* We are missing the 2 categories: ATP and General Lane related projects.\n", + "* We could repeat the steps above or we can use a function.\n", + " * You can think of a function as a piece of code you write only once but reuse more than once.\n", + " * In the long run, functions save you work and look neater when you present your work.\n", + "* Resources: Functions are incredibly important. Please spend more time than usual on this section and practice the tutorials linked.\n", + " * [Please read this great tutorial.](https://www.practicalpythonfordatascience.com/00_python_crash_course_functions)\n", + " * [And refer to this page on our docs.](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00ead246-8879-4075-a632-d0ded58df558", + "metadata": {}, + "outputs": [], + "source": [ + "# Practice here" + ] + }, + { + "cell_type": "markdown", + "id": "463e13cf-7ba1-4499-bcd0-465a6457f856", + "metadata": { + "tags": [] + }, + "source": [ + "#### Let's build a function together.\n", + "* This will be repetitive after the tutorials, but you will use functions all the time at DDS and it's one of the most critical concepts to grasp.\n", + "* Start your function with `def():`` and the name you'd like." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97e597a2-8625-4f2b-8646-760c0c011208", + "metadata": {}, + "outputs": [], + "source": [ + "# def categorize():" + ] + }, + { + "cell_type": "markdown", + "id": "06ccd282-cf21-462b-8930-9a3148671ff1", + "metadata": {}, + "source": [ + "* Now let's think of what are the two elements that we will repeat.\n", + "* We merely want to substitute `transit_keywords` with ATP or General Lane related keywords.\n", + "* Instead of the `df[\"Transit]\"`, we want to create two new columns called something like `df[\"ATP]\"` and `df[\"General_Lanes]\"` to hold our yes/no results.\n", + "* Add the two elements that need to be substituted into the argument of your function.\n", + " * It's good practice to specify what exactly the parameter should be: a string/list/dataframe. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61973dc6-d99b-48f0-842f-a3c8fe74f064", + "metadata": {}, + "outputs": [], + "source": [ + "# def categorize(df:pd.DataFrame, keywords:list, new_column:str):" + ] + }, + { + "cell_type": "markdown", + "id": "ae178f6d-0f76-419c-aab2-9924ba294605", + "metadata": {}, + "source": [ + "* It's also a nice idea to document what your function will return.\n", + "* In our case, it's a Pandas dataframe. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a794693a-3bf2-48ba-b0a7-1ca3a41e03af", + "metadata": {}, + "outputs": [], + "source": [ + "# def categorize(df:pd.DataFrame, keywords:list, new_column:str)->pd.DataFrame:" + ] + }, + { + "cell_type": "markdown", + "id": "be820c1a-a0d2-4b2f-bf01-70e753603291", + "metadata": {}, + "source": [ + "* Think about the steps we took to categorize transit only.\n", + "* Add the sections of the code we will be reusing and sub in the original variables for the arguments.\n", + " * First, we joined the keywords from a list into a tuple.\n", + " * Second, we searched through the Scope of Work column for the keywords.\n", + " * Third, if we find the keyword, we will tag the project as \"Y\" in the column \"new_column\". If the keyword isn't found, the project is tagged as \"N\"." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "4721b564-726a-4e05-9d27-8035609b5fcf", + "metadata": {}, + "outputs": [], + "source": [ + "def categorize(df: pd.DataFrame, keywords: list, new_column: str) -> pd.DataFrame:\n", + " joined_keywords = f\"({'|'.join(keywords)})\" # Remember this used to be the list called transit_keywords, but it must be changed into a tuple.\n", + "\n", + " # We are now creating a new column: notice how parameters has no quotation marks.\n", + " df[new_column] = np.where(\n", + " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n", + " \"Y\",\n", + " \"N\",\n", + " )\n", + "\n", + " # We are returning the updated dataframe from this function\n", + " return df" + ] + }, + { + "cell_type": "markdown", + "id": "81bbb109-beef-452c-b8d9-eb13e7b9ee03", + "metadata": {}, + "source": [ + "* Now let's use your function" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "23e31c98-17b3-41e2-883a-14dae9d6da7e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_359/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + ] + } + ], + "source": [ + "df = categorize(df, atp, \"ATP\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "d5ec64cf-432c-45e2-b14d-f4ea7ca3de2a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "N 30\n", + "Y 14\n", + "Name: ATP, dtype: int64" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.ATP.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "882a02a6-ce39-4da2-b2be-7e91322624e4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_359/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + ] + } + ], + "source": [ + "df = categorize(df, transit, \"Transit\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "ee56ee97-307c-44a4-a2d4-b02eff954f87", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_359/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + ] + } + ], + "source": [ + "df = categorize(df, general_lanes, \"General_Lanes\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "96f2efba-4179-4a8c-b969-fd2990f8a129", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "N 40\n", + "Y 4\n", + "Name: General_Lanes, dtype: int64" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.General_Lanes.value_counts()" + ] + }, + { + "cell_type": "markdown", + "id": "405aac8e-4488-47fa-bbb1-a12121ed8d15", + "metadata": {}, + "source": [ + "* Use the `groupby` technique from Exercise 2 to get some descriptive statistics for these 3 new columns\n", + "* Use `.reset_index()` after `aggregate()` to see what happens." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "62115dcb-ea34-4bb1-9bd1-e678ec015b8c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
General_LanesTransitATPproject_nameoverall_score
0NNN2073.00
1NNY1175.00
2NYN878.00
3NYY183.00
4YNN265.50
5YNY288.00
\n", + "
" + ], + "text/plain": [ + " General_Lanes Transit ATP project_name overall_score\n", + "0 N N N 20 73.00\n", + "1 N N Y 11 75.00\n", + "2 N Y N 8 78.00\n", + "3 N Y Y 1 83.00\n", + "4 Y N N 2 65.50\n", + "5 Y N Y 2 88.00" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.groupby([\"General_Lanes\", \"Transit\", \"ATP\"]).aggregate(\n", + " {\"project_name\": \"nunique\", \"overall_score\": \"median\"}\n", + ").reset_index()" + ] + }, + { + "cell_type": "markdown", + "id": "54c05583-16c9-4a3a-9dc0-36b4a709faee", + "metadata": {}, + "source": [ + "## Function + If-Else\n", + "* Above, we can see all types of combinations of categories a project can fall into. \n", + "* Let's do away with these \"Y\" and \"N\" columns and create actual categories in an actual column called `categories`.\n", + "* If a project has \"N\" for all 3 of the General Lane, Transit, and ATP columns, it should be `Other`. \n", + "* If a project has \"Y\" for all 3, it should be categorized as \"General Lane, Transit, and ATP\".\n", + "* If a project has \"Y\" for only ATP and Transit, it should be categorized as \"Transit and ATP\".\n", + "* Yes this will be very tedious given all the combinations!\n", + "* To write the function to create these categories, read these resources:\n", + " * [DDS Apply Docs](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)\n", + " * [DDS If-Else Tutorial](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#if-else-statements)\n", + " * [Geeks for Geeks: if-else with multiple conditions](https://www.geeksforgeeks.org/check-multiple-conditions-in-if-statement-python/)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "d560dad0-de03-4469-99f8-5fadd9b198dc", + "metadata": {}, + "outputs": [], + "source": [ + "def categorize(row):\n", + " if (row.General_Lanes == \"N\") & (row.Transit == \"N\") & (row.ATP == \"N\"):\n", + " return \"Other\"\n", + " elif (row.General_Lanes == \"N\") & (row.Transit == \"N\") & (row.ATP == \"Y\"):\n", + " return \"ATP\"\n", + " elif (row.General_Lanes == \"N\") & (row.Transit == \"Y\") & (row.ATP == \"N\"):\n", + " return \"Transit\"\n", + " elif (row.General_Lanes == \"N\") & (row.Transit == \"Y\") & (row.ATP == \"Y\"):\n", + " return \"Transit and ATP\"\n", + " elif (row.General_Lanes == \"Y\") & (row.Transit == \"N\") & (row.ATP == \"N\"):\n", + " return \"General Lanes\"\n", + " elif (row.General_Lanes == \"Y\") & (row.Transit == \"N\") & (row.ATP == \"Y\"):\n", + " return \"General Lanes and ATP\"\n", + " else:\n", + " return \"Transit, General Lanes, and ATP\"" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "f8b7d946-c724-43cb-9a93-d1003f7f024f", + "metadata": {}, + "outputs": [], + "source": [ + "# Apply your function\n", + "df[\"category\"] = df.apply(categorize, axis=1)" + ] + }, + { + "cell_type": "markdown", + "id": "df815f56-c2ed-43ff-9180-147beddcffe0", + "metadata": {}, + "source": [ + "### Please export your output as a `.parquet` to GCS before moving onto the next step" + ] + }, + { + "cell_type": "markdown", + "id": "14ba020e-e2b3-4447-89e2-abdc0579fc6b", + "metadata": {}, + "source": [ + "## For Loops \n", + "* For Loops are one of the greatest gifts of Python. \n", + "* Below is a simple for loop that prints out all the numbers in range of 10.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "48495a9f-e29c-41eb-b3e7-de6371fbd182", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n" + ] + } + ], + "source": [ + "for i in range(10):\n", + " print(i)" + ] + }, + { + "cell_type": "markdown", + "id": "a8cdfc33-359c-4687-be4a-7f758c028640", + "metadata": {}, + "source": [ + "* Here, I'm looping over a couple of columns in my dataframe and printing some descriptive statistics about it.\n", + "* Notice how I have to use `print` and `display` to show the results.\n", + " * Try this same block of code without `print` and `display` to see the difference." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "fca9e430-a906-4d0e-8046-36a0687b0636", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Statistics for zev_score\n" + ] + }, + { + "data": { + "text/plain": [ + "count 44.00\n", + "mean 4.98\n", + "std 2.96\n", + "min 1.00\n", + "25% 3.00\n", + "50% 4.00\n", + "75% 7.25\n", + "max 10.00\n", + "Name: zev_score, dtype: float64" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Statistics for vmt_score\n" + ] + }, + { + "data": { + "text/plain": [ + "count 44.00\n", + "mean 5.66\n", + "std 3.04\n", + "min 1.00\n", + "25% 2.75\n", + "50% 6.00\n", + "75% 8.00\n", + "max 10.00\n", + "Name: vmt_score, dtype: float64" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Statistics for accessibility_score\n" + ] + }, + { + "data": { + "text/plain": [ + "count 44.00\n", + "mean 5.39\n", + "std 3.14\n", + "min 1.00\n", + "25% 2.75\n", + "50% 5.00\n", + "75% 8.00\n", + "max 10.00\n", + "Name: accessibility_score, dtype: float64" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for column in [\"zev_score\", \"vmt_score\", \"accessibility_score\"]:\n", + " print(f\"Statistics for {column}\")\n", + " display(df[column].describe())" + ] + }, + { + "cell_type": "markdown", + "id": "ded54884-4bad-46ae-a82f-2a67936c57dd", + "metadata": {}, + "source": [ + "#### Using a For Loop\n", + "* Below, I have already aggregated the dataframe for you." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "5b414d3f-71a4-4078-9d98-b9082114e2c5", + "metadata": {}, + "outputs": [], + "source": [ + "agg1 = (\n", + " df.groupby([\"category\"])\n", + " .aggregate(\n", + " {\"overall_score\": \"median\", \"Project Cost\": \"median\", \"project_name\": \"nunique\"}\n", + " )\n", + " .reset_index()\n", + " .rename(\n", + " columns={\n", + " \"overall_score\": \"median_score\",\n", + " \"Project Cost\": \"median_project_cost\",\n", + " \"project_name\": \"total_projects\",\n", + " }\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "1698fe9c-6d1f-412b-a632-826aae1ffc65", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorymedian_scoremedian_project_costtotal_projects
0ATP75.006238994.0011
1General Lanes65.504172279.002
2General Lanes and ATP88.008663951.002
3Other73.005232062.0020
4Transit78.003510634.008
5Transit and ATP83.007285919.001
\n", + "
" + ], + "text/plain": [ + " category median_score median_project_cost total_projects\n", + "0 ATP 75.00 6238994.00 11\n", + "1 General Lanes 65.50 4172279.00 2\n", + "2 General Lanes and ATP 88.00 8663951.00 2\n", + "3 Other 73.00 5232062.00 20\n", + "4 Transit 78.00 3510634.00 8\n", + "5 Transit and ATP 83.00 7285919.00 1" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agg1" + ] + }, + { + "cell_type": "markdown", + "id": "345a87ee-0f09-43f2-ad3e-70debb7ab25c", + "metadata": {}, + "source": [ + "* I have also prepared an Altair chart function. " + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "320bd91e-b9ed-4423-80d4-c1a1aa5ba59f", + "metadata": {}, + "outputs": [], + "source": [ + "def create_chart(df: pd.DataFrame, column: str) -> alt.Chart:\n", + " title = column.replace(\"_\",\" \").title()\n", + " chart = (\n", + " alt.Chart(df, title=f\"{title} by Categories\")\n", + " .mark_bar(size=20)\n", + " .encode(\n", + " x=alt.X(column),\n", + " y=alt.Y(\"category\"),\n", + " color=alt.Color(\n", + " \"category\",\n", + " scale=alt.Scale(\n", + " range=calitp_color_palette.CALITP_CATEGORY_BRIGHT_COLORS\n", + " ),\n", + " ),\n", + " tooltip=list(df.columns),\n", + " )\n", + " .properties(width=400, height=250)\n", + " )\n", + " return chart" + ] + }, + { + "cell_type": "markdown", + "id": "a47dc93c-ab8b-4be7-a90d-3ca941e94050", + "metadata": {}, + "source": [ + "* Use the function to create a chart out of the aggregated dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "a6103703-8131-4ed8-9482-314c7895c279", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_chart(agg1, \"median_score\")" + ] + }, + { + "cell_type": "markdown", + "id": "eff3b0be-7091-4995-b2b8-63d62bf9b6c4", + "metadata": {}, + "source": [ + "* We have a couple of other columns left that still need to be visualized. \n", + "* This is the perfect case for using a for loop, since we all we want to do is replace the column above with the two remainig columns. \n", + "* Try this below! \n", + " * Hint: you'll have to wrap the function with `display()` to get your results." + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "ca8659f1-0842-4bb5-a544-9a2a5fb93c02", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for column in [\"median_score\", \"median_project_cost\", \"total_projects\"]:\n", + " display(create_chart(agg1, column))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/starter_kit/2024_basics_04.ipynb b/starter_kit/2024_basics_04.ipynb index fa91f6f66..e45194cfa 100644 --- a/starter_kit/2024_basics_04.ipynb +++ b/starter_kit/2024_basics_04.ipynb @@ -5,7 +5,433 @@ "id": "05dd29e6-ec3f-4f9d-a595-d28b578c74e3", "metadata": {}, "source": [ - "# Exercise 4: Practicing more functions and merges, Prettifying, Scripts, HTML -> PDF dynamics" + "# Exercise 4: Python Scripts, Display, Markdown, Preparing for the Portfolio\n", + "* Cleaning and analyzing data takes a lot of time, patience, and skill.\n", + "* However, presenting the data to stakeholders is also equaly important.\n", + "* At DDS, we often present our work in a Jupyter Notebook.\n", + "* This exercise will walk you through how we do so. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d4e2cdf-a5b9-4ebb-aa2f-c7abe897a683", + "metadata": {}, + "outputs": [], + "source": [ + "import _starterkit_utils\n", + "import altair as alt\n", + "import numpy as np\n", + "import pandas as pd\n", + "from calitp_data_analysis import calitp_color_palette" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0403b50-d81c-4499-9b69-e164eb38f8cd", + "metadata": {}, + "outputs": [], + "source": [ + "pd.options.display.max_columns = 100\n", + "pd.options.display.float_format = \"{:.2f}\".format\n", + "pd.set_option(\"display.max_rows\", None)\n", + "pd.set_option(\"display.max_colwidth\", None)" + ] + }, + { + "cell_type": "markdown", + "id": "20bbcce9-b48c-4ab3-ae05-7229b97c141b", + "metadata": {}, + "source": [ + "## Python Scripts\n", + "* Up until now, we have been placing all of our code in the Jupyter Notebook.\n", + "* While this is convenient, it's not the best practice. \n", + "* A notebook full of code isn't easy to digest. \n", + "* Jupyter notebooks are also very difficult for Git to version control. Everything gets jumbled. \n", + "* The best solution is to move the bulk of your code when you have reached a stopping point to a Python Script. \n", + " * Read all about the benefits of scripts [here in our DDS docs](https://docs.calitp.org/data-infra/analytics_tools/scripts.html).\n", + " * Summary points from the docs page above:\n", + " * Python scripts (.py) are plain text files. Git tracks plain text changes easily.\n", + " * Scripts are robust to scaling and reproducing work.\n", + " * Break out scripts by concepts / stages\n", + " * All functions used in scripts should have docstrings. Type hints are encouraged!\n", + "* Making Python scripts is an art and not straight forward.\n", + "* I have already populated a `.py` file called `_starterkit_utils` with some sample functions.\n", + " * I have imported my Python Script just like how I imported my other dependencies (Pandas, Altair, Numpy).\n", + " * Read about dependencies [here](https://www.practicalpythonfordatascience.com/05_data_exploration)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68d8980b-e857-491e-b03a-4648c5f4c5f3", + "metadata": {}, + "outputs": [], + "source": [ + "import _starterkit_utils" + ] + }, + { + "cell_type": "markdown", + "id": "6f37fc46-a49e-45b4-92bf-d5b3910b2325", + "metadata": {}, + "source": [ + "### Breakdown of a Script.\n", + "#### Function 1\n", + "* Following what the DDS docs says, I am creating a new function every time I am processing the data in another stage.\n", + "* I have one function that loads in my dataset.\n", + "* Take a look at the column names: they are no longer in `snakecase` because I applied a function that capitalizes it properly.\n", + "* To use a function in a Script, write `name_of_your_script.name_of_the_function(whatever arguments)`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44467ccf-599f-4662-8164-8a58fac85711", + "metadata": {}, + "outputs": [], + "source": [ + "df = _starterkit_utils.load_dataset()" + ] + }, + { + "cell_type": "markdown", + "id": "422c3b29-822b-4957-bc5a-b9d0c55fa34c", + "metadata": {}, + "source": [ + "#### Function 2:\n", + "* After loading in the dataset from GCS, I am entering my second stage of processing the data.\n", + "* I am aggregating my dataframe by Category, basically the same function in Exercise 3. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9635fe8-a6c7-4813-9f25-7ba555ce9726", + "metadata": {}, + "outputs": [], + "source": [ + "aggregated_df = _starterkit_utils.aggregate_by_category(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2bdcb3e6-2add-4af6-a20a-9072b7ba075c", + "metadata": {}, + "outputs": [], + "source": [ + "aggregated_df" + ] + }, + { + "cell_type": "markdown", + "id": "c5567fc1-0f13-4913-8744-5568d85942f7", + "metadata": {}, + "source": [ + "#### Function 3\n", + "* I want to swap my dataframe from wide to long. \n", + "* [Read about wide to long.](https://www.statology.org/long-vs-wide-data/)\n", + "* [Pandas doc on melt](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.melt.html)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82172952-3d59-436e-b08c-7096454b6e04", + "metadata": {}, + "outputs": [], + "source": [ + "df2 = _starterkit_utils.wide_to_long(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1bcac91b-b0a1-4efd-8a73-f019c376d030", + "metadata": {}, + "outputs": [], + "source": [ + "df2.head(2)" + ] + }, + { + "cell_type": "markdown", + "id": "55622831-2e94-4101-b531-611ff864a1a7", + "metadata": {}, + "source": [ + "#### Function 4\n", + "* Now that I have my aggregated data, I want to visualize my results,\n", + "* `style_df` takes my pandas dataframe and makes it look a bit sleeker." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d69a4f91-4e37-4207-93e0-2eaa18f998ff", + "metadata": {}, + "outputs": [], + "source": [ + "_starterkit_utils.style_df(aggregated_df)" + ] + }, + { + "cell_type": "markdown", + "id": "f9836712-aecb-4d5e-ae50-895fdb3d427f", + "metadata": {}, + "source": [ + "#### Function 5 \n", + "* This is function that creates a chart that shows the scores by metric for each project." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb9bee7d-62df-4a0d-8ab2-483bb0d977f2", + "metadata": {}, + "outputs": [], + "source": [ + "d2_wide_df = df2.loc[df2[\"CalTrans District\"] == 2].reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7f39ca4e-9fb9-497d-bee6-22be385a9d34", + "metadata": {}, + "outputs": [], + "source": [ + "_starterkit_utils.create_metric_chart(d2_wide_df)" + ] + }, + { + "cell_type": "markdown", + "id": "0f14c7d5-d9b7-40db-9e42-9dd1369971e2", + "metadata": {}, + "source": [ + "### Your turn\n", + "* Create your own `.py` file with your own functions. \n", + "* Make sure to separate out functions by theme:\n", + " * One function that loads the dataset and does some light cleaning.\n", + " * One (or more) functions that transform your dataframe.\n", + " * `melt()`, `.T`, `.groupby()` are just some of the many options available through `pandas`.\n", + " * One (or more) functions that visualize your dataframe.\n", + " * Could be a chart, a styled dataframe, a wordcloud. \n", + "* Other things to consider\n", + " * [CalTrans Districts are currently integers, but they have actual names that can be mapped.](https://cwwp2.dot.ca.gov/documentation/district-map-county-chart.htm) \n", + " * Are the currency columns formatted with $ and commas?\n", + " * Are all the scores formatted with the same number of decimals?\n", + " * Are the string columns formatted with the right punctuation and capitalization?\n", + "* Please note, you will be using these functions for Exercise 5. Make sure your functions are on the district grain. " + ] + }, + { + "cell_type": "markdown", + "id": "7e1ff2d3-ae53-4682-b540-cb8a3c11e076", + "metadata": {}, + "source": [ + "## Markdown/Display\n", + "* Although our code is now neatly stored in a Python script, a Jupyter Notebook on its own is a bit plain, even when we have beautiful charts. \n", + "* There are many ways to jazz it up.\n", + "* AMANDA: Link some resources." + ] + }, + { + "cell_type": "markdown", + "id": "ed396a2f-c3f1-40be-aad2-64835be8431b", + "metadata": {}, + "source": [ + "#### Images\n", + "* You can add an image in a markdown cell\n", + "``

\n", + "\n", + "* You can add an image in a code cell if you import the packages below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ec41786-491f-46ad-963e-f380d8095ade", + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import HTML, Image, Markdown, display, display_html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d0a6849-f178-46fc-919a-f45b5436c423", + "metadata": {}, + "outputs": [], + "source": [ + "display(Image(filename=\"./19319_en_1.jpg\", retina=True))" + ] + }, + { + "cell_type": "markdown", + "id": "2b26a0da-b23c-436a-b79a-9749b33ef554", + "metadata": {}, + "source": [ + "### Display\n", + "* Of course, you can write your narratives in a Markdown cell like what I'm doing right now.\n", + "* However, what do you do if you want to incorporate values from your dataframe into the narrative?\n", + "* Writing out the values isn't necessarily the best idea.If the values change, you'll have to rewrite your narrative.\n", + "* The best way is to use `display` and `markdown` like below.\n", + "* We are using District 3 as an example" + ] + }, + { + "cell_type": "markdown", + "id": "3ebd21f4-0779-48ea-9cfd-eb912d5fda96", + "metadata": {}, + "source": [ + "#### No hard coding\n", + "* Save out your desired value into a new variable if you are manipulating it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "caecab58-2d26-4604-a3f1-ab4a11400038", + "metadata": {}, + "outputs": [], + "source": [ + "d3_df = df.loc[df[\"CalTrans District\"] == 3].reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "995eb899-0397-4f60-b587-18fcf8a4cb0e", + "metadata": {}, + "outputs": [], + "source": [ + "d3_median_score = d3_df[\"Overall Score\"].median()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bc73cc66-911a-44bf-9710-920328b40609", + "metadata": {}, + "outputs": [], + "source": [ + "d3_total_projects = d3_df[\"Project Name\"].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a5dafba-c901-412c-bf53-e418dc558787", + "metadata": {}, + "outputs": [], + "source": [ + "d3_max_project = d3_df[\"Project Cost\"].max()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e183e629-7f79-45e3-810b-294851ca9abf", + "metadata": {}, + "outputs": [], + "source": [ + "d3_max_project = f\"${d3_max_project:,.2f}\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb8e4a80-2eec-4db0-b919-7c3d4486d8e0", + "metadata": {}, + "outputs": [], + "source": [ + "d3_max_project" + ] + }, + { + "cell_type": "markdown", + "id": "241607df-d133-4fb1-ac13-f1a32454b815", + "metadata": {}, + "source": [ + "\n", + "* The f string has multiple quotation marks. This allows you to write a f-string that goes over multiple lines." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d7e68ad-79dd-48b6-8e17-90496d470b69", + "metadata": {}, + "outputs": [], + "source": [ + "display(\n", + " Markdown(\n", + " f\"\"\"

District 3

\n", + " The median score for projects in District 3 is {d3_median_score}
\n", + " The total number of projects is {d3_total_projects}
\n", + " The most expensive project costs {d3_max_project}\n", + " \"\"\"\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "4aa41900-7dbf-4c61-b927-4f1e42f6b8da", + "metadata": {}, + "source": [ + "* You can code in this cell. I'm filtering out for district 3 values.\n", + "* Notice the header went from `

` to `

`. You can also swap it out for `

` and `

`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38d84ed3-9626-4f91-9aea-e2449aef4cf8", + "metadata": {}, + "outputs": [], + "source": [ + "display(\n", + " Markdown(\n", + " f\"\"\"

Metric Scores

\n", + " \"\"\"\n", + " )\n", + ")\n", + "d3_wide_df = df2.loc[df2[\"CalTrans District\"] == 3].reset_index(drop=True)\n", + "display(_starterkit_utils.create_metric_chart(d2_wide_df))" + ] + }, + { + "cell_type": "markdown", + "id": "fe45d252-1d46-4d34-98f4-7118afd96406", + "metadata": {}, + "source": [ + "### This can be a function too\n", + "* What if I wanted to generate these narratives for every district?\n", + "* I can simply turn this into a function.\n", + "* Remember to look at the code in `_starterkit_utils.py`" + ] + }, + { + "cell_type": "markdown", + "id": "674c3407-fd80-47fa-9402-d2e18419583b", + "metadata": {}, + "source": [ + "* I only want to print out a couple of districts or else this notebook will become too large" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d6f524a-d49b-4729-801f-ccc4bd800149", + "metadata": {}, + "outputs": [], + "source": [ + "for district in range(10,13):\n", + " _starterkit_utils.create_district_summary(df, district)" ] } ], diff --git a/starter_kit/_starterkit_utils.py b/starter_kit/_starterkit_utils.py new file mode 100644 index 000000000..e49304fee --- /dev/null +++ b/starter_kit/_starterkit_utils.py @@ -0,0 +1,193 @@ +import pandas as pd +import numpy as np +import altair as alt +from calitp_data_analysis import calitp_color_palette +from IPython.display import HTML, Image, Markdown, display, display_html + +def reverse_snakecase(df:pd.DataFrame)->pd.DataFrame: + """ + Clean up columns to remove underscores and spaces. + """ + df.columns = df.columns.str.replace("_", " ").str.strip().str.title() + + df.columns = (df.columns.str.replace("Dac", "DAC") + .str.replace("Vmt", "VMT") + .str.replace("Zev", "ZEV") + .str.replace("Lu", "Landuse") + .str.replace("Ct", "CalTrans") + ) + return df + +def load_dataset()->pd.DataFrame: + """ + Load the final dataframe. + """ + GCS_FILE_PATH = "gs://calitp-analytics-data/data-analyses/starter_kit/" + FILE = "starter_kit_example_categorized.parquet" + + # Read dataframe in + df = pd.read_parquet(f"{GCS_FILE_PATH}{FILE}") + + # Titlecase the Scope of Work column again since it is all lowercase + df["Scope of Work"] = df["Scope of Work"].str.title() + + # Clean up the column names + df = reverse_snakecase(df) + return df + +def aggregate_by_category(df: pd.DataFrame) -> pd.DataFrame: + """ + Find the median overall score and project cost + and total unique projects by category. + """ + agg1 = ( + df.groupby(["Category"]) + .aggregate( + { + "Overall Score": "median", + "Project Cost": "median", + "Project Name": "nunique", + } + ) + .reset_index() + .rename( + columns={ + "Overall Score": "Median Score", + "Project Cost": "Median Project Cost", + "Project Name": "Total Projects", + } + ) + ) + + # Format the Cost column properly + agg1['Median Project Cost'] = agg1['Median Project Cost'].apply(lambda x: '${:,.0f}'.format(x)) + + return agg1 + +def wide_to_long(df:pd.DataFrame)->pd.DataFrame: + """ + Change the dataframe from wide to long based on the project name and + Caltrans District. + """ + df2 = pd.melt( + df, + id_vars=["CalTrans District","Project Name"], + value_vars=[ + "Accessibility Score", + "DAC Accessibility Score", + "DAC Traffic Impacts Score", + "Freight Efficiency Score", + "Freight Sustainability Score", + "Mode Shift Score", + "Landuse Natural Resources Score", + "Safety Score", + "VMT Score", + "ZEV Score", + "Public Engagement Score", + "Climate Resilience Score", + "Program Fit Score", + ]) + + df2 = df2.rename(columns = {'variable':'Metric', + 'value':'Score'}) + return df2 + +def style_df(df: pd.DataFrame): + """ + Styles a dataframe and displays it. + """ + display( + df.style.hide(axis="index") + .format(precision=0) # Display only 2 decimal points + .set_properties(**{ + "background-color": "white", + "text-align": "center" + }) + ) + +def create_metric_chart(df: pd.DataFrame) -> alt.Chart: + """ + Create a chart that displays metric scores + for each project. + """ + # Create dropdown + metrics_list = df["Metric"].unique().tolist() + + metrics_dropdown = alt.binding_select( + options=metrics_list, + name="Metrics: ", + ) + # Column that controls the bar charts + xcol_param = alt.selection_point( + fields=["Metric"], value=metrics_list[0], bind=metrics_dropdown + ) + + chart = ( + alt.Chart(df, title="Metric by Categories") + .mark_bar(size=20) + .encode( + x=alt.X("Score", scale=alt.Scale(domain=[0, 10])), + y=alt.Y("Project Name"), + color=alt.Color( + "Score", + scale=alt.Scale( + range=calitp_color_palette.CALITP_CATEGORY_BRIGHT_COLORS + ), + ), + tooltip=list(df.columns), + ) + .properties(width=400, height=250) + ) + + chart = chart.add_params(xcol_param).transform_filter(xcol_param) + + return chart + +def create_district_summary(df: pd.DataFrame, caltrans_district: int): + filtered_df = df.loc[df["CalTrans District"] == caltrans_district].reset_index( + drop=True + ) + # Finding the values referenced in the narrative + median_score = filtered_df["Overall Score"].median() + total_projects = filtered_df["Project Name"].nunique() + max_project = filtered_df["Project Cost"].max() + max_project = f"${max_project:,.2f}" + + # Aggregate the dataframe + aggregated_df = aggregate_by_category(filtered_df) + + # Change the dataframe from wide to long + df2 = wide_to_long(filtered_df) + + # Create narrative + display( + Markdown( + f"""

District {caltrans_district}

+ The median score for projects in District 3 is {median_score}
+ The total number of projects is {total_projects}
+ The most expensive project costs {max_project} + """ + ) + ) + display( + Markdown( + f"""

Metrics aggregated by Categories

+ """ + ) + ) + style_df(aggregated_df) + + display( + Markdown( + f"""

Overview of Projects

+ """ + ) + ) + style_df(filtered_df[["Project Name", "Overall Score", "Scope Of Work"]]) + display( + Markdown( + f"""

Metric Scores by Project

+ """ + ) + ) + display(create_metric_chart(df2)) \ No newline at end of file From 668f2e1e6cde1ffe90e482fadaea253bccec9321 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Mon, 28 Oct 2024 22:48:49 +0000 Subject: [PATCH 08/12] started on ex 3 and ex 4 --- starter_kit/2024_basics_03.ipynb | 14 +++++++++++++ starter_kit/2024_basics_04.ipynb | 2 +- starter_kit/2024_basics_05.ipynb | 34 ++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 starter_kit/2024_basics_05.ipynb diff --git a/starter_kit/2024_basics_03.ipynb b/starter_kit/2024_basics_03.ipynb index 9329e4625..ede84f5ae 100644 --- a/starter_kit/2024_basics_03.ipynb +++ b/starter_kit/2024_basics_03.ipynb @@ -1088,6 +1088,20 @@ "df[\"category\"] = df.apply(categorize, axis=1)" ] }, + { + "cell_type": "markdown", + "id": "d91c41b1-76c4-4673-b16f-ef9990d66270", + "metadata": {}, + "source": [ + "### Practice #2:\n", + "* Please write another if-else function that categorizes projects by whether they are low, medium, or high scoring.\n", + "* Use the values you find from `.describe()` as reference.\n", + " * You aren't limited to only the 25th, 50th, and 75th percentile. \n", + " * Specify `.describe(percentiles=[0.05, 0.1, 0.9, 0.95])`\n", + "* You can find save thewhatever percentile you like using \n", + " `p75 = df.overall_score.quantile(0.75).astype(float)`" + ] + }, { "cell_type": "markdown", "id": "df815f56-c2ed-43ff-9180-147beddcffe0", diff --git a/starter_kit/2024_basics_04.ipynb b/starter_kit/2024_basics_04.ipynb index e45194cfa..94b20f9d6 100644 --- a/starter_kit/2024_basics_04.ipynb +++ b/starter_kit/2024_basics_04.ipynb @@ -210,7 +210,7 @@ "id": "0f14c7d5-d9b7-40db-9e42-9dd1369971e2", "metadata": {}, "source": [ - "### Your turn\n", + "## Your Script\n", "* Create your own `.py` file with your own functions. \n", "* Make sure to separate out functions by theme:\n", " * One function that loads the dataset and does some light cleaning.\n", diff --git a/starter_kit/2024_basics_05.ipynb b/starter_kit/2024_basics_05.ipynb new file mode 100644 index 000000000..53efc7651 --- /dev/null +++ b/starter_kit/2024_basics_05.ipynb @@ -0,0 +1,34 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "36c5c03c-164a-4530-9fc6-43f5d1abbf7e", + "metadata": {}, + "source": [ + "# Portfolio\n", + "* Please duplicate this new notebook, along with your Python script into a new folder in `data-analyses`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 42e9c12391dacc0720c38cd87d296dc8088ee1d3 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Tue, 29 Oct 2024 19:09:52 +0000 Subject: [PATCH 09/12] ex 5 how to make a portfolio --- ha_portfolio/README.md | 11 + ha_portfolio/_starterkit_utils.py | 195 +++ ha_portfolio/ha_portfolio.ipynb | 281 ++++ portfolio/ha_starterkit_district/README.md | 11 + portfolio/ha_starterkit_district/_config.yml | 43 + portfolio/ha_starterkit_district/_toc.yml | 17 + .../00__ha_portfolio__district_1.ipynb | 3 + .../00__ha_portfolio__district_10.ipynb | 3 + .../00__ha_portfolio__district_11.ipynb | 3 + .../00__ha_portfolio__district_12.ipynb | 3 + .../00__ha_portfolio__district_2.ipynb | 3 + .../00__ha_portfolio__district_3.ipynb | 3 + .../00__ha_portfolio__district_4.ipynb | 3 + .../00__ha_portfolio__district_5.ipynb | 3 + .../00__ha_portfolio__district_6.ipynb | 3 + .../00__ha_portfolio__district_7.ipynb | 3 + .../00__ha_portfolio__district_8.ipynb | 3 + .../00__ha_portfolio__district_9.ipynb | 3 + portfolio/sites/ha_starterkit_district.yml | 31 + starter_kit/2024_basics_01.ipynb | 533 ++++++- starter_kit/2024_basics_02.ipynb | 1299 ++++++++++++++++- starter_kit/2024_basics_03.ipynb | 548 +++++-- starter_kit/2024_basics_04.ipynb | 1190 ++++++++++++++- starter_kit/2024_basics_05.ipynb | 56 +- starter_kit/_starterkit_utils.py | 12 +- starter_kit/starterkit_district.yml | 31 + 26 files changed, 3963 insertions(+), 331 deletions(-) create mode 100644 ha_portfolio/README.md create mode 100644 ha_portfolio/_starterkit_utils.py create mode 100644 ha_portfolio/ha_portfolio.ipynb create mode 100644 portfolio/ha_starterkit_district/README.md create mode 100644 portfolio/ha_starterkit_district/_config.yml create mode 100644 portfolio/ha_starterkit_district/_toc.yml create mode 100644 portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb create mode 100644 portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb create mode 100644 portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb create mode 100644 portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb create mode 100644 portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb create mode 100644 portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb create mode 100644 portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb create mode 100644 portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb create mode 100644 portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb create mode 100644 portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb create mode 100644 portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb create mode 100644 portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb create mode 100644 portfolio/sites/ha_starterkit_district.yml create mode 100644 starter_kit/starterkit_district.yml diff --git a/ha_portfolio/README.md b/ha_portfolio/README.md new file mode 100644 index 000000000..825c171fc --- /dev/null +++ b/ha_portfolio/README.md @@ -0,0 +1,11 @@ +# Starter Kit Portfolio +I am revamping some of our exercises and one exercise will teach future analysts how to make a portfolio. Yay! + +## Who We Are +We want our audience to understand who we are and why our expertise and research should be trusted. Here is a blurb you can lift. + +This website was created by the [California Department of Transportation](https://dot.ca.gov/)'s Division of Data and Digital Services. We are a group of data analysts and scientists who analyze transportation data, such as General Transit Feed Specification (GTFS) data, or data from funding programs such as the Active Transportation Program. Our goal is to transform messy and indecipherable original datasets into usable, customer-friendly products to better the transportation landscape. For more of our work, visit our [portfolio](https://analysis.calitp.org/). + +Alt text Alt text + +
Caltrans®, the California Department of Transportation® and the Caltrans logo are registered service marks of the California Department of Transportation and may not be copied, distributed, displayed, reproduced or transmitted in any form without prior written permission from the California Department of Transportation. diff --git a/ha_portfolio/_starterkit_utils.py b/ha_portfolio/_starterkit_utils.py new file mode 100644 index 000000000..ecfdcee2e --- /dev/null +++ b/ha_portfolio/_starterkit_utils.py @@ -0,0 +1,195 @@ +import pandas as pd +import numpy as np +import altair as alt +from calitp_data_analysis import calitp_color_palette +from IPython.display import HTML, Image, Markdown, display, display_html + +def reverse_snakecase(df:pd.DataFrame)->pd.DataFrame: + """ + Clean up columns to remove underscores and spaces. + """ + df.columns = df.columns.str.replace("_", " ").str.strip().str.title() + + df.columns = (df.columns.str.replace("Dac", "DAC") + .str.replace("Vmt", "VMT") + .str.replace("Zev", "ZEV") + .str.replace("Lu", "Landuse") + .str.replace("Ct", "CalTrans") + ) + return df + +def load_dataset()->pd.DataFrame: + """ + Load the final dataframe. + """ + GCS_FILE_PATH = "gs://calitp-analytics-data/data-analyses/starter_kit/" + FILE = "starter_kit_example_categorized.parquet" + + # Read dataframe in + df = pd.read_parquet(f"{GCS_FILE_PATH}{FILE}") + + # Capitalize the Scope of Work column again since it is all lowercase + df.scope_of_work = df.scope_of_work.str.capitalize() + + # Clean up the column names + df = reverse_snakecase(df) + return df + +def aggregate_by_category(df: pd.DataFrame) -> pd.DataFrame: + """ + Find the median overall score and project cost + and total unique projects by category. + """ + agg1 = ( + df.groupby(["Category"]) + .aggregate( + { + "Overall Score": "median", + "Project Cost": "median", + "Project Name": "nunique", + } + ) + .reset_index() + .rename( + columns={ + "Overall Score": "Median Score", + "Project Cost": "Median Project Cost", + "Project Name": "Total Projects", + } + ) + ) + + # Format the Cost column properly + agg1['Median Project Cost'] = agg1['Median Project Cost'].apply(lambda x: '${:,.0f}'.format(x)) + + return agg1 + +def wide_to_long(df:pd.DataFrame)->pd.DataFrame: + """ + Change the dataframe from wide to long based on the project name and + Caltrans District. + """ + df2 = pd.melt( + df, + id_vars=["CalTrans District","Project Name"], + value_vars=[ + "Accessibility Score", + "DAC Accessibility Score", + "DAC Traffic Impacts Score", + "Freight Efficiency Score", + "Freight Sustainability Score", + "Mode Shift Score", + "Landuse Natural Resources Score", + "Safety Score", + "VMT Score", + "ZEV Score", + "Public Engagement Score", + "Climate Resilience Score", + "Program Fit Score", + ]) + + df2 = df2.rename(columns = {'variable':'Metric', + 'value':'Score'}) + return df2 + +def style_df(df: pd.DataFrame): + """ + Styles a dataframe and displays it. + """ + display( + df.style.hide(axis="index") + .format(precision=0) # Display only 2 decimal points + .set_properties(**{ + "background-color": "white", + "text-align": "center" + }) + ) + +def create_metric_chart(df: pd.DataFrame) -> alt.Chart: + """ + Create a chart that displays metric scores + for each project. + """ + # Create dropdown + metrics_list = df["Metric"].unique().tolist() + + metrics_dropdown = alt.binding_select( + options=metrics_list, + name="Metrics: ", + ) + # Column that controls the bar charts + xcol_param = alt.selection_point( + fields=["Metric"], value=metrics_list[0], bind=metrics_dropdown + ) + + chart = ( + alt.Chart(df, title="Metric by Categories") + .mark_circle(size=200) + .encode( + x=alt.X("Score", scale=alt.Scale(domain=[0, 10])), + y=alt.Y("Project Name"), + color=alt.Color( + "Score", + scale=alt.Scale( + range=calitp_color_palette.CALITP_CATEGORY_BRIGHT_COLORS + ), + ), + tooltip=list(df.columns), + ) + .properties(width=400, height=250) + ) + + chart = chart.add_params(xcol_param).transform_filter(xcol_param) + + return chart + +def create_district_summary(df: pd.DataFrame, caltrans_district: int): + """ + Create a summary of CSIS metrics for one Caltrans District. + """ + filtered_df = df.loc[df["CalTrans District"] == caltrans_district].reset_index( + drop=True + ) + # Finding the values referenced in the narrative + median_score = filtered_df["Overall Score"].median() + total_projects = filtered_df["Project Name"].nunique() + max_project = filtered_df["Project Cost"].max() + max_project = f"${max_project:,.2f}" + + # Aggregate the dataframe + aggregated_df = aggregate_by_category(filtered_df) + + # Change the dataframe from wide to long + df2 = wide_to_long(filtered_df) + + # Create narrative + display( + Markdown( + f"""The median score for projects in District 3 is {median_score}
+ The total number of projects is {total_projects}
+ The most expensive project costs {max_project} + """ + ) + ) + display( + Markdown( + f"""

Metrics aggregated by Categories

+ """ + ) + ) + style_df(aggregated_df) + + display( + Markdown( + f"""

Overview of Projects

+ """ + ) + ) + style_df(filtered_df[["Project Name", "Overall Score", "Scope Of Work"]]) + display( + Markdown( + f"""

Metric Scores by Project

+ """ + ) + ) + display(create_metric_chart(df2)) \ No newline at end of file diff --git a/ha_portfolio/ha_portfolio.ipynb b/ha_portfolio/ha_portfolio.ipynb new file mode 100644 index 000000000..1c478972e --- /dev/null +++ b/ha_portfolio/ha_portfolio.ipynb @@ -0,0 +1,281 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "36c5c03c-164a-4530-9fc6-43f5d1abbf7e", + "metadata": { + "tags": [] + }, + "source": [ + "**Portfolio**\n", + "* You might have seen DDS's [portfolio](https://analysis.calitp.org/).\n", + "* We often present our work on our portfolio because it retains the interactivity of the `Altair` charts and `Geopandas` maps we make.\n", + "* Additionally, it is very streamlined to update our work when it needs to be updated. \n", + "* Spend some time exploring our portfolio above. \n", + "\n", + "**How does the portfolio work?**\n", + "* For the majority of the sites on the portfolio are using **one** notebook essentially as a template that is looped one or more variables. \n", + " * This [National Transit Dataset Monthly Ridership by Regional Transit Planning Authority (RTPA)](https://ntd-monthly-ridership--cal-itp-data-analyses.netlify.app/readme) takes [this notebook](https://github.com/cal-itp/data-analyses/blob/main/ntd/monthly_ridership_report.ipynb) and reruns it for every \n", + "RTPA in this [yml file](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/ntd_monthly_ridership.yml). \n", + " * This process of looping over a parameter is called parameterizing a notebook!\n", + "\n", + "**Let's make a portfolio**\n", + "* Please read the instructions very carefully.\n", + "\n", + "**Resources**\n", + "* You may wish to read these resources before making the portfolio.\n", + "* [Preparing notebooks for the portfolio](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html)\n", + "* [Publishing to the portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html)" + ] + }, + { + "cell_type": "markdown", + "id": "4dc7d9d1-5722-467f-8e2f-d1e2b8d7e566", + "metadata": {}, + "source": [ + "**Step 1: Move this notebook**\n", + "* Create a new folder in the `data-analyses` repo called `lastname_portfolio`.\n", + "* Right click -> copy to copy this notebook to the new folder.\n", + "* Rename this notebook using as `lastname_portfolio.ipynb`\n", + "* Use `git mv` to move the Python file that holds your functions to the new folder.\n", + "* Right click -> copy the `starterkit_district.yml` file to the folder `portfolio/sites`. Rename `starterkit_district.yml` to `lastname_starterkit_district`\n", + "* Close this original `2024_basics_05.ipynb` and begin working on your new `lastname_portfolio.ipynb`" + ] + }, + { + "cell_type": "markdown", + "id": "8cb15ca0-580e-4a0d-9dbc-accb761d77d1", + "metadata": {}, + "source": [ + "**Step 2: Netlify Setup**\n", + "* Follow the instructions [here](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#netlify-setup).\n", + "* You only need to do this step **once** for the entirety of your career at DDS. \n", + "* Once you have your key setup, you can publish limitless portfolios." + ] + }, + { + "cell_type": "markdown", + "id": "89858742-9a67-4f10-9f65-29770f955075", + "metadata": {}, + "source": [ + "**Step 3: Create a `README.md` **\n", + "* When you go to each site on our [portfolio](https://analysis.calitp.org/), you'll always go to page of introduction.\n", + "* Every portfolio must have a `README.md` file or else it won't build.\\\n", + "* It also serves as our page to discuss our methodology, the datasets we used, and other details to give our viewers some context into what they are looking at. \n", + "* We have a template for you to populate [here](https://github.com/cal-itp/data-analyses/blob/main/portfolio/template_README.md). \n", + " * You don't have to fill out every section and you can delete whatever is irrelevant to you.\n", + " * Make sure to rename `template_README.md` as `README.md`. You cannot deviate from another variation such as `README_intro.md` because the portfolio will not build.\n", + "* **Further Reading**: [DDS Docs](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#file-setup)" + ] + }, + { + "cell_type": "markdown", + "id": "2d62df5f-1608-4cf9-8e66-2686d4b9f5da", + "metadata": {}, + "source": [ + "**Step 4: Update `starterkit_district.yml`**\n", + "* You can think of this yml file as a \"Table of Contents.\"\n", + "* We are taking this notebook you're currently reading and re-running it for every Caltrans District.\n", + "* Every Caltrans District is listed in the yml file and a page for each district will generate on your portfolio.\n", + "* In the `starterkit_district.yml` please rename each part designated in all caps such as REPLACE_WITH_YOUR_FOLDER_NAME. \n", + "* **Further Reading**: [DDS Docs on YML](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#yml)" + ] + }, + { + "cell_type": "markdown", + "id": "2986f064-d922-491a-846b-1d4f5e4ea9e4", + "metadata": {}, + "source": [ + "**Step 6: Importing the right packages**\n", + "* Making a parameterized notebook is extremely finicky.\n", + "* For every notebook you make, you must copy and paste this block of code in this **exact** order. Otherwise, your notebook won't work.\n", + "* **What am I importing?**\n", + " * `%%capture`: FIND DEFINITION\n", + " * `import warnings warnings.filterwarnings('ignore')`: Sometimes when you are analyzing data, harmless warnings pop up. These warnings are quite unattractive and we don't want them to be displayed in a portfolio so we turn off these warnings. You don't want to turn off the warnings if you are still analyzing your data.\n", + " * `import calitp_data_analysis.magics`: the library \n", + "* **Resource**: [DDS Getting Notebooks Ready for Parameterization](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#getting-ready-for-parameterization)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "260ba8f3-dd02-4fdc-945d-450db01d188e", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "import calitp_data_analysis.magics\n", + "\n", + "# All your other packages go here\n", + "# Here I just want pandas and my own utils.\n", + "import pandas as pd\n", + "import _starterkit_utils " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a2996fd-29d0-4a19-ac48-a6957d9f8140", + "metadata": {}, + "outputs": [], + "source": [ + "pd.options.display.max_columns = 100\n", + "pd.options.display.float_format = \"{:.2f}\".format\n", + "pd.set_option(\"display.max_rows\", None)\n", + "pd.set_option(\"display.max_colwidth\", None)" + ] + }, + { + "cell_type": "markdown", + "id": "b07ecdbc-a3a9-4183-80dc-57e71cf61fe6", + "metadata": {}, + "source": [ + "**Step 7: Setting your parameters**\n", + "* While these steps have already been done for you, it would still benefit you to re-do these steps and refer to the resource below. \n", + "* **Resource**: [DDS Docs Capturing Parameters](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#capturing-parameters).\n", + "* **Parameter #1:** Set a cell that is commented out with your parameter. Turn on the parameter tag.\n", + " * To turn on the parameter tag: go to the code cell go to the upper right hand corner -> click on the gears -> go to “Cell Tags” -> Add Tag + -> add a tag called “parameters” -> click on the new “parameters” tag to ensure a checkmark shows up and it turns dark gray" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d82c9a8-6f8f-485b-ace5-957f1b80c2f3", + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# district = 1" + ] + }, + { + "cell_type": "markdown", + "id": "2fca6082-1964-43d7-bcd8-8668c39afaac", + "metadata": {}, + "source": [ + "**Parameter #2:**This second cell replaces each district as the notebook loops over each parameter in the `starter_kit.yml` file.\n", + "* `%%capture_parameters` must be the first line of code in this block or else your notebook will fail to parameterize." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43a07a8c-567d-471d-be10-a547cd0b3a13", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture_parameters\n", + "district" + ] + }, + { + "cell_type": "markdown", + "id": "f9285e93-924d-4681-b526-97b8e46643b1", + "metadata": {}, + "source": [ + "* **Parameter #3:** The first markdown cell must include parameters to inject. This line below generates the title District 1 Analysis for District 1.. Feel free to change this to anything you wish, but make sure this is of the markdown cell.\n", + "* This cell is extremely important and read why [here](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#header)." + ] + }, + { + "cell_type": "markdown", + "id": "cb5a0cc4-3e7e-4aea-81f2-c5e858fb315b", + "metadata": {}, + "source": [ + "# District {district} Analysis " + ] + }, + { + "cell_type": "markdown", + "id": "64615b63-3848-45b7-af2e-19c7b7346997", + "metadata": {}, + "source": [ + "**Step 8: Input your functions**\n", + "* I am loading my dataset first.\n", + "* Then I am adding in my dataset and the district parameter into `_starterkit_utils.create_district_summary`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c91049e1-107d-47d9-9cda-63aa4fbf554b", + "metadata": {}, + "outputs": [], + "source": [ + "df = _starterkit_utils.load_dataset()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd1509c0-b435-456e-ad1c-b583a991f1e2", + "metadata": {}, + "outputs": [], + "source": [ + "_starterkit_utils.create_district_summary(df, district)" + ] + }, + { + "cell_type": "markdown", + "id": "76052780-3c27-405c-9379-13e82130eec7", + "metadata": {}, + "source": [ + "**Step 9: Download the right packages**\n", + "* Resource: [DDS Deploying Portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#building-and-deploying-your-report)\n", + "* Navigate back to the root of your repo `~/data-analyses`.\n", + "* Once there, install the portfolio requirements using `pip install -r portfolio/requirements.txt`. This will take a bit." + ] + }, + { + "cell_type": "markdown", + "id": "c8fce487-015d-4e24-8444-d5c07ec17890", + "metadata": {}, + "source": [ + "**Step 10: Build your portfolio**\n", + "* Double check you are at the root of your repo.\n", + "* Replace `REPLACE_YML_NAME` with just the name of your `yml` file without the `.yml` extension into the command below.\n", + "* Run `python portfolio/portfolio.py build REPLACE_YML_NAME --deploy` to build your portfolio.\n", + " * Example: My yml is called `ha_starterkit_district.yml` so I would run `python portfolio/portfolio.py build ha_starterkit_district --deploy`.\n" + ] + }, + { + "cell_type": "markdown", + "id": "fc0fde8b-7671-43cf-b1ac-66730e436d11", + "metadata": {}, + "source": [ + "**Step 11: Something not right?**\n", + "* Your portfolio should be up and running. You can view your portfolio using the draft URL. It'll look something like this: `https://ha-starterkit-district--cal-itp-data-analyses.netlify.app`.\n", + "* What if something is a little off? After updating your code, rerun this line of code to redo your portfolio.\n", + "` python portfolio/portfolio.py clean REPLACE_YML_NAME && python portfolio/portfolio.py build REPLACE_YML_NAME --deploy`" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/portfolio/ha_starterkit_district/README.md b/portfolio/ha_starterkit_district/README.md new file mode 100644 index 000000000..825c171fc --- /dev/null +++ b/portfolio/ha_starterkit_district/README.md @@ -0,0 +1,11 @@ +# Starter Kit Portfolio +I am revamping some of our exercises and one exercise will teach future analysts how to make a portfolio. Yay! + +## Who We Are +We want our audience to understand who we are and why our expertise and research should be trusted. Here is a blurb you can lift. + +This website was created by the [California Department of Transportation](https://dot.ca.gov/)'s Division of Data and Digital Services. We are a group of data analysts and scientists who analyze transportation data, such as General Transit Feed Specification (GTFS) data, or data from funding programs such as the Active Transportation Program. Our goal is to transform messy and indecipherable original datasets into usable, customer-friendly products to better the transportation landscape. For more of our work, visit our [portfolio](https://analysis.calitp.org/). + +Alt text Alt text + +
Caltrans®, the California Department of Transportation® and the Caltrans logo are registered service marks of the California Department of Transportation and may not be copied, distributed, displayed, reproduced or transmitted in any form without prior written permission from the California Department of Transportation. diff --git a/portfolio/ha_starterkit_district/_config.yml b/portfolio/ha_starterkit_district/_config.yml new file mode 100644 index 000000000..47dea21ce --- /dev/null +++ b/portfolio/ha_starterkit_district/_config.yml @@ -0,0 +1,43 @@ +# Book settings +# Learn more at https://jupyterbook.org/customize/config.html + +title: Testing a Portfolio +author: Cal-ITP +copyright: "2024" +#logo: calitp_logo_MAIN.png + +# Force re-execution of notebooks on each build. +# See https://jupyterbook.org/content/execute.html +execute: + execute_notebooks: 'off' + allow_errors: false + timeout: -1 + +# Define the name of the latex output file for PDF builds +latex: + latex_documents: + targetname: book.tex + +launch_buttons: + binderhub_url: "https://mybinder.org" + jupyterhub_url: "https://hubtest.k8s.calitp.jarv.us" + thebe: true + +repository: + url: https://github.com/cal-itp/data-analyses/ # Online location of your book +# path_to_book: docs # Optional path to your book, relative to the repository root + path_to_book: ha_portfolio + branch: main # Which branch of the repository should be used when creating links (optional) + +# Add GitHub buttons to your book +# See https://jupyterbook.org/customize/config.html#add-a-link-to-your-repository +html: + use_issues_button: true + use_repository_button: true + use_edit_page_button: true + google_analytics_id: 'G-JCX3Z8JZJC' + +sphinx: + config: + html_js_files: + - https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js \ No newline at end of file diff --git a/portfolio/ha_starterkit_district/_toc.yml b/portfolio/ha_starterkit_district/_toc.yml new file mode 100644 index 000000000..957f7035e --- /dev/null +++ b/portfolio/ha_starterkit_district/_toc.yml @@ -0,0 +1,17 @@ +format: jb-book +parts: +- caption: null + chapters: + - file: district_1/00__ha_portfolio__district_1.ipynb + - file: district_2/00__ha_portfolio__district_2.ipynb + - file: district_3/00__ha_portfolio__district_3.ipynb + - file: district_4/00__ha_portfolio__district_4.ipynb + - file: district_5/00__ha_portfolio__district_5.ipynb + - file: district_6/00__ha_portfolio__district_6.ipynb + - file: district_7/00__ha_portfolio__district_7.ipynb + - file: district_8/00__ha_portfolio__district_8.ipynb + - file: district_9/00__ha_portfolio__district_9.ipynb + - file: district_10/00__ha_portfolio__district_10.ipynb + - file: district_11/00__ha_portfolio__district_11.ipynb + - file: district_12/00__ha_portfolio__district_12.ipynb +root: README diff --git a/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb b/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb new file mode 100644 index 000000000..ebeae7db3 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0018471be67dc08f614c69e7f4d7815cb2da1b70d4a1ff936a643f5c35815c47 +size 33424 diff --git a/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb b/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb new file mode 100644 index 000000000..79d0bec32 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb9b9872e177774875a6b0941857fc5ef156af2a9df607507be93f3c24ca9b2d +size 30642 diff --git a/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb b/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb new file mode 100644 index 000000000..5d79ece35 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fe8f764f64afb6215bdd302e9b5c69075825b621b32be8f5b0d071dd3aeb440 +size 43771 diff --git a/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb b/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb new file mode 100644 index 000000000..7caeacff6 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21bafc2c305a21d9774db5192da95fd00ef5ff423e28e34992be2ba3cb8e1b1c +size 35966 diff --git a/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb b/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb new file mode 100644 index 000000000..c63601816 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89810da26ccdf9d56d58dab556cd2282e3899ca0402e59eb23e50a9acd6da428 +size 43147 diff --git a/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb b/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb new file mode 100644 index 000000000..5ccd49597 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8981a5ae0f033b522e49a4204b6dc30c7b9fc0337da4003058d2728c2ea973d +size 45376 diff --git a/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb b/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb new file mode 100644 index 000000000..8311191b3 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f4166804cc1bf86becea14dc340b9dea4f4f06bc46f7868afb0ca01b22d1551 +size 33660 diff --git a/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb b/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb new file mode 100644 index 000000000..5bb6c97cd --- /dev/null +++ b/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c47e40c9eaa9df9630d34a3ad8704cbca7a356fc3279a7ebae609eedb7e74824 +size 30827 diff --git a/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb b/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb new file mode 100644 index 000000000..ba5dbe284 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb826f08945597e319cc3046b5aa35ae18a2d2bffc808bcc44a9584722f3274a +size 43052 diff --git a/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb b/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb new file mode 100644 index 000000000..d36d9e606 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01626e62de990c220a904e3e076c0f95960814db723d559537bbe0e9b487d706 +size 40278 diff --git a/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb b/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb new file mode 100644 index 000000000..4acae490b --- /dev/null +++ b/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1503584a03a7e4738fdebd059a229b105ee832fe6552551787e0a8ae180982ef +size 33542 diff --git a/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb b/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb new file mode 100644 index 000000000..d81dde067 --- /dev/null +++ b/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb915feb420a72619652a4cf311d3e4bb2810b2ec4f3a1cdb28a7f49b9812954 +size 35818 diff --git a/portfolio/sites/ha_starterkit_district.yml b/portfolio/sites/ha_starterkit_district.yml new file mode 100644 index 000000000..dbb2e23d1 --- /dev/null +++ b/portfolio/sites/ha_starterkit_district.yml @@ -0,0 +1,31 @@ +directory: ./ha_portfolio/ +notebook: ./ha_portfolio/ha_portfolio.ipynb +parts: +- caption: Introduction +- chapters: + - params: + district: 1 + - params: + district: 2 + - params: + district: 3 + - params: + district: 4 + - params: + district: 5 + - params: + district: 6 + - params: + district: 7 + - params: + district: 8 + - params: + district: 9 + - params: + district: 10 + - params: + district: 11 + - params: + district: 12 +readme: ./ha_portfolio/README.md +title: Testing a Portfolio diff --git a/starter_kit/2024_basics_01.ipynb b/starter_kit/2024_basics_01.ipynb index cc5206469..f3123128b 100644 --- a/starter_kit/2024_basics_01.ipynb +++ b/starter_kit/2024_basics_01.ipynb @@ -33,9 +33,13 @@ "id": "4dd32eed-55a4-4fd1-874b-02f9b4bd94a7", "metadata": {}, "source": [ - "## Import Pandas\n", + "## Import Packages\n", + "* Before rolling up our skills and doing some data cleaning and analyzing, we need to equip ourselves with the right tools to get started.\n", + "* Part of our tools is to import packages we're going to use. \n", + "* **Resource**: [Importing Dependencies via Practical Python for Data Science](https://www.practicalpythonfordatascience.com/05_data_exploration.html?highlight=dependencies#importing-our-dependencies)\n", + "### Pandas\n", "* You are importing the package `pandas` that is the backbone of all data analysis work. \n", - "* You can import countless packages. `numpy` and `geopandas` are also popular. " + "* You can import countless packages. `numpy` and `geopandas` (which is for geospatial data work) are also popular. " ] }, { @@ -45,10 +49,24 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "import pandas as pd" ] }, + { + "cell_type": "markdown", + "id": "19b42c5d-4f2b-4d66-a7a7-98ab74a6591e", + "metadata": {}, + "source": [ + "* This block of code below adjusts the notebook.\n", + "* I am setting the maximum number of columns to be dissplayed to be 100.\n", + "* I want any `float` columns to be rounded to 2 decimal points.\n", + "* I want all of the rows in the dataframe to display. \n", + "* I don't want my columns to be truncated.\n", + " * If you have a column with `strings` that is very long, it will automatically cut off.\n", + " * The California Department of Transportation (Caltrans) is committed to leading climate action and advancing social equity in the transportation sector set forth by the California State Transportation Agency (CalSTA) Climate Action Plan for Transportation Infrastructure (CAPTI, 2021) would be displayed as The California Department of Transportation (Caltrans) is... without this line of code.\n", + "* Adjust some of these settings if you wish " + ] + }, { "cell_type": "code", "execution_count": 2, @@ -62,6 +80,28 @@ "pd.set_option(\"display.max_colwidth\", None)" ] }, + { + "cell_type": "markdown", + "id": "f14077a3-2882-46eb-8cd2-27c08e4705a9", + "metadata": {}, + "source": [ + "### Calitp_data_analysis\n", + "* DDS also has our own [internal library of functions](https://docs.calitp.org/data-infra/analytics_tools/python_libraries.html#calitp-data-analysis).\n", + "* You can check out all the functions [here](https://github.com/cal-itp/data-infra/tree/main/packages/calitp-data-analysis/calitp_data_analysis).\n", + "* Below, we are importing only one function called `to_snakecase` from the python script `sql` in our package `calitp_data_analysis`.\n", + "* `to_snakecase` allows us to change the column names of our dataset from something like `Project Description` to `project_description`. By turning the column names to lower case and replacing the spaces with underscores, this makes referencing specific columns much easier." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bd388d88-d2d6-4dd6-9870-22c14db7a44a", + "metadata": {}, + "outputs": [], + "source": [ + "from calitp_data_analysis.sql import to_snakecase" + ] + }, { "cell_type": "markdown", "id": "ff74b143-6ff2-46e9-ae88-4a208155e990", @@ -89,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "5950cb87-75ab-4871-ab4b-a8f1c41f0a4a", "metadata": {}, "outputs": [], @@ -97,14 +137,190 @@ "url = \"gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx\"" ] }, + { + "cell_type": "markdown", + "id": "88d79cea-c017-454e-a2aa-85c0bf511d85", + "metadata": {}, + "source": [ + "* Read in the dataframe without `to_snakecase()` first to see what happens." + ] + }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, + "id": "67ba9264-65d9-453b-a800-a91bd365e43e", + "metadata": {}, + "outputs": [], + "source": [ + "df_no_snakecase = (pd.read_excel(url))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e2d886b4-c207-41e5-8325-7275619b60e6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_nameScope of WorkProject Cost
02Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.6265525
13Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.3777437
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 2 Meadow Magic Multi-Use Path \n", + "1 3 Bunny Hop Bike Boulevard \n", + "\n", + " Scope of Work \\\n", + "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", + "\n", + " Project Cost \n", + "0 6265525 \n", + "1 3777437 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no_snakecase.head(2)" + ] + }, + { + "cell_type": "markdown", + "id": "f959563e-7fa2-444a-b2b3-6c539dce802b", + "metadata": {}, + "source": [ + "* Read in the dataframe with `to_snakecase()` now and compare the difference!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, "id": "e09456e0-dfd2-4388-85de-eb9e95f983fa", "metadata": {}, "outputs": [], "source": [ - "df = pd.read_excel(url)" + "df = to_snakecase(pd.read_excel(url))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "54c718b3-eeff-4ec5-b012-1cc612543c60", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_namescope_of_workproject_cost
02Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.6265525
13Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.3777437
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 2 Meadow Magic Multi-Use Path \n", + "1 3 Bunny Hop Bike Boulevard \n", + "\n", + " scope_of_work \\\n", + "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", + "\n", + " project_cost \n", + "0 6265525 \n", + "1 3777437 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head(2)" ] }, { @@ -122,6 +338,81 @@ "* Try everything yourself below." ] }, + { + "cell_type": "code", + "execution_count": 9, + "id": "5e966250-47b1-4f14-802b-c795e44330dd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_namescope_of_workproject_cost
02Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.6265525
13Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.3777437
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 2 Meadow Magic Multi-Use Path \n", + "1 3 Bunny Hop Bike Boulevard \n", + "\n", + " scope_of_work \\\n", + "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", + "\n", + " project_cost \n", + "0 6265525 \n", + "1 3777437 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head(2)" + ] + }, { "cell_type": "markdown", "id": "3386e9d8-15cd-48bc-8b1f-cf6f95512ad5", @@ -140,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "id": "7f55b33e-d402-473b-815a-92ad935d35d7", "metadata": {}, "outputs": [ @@ -155,8 +446,8 @@ "--- ------ -------------- ----- \n", " 0 ct_district 44 non-null int64 \n", " 1 project_name 44 non-null object\n", - " 2 Scope of Work 44 non-null object\n", - " 3 Project Cost 44 non-null int64 \n", + " 2 scope_of_work 44 non-null object\n", + " 3 project_cost 44 non-null int64 \n", "dtypes: int64(2), object(2)\n", "memory usage: 1.5+ KB\n" ] @@ -186,7 +477,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, "id": "63f21ab5-0920-4310-afce-2ea657556912", "metadata": {}, "outputs": [ @@ -208,7 +499,7 @@ "Name: ct_district, dtype: int64" ] }, - "execution_count": 6, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -229,7 +520,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 12, "id": "1d832308-a425-404d-83a0-53ce8bfae279", "metadata": {}, "outputs": [ @@ -239,7 +530,7 @@ "44" ] }, - "execution_count": 7, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -250,7 +541,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "id": "55d2140f-feab-496b-b9b1-90bbe5701a9a", "metadata": {}, "outputs": [ @@ -260,7 +551,7 @@ "(44, 4)" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -274,12 +565,12 @@ "id": "7c0c499e-fa7b-4f01-a357-db7b0ec41416", "metadata": {}, "source": [ - "* Notice that when you have spaces in between each string of your column name, you need to refer the column using brackets []. " + "* You can preview a column with brackets [] as well. " ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "id": "4e232324-f75f-46a0-962d-76ed9273dac7", "metadata": {}, "outputs": [ @@ -289,13 +580,13 @@ "44" ] }, - "execution_count": 12, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df[\"Scope of Work\"].nunique()" + "df.scope_of_work.nunique()" ] }, { @@ -317,13 +608,31 @@ "### Lists: An Introduction\n", "* We can load in all of the sheets in an Excel workbook using a list\n", "* Per [Practical Python for Data Science](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#list): \"lists represent a collection of objects and are constructed with square brackets, separating items with commas. A list can contain a collection of one datatype...It can also contain a collection of mixed datatypes\".\"\n", - " * Play around with some of the examples in the link above in this notebook.\n", - "* Notice that the items in this list are strings. Read about strings [here](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#string)." + " * **Play around with some of the examples in the link above in this notebook.**\n", + " * You will be using lists often in your work, so it is best to be familiar with this datatype.\n" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, + "id": "c7f41842-853e-4ad0-ae9e-0da0955d4352", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "21a32ab4-bfb2-4e7a-b90a-6fa05b7ceb89", + "metadata": {}, + "source": [ + "* I am placing all of the sheets in our Excel Workbook in a list.\n", + "* Notice that the items in this list are strings. Read about strings [here](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#string).\n", + "* You can access each element of the list using an index. " + ] + }, + { + "cell_type": "code", + "execution_count": 15, "id": "02380fb6-c55b-477f-acfb-8b483e83beac", "metadata": {}, "outputs": [], @@ -335,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "8a9a1a3e-e10d-4447-96dd-92ecb2fe6357", "metadata": {}, "outputs": [ @@ -345,7 +654,7 @@ "2" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -354,17 +663,9 @@ "len(my_sheets)" ] }, - { - "cell_type": "markdown", - "id": "21a32ab4-bfb2-4e7a-b90a-6fa05b7ceb89", - "metadata": {}, - "source": [ - "* You can access each element of the list using an index. " - ] - }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "a3be037d-b21b-4192-9099-25bfcb660f01", "metadata": {}, "outputs": [ @@ -374,7 +675,7 @@ "'projects_auto'" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -386,7 +687,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "ebf91535-a466-446a-9f7a-606503d78b6a", "metadata": {}, "outputs": [ @@ -396,7 +697,7 @@ "'overall_score'" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -416,7 +717,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "2e2578bc-db1f-41f5-bc07-3cb82998420e", "metadata": {}, "outputs": [], @@ -440,22 +741,22 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "4c6f8fdb-33d3-4c44-bb00-6d1447d49feb", "metadata": {}, "outputs": [], "source": [ - "projects_df = df2.get(my_sheets[0])" + "projects_df = to_snakecase(df2.get(my_sheets[0]))" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "167af2f1-b09d-476d-87b4-b9374ad445c2", "metadata": {}, "outputs": [], "source": [ - "scores_df = df2.get(my_sheets[1])" + "scores_df = to_snakecase(df2.get(my_sheets[1]))" ] }, { @@ -477,7 +778,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "e9321f90-8c99-46fb-9d50-8571f3d94fc8", "metadata": {}, "outputs": [], @@ -512,7 +813,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 24, "id": "48ee899b-3db9-464f-802f-d431189176b7", "metadata": { "scrolled": true, @@ -533,7 +834,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "2c64cdcf-9598-4f4a-b077-5caec0cfe264", "metadata": {}, "outputs": [], @@ -544,25 +845,13 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "id": "47a96b86-e5d1-4fcd-ba73-7db5badae28b", "metadata": { "scrolled": true, "tags": [] }, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'columns_to_drop' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[24], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m scores_df\u001b[38;5;241m.\u001b[39mdrop(columns \u001b[38;5;241m=\u001b[39m \u001b[43mcolumns_to_drop\u001b[49m)\n", - "\u001b[0;31mNameError\u001b[0m: name 'columns_to_drop' is not defined" - ] - } - ], + "outputs": [], "source": [ "\n", "subsetted_df2 = scores_df.drop(columns = columns_to_drop)" @@ -581,14 +870,14 @@ "> Python f-strings provide a quick way to interpolate and format strings. They’re readable, concise, and less prone to error than traditional string interpolation and formatting tools...\n", " * Read more about them [here](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python).\n", "* Reference\n", - " * [Saving Code](https://docs.calitp.org/data-infra/analytics_tools/saving_code.html)\n", + " * [DDS Docs: Saving Code](https://docs.calitp.org/data-infra/analytics_tools/saving_code.html)\n", "* Let's practice !\n", " * My file_path is always going to be `gs://calitp-analytics-data/data-analyses/starter_kit/`." ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "id": "4c9c53a5-dbf3-4dc0-aea0-832f3a91414d", "metadata": {}, "outputs": [], @@ -607,7 +896,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "id": "db111f34-08b8-42f9-96fe-6852c4af50ad", "metadata": {}, "outputs": [], @@ -626,7 +915,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "id": "edff403c-ef37-48d8-8c7a-60b388752a51", "metadata": {}, "outputs": [ @@ -636,7 +925,7 @@ "'gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_example_final_scores.xlsx'" ] }, - "execution_count": 28, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -658,7 +947,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "id": "bf37fc2d-ac6c-4134-94de-79a9a4141ffc", "metadata": {}, "outputs": [], @@ -687,6 +976,122 @@ "scores_df.to_parquet(f\"{GCS_FILE_PATH}starter_kit_example_final_scores.parquet\")" ] }, + { + "cell_type": "code", + "execution_count": 32, + "id": "9bc1a3cb-85e2-4203-bdd4-e45bb6c20ba4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_nameaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_score
0Meadow Magic Multi-Use Path18931038221042466
1Bunny Hop Bike Boulevard9525624595210771
\n", + "
" + ], + "text/plain": [ + " project_name accessibility_score dac_accessibility_score \\\n", + "0 Meadow Magic Multi-Use Path 1 8 \n", + "1 Bunny Hop Bike Boulevard 9 5 \n", + "\n", + " dac_traffic_impacts_score freight_efficiency_score \\\n", + "0 9 3 \n", + "1 2 5 \n", + "\n", + " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", + "0 10 3 8 \n", + "1 6 2 4 \n", + "\n", + " safety_score vmt_score zev_score public_engagement_score \\\n", + "0 2 2 10 4 \n", + "1 5 9 5 2 \n", + "\n", + " climate_resilience_score program_fit_score overall_score \n", + "0 2 4 66 \n", + "1 10 7 71 " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scores_df.head(2)" + ] + }, { "cell_type": "markdown", "id": "69d211b4-89f0-4b2c-9093-1118114ba649", diff --git a/starter_kit/2024_basics_02.ipynb b/starter_kit/2024_basics_02.ipynb index 4b5310998..97bdd7aba 100644 --- a/starter_kit/2024_basics_02.ipynb +++ b/starter_kit/2024_basics_02.ipynb @@ -10,18 +10,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "6cbbfb96-1e9e-400a-9884-72f08d1191f3", "metadata": {}, "outputs": [], "source": [ "import altair as alt\n", - "import pandas as pd" + "import pandas as pd\n", + "from calitp_data_analysis.sql import to_snakecase" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "3da62b06-24b4-4791-a073-185ee3765152", "metadata": {}, "outputs": [], @@ -44,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "e7e4cafe-eb24-477b-a45c-88bfcaff37f3", "metadata": {}, "outputs": [], @@ -54,7 +55,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "2c4af22f-91ac-4e03-8b80-2121adc9a348", "metadata": {}, "outputs": [], @@ -64,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "873bfb72-9b47-472c-a18b-248be7f8c694", "metadata": {}, "outputs": [], @@ -74,27 +75,92 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "6cf0c667-b81a-430f-afb8-68f4e0f0a147", "metadata": {}, "outputs": [], "source": [ - "projects_df = pd.read_excel(f\"{GCS_FILE_PATH}{EXCEL_FILE}\")" + "projects_df = to_snakecase(pd.read_excel(f\"{GCS_FILE_PATH}{EXCEL_FILE}\"))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "7de4e3b1-15bb-4f37-a392-36c3c0d3e39d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_namescope_of_workproject_cost
02Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.6265525
13Bunny Hop Bike BoulevardA Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.3777437
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 2 Meadow Magic Multi-Use Path \n", + "1 3 Bunny Hop Bike Boulevard \n", + "\n", + " scope_of_work \\\n", + "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", + "\n", + " project_cost \n", + "0 6265525 \n", + "1 3777437 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "projects_df.head(2)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "8a5e10d5-f978-408d-87d9-05f930038a47", "metadata": {}, "outputs": [], @@ -104,10 +170,116 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "898592ba-7655-41c9-a982-251491bd9083", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_nameaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_score
0Meadow Magic Multi-Use Path18931038221042466
1Bunny Hop Bike Boulevard9525624595210771
\n", + "
" + ], + "text/plain": [ + " project_name accessibility_score dac_accessibility_score \\\n", + "0 Meadow Magic Multi-Use Path 1 8 \n", + "1 Bunny Hop Bike Boulevard 9 5 \n", + "\n", + " dac_traffic_impacts_score freight_efficiency_score \\\n", + "0 9 3 \n", + "1 2 5 \n", + "\n", + " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", + "0 10 3 8 \n", + "1 6 2 4 \n", + "\n", + " safety_score vmt_score zev_score public_engagement_score \\\n", + "0 2 2 10 4 \n", + "1 5 9 5 2 \n", + "\n", + " climate_resilience_score program_fit_score overall_score \n", + "0 2 4 66 \n", + "1 10 7 71 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "overall_scores_df.head(2)" ] @@ -145,7 +317,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "ad4962ca-ed83-48a3-b1e6-79e5d5b1042b", "metadata": {}, "outputs": [], @@ -166,30 +338,63 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "e820d7af-17d4-4b2a-8007-5d958a3f7d9e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(41, 18)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "m1.shape" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "3642de14-3bf4-47c0-bd80-3502819ea14d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "41" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "m1.project_name.nunique()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "4b5be67a-f579-4f22-97cb-b6b31d7b8433", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "44" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "projects_df.project_name.nunique()" ] @@ -208,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "98e92c3f-ccd4-45f8-b6a6-523ddcb4a7ac", "metadata": {}, "outputs": [], @@ -220,10 +425,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "f134cddf-5220-44f9-9e15-1c5171cbedfd", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "both 41\n", + "left_only 3\n", + "right_only 3\n", + "Name: _merge, dtype: int64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "m2._merge.value_counts()" ] @@ -241,10 +460,85 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "4dd07bab-4d1b-41a0-954e-4c2d59584e57", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_name_merge
10Rainbow Rush hot Lanesleft_only
12Bunny Lane HOV+2 heavenleft_only
26main street muffin topleft_only
44Rainbow Rush HOT Lanesright_only
45Bunny Lane HOV+2 Havenright_only
46Main Street Muffin Top Revitalizationright_only
\n", + "
" + ], + "text/plain": [ + " project_name _merge\n", + "10 Rainbow Rush hot Lanes left_only\n", + "12 Bunny Lane HOV+2 heaven left_only\n", + "26 main street muffin top left_only\n", + "44 Rainbow Rush HOT Lanes right_only\n", + "45 Bunny Lane HOV+2 Haven right_only\n", + "46 Main Street Muffin Top Revitalization right_only" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "m2.loc[m2._merge != \"both\"][[\"project_name\", \"_merge\"]]" ] @@ -259,10 +553,85 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "c47ef38d-6db5-4bf1-bd87-62b7d84943b6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
project_name_merge
10Rainbow Rush hot Lanesleft_only
12Bunny Lane HOV+2 heavenleft_only
26main street muffin topleft_only
44Rainbow Rush HOT Lanesright_only
45Bunny Lane HOV+2 Havenright_only
46Main Street Muffin Top Revitalizationright_only
\n", + "
" + ], + "text/plain": [ + " project_name _merge\n", + "10 Rainbow Rush hot Lanes left_only\n", + "12 Bunny Lane HOV+2 heaven left_only\n", + "26 main street muffin top left_only\n", + "44 Rainbow Rush HOT Lanes right_only\n", + "45 Bunny Lane HOV+2 Haven right_only\n", + "46 Main Street Muffin Top Revitalization right_only" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "m2.loc[m2._merge.isin([\"left_only\",\"right_only\"])][[\"project_name\", \"_merge\"]]" ] @@ -286,7 +655,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "df6fa95e-cc25-4142-8c2b-ee254863e609", "metadata": {}, "outputs": [], @@ -311,10 +680,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "5601fd36-d221-41da-ab76-b88c616e5e62", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array(['Rainbow Rush hot Lanes', 'Bunny Lane HOV+2 heaven',\n", + " 'main street muffin top ', 'Rainbow Rush HOT Lanes',\n", + " 'Bunny Lane HOV+2 Haven', 'Main Street Muffin Top Revitalization'],\n", + " dtype=object)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "m2.loc[m2._merge.isin([\"left_only\",\"right_only\"])].project_name.unique()" ] @@ -330,7 +713,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "9dad92fe-87a6-434d-a62f-d269f3ad1054", "metadata": {}, "outputs": [], @@ -352,7 +735,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "d8532992-771e-446a-b419-55ad757ff45f", "metadata": {}, "outputs": [], @@ -370,7 +753,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "db09aa04-7a94-4b94-9ade-10b1a987e006", "metadata": {}, "outputs": [], @@ -380,20 +763,126 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "04f4f6d8-55b6-460c-8a52-8626dcfd1cb9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(44, 18)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "final_m.shape" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "id": "39d74f54-a72b-4acc-91b0-b3dcb4539a92", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_namescope_of_workproject_costaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_score
02Meadow Magic Multi-Use PathA 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.626552518931038221042466
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 2 Meadow Magic Multi-Use Path \n", + "\n", + " scope_of_work \\\n", + "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "\n", + " project_cost accessibility_score dac_accessibility_score \\\n", + "0 6265525 1 8 \n", + "\n", + " dac_traffic_impacts_score freight_efficiency_score \\\n", + "0 9 3 \n", + "\n", + " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", + "0 10 3 8 \n", + "\n", + " safety_score vmt_score zev_score public_engagement_score \\\n", + "0 2 2 10 4 \n", + "\n", + " climate_resilience_score program_fit_score overall_score \n", + "0 2 4 66 " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "final_m.head(1)" ] @@ -408,7 +897,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "70410a43-62c9-467c-b777-3415f22abe01", "metadata": {}, "outputs": [], @@ -430,13 +919,16 @@ " * Min overall score\n", " * Number of unique projects\n", "* There are many options Some are `groupby / agg`, `pivot_table`, `groupby / transform`\n", - "* Resources:[DDS Docs](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#aggregating)\n", - " * Use the space below and explore these tutorials. Then, apply your new knowledge to the prompt above." + "* Resources: [DDS Docs](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#aggregating)\n", + " * Use the space below and explore these tutorials. \n", + " * Then, apply your new knowledge to the prompt above.\n", + "* Hint: After aggregating, your column name will no longer be relevant. For example, if you use `scope_of_work` to count the number of projects, this column no longer represents `scope_of_work`. It should be renamed something like `n_projects`.\n", + " * Rename your columns using this `df.rename(columns={\"old_column_name\":\"new_column_name\"})`" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "7328fcf2-ea52-46b8-8624-a7f3f39428df", "metadata": {}, "outputs": [], @@ -446,7 +938,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "id": "8dc4063c-1150-4b67-a125-16f245f4b9c4", "metadata": {}, "outputs": [], @@ -456,7 +948,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "0892a805-7d7f-47cf-b086-f5e320c5361c", "metadata": {}, "outputs": [], @@ -477,7 +969,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "94c178b1-ff70-4d63-8820-aef101928c75", "metadata": {}, "outputs": [], @@ -489,10 +981,160 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "id": "70178e81-0d11-4d19-9001-96e466d6dced", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtmedian_scoremin_scoremax_scoren_projects
0169.5069702
1272.5064746
2371.0062777
3466.0065672
4581.0081811
5666.5057856
6776.0053865
7878.5063942
8981.0048903
91080.0080801
101171.0068876
111270.0065883
\n", + "
" + ], + "text/plain": [ + " ct_district median_score min_score max_score n_projects\n", + "0 1 69.50 69 70 2\n", + "1 2 72.50 64 74 6\n", + "2 3 71.00 62 77 7\n", + "3 4 66.00 65 67 2\n", + "4 5 81.00 81 81 1\n", + "5 6 66.50 57 85 6\n", + "6 7 76.00 53 86 5\n", + "7 8 78.50 63 94 2\n", + "8 9 81.00 48 90 3\n", + "9 10 80.00 80 80 1\n", + "10 11 71.00 68 87 6\n", + "11 12 70.00 65 88 3" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "agg1" ] @@ -543,10 +1185,89 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "id": "fdcece32-d053-4b32-9e76-0f5ffed9ff52", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "alt.Chart(agg1).mark_bar().encode(x=\"ct_district\", y=\"n_projects\")" ] @@ -566,10 +1287,89 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "id": "88e1dff9-0188-49c9-b6cc-599610aca9a7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", " x=\"ct_district\", y=\"n_projects\"\n", @@ -587,10 +1387,89 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "id": "d43cae4f-1faf-48fb-8c21-559feb5243b1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_circle().encode(\n", " x=\"ct_district\", y=\"n_projects\"\n", @@ -608,12 +1487,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "id": "cb8df2a3-bf37-4fe4-833e-1259a6ad7f15", "metadata": {}, "outputs": [], "source": [ - "# Import the color palettes like so \n", + "# Import the color palettes\n", "from calitp_data_analysis import calitp_color_palette" ] }, @@ -628,23 +1507,155 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "id": "aa21d088-3360-4d3e-811c-8cc5bdb2d3a8", "metadata": { "scrolled": true, "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mType:\u001b[0m module\n", + "\u001b[0;31mString form:\u001b[0m \n", + "\u001b[0;31mFile:\u001b[0m /opt/conda/lib/python3.9/site-packages/calitp_data_analysis/calitp_color_palette.py\n", + "\u001b[0;31mSource:\u001b[0m \n", + "\u001b[0;31m# --------------------------------------------------------------#\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;31m# Cal-ITP style guide\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;31m# Google Drive > Cal-ITP Team > Project Resources >\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;31m# Branded Resources and External Comms Guidelines > Branded Resources > Style Guide\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;31m# --------------------------------------------------------------#\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0mCALITP_CATEGORY_BRIGHT_COLORS\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#2EA8CE\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# darker blue\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#EB9F3C\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# orange\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#F4D837\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# yellow\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#51BF9D\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# green\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#8CBCCB\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# lighter blue\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#9487C0\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# purple\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0mCALITP_CATEGORY_BOLD_COLORS\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#136C97\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# darker blue\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#E16B26\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# orange\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#F6BF16\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# yellow\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#00896B\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# green\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#7790A3\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# lighter blue\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#5B559C\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# purple\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0mCALITP_DIVERGING_COLORS\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#E16B26\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#EB9F3C\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# oranges\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#f6e7e1\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# linen\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#8CBCCB\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#2EA8CE\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#136C97\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# blues\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0mCALITP_SEQUENTIAL_COLORS\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#B9D6DF\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# light blue (lightest)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#8CBCCB\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# lighter blue bright\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#2EA8CE\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# darker blue bright\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#136C97\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# darker blue bold\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"#0B405B\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;31m# indigo dye (darkest)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "calitp_color_palette??" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "id": "c629f242-9b1b-49d1-b4b0-1bb956782d69", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", " x=\"ct_district\",\n", @@ -672,10 +1683,89 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "id": "9832f9fc-53a3-4c5e-ba87-4b346d6f6985", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", " x=alt.X(\"ct_district\", scale=alt.Scale(domain=[1, 12])),\n", @@ -701,10 +1791,89 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "id": "8b85dd29-88cb-4b4b-b3b7-20ee1851335e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar(size = 10).encode(\n", " x=alt.X(\"ct_district\", scale=alt.Scale(domain=[1, 12])),\n", @@ -725,7 +1894,11 @@ "source": [ "### We have only visualized one column of data. \n", "* We have only visualized one column of data, but we have a couple of columns above. \n", - "* Make a few other charts in different styles. Altair's [gallery](https://altair-viz.github.io/gallery/index.html) is a great resource for inspiration." + "* Try to customize your grid. If you can dream it, you can probably do it with Altair. \n", + "* You can turn off the grid lines, rotate the axis labels by various degrees, label the bars, add a dropdown menu to change the axis, and more. \n", + "* Make a few other charts in different styles.\n", + "* Altair's [gallery](https://altair-viz.github.io/gallery/index.html) is a great resource for inspiration.\n", + "* DDS's [portfolio](https://analysis.calitp.org/) also contains a plethora of examples.\n" ] } ], diff --git a/starter_kit/2024_basics_03.ipynb b/starter_kit/2024_basics_03.ipynb index ede84f5ae..89c3127f1 100644 --- a/starter_kit/2024_basics_03.ipynb +++ b/starter_kit/2024_basics_03.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 1, "id": "ba8a0d90-9d57-4d01-9eb4-0b255970995e", "metadata": {}, "outputs": [], @@ -74,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "c97f0ec6-bea0-401a-bb27-f37984a762eb", "metadata": {}, "outputs": [ @@ -101,8 +101,8 @@ " \n", " ct_district\n", " project_name\n", - " Scope of Work\n", - " Project Cost\n", + " scope_of_work\n", + " project_cost\n", " accessibility_score\n", " dac_accessibility_score\n", " dac_traffic_impacts_score\n", @@ -149,10 +149,10 @@ " ct_district project_name \\\n", "0 2 Meadow Magic Multi-Use Path \n", "\n", - " Scope of Work \\\n", + " scope_of_work \\\n", "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", "\n", - " Project Cost accessibility_score dac_accessibility_score \\\n", + " project_cost accessibility_score dac_accessibility_score \\\n", "0 6265525 1 8 \n", "\n", " dac_traffic_impacts_score freight_efficiency_score \\\n", @@ -168,7 +168,7 @@ "0 2 4 66 " ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -204,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "6a6b817f-15e2-4d1c-aeae-5d7e9661a6f0", "metadata": {}, "outputs": [], @@ -228,7 +228,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "ea4a4df7-61ec-430b-a827-302704857318", "metadata": {}, "outputs": [ @@ -236,15 +236,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_359/3727765838.py:2: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.\n", - " df[\"Scope of Work\"]\n" + "/tmp/ipykernel_493/3600759827.py:2: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.\n", + " df.scope_of_work.str.lower()\n" ] } ], "source": [ - "df[\"Scope of Work\"] = (\n", - " df[\"Scope of Work\"]\n", - " .str.lower()\n", + "df.scope_of_work = (\n", + " df.scope_of_work.str.lower()\n", " .str.strip()\n", " .str.replace(\"-\", \" \")\n", " .str.replace(\"+\", \" \")\n", @@ -266,22 +265,22 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "315228d8-a72e-4f18-a0e7-2a254c87cc23", "metadata": {}, "outputs": [], "source": [ - "preview_subset = [\"project_name\", \"Scope of Work\"]" + "preview_subset = [\"project_name\", \"scope_of_work\"]" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "be843d6a-b751-4e9f-8820-b521089914d3", "metadata": {}, "outputs": [], "source": [ - "transit_only_projects = df.loc[df[\"Scope of Work\"].str.contains(\"transit\")]" + "transit_only_projects = df.loc[df.scope_of_work.str.contains(\"transit\")]" ] }, { @@ -295,7 +294,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "0d9a6259-8748-41fe-a549-01bdf0e9c273", "metadata": {}, "outputs": [ @@ -305,7 +304,7 @@ "7" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -316,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "6789307c-5808-4501-a1a6-5a14a12b0219", "metadata": {}, "outputs": [ @@ -342,7 +341,7 @@ " \n", " \n", " project_name\n", - " Scope of Work\n", + " scope_of_work\n", " \n", " \n", " \n", @@ -395,7 +394,7 @@ "27 Park and Ride Petal Paradise \n", "43 Brookside Bus Blossom Lane \n", "\n", - " Scope of Work \n", + " scope_of_work \n", "11 managed lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices. \n", "16 an intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion. \n", "19 new, eco friendly rolling stock for public transit, incorporating advanced propulsion systems, comfortable seating, and onboard amenities. \n", @@ -405,7 +404,7 @@ "43 prioritize public transportation and enhance air quality by dedicating lanes to buses and hovs on brookside boulevard, integrating smart traffic signals and real time transit information inspired by the ancient elves. " ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -430,7 +429,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "c2575f75-44ac-46ba-a334-fdf984546cd3", "metadata": {}, "outputs": [], @@ -440,7 +439,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "f6a2a521-c0ae-4c2d-830d-4020a13855f2", "metadata": {}, "outputs": [ @@ -450,7 +449,7 @@ "'(transit|passenger rail|bus|ferry)'" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -471,7 +470,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "e5e23b6f-98b8-4219-bc52-d847ea39d121", "metadata": {}, "outputs": [ @@ -479,8 +478,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_359/2441750228.py:1: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)][preview_subset]\n" + "/tmp/ipykernel_493/1070197006.py:1: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " df.loc[df.scope_of_work.str.contains(transit_keywords)][preview_subset]\n" ] }, { @@ -505,7 +504,7 @@ " \n", " \n", " project_name\n", - " Scope of Work\n", + " scope_of_work\n", " \n", " \n", " \n", @@ -570,7 +569,7 @@ "27 Park and Ride Petal Paradise \n", "43 Brookside Bus Blossom Lane \n", "\n", - " Scope of Work \n", + " scope_of_work \n", "11 managed lanes prioritizing carpools, clean vehicles, and public transit, featuring real time traffic updates and incentives for sustainable transportation choices. \n", "16 an intelligent transportation system integrating traffic management, real time transit information, and smart parking solutions to enhance mobility and reduce congestion. \n", "18 a 30 mile passenger rail line connecting coastal towns, featuring modern train sets, enhanced station amenities, and scenic viewing cars. \n", @@ -582,18 +581,18 @@ "43 prioritize public transportation and enhance air quality by dedicating lanes to buses and hovs on brookside boulevard, integrating smart traffic signals and real time transit information inspired by the ancient elves. " ] }, - "execution_count": 16, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)][preview_subset]" + "df.loc[df.scope_of_work.str.contains(transit_keywords)][preview_subset]" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "7b62f28d-7b28-4258-8efa-74d1f9a41d04", "metadata": {}, "outputs": [ @@ -609,14 +608,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_359/1261237332.py:3: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " print(len(df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)]))\n" + "/tmp/ipykernel_493/2770509021.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " print(len(df.loc[df.scope_of_work.str.contains(transit_keywords)]))\n" ] } ], "source": [ "print(len(transit_only_projects))\n", - "print(len(df.loc[df[\"Scope of Work\"].str.contains(transit_keywords)]))" + "print(len(df.loc[df.scope_of_work.str.contains(transit_keywords)]))" ] }, { @@ -631,7 +630,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "47afb269-672f-44c1-8ab5-d70921c6e703", "metadata": {}, "outputs": [ @@ -639,14 +638,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_359/1837788452.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " (df[\"Scope of Work\"].str.contains(transit_keywords)),\n" + "/tmp/ipykernel_493/653877654.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " (df.scope_of_work.str.contains(transit_keywords)),\n" ] } ], "source": [ "df[\"Transit\"] = np.where(\n", - " (df[\"Scope of Work\"].str.contains(transit_keywords)),\n", + " (df.scope_of_work.str.contains(transit_keywords)),\n", " \"Y\",\n", " \"N\",\n", ")" @@ -662,7 +661,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "c63f2ff8-3d2f-41c6-96d1-36d35159aef8", "metadata": {}, "outputs": [ @@ -674,7 +673,7 @@ "Name: Transit, dtype: int64" ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -685,7 +684,7 @@ }, { "cell_type": "markdown", - "id": "651cf0bd-3bb1-44a7-a436-8f9b4d90a488", + "id": "f18b2040-37f0-4e1a-b7ab-484eea69f1f9", "metadata": { "tags": [] }, @@ -696,14 +695,118 @@ "* We could repeat the steps above or we can use a function.\n", " * You can think of a function as a piece of code you write only once but reuse more than once.\n", " * In the long run, functions save you work and look neater when you present your work.\n", - "* Resources: Functions are incredibly important. Please spend more time than usual on this section and practice the tutorials linked.\n", - " * [Please read this great tutorial.](https://www.practicalpythonfordatascience.com/00_python_crash_course_functions)\n", - " * [And refer to this page on our docs.](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)" + "* You may not have realized this but you've been using functions this whole time.\n", + " * When you are taking the `len()` you are using a built-in function to find the number of rows in a dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "8c62fef2-8215-4983-a4e6-c671177b822f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "44" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "markdown", + "id": "c2180f69-6b3d-465c-8dda-a067e24f4ed1", + "metadata": {}, + "source": [ + "* `type` too is a built-in function that tells you what type of variable you are looking at. " + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "0659a036-76ad-4251-80a1-323a0a04c912", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.frame.DataFrame" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "2985ec16-35e1-4eae-b2c5-facb354ce4e5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(GCS_FILE_PATH)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, + "id": "65c6b0c7-a314-434f-8304-10afd6c84514", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "list" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(transit)" + ] + }, + { + "cell_type": "markdown", + "id": "b2a5b9d7-1b39-419e-892a-fe44da7a4cf0", + "metadata": { + "tags": [] + }, + "source": [ + "### Practice with outside resources\n", + "* Functions are incredibly important.**Please spend more time than usual on this section and practice the tutorials linked.**\n", + "* [Please read this great tutorial.](https://www.practicalpythonfordatascience.com/00_python_crash_course_functions)\n", + "* [And refer to this page on our docs.](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, "id": "00ead246-8879-4075-a632-d0ded58df558", "metadata": {}, "outputs": [], @@ -725,7 +828,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "97e597a2-8625-4f2b-8646-760c0c011208", "metadata": {}, "outputs": [], @@ -747,7 +850,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "61973dc6-d99b-48f0-842f-a3c8fe74f064", "metadata": {}, "outputs": [], @@ -766,7 +869,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "a794693a-3bf2-48ba-b0a7-1ca3a41e03af", "metadata": {}, "outputs": [], @@ -781,24 +884,25 @@ "source": [ "* Think about the steps we took to categorize transit only.\n", "* Add the sections of the code we will be reusing and sub in the original variables for the arguments.\n", - " * First, we joined the keywords from a list into a tuple.\n", + " * First, we joined the keywords from a list into a big string.\n", " * Second, we searched through the Scope of Work column for the keywords.\n", - " * Third, if we find the keyword, we will tag the project as \"Y\" in the column \"new_column\". If the keyword isn't found, the project is tagged as \"N\"." + " * Third, if we find the keyword, we will tag the project as \"Y\" in the column \"new_column\". If the keyword isn't found, the project is tagged as \"N\".\n" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 23, "id": "4721b564-726a-4e05-9d27-8035609b5fcf", "metadata": {}, "outputs": [], "source": [ "def categorize(df: pd.DataFrame, keywords: list, new_column: str) -> pd.DataFrame:\n", - " joined_keywords = f\"({'|'.join(keywords)})\" # Remember this used to be the list called transit_keywords, but it must be changed into a tuple.\n", + " \n", + " # Remember this used to be the list called transit_keywords, but it must be changed into a long string\n", + " joined_keywords = f\"({'|'.join(keywords)})\" \n", "\n", " # We are now creating a new column: notice how parameters has no quotation marks.\n", - " df[new_column] = np.where(\n", - " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n", + " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)), \n", " \"Y\",\n", " \"N\",\n", " )\n", @@ -817,7 +921,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "id": "23e31c98-17b3-41e2-883a-14dae9d6da7e", "metadata": {}, "outputs": [ @@ -825,8 +929,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_359/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + "/tmp/ipykernel_493/1188347530.py:5: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" ] } ], @@ -836,7 +940,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 25, "id": "d5ec64cf-432c-45e2-b14d-f4ea7ca3de2a", "metadata": {}, "outputs": [ @@ -848,7 +952,7 @@ "Name: ATP, dtype: int64" ] }, - "execution_count": 22, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -859,7 +963,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 26, "id": "882a02a6-ce39-4da2-b2be-7e91322624e4", "metadata": {}, "outputs": [ @@ -867,8 +971,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_359/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + "/tmp/ipykernel_493/1188347530.py:5: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" ] } ], @@ -878,7 +982,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 27, "id": "ee56ee97-307c-44a4-a2d4-b02eff954f87", "metadata": {}, "outputs": [ @@ -886,8 +990,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_359/1955324842.py:8: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " (df[\"Scope of Work\"].str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + "/tmp/ipykernel_493/1188347530.py:5: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" ] } ], @@ -897,7 +1001,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 28, "id": "96f2efba-4179-4a8c-b969-fd2990f8a129", "metadata": {}, "outputs": [ @@ -909,7 +1013,7 @@ "Name: General_Lanes, dtype: int64" ] }, - "execution_count": 25, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -924,12 +1028,13 @@ "metadata": {}, "source": [ "* Use the `groupby` technique from Exercise 2 to get some descriptive statistics for these 3 new columns\n", - "* Use `.reset_index()` after `aggregate()` to see what happens." + "* Use `.reset_index()` after `aggregate()` to see what happens.\n", + "* Try `.reset_index(drop = True)` as well. " ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 29, "id": "62115dcb-ea34-4bb1-9bd1-e678ec015b8c", "metadata": {}, "outputs": [ @@ -976,7 +1081,7 @@ " N\n", " Y\n", " 11\n", - " 75.00\n", + " 70.00\n", " \n", " \n", " 2\n", @@ -984,7 +1089,7 @@ " Y\n", " N\n", " 8\n", - " 78.00\n", + " 68.00\n", " \n", " \n", " 3\n", @@ -992,7 +1097,7 @@ " Y\n", " Y\n", " 1\n", - " 83.00\n", + " 73.00\n", " \n", " \n", " 4\n", @@ -1000,7 +1105,7 @@ " N\n", " N\n", " 2\n", - " 65.50\n", + " 75.50\n", " \n", " \n", " 5\n", @@ -1008,7 +1113,7 @@ " N\n", " Y\n", " 2\n", - " 88.00\n", + " 83.00\n", " \n", " \n", "\n", @@ -1017,14 +1122,14 @@ "text/plain": [ " General_Lanes Transit ATP project_name overall_score\n", "0 N N N 20 73.00\n", - "1 N N Y 11 75.00\n", - "2 N Y N 8 78.00\n", - "3 N Y Y 1 83.00\n", - "4 Y N N 2 65.50\n", - "5 Y N Y 2 88.00" + "1 N N Y 11 70.00\n", + "2 N Y N 8 68.00\n", + "3 N Y Y 1 73.00\n", + "4 Y N N 2 75.50\n", + "5 Y N Y 2 83.00" ] }, - "execution_count": 39, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1041,21 +1146,43 @@ "metadata": {}, "source": [ "## Function + If-Else\n", - "* Above, we can see all types of combinations of categories a project can fall into. \n", - "* Let's do away with these \"Y\" and \"N\" columns and create actual categories in an actual column called `categories`.\n", - "* If a project has \"N\" for all 3 of the General Lane, Transit, and ATP columns, it should be `Other`. \n", - "* If a project has \"Y\" for all 3, it should be categorized as \"General Lane, Transit, and ATP\".\n", - "* If a project has \"Y\" for only ATP and Transit, it should be categorized as \"Transit and ATP\".\n", - "* Yes this will be very tedious given all the combinations!\n", - "* To write the function to create these categories, read these resources:\n", + "* There are many cases in which we want to categorize our columns to create broader groups for summarizing and aggregating.\n", + "* Using a function with an If-Else clause will help us accomplish this goal.\n", + "* Goal: \n", + " * We are going to write an If-Else function that categorizes projects by whether it scored low, medium, or high based on its `overall_score`.\n", + " * If a project scores below the 25% percentile, it is a \"low scoring project\".\n", + " * If a project scores above the 25% percentile but below the 75% percentile, it is a \"medium scoring project\".\n", + " * Anything above the 75% percentile is \"high scoring\".\n", + " * Use the values you find from .describe() as reference.\n", + " * You aren't limited to only the 25th, 50th, and 75th percentile. Try some other percentiles.\n", + " * You can do so by specifying within `describe` like `.describe(percentiles=[0.05, 0.1, 0.9, 0.95])`.\n", + " * You can save whatever percentile you like using `p75 = df.overall_score.quantile(0.75).astype(float)`.\n", + "* Resources for further reading:\n", " * [DDS Apply Docs](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)\n", " * [DDS If-Else Tutorial](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#if-else-statements)\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "d91c41b1-76c4-4673-b16f-ef9990d66270", + "metadata": {}, + "source": [ + "### Practice #2\n", + "* Goal:\n", + " * Above, we can see all types of combinations of categories a project can fall into. \n", + " * Let's do away with these \"Y\" and \"N\" columns and create actual categories in an actual column called `categories`.\n", + " * If a project has \"N\" for all 3 of the General Lane, Transit, and ATP columns, it should be `Other`. \n", + " * If a project has \"Y\" for all 3, it should be categorized as \"General Lane, Transit, and ATP\".\n", + " * If a project has \"Y\" for only ATP and Transit, it should be categorized as \"Transit and ATP\".\n", + " * Yes this will be very tedious given all the combinations!\n", + "* Resource:\n", " * [Geeks for Geeks: if-else with multiple conditions](https://www.geeksforgeeks.org/check-multiple-conditions-in-if-statement-python/)" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 30, "id": "d560dad0-de03-4469-99f8-5fadd9b198dc", "metadata": {}, "outputs": [], @@ -1079,7 +1206,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 31, "id": "f8b7d946-c724-43cb-9a93-d1003f7f024f", "metadata": {}, "outputs": [], @@ -1090,24 +1217,137 @@ }, { "cell_type": "markdown", - "id": "d91c41b1-76c4-4673-b16f-ef9990d66270", + "id": "df815f56-c2ed-43ff-9180-147beddcffe0", "metadata": {}, "source": [ - "### Practice #2:\n", - "* Please write another if-else function that categorizes projects by whether they are low, medium, or high scoring.\n", - "* Use the values you find from `.describe()` as reference.\n", - " * You aren't limited to only the 25th, 50th, and 75th percentile. \n", - " * Specify `.describe(percentiles=[0.05, 0.1, 0.9, 0.95])`\n", - "* You can find save thewhatever percentile you like using \n", - " `p75 = df.overall_score.quantile(0.75).astype(float)`" + "### Please export your output as a `.parquet` to GCS before moving onto the next step" ] }, { - "cell_type": "markdown", - "id": "df815f56-c2ed-43ff-9180-147beddcffe0", + "cell_type": "code", + "execution_count": 32, + "id": "f18a7754-907c-46fa-ad77-4a09abb03206", "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ct_districtproject_namescope_of_workproject_costaccessibility_scoredac_accessibility_scoredac_traffic_impacts_scorefreight_efficiency_scorefreight_sustainability_scoremode_shift_scorelu_natural_resources_scoresafety_scorevmt_scorezev_scorepublic_engagement_scoreclimate_resilience_scoreprogram_fit_scoreoverall_scoreTransitATPGeneral_Lanescategory
02Meadow Magic Multi-Use Patha 2 mile class i bike lane and multi use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.626552518931038221042466NYNATP
\n", + "
" + ], + "text/plain": [ + " ct_district project_name \\\n", + "0 2 Meadow Magic Multi-Use Path \n", + "\n", + " scope_of_work \\\n", + "0 a 2 mile class i bike lane and multi use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", + "\n", + " project_cost accessibility_score dac_accessibility_score \\\n", + "0 6265525 1 8 \n", + "\n", + " dac_traffic_impacts_score freight_efficiency_score \\\n", + "0 9 3 \n", + "\n", + " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", + "0 10 3 8 \n", + "\n", + " safety_score vmt_score zev_score public_engagement_score \\\n", + "0 2 2 10 4 \n", + "\n", + " climate_resilience_score program_fit_score overall_score Transit ATP \\\n", + "0 2 4 66 N Y \n", + "\n", + " General_Lanes category \n", + "0 N ATP " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "### Please export your output as a `.parquet` to GCS before moving onto the next step" + "df.head(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "2245ce0c-97fb-4f08-9791-9fb6b28b49c7", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "df.to_parquet(f\"{GCS_FILE_PATH}starter_kit_example_categorized.parquet\")" ] }, { @@ -1122,7 +1362,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 35, "id": "48495a9f-e29c-41eb-b3e7-de6371fbd182", "metadata": {}, "outputs": [ @@ -1160,7 +1400,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 36, "id": "fca9e430-a906-4d0e-8046-36a0687b0636", "metadata": {}, "outputs": [ @@ -1254,7 +1494,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 37, "id": "5b414d3f-71a4-4078-9d98-b9082114e2c5", "metadata": {}, "outputs": [], @@ -1262,13 +1502,13 @@ "agg1 = (\n", " df.groupby([\"category\"])\n", " .aggregate(\n", - " {\"overall_score\": \"median\", \"Project Cost\": \"median\", \"project_name\": \"nunique\"}\n", + " {\"overall_score\": \"median\", \"project_cost\": \"median\", \"project_name\": \"nunique\"}\n", " )\n", " .reset_index()\n", " .rename(\n", " columns={\n", " \"overall_score\": \"median_score\",\n", - " \"Project Cost\": \"median_project_cost\",\n", + " \"project_cost\": \"median_project_cost\",\n", " \"project_name\": \"total_projects\",\n", " }\n", " )\n", @@ -1277,7 +1517,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 38, "id": "1698fe9c-6d1f-412b-a632-826aae1ffc65", "metadata": {}, "outputs": [ @@ -1312,21 +1552,21 @@ " \n", " 0\n", " ATP\n", - " 75.00\n", + " 70.00\n", " 6238994.00\n", " 11\n", " \n", " \n", " 1\n", " General Lanes\n", - " 65.50\n", + " 75.50\n", " 4172279.00\n", " 2\n", " \n", " \n", " 2\n", " General Lanes and ATP\n", - " 88.00\n", + " 83.00\n", " 8663951.00\n", " 2\n", " \n", @@ -1340,14 +1580,14 @@ " \n", " 4\n", " Transit\n", - " 78.00\n", + " 68.00\n", " 3510634.00\n", " 8\n", " \n", " \n", " 5\n", " Transit and ATP\n", - " 83.00\n", + " 73.00\n", " 7285919.00\n", " 1\n", " \n", @@ -1357,15 +1597,15 @@ ], "text/plain": [ " category median_score median_project_cost total_projects\n", - "0 ATP 75.00 6238994.00 11\n", - "1 General Lanes 65.50 4172279.00 2\n", - "2 General Lanes and ATP 88.00 8663951.00 2\n", + "0 ATP 70.00 6238994.00 11\n", + "1 General Lanes 75.50 4172279.00 2\n", + "2 General Lanes and ATP 83.00 8663951.00 2\n", "3 Other 73.00 5232062.00 20\n", - "4 Transit 78.00 3510634.00 8\n", - "5 Transit and ATP 83.00 7285919.00 1" + "4 Transit 68.00 3510634.00 8\n", + "5 Transit and ATP 73.00 7285919.00 1" ] }, - "execution_count": 54, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1384,13 +1624,13 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 39, "id": "320bd91e-b9ed-4423-80d4-c1a1aa5ba59f", "metadata": {}, "outputs": [], "source": [ "def create_chart(df: pd.DataFrame, column: str) -> alt.Chart:\n", - " title = column.replace(\"_\",\" \").title()\n", + " title = column.replace(\"_\", \" \").title()\n", " chart = (\n", " alt.Chart(df, title=f\"{title} by Categories\")\n", " .mark_bar(size=20)\n", @@ -1420,7 +1660,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 40, "id": "a6103703-8131-4ed8-9482-314c7895c279", "metadata": {}, "outputs": [ @@ -1429,23 +1669,23 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, - "execution_count": 86, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1520,7 +1760,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 41, "id": "ca8659f1-0842-4bb5-a544-9a2a5fb93c02", "metadata": {}, "outputs": [ @@ -1529,23 +1769,23 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ @@ -1606,23 +1846,23 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ @@ -1683,23 +1923,23 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ diff --git a/starter_kit/2024_basics_04.ipynb b/starter_kit/2024_basics_04.ipynb index 94b20f9d6..e38d70769 100644 --- a/starter_kit/2024_basics_04.ipynb +++ b/starter_kit/2024_basics_04.ipynb @@ -5,7 +5,7 @@ "id": "05dd29e6-ec3f-4f9d-a595-d28b578c74e3", "metadata": {}, "source": [ - "# Exercise 4: Python Scripts, Display, Markdown, Preparing for the Portfolio\n", + "# Exercise 4: Python Scripts, Concept of Grains, Display, Markdown,\n", "* Cleaning and analyzing data takes a lot of time, patience, and skill.\n", "* However, presenting the data to stakeholders is also equaly important.\n", "* At DDS, we often present our work in a Jupyter Notebook.\n", @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "1d4e2cdf-a5b9-4ebb-aa2f-c7abe897a683", "metadata": {}, "outputs": [], @@ -28,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "a0403b50-d81c-4499-9b69-e164eb38f8cd", "metadata": {}, "outputs": [], @@ -64,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "68d8980b-e857-491e-b03a-4648c5f4c5f3", "metadata": {}, "outputs": [], @@ -87,7 +87,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "44467ccf-599f-4662-8164-8a58fac85711", "metadata": {}, "outputs": [], @@ -107,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "f9635fe8-a6c7-4813-9f25-7ba555ce9726", "metadata": {}, "outputs": [], @@ -117,10 +117,99 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "2bdcb3e6-2add-4af6-a20a-9072b7ba075c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CategoryMedian ScoreMedian Project CostTotal Projects
0ATP70.00$6,238,99411
1General Lanes75.50$4,172,2792
2General Lanes and ATP83.00$8,663,9512
3Other73.00$5,232,06220
4Transit68.00$3,510,6348
5Transit and ATP73.00$7,285,9191
\n", + "
" + ], + "text/plain": [ + " Category Median Score Median Project Cost Total Projects\n", + "0 ATP 70.00 $6,238,994 11\n", + "1 General Lanes 75.50 $4,172,279 2\n", + "2 General Lanes and ATP 83.00 $8,663,951 2\n", + "3 Other 73.00 $5,232,062 20\n", + "4 Transit 68.00 $3,510,634 8\n", + "5 Transit and ATP 73.00 $7,285,919 1" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "aggregated_df" ] @@ -138,7 +227,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "82172952-3d59-436e-b08c-7096454b6e04", "metadata": {}, "outputs": [], @@ -148,10 +237,67 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "1bcac91b-b0a1-4efd-8a73-f019c376d030", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CalTrans DistrictProject NameMetricScore
02Meadow Magic Multi-Use PathAccessibility Score1
13Bunny Hop Bike BoulevardAccessibility Score9
\n", + "
" + ], + "text/plain": [ + " CalTrans District Project Name Metric Score\n", + "0 2 Meadow Magic Multi-Use Path Accessibility Score 1\n", + "1 3 Bunny Hop Bike Boulevard Accessibility Score 9" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df2.head(2)" ] @@ -168,10 +314,76 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "d69a4f91-4e37-4207-93e0-2eaa18f998ff", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CategoryMedian ScoreMedian Project CostTotal Projects
ATP70$6,238,99411
General Lanes76$4,172,2792
General Lanes and ATP83$8,663,9512
Other73$5,232,06220
Transit68$3,510,6348
Transit and ATP73$7,285,9191
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "_starterkit_utils.style_df(aggregated_df)" ] @@ -187,7 +399,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "cb9bee7d-62df-4a0d-8ab2-483bb0d977f2", "metadata": {}, "outputs": [], @@ -197,21 +409,112 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "7f39ca4e-9fb9-497d-bee6-22be385a9d34", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "_starterkit_utils.create_metric_chart(d2_wide_df)" ] }, { "cell_type": "markdown", - "id": "0f14c7d5-d9b7-40db-9e42-9dd1369971e2", + "id": "e268d5f7-30f6-4b36-bfa3-1391dfa772f9", "metadata": {}, "source": [ - "## Your Script\n", + "## Grains\n", "* Create your own `.py` file with your own functions. \n", + "* Please note, you will be using these functions for Exercise 5. Make sure your functions make sense for the single district grain.\n", + " * Grain means the level your dataset is presented at. \n", + " * The original dataset is presented on the project-level grain because each row represents a unique project. \n", + " * If we aggregate the dataset without using Caltrans District, then this dataset would be represented on a state-wide grain because one row = represents the entire state." + ] + }, + { + "cell_type": "markdown", + "id": "6fc393e2-bfcf-40fc-b6f1-5aa90e0c9715", + "metadata": {}, + "source": [ + "## Create your own Script\n", "* Make sure to separate out functions by theme:\n", " * One function that loads the dataset and does some light cleaning.\n", " * One (or more) functions that transform your dataframe.\n", @@ -223,7 +526,7 @@ " * Are the currency columns formatted with $ and commas?\n", " * Are all the scores formatted with the same number of decimals?\n", " * Are the string columns formatted with the right punctuation and capitalization?\n", - "* Please note, you will be using these functions for Exercise 5. Make sure your functions are on the district grain. " + " * Are the column names formatted properly? While `snake_case` is very handy when we are analyzing the dataframe, it is not slightly when presenting the data. We typically reverse the `snake_case` back to something like `Project Name`." ] }, { @@ -251,7 +554,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "4ec41786-491f-46ad-963e-f380d8095ade", "metadata": {}, "outputs": [], @@ -261,10 +564,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "8d0a6849-f178-46fc-919a-f45b5436c423", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAgEAYABgAAD/4RvKRXhpZgAATU0AKgAAAAgADQEOAAIAAAAQAAAAqgESAAMAAAABAAEAAAEaAAUAAAABAAAAugEbAAUAAAABAAAAwgEoAAMAAAABAAIAAAExAAIAAAAcAAAAygEyAAIAAAAUAAAA5gE7AAIAAAAcAAAA+oKYAAIAAAAcAAABFpybAAEAAAAgAAABMpydAAEAAAA4AAABUuocAAcAAAfEAAABiodpAAQAAAABAAAJUAAAEZRMaWdodG5pbmcgc3Rvcm0AAA6mAAAAJxAADqYAAAAnEEFkb2JlIFBob3Rvc2hvcCBDUzMgV2luZG93cwAyMDExOjAzOjIzIDE1OjU4OjQ1AERlc2lnbiBQaWNzIFJGL0dldHR5IEltYWdlcwBEZXNpZ24gUGljcyBSRi9HZXR0eSBJbWFnZXMATABpAGcAaAB0AG4AaQBuAGcAIABzAHQAbwByAG0AAABEAGUAcwBpAGcAbgAgAFAAaQBjAHMAIABSAEYALwBHAGUAdAB0AHkAIABJAG0AYQBnAGUAcwAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKABAAMAAAAB//8AAKACAAQAAAABAAAHgKADAAQAAAABAAAEsOocAAcAAAgMAAAJhgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAAEeIBGwAFAAAAAQAAEeoBKAADAAAAAQACAAACAQAEAAAAAQAAEfICAgAEAAAAAQAACdAAAAAAAAAASAAAAAEAAABIAAAAAf/Y/+AAEEpGSUYAAQIAAEgASAAA/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCABkAKADASIAAhEBAxEB/90ABAAK/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwDuyFAhFIUCE1uhE4ITgjuCE4ILwhIQ3BGIUHBJeEDghuajuCG4IMga7moTwrLmoL2pMgarmobgrDmoTmoLwgLVEhFLVEgJJRFqYtV+npHUbwHV0O2u4c4hgPw9QtUn9D6iASK22Furmse1zh/ZSWHLjBozj9ocyEoRC2CQRBGhB0IKaElyPalCJtTbUlP/0O+KgQiFRcmt0InIbkVyG5BcERCg5EKgUmQIiFAhFIUCEGQIXBBeEdwQnhJeEDgguCO4ITggyBCQpYuXj4uWLMmw1VNZIIbuJJkNH9X2oGZlVYrQXn3Ona3vDdXu/srieqHJzsyy1mSHPrId6G4j02O0a6f8J7Pp2bkGtzWUAe2Nzv5Poeb1+k0+ux5sdUwsBB7OB2u2fyn/AKNyo9P+sFjur5TW0Wb+mWOpzrayHVGuuW2fzgpf9o3Mf+j965DojzZQazcSWE7ay3cxwP8Aox+b+d7/AKC7fp+XhW4VmJnVt9Z4LBdSW+rBb6MufX7LbK2e3e/1f9Gg0271DIwOqA5NDfTyG/TIgl4ifcz27v8AjFkws3oecK6r8e14bZ0+x1JsPt4Oxtmwz+juhazw07XsEBwkt/dcNHMRbfKZP0Cf7v8A3qKEoU4TQi2n/9HvyouUiouTW4GDkJyIUNyC8IyolSKgUmQMShlTKgSgvCNyC9GcgvSZAichORXILigvDz/1jz247ywAuudWK6q28kuO95/qtbsWOzBwH5TXZJisiGPYPducPa1o/wAI3+Qodetut65mMoBfY+wY9YGriR6TPSYfzfUt/RN2/wDotbGP0r7OGsfeBbjtDLDtBYXxLn1T+64+kgdnPyWZyl/Wr/vf+i5bGVdNzjaQbKzP0mwSPzNHe32rRoz7LrTY3cA6XNZsDYPfa1n73ud7lfbg9NAcb8hxD+Q/UTx7fbtVmnD6Y2X10es7nda89wS72M/lJtrKeY3Xfti/Nx6vWB9z2RuBaAN7H/ynV+pt/lrrGuqdTU+pwfXawOY5uo0mtw3fv6e5Dpcyu4Gtjap+iGNETz2S/ZObgvF+Mzf0nIcXkAicew/TrfW73ehe/b9mtr/m/wCYs/waIK7EeHJE+IH2s0ydRlOdN//S78qBUioEprdDFyE5EchOQXBgVElOVAlJkDFxQyVJxUCUF4YOKC8ojihOKTIEbihOKm4obigyBoV9Iw6up29TbudfYS4NcRsY4j032VNj6b/d/nolmO13qmJJM/eFYJQKchn259TjILQIQOzX5mMY49BVytBVVW0OYTIIgxx8FKu1tNRbEObrPYdlLqVLaQbKxpHKoYj68gemPa6TPhofamtN0MQlzgdXEnnsup2Ns6e/GOpdURHgfpM/6bVg4lQraCGeBW1iuJta2PpQD5aE/wDfkQgmiCOmrzm6RKYpOaa3urPLCWn5Haokpzq2/wD/0+8JUCU5KgSmt1ZxQnFTcUJxQXhiSoOckSoOKTIFnFCc5Sc5CcUF4YuchOcpOKE8pMgYuchkpyhucgvCi6AT4arD+0OZli8akkgx4/SWy7UEeK57Kea8hzD7ZEgeBCBa3N36e2rv2OGVSNmtbtQR5j6KB0bAFDXvt/nHOdI7AJum9TrOBwBbWC2wHgkfQc3+s1yyumdXyLc+7GBO4vbpzodP++oNR65vqN2sqabHO9rWNGpn4q/gl0kW6PZBI8z9Lcmoy8Sij1bJBDS4lup0/dUKbzbLrBtfc42Ejs4/SZ/mJLXN6ywV9Rsjh4a+RwSR7j+Coko2feL8p72nc1vsafEN0lVpKc6mMEQiDvwh/9T0Q01/uhRNNX7gRi1RIKazcR7lA6ir9wIbqKP9GPxVghQcElwke5a5x6P9GPxUTj4/+jH4/wB6sbU21JPGe5+1rHExj/gm/j/eonDxv9E38f71a2FNsKC7jl+8ftaZwcTvU38f71B2Fg96m/ef71dNU8obsVrkkjJL94/a0XYnThzW37z/AOSQX0dJbzU37z/5JXbOl1P5JVZ/1dxnmS5w+aC8ZO85fa07beh0sdZZW1rGAue6TAA+kfpLg+tfWLDy8gX4+D9nx2e3e2wvc7u19rY9jtv7i9Ed9V8UtcN7jI4MH8qp5P1I6Vl2b8iX+0Nho9NhA43V0+nvd/KQN9lmXJegkSP6xeJ6NluvzHU0FjxYATr+aD7o/wA5amF0WrH6lkXNtBdZsa0c7Y3WOlw/0nt2rQxv8WOHiZYycTMsBEg1WNBYQ4RsO0sftVzE+qXVMWywNfTbW9xfu3ua5xPsY3b6b/S9Ov8AloEMQle6W6/7Pi77m78Zr2tcxpBeWO3OM7v3Nqe7INmdXW1v6vo57ojeG+07HN9rva79Iro+rtmQyhme4MqpJO2lzi4mfb74Z9Fu9i08fpfT8fEqxKmF1dTi5gsJc7+tZaTvsclRTxAFpfsfpwMDHr+5P+ycD/uNV/mrSFLWiAAAOAEvTHdOpf7sv3j9r//V9KKYr5hSQZH6bMKDl8zpIJfpbRLRfNKSSX6V0TL5rSSS/SiS+a0klP0mlovmxJBT9JqDtu7svm9JJaX6QbE6cqYiSvmxJJD9Le3aJ40SdtkL5pSSU/Sj52HZ9Ltx/wB+9qF+tacTu/kfRXzgkiuf/9n/7RFsUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAG8cAgAAAm6UHAJ4AA9MaWdodG5pbmcgc3Rvcm0cAlAAG0Rlc2lnbiBQaWNzIFJGL0dldHR5IEltYWdlcxwCBQAPTGlnaHRuaW5nIHN0b3JtHAJ0ABtEZXNpZ24gUGljcyBSRi9HZXR0eSBJbWFnZXMAOEJJTQQlAAAAAAAQ/t8TV1QBym+25eNyYBIB9ThCSU0D7QAAAAAAEABgAAAAAQABAGAAAAABAAE4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAAAB44QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0ECgAAAAAAAQAAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklNBAgAAAAAAB8AAAABAAACQAAAAkAAAAADAADvYAAAAJVgAQAA22AAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA0UAAAAGAAAAAAAAAAAAAASwAAAHgAAAAAgATwBuAGUAQgB1AG4AbgB5AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAeAAAAEsAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABAAAAABAAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAEsAAAAABSZ2h0bG9uZwAAB4AAAAAGc2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAABXNsaWNlAAAAEgAAAAdzbGljZUlEbG9uZwAAAAAAAAAHZ3JvdXBJRGxvbmcAAAAAAAAABm9yaWdpbmVudW0AAAAMRVNsaWNlT3JpZ2luAAAADWF1dG9HZW5lcmF0ZWQAAAAAVHlwZWVudW0A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czp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNC4xLWMwMzYgNDYuMjc2NzIwLCBNb24gRmViIDE5IDIwMDcgMjI6NDA6MDggICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eGFwTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHhhcE1NOkluc3RhbmNlSUQ9InV1aWQ6OEYzQTJGRTNBMDU1RTAxMTgzMDdGMzdBMUZFQzFGNTYiIHhhcE1NOkRvY3VtZW50SUQ9InV1aWQ6REJEODYwNEM5QjNGRTAxMUJBMjRGMzcwMzQ3NDE2NUMiIHhhcDpDcmVhdGVEYXRlPSIyMDExLTAyLTIzVDE0OjIyOjE4LTA4OjAwIiB4YXA6TW9kaWZ5RGF0ZT0iMjAxMS0wMy0yM1QxNTo1ODo0NS0wNzowMCIgeGFwOk1ldGFkYXRhRGF0ZT0iMjAxMS0wMy0yM1QxNTo1ODo0NS0wNzowMCIgeGFwOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1MzIFdpbmRvd3MiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJBZG9iZSBSR0IgKDE5OTgpIiBwaG90b3Nob3A6SGlzdG9yeT0iIiB0aWZmOk9yaWVudGF0aW9uPSIxIiB0aWZmOlhSZXNvbHV0aW9uPSI5NjAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249Ijk2MDAwMC8xMDAwMCIgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIgdGlmZjpOYXRpdmVEaWdlc3Q9IjI1NiwyNTcsMjU4LDI1OSwyNjIsMjc0LDI3NywyODQsNTMwLDUzMSwyODIsMjgzLDI5NiwzMDEsMzE4LDMxOSw1MjksNTMyLDMwNiwyNzAsMjcxLDI3MiwzMDUsMzE1LDMzNDMyOzhDODhBQzJEREIwQjQ3OEM1REY3MTMyNDY4MDRFMUZDIiBleGlmOlBpeGVsWERpbWVuc2lvbj0iMTkyMCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjEyMDAiIGV4aWY6Q29sb3JTcGFjZT0iLTEiIGV4aWY6TmF0aXZlRGlnZXN0PSIzNjg2NCw0MDk2MCw0MDk2MSwzNzEyMSwzNzEyMiw0MDk2Miw0MDk2MywzNzUxMCw0MDk2NCwzNjg2NywzNjg2OCwzMzQzNCwzMzQzNywzNDg1MCwzNDg1MiwzNDg1NSwzNDg1NiwzNzM3NywzNzM3OCwzNzM3OSwzNzM4MCwzNzM4MSwzNzM4MiwzNzM4MywzNzM4NCwzNzM4NSwzNzM4NiwzNzM5Niw0MTQ4Myw0MTQ4NCw0MTQ4Niw0MTQ4Nyw0MTQ4OCw0MTQ5Miw0MTQ5Myw0MTQ5NSw0MTcyOCw0MTcyOSw0MTczMCw0MTk4NSw0MTk4Niw0MTk4Nyw0MTk4OCw0MTk4OSw0MTk5MCw0MTk5MSw0MTk5Miw0MTk5Myw0MTk5NCw0MTk5NSw0MTk5Niw0MjAxNiwwLDIsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMjAsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMzA7RDg2ODAyMUQxQzg2RTE3OUIzMUU5QTBDQ0Y3QjhEOUYiPiA8ZGM6dGl0bGU+IDxyZGY6QWx0PiA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPkxpZ2h0bmluZyBzdG9ybTwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDxkYzpkZXNjcmlwdGlvbj4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+TGlnaHRuaW5nIHN0b3JtPC9yZGY6bGk+IDwvcmRmOkFsdD4gPC9kYzpkZXNjcmlwdGlvbj4gPGRjOmNyZWF0b3I+IDxyZGY6U2VxPiA8cmRmOmxpPkRlc2lnbiBQaWNzIFJGL0dldHR5IEltYWdlczwvcmRmOmxpPiA8L3JkZjpTZXE+IDwvZGM6Y3JlYXRvcj4gPGRjOnJpZ2h0cz4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+RGVzaWduIFBpY3MgUkYvR2V0dHkgSW1hZ2VzPC9yZGY6bGk+IDwvcmRmOkFsdD4gPC9kYzpyaWdodHM+IDx4YXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ1dWlkOkQ4RDg2MDRDOUIzRkUwMTFCQTI0RjM3MDM0NzQxNjVDIiBzdFJlZjpkb2N1bWVudElEPSJ1dWlkOjExNDY1RUM2OTUzRkUwMTFCQTI0RjM3MDM0NzQxNjVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9InciPz7/4gJASUNDX1BST0ZJTEUAAQEAAAIwQURCRQIQAABtbnRyUkdCIFhZWiAH0AAIAAsAEwAzADthY3NwQVBQTAAAAABub25lAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUFEQkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApjcHJ0AAAA/AAAADJkZXNjAAABMAAAAGt3dHB0AAABnAAAABRia3B0AAABsAAAABRyVFJDAAABxAAAAA5nVFJDAAAB1AAAAA5iVFJDAAAB5AAAAA5yWFlaAAAB9AAAABRnWFlaAAACCAAAABRiWFlaAAACHAAAABR0ZXh0AAAAAENvcHlyaWdodCAyMDAwIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkAAAAZGVzYwAAAAAAAAARQWRvYmUgUkdCICgxOTk4KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAGN1cnYAAAAAAAAAAQIzAABjdXJ2AAAAAAAAAAECMwAAY3VydgAAAAAAAAABAjMAAFhZWiAAAAAAAACcGAAAT6UAAAT8WFlaIAAAAAAAADSNAACgLAAAD5VYWVogAAAAAAAAJjEAABAvAAC+nP/uAA5BZG9iZQBkQAAAAAH/2wCEAAEBAQEBAQIBAQIDAgICAwMDAwMDAwQEBAQEBAQFBAQEBAQEBQYFBQUFBQYHBwcHBwcICAgICAgICAgICAgICAgBAQICBAIEBwQEBwgHBwcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICP/AABEIBLAHgAMBEQACEQEDEQH/3QAEAPD/xAGiAAAABgIDAQAAAAAAAAAAAAAHCAYFBAkDCgIBAAsBAAAGAwEBAQAAAAAAAAAAAAYFBAMHAggBCQAKCxAAAgECBQIDBAYGBQUBAwZvAQIDBBEFBiESAAcxQRMIUSJhFHGBMpEJoSPwwUKxFdEW4fFSMxckYhhDNCWCChlyUyZjkkQ1olSyGnM2wtInRTdG4vKDk6OzZFUow9MpOOPzR0hWZSo5OklKV1hZWmZ0dYSFZ3Z3aIaHlJWkpbS1xMXU1eTl9PWWl6antrfGx9bX5uf292lqeHl6iImKmJmaqKmquLm6yMnK2Nna6Onq+Pn6EQABAwIDBAcGAwQDBgcHAWkBAgMRAAQhBRIxBkHwUWEHEyJxgZGhscEIMtEU4SPxQhVSCRYzYtJyJILCkpNDF3ODorJjJTRT4rM1JkRUZEVVJwqEtBgZGigpKjY3ODk6RkdISUpWV1hZWmVmZ2hpanR1dnd4eXqFhoeIiYqUlZaXmJmao6Slpqeoqaq1tre4ubrDxMXGx8jJytPU1dbX2Nna4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/ANqZl3cLaniuvLHPVTVXTJtF+ere2sRF9Dz1WrGQvt56vVw56vV7nq9XB+3PV6sXPV6vc9Xqwv8Aa56vVi5un68yg9+eqoM11tHPVuKwc9W69z1eqOdb89Xq4bBz1erxjsbDmpp3TWOyeznor2qumG03HNVesZFxbnq9XHZY356vVwZbc9W9lceerVR5Bc2PN0orgw3c9VNNYSLG3PVesbJc3HPV6sXPVfSaxP356qVjPY89XqxbG5qK9WNluLc3T+msJGmvjz1b0isJWxsOeq9ceer1YXGvPV6sPlrys05NYiqt35rZVqwMu3jleBmu+M1qou7l9Nbio7g7d3t5erVifw56tisOwcbmr1hZBfXm5r1YWHgeWr1YmW2o56vVh2Dnqf01idRpz1OVhI1sOer1cWBGh5Q16uJAtY81W6xDtzxpyu+ar1cStzfnq9WIi4ufHnq9WLZr8Oep1FYSoPfnqslU1jZdvbnqvtrgRcW56t1i2m1+er1dbTe3PV6sfc356nNNYWFjzdXArGwuvPV6sB56rgTWLy/jzdO1iZTu0HPV6uO0lrjmjV015lsNp5Wnax7NPjz1erEQDoeer1YHQX56vVikTQ683WxUcoAb8qqnq4Mu3l69WJlJNxzVVisZFjbm6tWB1HPU4lUVwsPZz1P1idRz1NprFtW3PU5WGwvfnq9XexeJKrUd1Hbm6UVwkUDtz1UTWLnqvWJ/tHljWqwSeHNjbVhXFvtHj1WTWF+3G01esZ2+Jtzyq9XAqu7x43VxXTqO3K09WBlBFxpbm9lN/dWPYvNU5XEooF+er1YyBbnq9XDaPZz1eqOVUntzdP1HkQeHPV6o/PV6sbotuer1RStjbnq9WN/s89SysPPV6sL/AGuer1ceer1Y5PDnq9WMgEWPPV6oci2vzdXTWG19ONqq9YuM1qsDoDrz1VFRyLaHnqtWF0BPHNVWFYnU2143VaieWePyKvNRmWx5ar1wKg9+er1YGSxOnPUrrC6DwHPUwqojIL9uep+sZRfAc9XqxlNNRz1erDsG/nq2TWNkAHPVqsEi7Tcc3TwrrnqtWOYEqGPblU7K1WE3YaactW64bfcseer1cT27a89Xq7cfRpxs0orAdTqTy1erCRr30Pw56vVFkj97Tnq9XDa19o56vVjSOzkd/jzdNgY1zdbC442qnKjsyAG3L16okjAsNp789Xq4Esup14zNbqM7e4T7TpytXTXIbSS3PU2sTXiwN7HXnqag1h22vt56nq4FDcE89XjjXj31H0c9VNIrxUi/5jnq9pFcLqBdvHnquBXmNhc6nnqtFY9hI9nPVsmK7b3NWPPVQma43W97X56vV2ENvdAtz1erGyh7356klRpUdgLH6uepYCDWFIijXIHPU2s13LE57Gw56qBXTWSON1AF789W1Krm9769uepmuDEDt256nUVi3gkjnqerj9tC1teer1YHG1Q3hz1eruylCRqeepvVXaoxS+nLTTlY5EI0A5WvV0U3e7356vVjKbdGFjz1ergo2ncTfnq9XFJBqPbz1erna7Wtr+XLCvVEkbZqdTfntlerlY2vytermFsQSBxRWq63ry1J66ZXtrzU1fTXlNjfjAMU9XXw7c3qrVdWXW/HqbONYyBrY8TU3pNdBCe/PU6pUVyCm1jz1MV1u2+7z1W0mu7qfr56q10wIHw56vV23w7c9VtJrEdW3Hnq9pNcdpUbuer2k16wtc+3nq9pNe2tf3fHnqrXEgg+6Lc9Xq4su3nq9WTw7d9Oer1e2HXTnq9WK7Wseer1cTftbnq9XVrA89Xq4/6nPV6sluVivViYC1jpflq9WZFUG1uer1dMpJ93w56vViYOdeer1YGXxHPV6uwoXU89Xq5C372nPV6vHalra356vV61zf2c9Xq6ZQ3bvz1erx3utxz1ergbD3T4c9Xqw9jr+7z1ery6sCfr56vVLVtdw7c9XqiuS+ngeer1eUNtYAdu3PV6u00WxA19uvPV6u+er1cgtxvOo56vV0yi9/bz1ersK1tTrz1ergi3U356vVy2KDYHXnq9XEgFdNTz1eroKNwJ8Oer1dNGLj6Oer1dd2t7fDnq9XHab256vVxEY22b2Dnq9WQEDQaW56vVl1btYfXz1erwRu50HPV6uwpIDX0PPV6uNnDXH0c9XqkAHbcnQ9+er1f/0NqZgD34W1PFcuer1cZO3NU2msPN05Xuer1cX+zz1erDz1er3PV6sUnYc9VhXDnqrXZAIPPV6o3PV6uJ5unU11z1WrBY2vz1errnq9Ufnq9Xuer1dN4crTwrBy1M103hytPCuPPVavHtz1WFY5PDmjWqxWBN+brVcHBbtz1OfbWIqR35unKxMpJuOer1cCCO/PV6o3PV6uJA7nnq9WKxAvz1errnqd11gb93mhT1YpPDm69WFl3c9XqxkWNr89XqxMtze/PV6sOnKxTkViZdnNbatUeQccq1Y+er1RyB2789XqxSAWA56vVx2LxmqVH5un64FAe3PV6ozjW/HK9WNhcW56nE1w8scpFX0isXPGnKwHuear1YnHjz1erHz1brplJOnNU5XAixtz1eriRcW56vVxKnbbnq9WPab256r/bWJkubjnqsisbx/HnqerEy20vz1erERYd+bp+uuer1YOer1Y3Ut256tg1iK+B56tzXAxrz1b1VhHKKpyuBDHtxyt1jO4G3NVaa4OrMfo56vbaxslxzVORWIqR35qrVhfvz1erGex56vVHb7R5unRWN+3N1asXPV6sL/a56nE1iftz1N1i56ldcH7c9VE7Kx62vzVOTWHY1+erwrwRuMqqtYJFseUp+uPFFVrCQt9eJ6tWN/s8UVWsQVW7cT1asDAC9uWp+sbdhzVNprjzdOViP2+aqwrg/flaerAOx5s02msfNU5XB/sHl07a9WLlK9Xuer1RObp+scn2ueqiawtbbrz1XrA6m1uer1YOepZUeQEg256vVg2kaW56vVhYG/bnq9XGx9nPV6sUnhz1erHz1eqPz1erHJ25unE1FKeznqvWGQePPVRNYDbv7Oeq9YiLG58OJarUdhY25un6i8U01WAj4c1VxWHnq3WNlUgk89Suoz/a56k6ttYJPDnqcTWPnqcrHIfd5RVbrExG7l61WJ7Hnq9UeXxt7OUTTw21xAv7vLJ2VusTqQbD6OeTsr1YNb/Dlq3XRUsNvjz1ero6qB7L89XqxMT39vK0orsoO689XqjONb89Xqjv356vVw56vVxsEGvK7K9XnUH7XNETXqbnjNyR9PNaaUVwdGTwvyppisBUnueVr1YrNuPiBz1XTXFjps56vKrokDsLfXz1UrkpbUr256vViUi9zz1erkl7+6L89Xq423HX6+er1R279tebp+uiDt156vVz8v481SVdc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356vVHdR4Dnq9WEgjvypr1Yn8OeFerHy1eqO97683TorE50tz1WqOWFu3PV6uF19nPV6sb2vyg2VsViIBGvNKq9YHQHtzya9UUgHvxqt1gZBc8UVqsJVhxpVbqIyC+mnKV6sZQ+HPV6o7CxtxRWq4kXFuep4K6a4ONL89W01FYHdyoM07WJgSdPDnjXqxkMSbd+WrVYrNrfm6UV51AAI/XTjSa1WHbbv347W67Isu4duer1cRdlseJaoKhsoc29vFVOisbbUYsO45WnqiSD3iBxpNeqIw97Tw8OUrde7kkafVx4Vquyh7C3LV6uJjJGtuer1Yip156vVjG7UX7c9XqwMltB489XqxbVBZWGnPVs7K9GNDs+483VE1w+wSBqPp56lNcGePXjeqt1wb7IvyhFerzH3do05qvVgcLbbz1erFtINrX5qmoroqQbd+eqteLHX489Xq4kL9F+erxxrG6kHv3HPV6vIluxvz1MrrLZdu23PU1WNksCRz1eqKbnRh356n010ikG3PV5VSAN2niPHnqYriy7Sbnnq9XEgMu22tuer1cAALG2pHPV6ujbbp256vVjc2O46C3PV6ugNoAGt9eer1cthZeer1YSpvppz1ergxYG3flRTidtYtil9Pr5an6y2Xbb289TGqsJVdpPx54GrgzWO+3xPPU5UlVVl328PHnqYVUaaILbaOeq6awkFBp2+PPU5UpCRGZLd7c9Xqjta1yBz1erlToHnQEd2H3c9TCqx1DGSd5V7buerya8yltSeep+sDCw18eer1dKLN2+vnq9XDaEJHfimab012UIG4nnpr2mutm+5PE1OV2yhT9PFIplVY9Cd3x43ppuubbracqurJ21gs17k8pSiuSm4vyia9WMPZtw5emzsrJckm/hz1MVjXv7eepQrZWVl0u3PUnr3PV6uA+2eer1dFSTtXW3PV6uP2fieer1e1fUc9Xq7G0dzz1erh4lj4c9Xq8NTbnq9XJRdde3PV6sJA7jtz1Oaa60A08OereiuYS4ve1+er2iuNgBYfWeepqu2sDbx56vVks6nb8eer1cQoBudeer1dEX0tfnq9XBlsO1+er1cGVjc89XqxW1s2vPV6u9VT6eer1e2hjpoeer1e7e99XPV6u/KHsHPV6uRRkGnPV6sTH3STbnq9XEKQ1/qvz1erntt2PPV6uZsdfZz1erkEtqPp56vVw77m56vVyGoLeznq9XRsLEc9Xq8GY/Rz1erpgbADw56vV5CDoRz1er1hfb4c9Xq7ttaw56vVwBYXC9uer1dGP3L9jz1ermifnz1erntAOo56vV//9Tawb7PC47anI1w2Hla1XZUW056rRWIqbX5bbTtdc1Xq4Sdueqiaxc9V6xuNL89XqxWv356vV6w9nPV6sTae77Oer1cNeX1U5Ncea21evc1XqwWPPVqa656t1iIOvPV6uHPV6uLbieeq01h56q103hytPCvEXFz489Vq4E2F+er1cJPDmjW6x83Wq9z1erHJ256nE1h5unKxSfa56qJrhz1XqO/j9fPV6o/PV6vc9SusLCxsOer1YyoPfnq9WIixtz1erC4N7jm6cTWLnqcqPz1arpwDz1aAisJPs56vRWBgvhz1XiuPPVqorgAXPPVbZWKxGh5Q14VH5qKtWMp7Oar1R3Rt3PV6sZ0789Sysfl/Hnq9WFl3a89Xq4lSW056tiuBBHfnq1Xrc1W4rEwsbc9Vq6trbnq9XFrW156vVjbb+7z1OATXHmqUVH56vVwbuOer1YipAuebqwrH5Yte3N07XApdrDmqrNY+bq1Yn789Xqxnseer1RwxGg5ulFdc9Xqwv8Aa56vVwIvz1erE40789XqxMLL9HKaRWq6780RSmsT/a5uvVhkFxz1erDb481NWmsLKQea1VcGaxup2357VW5rD2045W6wstteeq6dtYmW456qVisQbc9Xq8VO23ElKawhT7OXVtq01gYENYePHE1ua4Mu4cZrwMVjdNovz1XBmsRAJueKarNYOJqcrxGuvhy2yvA1xI0PPTWqwHmqsBNcNi83T1cDGb6c1VNVYZE0789Xk1jII783V6jaX56vVwYDmqsKxNY9hzUVbVXFhY25qnK4MLi3PV6oDAgnm6frG/2eer1R2Vr89Xqw89SysD9m56vV1z1erC/2uer1cD4cqa9UWQWtzwr1YuWr1YZPtc3TorCw936Oeq1RmWw0B56vVi56vVxk78oNlbFYzzSqvWN+/L16sZAIseer1YGUXseer1YHXbxpVbqMwG4347WqjspHGTW6iuoLa8rXqwlbNY89Xq489TqawH7f38cTT1cNup45WqwsoGo9nG01YGuP+InjlVqO4sovxtNWmsXhrrxyq17aGW5NvhyiquDIroiy37cZ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bWK6X07256qkTXEpIg+F+eq1cWU3uO/PV6uRUML+znqorZXAoQfbz1U110UPhz1PV2tl95uephVcGOm489TdYHQ31N789Tuuo8kVhp4i3PU6FAV0sXlfvac9ViZrmpBG/nqZ0msiCxL9jz1N/bWRVDXPPVWvIqhb89Xq4+S4uV8eepzVWLYdd/jz1b11i2390dhpz1e1124G3avPU1UJTce/p4A89Sus5G76u1u/PV6uQjW+7tz1erlpu+J56mV1IYKKO9tZG/Jdf489TFQ3iLG6i3PU4DFRivgD27jnqU10oJ962ns9v0ctNerIYyO/K1TUK6ZFZ9BfTnqT13t2t7lrdrf089SusJUgjZ489XjhXAK20i3PUlUZr2wqRu8eeqorvYu43N+ep7RXAgg2sD9PPU9WPbHftrzYNM6q4bF4pqldlCB3sOerwxrqwDEc9XjhXtrbrkacS1WuBU3t+fFVWr2gOotz1ergqkA38eJa9pNeCle2vPV7Sa57fEd7DnqrXEBz8OW216uwpY6jntJr1d7dracrXqxnaDtXtz1eruxt9nnqsnbWFk8T29nPUprsWvYeN+er1doGVOepjTXXunv356m69opPiOer1e2+78Oer1c23Hv4c9Xq4qwOrDnq9XRABNuer1dJGCb89Xq7MRW3s56vVjVbtftz1erL7v189XqxAMdO3PV6uEvcc9XqxgXuNNeer1cypJA56vV5vdAA56vVxffYc9Xq6BJXTnq9XrEi/bnq9XJQO4Hjz1erskH3jz1erHpe4v8ATz1erJz1erntuu4f289XqxgsG2gk9uer1ZQtzppz1erG9u4OnPV6uSggC/t56vV07i3PV6sdiTp93PV6v//W2suFw21OQr3K1qvc9Xqxv9nm6frj93PV6uLDTtz1erjz1erFJ9rnqqKxkA9+eq1cNv8Aq/nz1erGR3HPV6sPlnm6vqroqR35qqVj5un6wkEGx56vV1Ye3nq9XXPV6vc9XqjN9v7+er1YOer1e56vV2fsHmjTqax8qacrp+y83Wqwc0a3XueFer3PGvVgIIOvN1qsLgntzxpRWLm69XF/snnq9WHnq9Ufnq9XRFxbnqfTXCTw56nKwv8AZ5o16sPN16sEn2ubp1NcRz1aVUbnqvWJ1A1HPV6uHPVusPNU5WN7243XqxMCRYccr1R+N16sL/a56vVgkB7jnqWVgZfEc9TK6wWf289T1cGWx56vVx56vV7nq9WDaxG7jtPVyN/HjNVr3PVqsLixvz1XTtrE/wBnnqU1wVd3PUjrE/bmxSysXNGvV7mq9WJu3N04qsRUHvzVN1hfvy1P1wfx+vnq9WI/YHPV6uHPV6sLqxbnqcTXHnqbqPY7rHlVbKfrG/2eXrdYeer1Y5PDnq9XfKUorAe556vVhfvz1erhz1eqP/uY4xTiqwS+HPV5NYj356rCsTAX056tk1wcKeKa9WHnqV1xdG3c9VNQroo3ElbrGytf2c9XqxlCBfnq9UfX/DxXVq6Zdp4wmrCuHjzRq9YmVr8rW69tsOw56vViI10A56vVjYC+oHPV6ozIb6c3TiaxlSBZubq9R+er1Y5PDnq9WP8AdPKmnE1xNgdOapysL9+er1YHHjz1erEQCLHnq9WKXw5unE1gKqTc89V6w6X56vVxIW3blNVbqPsXl6d11jdQDbnqvqFYCh8Oeq9QSAe/N0/WGVNq6c9VNVR7aX56r1jZP8PPV6sdj7Oer1cWU20HPVsVgYEN256vGsR+0eerYrGy7uJqvUdl9+3FFarEwINjxtVbqMwGp5tNaqOeVVW6wN3N+Ur1R2ADac9T6a656naisN0luer1cLW/Pnq9WCVSNDz1aBmsVjr8eKK1WGUHaF42mriuKrY345VKwjbbXm6UV24t24ymqCsL9r8eq9Yj7zW5WlFYSCe/0ctSesXK0orhttcnXnq9WKRB3B56qzXAhgAp8Tz1WrFNH49z356vVGcL3H189Xq4Ml9V5TTXqx+Xf7+Xr1eB2XvzdP1xeT3feOp54UlVXFlW+p7c9VtNR2G1raG/PU2RFczbZ/RzVPprCGG/9vG1UjrshbnXjdKW6in3l0783SmuWo1I56vV7apGnNVT7q8wYCx9ns56kh21i7Lci3PU/XEe8LqSL89Xq6K6ndfnq9XD3bac9Xq5KTY3/W3PUyuuZFxcePPU1WJgwWw5UU4nbUXazGx5aqq214bit+eqtctt9Aeer1YynvAfHnq9XF40YkEacqKdRtrDtCkKo0HNml1ZgPEfdzdIV7a8d1teepqulLM3vac9XqzbrJr9PPV6o7XvYjT6b89Xq9z1OaajFh4+PPU/URvcNtCDz1eqQl9uv1c9Xqkhbi1teer1R2bw8bc9Xqz1AISONfAA/frpz1JU1wYki4789Wqw2IUsbc9Xq4eXtIb2c9Xq5OGA0vfnq9XFSo/bz1er224GvPU5qriBtb3+erc6sKxldzaaX56qaTXUljpftz1WCaw23D3SeepxWyudiDdueq9e2Ke3PUzortIw6mx7fDnqarEVZTtPPVaIxrhaxGnPVrbjXfPVquLX7t48VVasb6KTz1ergex4lpTXfPV6uxcWHsHFVJq5bVXXnq9XVmtoeer1cSuvfjWmtV0b/ZI041Wq4FAp8eeqydtdlLrbnqU1xcC1x4c9Xq7GiWPKJptdcQpOo5emK7JXXTtz1eroE9hz1ermx3Cy89Xq4qi22/4uer1esoI156vV2NytYc9Xq5C7Haw56vV0UFtOer1dGNSACAeer1Yylr38Neer1d+WWGvPV6sbx20HPV6uAT3rc9Xq4sNxF/Hnq9XK/wC6wI56vV1tHs9vPV6u1VSeer1diwa47c9Xq6IJ09vPV6uGw32/lz1erkUBOh56vVlA0sDpbnq9XApubT6eer1eBZjYC1uer1d2a1m/hz1erIyhRY89XqxlNbDwtz1eriUPfnq9X//X2szc9+FlTjXQW/bnqtNe56q10Rppz1X1V1zdOVwK3W3PV6uO0e3nq9XEgg2PPV6sDCzc9Xq489XqxlPZz1erFcc9VorjKLC3PV4Vi56q1xPN06muueq1YD3PPV6uuer1YD3PPV6uNh7Oer1YmFm56vVz5WlFYn789Xq4c9Xq4lbm/PV6sb/aPPV6uFhzW2rTWMg3783VaxuDfvzdOpqOb3156r1wf7PPV6sPPV6o/PV6vc0KeTXFhcW5407WHm69WFgQeer1YnTdqObq4MVg56nawsttRz1argRcWPPV6sXv/Hnq9XXv/DjNVrCe547T9R30PG69UbjlergVBN+N16oz9ubFerHy9OJrH5Y5SKfrCVB788RXq4OpLfTy9XTXFhZuN1WvDmqsKxuNb89Vq4c9Xq6Nu/s56tVitdQeer1cNb/DnqdTWB07a89TmoVjKe089tq9dFLC/NV6sJUWtzdWJmsbCxtzVVrAftjlqfrFJ+79XPV6sR+wOer1cOer1YzcnQ89Xq4te+vPV6sLA+3m6eFYHBAseeq1Ytjc9Xq6C/R93NVYVhItrpzdVribeFuUpRWNgL6256vVjI8NOer1YiLi3PV6o5Ce3lFUorC/blK9WPx5sVUbK4P9nmqtXHlKUVhcEtpxxNbriO3NK216uLr+9ylarEVJFuX0mt1iEQ8eb1V6uDoL6DlKcTXDnqvXAoCb89XqxlTa556vVhKG+nPV6sZQs3PV6o5FjblqfrA6m3fnq9Uco3PV6sTqeer1Yv3TyppxNcOapysTdzz1erhz1er3PV6scnhz1erHz1eqJzdP17nq9UV1v256vVHZS3PV6sPPUsqEy31HN0/WGQEDXnqb01DKEduepyuHPV6vc9Xq4P4c9WxWBhu7Hnq8awFNe/PVsVwZdvNVasJsX156vVGdQBccbVW6jsBc8crVRntfiet1hfvxRWqjOPHielCaxFdTz1O1hYMHH1c9XqxWP5c9Xq4SjUD6eer1YrbQeer1R2UAXHPV6uIG0i4789Xq4EHUWtz1bNY2BtuPLDbWxWBwSvs14/TlcAhBuTflaUVhMY3X5ak9cdlrjlaUVHPuknjM1uuQU33ezm01qsPvGIt93HaqKjXbbbnqtWGwsW56vV17wIPhz1erD72/eQLX5utY1jYt3Nuer2NcATqPHtzVaisoINja/tP9nPVascnl39lueqwE1hYJtsvN07WHabhVA056aSaa4OWIJ8L+HE1PIEVxKbh9HN09XQQHsbc9Xq6O1hvsfq56vVxJI96+nbmqSnbXW0Ead+OJpPXYBANjxuliK4Skg89VlVhBPh4c9VK7DFjqOepldZNxHfw56mqxe8zanTnqV12Y22kD7+epMrbWIoQpt4c9Va7QFvCw+PPUrriA263bnq9XFhZb25UUyjbUVhYEjl6W1zBOtu/KGkR212+8H3hy1NVkXt73PV6uyAELAjnq9WE6gW56ldcdra3789XqxPECuo56m9VR/IVNW7Hnq9qqVEBawFhz1MV47STp3056vVhEfvAW+jnq2TNSZG3OSNdbcrNarhIt7205avVw2t9k6fVz1erhtuRz1erE0ZBIv8Rz1erG8R0IHPU+mvWkGnPVvSK6b3zc/Dnqp9tZFChjfnq0pU1haC5J9vPVvXWEg7do0v4256nq5RpcbL9vHnq9XAAx6nvz1U0ipCtYHbpz1Xrhtc/pHP3jnqZPi2VwcqbAC1hrz1U+2sHPVWuWniPo56vV7ZuO089XqxFTqRp4W56vV2FDAXNuer1dntxxNerhow49Vq4C49nPV6vGzePPV6u1YjRtOJarXehTd48srbXq4crSuuJFyBz1N6q43t7ve/PUxXO7Ae9rz1errYTqPHnq9XIaC3PV6uJUg7hz1err3l1PPV6vFQNe/PV6uLXUW8Oer1dg21vz1erIFsbA9+er1cBcGy+HPV6u20W7G9+er1e937Lac9Xq4lATcc9Xq4H3UFvbz1erCV0t4fTz1ermFI94X56vVz2+9duer1cNite/PV6uwott7fHnq9XtqkAA689Xq4m494+HPV6urWBtymqnkVzGgtzYM15dcb+/y1M1lClteer1d6lSB356vV43a4PPV6uO1gT7Oer1eII1789Xq//Q2uRxAqpyrHsHt43W4rtlAHPVWsfPV6uPN0/Xuer1e56vVik+1z1VFR3789Vq4c9Xq9z1eqPz1erpwWF+er1YOer1cTzdOprrnqtWA9zz1errnq9WM/b56rCsfPVWsL/a56vVx56vV5+/K0orhz1er3PV6sbnW3PV6sWhHw5rZW6xFyG05ur6axs3iebpyo/PV6uL/Z56vVh56vVhtuPu89Xq4kEac9TqK6a5GnNGnqjkEE83Xq9ypr1YOWr1dNYeHGqdqK7bePVpNYWbdz1Xrlxmq1F5un6wnueOV6sT9uN16oxQjtxyvVj43XqwMvgeOV6sJUryop8JiuHK07WDljWq4lQTfla3XBu/NVYV1z1Wri3NivV0x2tfmq9WJ/H6+erVcd689XqxE69uer1Y27jnqWViYC9hz1Moro9jzVPVg56vVjZSTz1eqMQb9uWp+sMitpz1erEfsDnq9XDnq9WJr7uer1cDqdeeq+qsRIYWHN07WN2uL89Xq656vVhHcc1VhWB+/N1WvFQTc8YVSisTAA6c8mvVjftxyvVhPY89Xq4nlVUoqM/2eOVqsHjxpNaFdMCRYcdrddbBbnqvqNYuepRXmXcb8SVWuLINvPV6uG1P1HPV6uG1b9uer1YfHjiqcNYX+1zya2Kx8pV6xf7mObrZrBJ2HPV4VwNgdOarVYCq3ty1P1jdQRpz1erDsbnq9UXnq9XVhY6cqacTWJwCNeeFbVWB0bdzVXrDz1er3PV6scnhz1erHz1eqJzdP17nq9Ufnq9WJwAdOep1KoqMQQbHnqaqOVI781tpZWCVQRfntlWmohUgXPLU7WIqLac9Xqxc9Xq4P4c9WxWM89XjWE/aPPVsVja1teJqvUV/tcUVqsbWtrxtVbqI3c8crVYJFJ7eHKKr1Ytuu7l6V1FlVieJ6omsJBHfnqsrZWGUEsLfDnqoisZB3XHs56nqxTfaBHx56vVgbdu056vVibQe3nq9WO+vv89Xq5MSF+PPV6sTdjz1bFRiSBpy6qvXC/u7eN0rrCzi+08snbSc7a4dmI4+asmuDx31HfjEU9UfY6tqb8rXq5ElUsx78UVqo9r3J8bc9Xq62IuoF/p56vViZbDadOer1R3DKOeqyaxMCw05una47GN9o+nnq9XgAH056vVhkj3Gx42RNbrEE2i3x43Xq7221FuOaq9WIpa5Ityhxr1eMQItzWivVwZSCL9uer1dhfdO3tz1erh5Xj4ctppMRNcvJ57TVYNYyrBb355VOgRXTIBr4nlK1UZl0uOeq2yu1uAC3PUnXXLvdx4c9TVcBdjz1K6zoxUXPPUxproNGpC256q6TXAyRsDYW56tpTNcNC3w56nNNcQFYG3KirARXDykHhy1b110I7PY9uephSprk0Z7jXnqpXXl7hutbnq9XWxex7HTnq9XA2Btz1K672m1+er1cHuBz1JKiSC179+eq6UzXo7kA7e/t56r6TWYDSxHPUzXJLCRb689Xqbx5we/x56vVJ3gtfnq9XgxJ97t7Oer1cHkF9tvr56vVjJVtD4c9Xq7kRioHhz1OhXTXey1gOer2usUcbC9+erSlTXiSpsOepuuFwDrz1erG6s5Fxp4W56vVkFoxuP5Dnq9WFkVfevoeepRqFejAKm5156tKrzElbH7uVFOVhBsSxGnLUkrpmU/ZFuerZEV2d23U6c9Wq4RkA68cVXq8wU+9xuvViAv7h56vVkAP189Xq4cVVauAuxN+air6q8Ab3PN1oma52Frc9Va8wG2/E6ttVrgbW+PK04murEnnqfrorc7l54EUkrq3vXOt+KqtXfvDUDv256vV09mAbnq9XNQALrz1erjYr4j6OJarXiBqR256raTXeh0PPV7Sa4W93c3blk7arXMWRto4oq1d+WALDnq9XEi1vjxLVa6ADEk89Xq42Ft3jz1erns389Xq4+Wu63HNNersIOw43Xq6ABNrnjmmvVw2jdbjder0gvz1errZpppz1eroi2h56vVyVF235WKc1msdjrbXmk1Zdd8vTNc1+wvPV6uvd3fDnq9Wew+vjmmvVx+F+N16uADAWJ7c8BXq//R2uWAAO3hZU5iuubp2vc9XqxMLKOer1cb89VNNevz1e016/PV7TWGT7XPVsVhZd2vPVauJT2c9Xq4c9Xqj89Xq9z1ergQD35un6xFTa/PVrZXGx56vTWJl8Rz1brjtPPVaKwlNdOeqtY+er1YnHvc9Xq4c9Xq6bw5WnhXHnqtXuer1Y5PDmjW6xH7J54V6u+aNeqO/wBo82KdFYvK+PN1XVWE9jzdOVh0t8eer1cNi89SusbLbtz1U+2uGlua21esbKAL81NergVF9eWr1YnAB056vViIB41V5rARflzWhUdl28vTtcuM1WovLGn6xP35qvVhftzYr1Y+Xr1YX+1ysV6scgsLctXqwv4/Xz1OoqPz1X0isTjW/Kir1j5o16urC9+ardR+O09WTjNVrHJ4c9Xq4v8Aa56vVx56vVh2Nz1OaqxOL256n66ZLm456m01jZbaHnqcrGVAHNV6sJUHvz1eqOUs3LU/WF0Fvhz1ergV9vPV6uDKtu3PV6sVgTryitleqO3utxylFdHvz1VFRz2HPVauuer1YR3HNVYVhl+1z1eNePGVU9WJ/tc0mvVjYEjTjterEUYDnq9WMI1ve15an6wsADbnq9XAgntxNWhXBlN7jjqatXHaLe9z2qvVxVAONq20prptGvylarGy/u89Xqx+X8eer1cACe3PV6o/lk9+bpRXFlF7c9Xq4ECx56vVgKLyxrVY2QE6c1Tqa4FCObq9RipB56vVhdTa9+er1cOer1RyBfUc9Xq86rblKUVhKDw56vVFcEHXnq9XDnq9Xuer1Y5PDnq9WPnq9UJlJOnN0/WNkNrnnq9UXnq9WN/DlRW6xMLi3LUrqMy7uer1RpPs8qa9UVyDp7OeGyr7Kxkix5enKjc9Xq4P4c9WxWM89XjWE/aPPVsVx4mq9YGU30HFFaqOy20PKKr1YGQbrcvXqxMhvpz1OJrEVF9eep+o8ia6c9XqxFe456qK2VFdNrcT1ZOysYVl7c9V6wSfa+/nq9WC2t+er1cXF1sOer1YCtiAT489Xqxn2e3Tnq9WNu3PVsViN7ad+aq9R2vt56ldYxdjc8snbSc7a4C27Tj5qya6cE2tzVO1jFvHnq9Xgqte4vz1erDsuBftxPW66KgX+HFFarEVJ7nnq9UaW7NY6c9WxXkGgJ/eB56tV5GtckaHnq9WIqj6Dv4c9XqwEL3N+bp+sdhe/t56vV1a4sOJ63WMbr/Rz1er1tSeWmvVgubW78rXq5Je59vLpr1ZCCNTbXvx2tVwLAX56vVwNimnj7eer1cTd+xHE9bqOVJNr89Xq5nbqOxtzVJVisY3bbDW3PUnrGwNyeepXXJVPceznq9XiFLfHnq9WMgAlvZz1eriB7xPPV6uVr6fDw54itK2VmG0akc9SWsbgWB7c9Xq4mwv8Oer1YAdbHtysU5pNZwwW2wd+WpusRsXseepXXK1lsNbHnqTK21Hva5bx56q1jf7R56rpVFdKm3U+PPU5qr19do56mK5H3W3n489Xq4eH1ac9Xq6C2FiL/Hnq9XEqe/jz1errZckc9Xq5KVVdfDnq9Xr7hcac9Xq4l1DgePPV6ugwvZ+/wAOer1YpVNwV0156vVFuGbeDb4c9Xq52V2BINxz1erKHY9jbnq9WKRrrY21056vV4Rx3I9ns56vV513C4789Xqht5mt/DTnqdRWSFFY+94c9Xl151G63Yc9TIE1jICv7vvDnqe0V4rdbAW56mq6RLH3hz1erlYA2a9uerRrDxVV65cS1WuwCe3PV6u7WNjz1erGALHltJr1dMAdbX5oiK9XPmq9WFV3dueApzTXO1zfijZVK6IBP0ctW69ceIuOer1d21vz1erjsXnq9Xfl/HiWraq6C3F+eqqttZQLaDnqrWEix3HiqrV7bfVuer1dspPbnq9XQ/wNz1ervbxrTWq8FstuO1uuMZJGvPV6uK+JtxlNVrMLfa5tVbriQp+1341Wq6ABXbxxNerg4Fvd55VersLuPG69XEq32Tz1eroICdfHlRTy68FU3Hs5ama5fui/jz1ertVBIDa89Xq8Ea/ftz1erGR+6fq56vVzDELZeer1f//S2uT24WVOYrvnqrXE8uafrjJ25WqJrDz1Xr3PV6vc9XqxyeHPV6sfPV6vc9XqxN3PPV6uHPV6uDi4sObq4E1w2fHnqtprHt0tz1e1Vx2jnq3FYWj8Trz1brEU9nPV6uJBvz1W21h8v489Va4EWNuer1cmFxytKKwFQTc89XqxFdo56qiuPPVauJUHmttb211sHNGvVi5atVhZVA9nPGlFY+br1R3B156vVH56vV7nq9WOTw5o08qsR+yeeFeTXfN07WA9zz1erG/bnq9WHlTXqj88a9XCT7PPCnBXDlK3UbjtP1ik78aptNYWFxzdOVi45XqxN3PPV6sL9uer1YmX93nqdRUfnqerG/hyor1Yzzxr1eHKVYVH2Nx6na5cZqte56vVhYe9pz1erG/2TzYr1cuar1R+epXXuer1YX+1z1erE/bnqonZWE8bVV6xH7Y47T9Yz3PPV6sD/a56vVwYEiw56vVwVDfXnq9WNwL9uepxNR2AB05unKxSDx56qisZj043qrdYyoA45W6wFQTz1er20AXHKmnU11zVXrgykm456vViIudvN1bTWIoD25unax7GPE1eAriQfHjv3VusbIWNxxqtgVx2jmppzTWIgBrctpNOV7Y3s5StVjKg89XgKxyKANPHnqsK489Vai83SisUnfm62K4c1WqwHljWq4HvzVPCvc3VqjHuOer1Y2UAac9XqxFV+jnq9WAjx5U04msb/Z5qnKicvSeun+1ylKKxSKCOer1Yuer1Y5PDnq9WPnq9UNlBPN0/XEoLHnq9URgAdOer1YX8OVFbrG2vfnjTqKj8tT1R5EsOer1R7cppr1YTGQOOU4DNYWXdz1XrE4Fu3PV6o7gE2PPV6sJ+0eeqwrjxNV6isLMNLceFarEeaVXqxP8Aa5evVwe1/e56nE1hJXwHPU/WBxrz1ergRcW56vVEZTccT1asRBHfnq9WCVWU3HPV6sGwga9+er1YX+zz1erEwuR9XPV6sNntpz1erprEkduerYrDICfeOnNVesGhPsHPV6sdtug8OKqtWI3v8eJarXZUg89Xqx7VvfnqV16+3w5dNaqMCACfjylbrvcfAcUVqsfPV6oh3q99Brxk1uumbS/fla9Xg43FbafRxRWqxFSDcC3PV6uD/Z5un6w3On5c9Xq4g2Nj4cbVW6xMG7njder1iim1uer1cdwKWFr89Xq9GouSDy6a9XpAW+yfv45SU10Uu1+eq1YZAPYDxtVKKyLdV+He1+O1qsLK3m6ADjMVuuFtze8OV2U2quIWze8O3NUkJmsjICde3PVSsTLtva/PU4mvKAFAtz1N1ibbtAb67c9T6axhbaLz1PTWcKV+wLjnqT413cED2Dnq1prESHYgac9XtNYjr7vPUrwrsqGN+epomK5AkJoOepLXdgRr3tz1ergBddl9fZz1erAe24jnqWgTWNrsot356tEVjN7bUufr56tVyRSSD3P5/fz1JK7cEWD6fXz1ergyaa6256neFcSNAg56mqyqgCXPPV6uJ3Bvd156vVjBBN29nhz1erlcFAEuNeer1YWJFzIPDnq9XQIPbnq9XO28gHw56vVi2hfabk89Xq97Pp56vVxYall7jnq9WJobD3jflTTmqvRRlNW8TyoFeXXmZi5C8eg1tNYyL+7fvytXVsrlGircg356k01nsD3Xnq3WGSMg7l789TuuuJV2B9otz1NVyEZuCdeepzVWFnZ7qBz1WIwrGyFQL+PPUzXcY9+x56vVzj3K4uDb6Oer1cLlm7d+er1YtRccVVashRjpY8S1WuFxz1amutv73PVbGsYYE24qrdZRqLjiWq1wsL34qq1e56vVz76HiWq1l2gjtz1K6xOlrBeephVcmU3vY89TdYuKqtXuer1dagAc9Xq5c9Xq656vVxv4W41qrVcCvu+5347W69sHj356vVz22W3PV6uV0+HGtNargRtO7jtbriy+9Y9uJarXgtiCOKqtXQAZdfbz1eru1tOJaU16/Kaqa0VyKg2Jvy9M14DQFeer1cCWOnh4cVVauWt7ka+2/EtVrwuFPt54mvV//9Pa64XDbU5CvcrWq4nlzT9cWFxbla9WPY3s56qzXipGvPVauPPV6scnhz1erHz1er3PV6sT9+er1cOer1cZPHm6dTXXPVasLdhz1UTXHnqvXF/s89Xqw89Xq6IB789Xqwc9Xq5lQeVpRUdlty1J64ONb8rSisZAPfnq9WJhY256vVx5rZW66N/Dm61WIgk89XqxG4788aUVg5uvVgPc89Xq4kX0PPV6sHPV6uJUNzW2nvurgyhe3N07XDnq9WA9zz1erG/bnq9WLmor1YGW3K7a3WKT7P182KuK4cpW6wbd3vceq1R3HYDnq3XHlIpyo/LV6sZUknnq9WN/H6+epxNYTe/u9uN0orFtPt45WqxOD2vxut1idSTxyrJrpltoeNVasdrCw5um64Ebeapyuuer1Yn789XqxnseerVd89W6jkWNuerVe56llYX+1z1erG/2eeqidlYeaq9cdq+zm6tNYWUFre3m6drgyKDY81VRWI/YHN1auHPV6sTAljbnq9Ucq27lVbKfrGyN4cvW6xlTttz1ergQ3jzVWmuKotzzxqya4sADblacrGUF+er1eKDnq9WAJt07cT1uuBAD/Hm6dFcJPDm6tUZ/tcumrp212O3KK209UflK1WNvtjnq9WPnq9Xjz1XTWGTw5unax89Xqj89XqxydhzdbFY+arVYzGQtuWp+sRQ9rc9Xq49jbnq9Uc9xz1erhJ4c9Xqx89XqinlTTia4P9nmqcqPtHNzVNNcH781V64P4/Xz1erA62Fuer1Y3Fxfnq9WC/N05prAVI56r1wPY89XqhuNb89XqxlQe/PV6sbIR25RVbrGVB78vSuorrfQc9XqwkAix56vVjdLDTnq0DUQ3BseU00/WF10uOOVuo7Kx156vVgdSGvz1bFYWBI04mpysDoSeKK1WJxY25RVerC/2uXr1ceepxNdX43qpRUSTU3HPaq9WK/Paq9WN197UccrVYymp+HE9WrE6356tiorizHnq8ajyg9xz1aqOoBI+HPV6uDLpbtz1erHtIO489WxXFluLHmqvUdlYN356vVxbXw56tGsG3ueerdcR4E89Xq4EWNuep1FcTcggc9T1R/ftY6c9Xq8wvbiitVh2hfs689XqxH4Diet1xUErtNhywE16uO0nXx49Wq7JI76H48T1uuJa4JYacUVqoDhfDw5un65BdD7Tz1erBckAcT1usbk7dvs56vVwYEH2356vVyQMNbcsDFerwi1vfj00k01l2leaqwEVgdb/TyiqU1hZ7J/HmtVerrzCRcHvylerIACQPHmjjXq7YAduepCUEV0wKgHwPPU3XmTct7eznq9WIrrfw56vVhdCRu56nEqiuf2O4A56tKVNYwx1Y89SiulDMthz1eroEoeer1dBRrt7c9VAIrkigDdz1NqVNcdova/PU3XdgPev4Hnq9WJiL7u456vVHcE2AHPUsGyugjHQ9hz1eXXvLuSTz1Ma6yhWQXXQc9TVYS4JVQBYa89Wia6Otzz1O6q9YgXI56m65XBGmvPV6uxZveYaDnq9UVlZzvB+rnqd115VsNx0J9nPU1WKUX0ueer1ZEO/wB8Hw8eer1eG09xz1erExde2ovz1erx+2ARz1erIFCi9uer1cWFyCeer1Yth3Eezmga9WJ/tXHfm6dRWIXMgbnqeqUEXsnbnqSV7aw7cqa9XTk393lq9WJZAps5uTz1errfZyQdOer1Yx7jlz2HPU8o4VlkjZyLc9TNcUVU07nnq9WY9hz1erCFsAB9rW3PV6sZiP2218Ty2o16uLyMWul7cslM1sCaxW5X7ator1joBytW11yAWxJHPV6d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er1cwCTr256vV794g9hbnq9XiN+vs56vV1z1erxUH7Rtz1eridv2jz1erjYWFtOer1cSSNb89Xq4hiTYi3PV6vc9Xqwv7/2f3e/PVoVyewAAHPUsrqWO1mQdu/PUkrEY7e8e3PV6vBCRttrz1erxisL89Vk7a4FAouOep1KYrsAEa+PPU5XMqQlhz1erwAAtz1erpDa9u/NgVQCK4BWVveHfiimVVkMe1rHx7cTVWuQXYLyduer1d2C6kaj489TyU1mXVira82BNNkRX/9DbCN/HhZU417nq9XF/s89Xqw89Xq483T9dWFrc9Xq581TFYyoPfm6frEwsbc9Xq656vVgPc89Xq656vVwftz1erFz1erpuw5unE1x56r1i8G56vVw56vV7nq9Ufnq9XTeHK08K4N256vGsTeHPV4Vx56rVxKqTc89XqxPYGw56nQKxkAix5ut7KwkWNueq1YnAvqeer1Y+er1YyBqb89Xqx89Xq9zU09qrDsb2c9sp2uLBh8Obr1R+er1YmW2o56vViYXFuer1YeVivVhZQnbnttPbaxkEjTlKoKxc9Vqx+X8eer1R5FNweXFWFYGFxy1O1h5WK9WA9zy1erE48eer1YuN04mo/NxTdcdi81SyuB2+B56tVxNz356t1xCgc1W5rgykm45utVxtbvzVWFcWB22HPVasTA27c9Xq6CAmw56vVgIINjz1Oor3PVfSK4Mu7XnqvXZsF56tAVhtrbnq3WPYPZyuoU/WMob2HL16sTp256vViZdosx56vA1H2j283SisbAX789XqxFQWtz1erjtBOvNVYV2yqBytPViIBFjz1erCwANhz1erg/2eer1YgCe3PV6vG99eer1cT2PPV6okn2x9PLU/WJvDmqomuubq9cHAv356vViYLbvz1erAQvt5RVerie45eldRz2PPV6u+er1R+er1dOu7jKqdrrYOe1V6sLIoa3PaqqKxui7eN1esLLu56vVHYAvx0CK1WFlBHHKcBmsZQcbVV6xnvrzWmr6qwyeHK1WuB5dVaro/YPKjbTya4cbq9YHGptz1erE48eer1R2XdzdOfbUVkJN+eq9YT2PPV6sHPV6uioJ156n0prh5fx56vaaxSJ256rgRWBkJ789Vqj89Xq4MDYg89Xqj7Bz1erDKtgDyor1YOWr1R5EUG/N04msQUeB40qrVgYXF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y8hY7Rc/Dnq3qrhtcHVdeerWuuyrE89W9VYto1+PPU4DNcAo0HPVeuNiTYcsa9XEgkW5XZXq62j97vz1ersHS/fnq8cK8QGFjyxEUx91cAEW7Dla3orpwCO9rjTnq1rqK6qVCm5P089ShBmuTbWFgO35c9WqwMmz3b/Hm6frGV3D3eer1dreJha6kagg+PNUkKKn1tp1FSqgbvtADs3j9/PVRBg03Moc27c3S6ulRTouvNU2TFcNh1289TXeV6RQBu56vd5Xhdh72nPVqdWFdybi1078vppspiukDkAkX+J7cpVkrisboATfsOeq/eV2YwUva1+bBimiqaxiOMJuJNhzeo03XIXQEOul9Dyterypc+6eer1cCbtY6eHPV6siRRtCXB95T2PPV6o5Rh7z9j256vVxWJnZV/xED7zz1WKoSac8fh8nHKuO32JGT/kH3f2c9TbQkVgpF2xyVJ8AQPuuf2c9XiahMAZQpB7jm68TNSaYsJ5WXSyOPqtbmqtUMxsGVNASDp9V+ep8KArqnjLaFewLH4DnqoYFednlKxr2vpb49ueqmypFc6Gby1+zGAg+kfa/Pnq1WKRVGxfbz1eqMyqSTxsia9XYXWx45Xq4FFUjXnq9XiRbavs56vVhsW+1fT489Xq7Vfd9vPV6sZjI94ac9Xq5G3hz1erplJ18Oer1dBPetfXnq9XFlUHXTnqulM10NrJrz1eUmK71ve1geepwImvBbDceerxRFcSD3bnqYrjsBIv4duer1d21uPr56vV2y/vDnq9WJhcWHPV6sSqw1Y89Xq7Nh9nnq9XIqCRfnq9XLZru56vV4oD2HPV6vMDrfnq9XG19U56vVy7+6Rrz1erpe556vVx3e7bnq9XQuugHPV6uROvujvz1ersj3doN7c9XqxEgAH289Xq8SpIN+er1dF76Dx56rATXSvewseeq2muEgUgjx56m66Cbj7L/AH89XqylSosvPV6uIBS+7nq9WNlubj6+er1cljCi3jz1ero3B0156vV5VDXB56vV2IydbX56vV3st7oW1+erZM1kESeJ56tV5QFNxz1erkoB789Xq8VP0c9Xqwn3b9+/hz1er//S2wRxAqpyrvjdars9hz1erhzdP17nq9XBxpflor1Ytp9nLaqrFe43VqxSfa56qiuHPVavc9Xqj89Xq8OWFervj1aqHxilFe56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sosSt+er1Y/G6jnq9XY+weer1d7raHXnq9WI6aL9/PV6vWY9156vV3/un1c9Xq6fS1uer1dA6G/PV6shtu97x56vVw1B2n6v7eer1c9tgLc9Xq8LBtOer1YrFD7vPV6utzHUduer1c1t9XPV6u1947Tz1ertk29u/PV6uIUON3PV6uYBJsOer1eKqRpz1er/1tsrQ9+FlTjXuer1dnsOer1Y2+yeeq6qxc9VK7PYc9Xq656vVjfseXNP1iZQGtyta211c89WorgVXvz1WrFz1er3PV6vc9Xqj89Xq9z1erA3731c3T9YrKO/PV6u+er1R+er1e56vVwftz1er3K0orEw90HnqqK4c0avXF/snm61WHnq9XVtb89XqxOovfnqtNY9i89VajsPA83SiuBQW056vVi56vVgYEd+er1dGwHu89TqKwFCDfnqerrnq9WF/tc9XqxeWvN05qqNJ256vJrEvKKqxrrl6tWMoD256vVgk78Zryax2B789W1VEbb9fHatWLjdbrA5UHnqunbUbmzVK9zVLKj89VE7K776nnqvXXPV6urC1hz1erHzVOV1z1eriftjnq9WM9hz1OJrjcc3FN1gIINjytK69z1erG48eWr1YiLjla9XHYvPV6sVr9uer1cSuvLTVprG6fvDmqsDNYytwebq9YSqr356vVxtc256vVjMannqtNY3QDtz1WBrHsFrcrqFXrGVPc8vWyajuNb89Xq6A9vjzVWFc+Vp6sT9+er1Rz9n6+bNUTXDmqvXA7b689XqwctT9dt9o81VRWFux4xV64cUVqsL/a56nE1hZR356rIrxAOg14kq9YWO02Xnq9Ufavs4rq1cxxhVarA/2uUp+scnbnqbTWHnqcrHJ2HN1sVhf7PNVqsPPV6uPLU/XB+3PV6sJF9Dz1erE6/Xfmq3trFsHN1qsdiRpypp1NcShH2hzVXri407c9Xqwsu3nq9WEoD256vVidDbXm6cTUQqCbnnqvWGRLnnq9Ucpu0789XqwlG8OepZWKQWGvPV6sPPV6uDItjzdW1VCZdvPU7XBgCNeer1cWW2o7cS1Worixtz1OJrAU9nFVVrGQFFxxLVaxMNbccTVoqORY247TlY2W+o56vVCYG+vE9brq1xY8cTXqxkdz8eOVqsNgfe42qt10yixPHKumozqCbfDjSqsqozLoRylOahUdl0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ttb89WwYru2thrz1aroi+h56vVxPvNt7Dnq9XrqunPV6sdtSR356vV2TcbF0056vVxuGuPDnq9XTOT7NO3PVb7q6+0BfnqrWMEhrtz1ersKpPve3nq9Xii2s3PV6uKghNeer1d7T9puer1YlNidOer1f/9LbOb7I4W1N4rHzVWrlvbnq9XHnq9XgxH2rc9Xq921PPV6uPN0/XB+w5qmjWM89W011zdOVxf7PPV6sPPV6vc9Xq9z1eqPz1er3PV6sLdzzU16uPN16sMh1tzdOJrFz1Xro9xz1ervnq9Udvt/fz1erpt37vPV6sHPV6svGzSmsTdhy1UFYnC3156rVh56vV7nq9UY9jz1erG/bm6UVi56vVjftyor1Y+Wr1YX+1z1erjz1PprC32uepyuPPV6oTk3tz1erGTYX56vVG5ulFe56vVhf7XPV6se9eer1YuNzTlYyxB5qvVHk8Oer1Y+bFPJr3NU9Ufnq9WJ/tctNargT4nla3XW4Wvz1erD25aa2awyd+Xqya4MSBrz1bFdnVbjjNerHuKix56tGulOm4c9W66bSwPPV6uj3HPV6uL9uer1YuapXXuer1R27nlTXq4s1hy1erDz1erDL4c3Tiaxc3V67PfmqomvWBGvGVVauLKAv0cbrVYOK6tUY9zzdKK8/2eJKpWEd+erRrBJ4cV05Xr6W4kqya43Ps56n6wlhc6Dnq9WNmsbDnq9XDe3PV6sIkHjzdWiuMnfnqsmsfN1escnhz1erGe/NVUV7m6tWM8aNKaxP354V6uD+P18tWqxaf4uer1R3c30t9/PVdNcCdNbDm6drC58Oer1Y+er1R+er1Y5CNvN1sVhZgO3NVqo7ksByia9WLjNO1j/fHHFVusbdhzya9XFu/HquahMWU83Va6Ltt5U06msJYt34mpysMnhz1erG7Hvz1erGzW0HPV6o+4c3T01ilLDvz1WBqNz1eri/2eepXUN128uqmtNY3vblKdArFa2h5qrRWJzc89Vqwb/hz1Visel/jz1WrF7nx56vVhJF+/PVfTXHcns56t6aisVub83V64+58OapisDWvpzdP1w03G3PV6uBK2PPV6o7kH7Px56vVHcgD29uer1YHkKj289SlOysWlhc9+eq9cbqBa/PV6sDai3t56vVwlJuLconZWqw/aBXl63WIsoGp15TSK2BNYu+p5ar1mlAgXYBd3HvfAez6/HnqrtqDbTaB256rV5l00PPU5qqMdyHUd7/AJ82TNVmTFLHBEfDcuYnjy3VpgtDEfaZffmsfaEFvhu56it3xOBPQdXs4e+kUqbrHxA/W3GpijRS5JjjXTEDRRr245W0nhXmuNQOepRXEXtutz1ern7h5RVJK4Ekm/hy9OoriLqtgeeralRXIAuwHdj2A56m1qipdWEjX5OI32W3MP3m9l/YOeqiPFTd2Fhqfbz1LDjXOFf0nmsNEBbm6RuHGsCyNIN58bm9+ap5ArkdTfnqerG5t256mNFYZAkhHYX7689VftwpnxCSAK9M0gVAAW297DsLjQDjajSG4OkH1pthr6SomTEa4+TTxOFDaAstwFAtqS50HfS/CRdY6ZxKlTSoypilXXYniNezJ8zWBzSm3ux06sI1fbcfaPYn4cSmgaaVGUYcOSvqKyqRZJJpWWMOLKFiUqC1u221z9PKVpVOkVS6SNjNUxtUNJtLLdtgBAIHcXIJA9lvbzVUpnwKsgqoJoqenNPT0+wguLNJe7mV27kt8OUUONeOFZq3LktaEepffJUEyKHsFhiQe8ypbQudSfZpxitA1EqsQM1d/NireVTI3lLYA7AtgLW0NvDl5NWimDAaOSCQ43iYCzTtJMw8SdoWMEf6ijX48pWiZoOsUklqKk4vH/lVJjUafa3b0BPsFuVVsp2g+q1dqySkJ3b5I9xIJP6NdxOvhvOnGqtUeoo1raiXG6hrPBG8YDaA7bgacrtrVJWiqqnE5KOsKny9sgsf8I9nw5sYV6oTY/HT1iFSR5knl3GpVAxA+s/s5fXXqErDEV5Z6wxF7JaFbaDd9i/06c1pmtExUHF3TCKASPKjTqzbQBus7aE/H2a9vbzxEV4GaUuX5P8AfBIalZNku1ULDWU2sdpHcBtCRp8eXTsrRpvy/jMEmZJ3QgbYjcKdF8pgoUfDUk82k6jVCmag1uIM6GgQBn+YZR7Lsb35s4VYCKaMcxdaItFMCWkkjUG+g/RgsuuhDE/fxoyavSoy9i1ZguNVNTWOXWniSIqLeCqnvEaXuTx8IjGtETTNV51bCa2WK+69mUq1t0YbSS57EgEfTx5KYr0TQY0lT5inF8Wfzqrz4lgi1Ygi6qVRdS0a+9bxNu3HatQ44VmBsGhpqXHKfzq1Kcl5hrJvVj7sgvbdtPcdj48ShEbaa00glxT+Y1/kVh8mSHz5oqg/YKO3uswUXJVNLnW4I8eOqVprf20hcCzlh1djs2KQo7UEKzJThmCmdlX7YH7qnQt3JN9RzaVTTlP3Tqsxh2xTGc0zNPTbg0MF7ghbvtQXG0GQgE+Pc8aCa1THh+fMPoc4mulPlyO5QIBZBE5IuSdWZfC/1c1or1GHSo8zp7QYCWI8yoqDUF295guvvD2P7wOvbTlinCk8YzTXiWaIML6L1M1QqKmJ1X8rgaEhXMUVpqiTYST9rapBBtdtebR9teI1KmgBocwFKuJamzedFside6bLFQH8VDD6+Nxqp6aS+ZMPpsVxNZGBhrXClzYhZBY7WB7Bhb3v2croq4NT6SoqMZpYp65t02HiRhJoCyMn7573BB1+/jiF6q9Tp8/jFRglE9U6/oYSoUm+1WYFEJ7kFe/x5sjVWqz4PVYPJiDyTQb1qkZZ495DKB7qtGR3s3t78pp016hFwxqSPC6fAKaM7EnmqJWYAs3uqoBt7ANOerVTsDloah1nAEbLIbbri4W4sLjlE1uldOyx5goBFYx7JIzYm4JXRvZcDmtVeoRYaU0tRDPGw2uxLKdRY+6foB7/AE35emtVLCjjo6SGmqD+kjuRtIJuE0Fj4d783TRM1Oo6aaljqK2P3qapkZrrqVUoAWI8ewv9/GSZq9SaelWKrocQjRX+YglinvruCjejfSG7fA8vowmvUpaiKlp4qaWFzDG4922gtuDC33d+e1YRXqV3lQ4XmRJpFKRm5c3J1ew3H9vKTjNeBwoWKOOTDpqihgjMxMcMyX/fRmsdR+8n5gjitJpITQtZexRaLDKOSpO9aqRvl5G7qGG4qT2G06C/HNUUwcaWjYUmJ1a1Lr5qzh1YR6spPcbTYsLi4ty5Ema0DFOUuFYll7G6afBai9KoRER9xZI3NjsfuoB7i5t7OWGFWBmn6amq33PTNFBVSSwhmliD3ZXHlyrpclb2YezX4c0BWgYrPX4kMZxT+rC+X/MKW3mRyboxKJQbLHIPB1BGnbswF+K9opo4Y0AOKZf/AJPmCPEstztWQgSGSjdv0rpujWQxDcQ5TUkKb6XA4kX4aXtq6aM3g2Fy4XhMFZUDzomazOV2n/iyI6gEgm411FxysRjSNZ10JqfLzxz4jGDsYI4N/euLbybeNu/DBJkUmIiktX4zuaeqitFIGuf8LW76+yxvxAVcKuEUItFHTY1QU1fTIBJtPmgEkGw1F+/u+HFw8dNmU0H+a8sVdbiVFjlHGsk5fy5ULbVcE7rAjsQQCL+PE60kGaUoVhjRZvVLW+dkGODFIr1kBfZI2j7Ozo/t07+BsDwyaM7aHu73gcxqoGtAebzIvbxaBNZPISRUWaQyEBtCo+/jtKKjk3Fj2HPV6vA7PePPV6vBrG41HPV6uPPV6vc9Xq70tbnq9XXbQc9Xq6Ykdvv56vV2L+PPV6utoN7+PPV6uBAA08Oer1YgbtY89Xq53925056vVwttXXtz1erm1xop56vViYlreznq9XWrMT256vV4vZuer1dbTbdz1ergzD7Q56vV3pf3tOer1Y9CbX56vV//09s6Tw4WVONYtw5uqzXtw56vTXmtt5qrVg56vV7nq9XJPtc9Xq8xB7c9Xq4HnqumuubpyuL/AGeer1Yeer1e56vV6x56qzUfnqtXuer1YD3PPV6uuer1YZO/N1dNYuepyuj3HPV6vEqDrzRr1YGIJ3Hm69XW4Ibc0RNerCTc35uvV2zW5TbSmsTSbueiqaq4MwB7c3Vq4P8Aa56vVx56vVjk8Oer1Y+er1Ytg5ulFR2Nhyor1YjzZr1YX+1zderEzEHTnqV1jcgG556vVhZv3Rz1eqO/fnq9WGT7PPVdNYObp2u178qaqajMfe5arVxl8OM15NYubpysB7nnq9WBvtc9TiawuT256rLrBr/i56nq4MSdDz1eroknvz1eriex56vVj5qnKxuxW1uWFUNcH1PPTWxWFux45VhWXjNeqPz1erq4vbnq9XbHtz1ergSGFhz1erok7fp56vVwPc89T6a65qnKxP356vVjPY89Xqwc9XqxPtvrzdOJrlzdXqOxA781VE1jL6ac3V69vuLcSVWsRawvxXVq4E3PElVrEzgfHm6eFYNOXVtq1cX7cpWqxc9V07a9z1KawHueer1YX789Xq4c9Xqi8tT9dO1jrzVUTXgQe3N1euEnhz1erGe/NVUV7m6tWM8aNKaxsyA8tWqwObg6356vVC56vV03hzdXTWIMi689TtYXfTtz1eriZPhz1U01EJJPPVesT/Z5RNerEObVT1Y5SBa/PJr1cLj28YrVYC634rq1cHkX93jOmtVhLE8erdYz3PKUorCfs/XzZqiax81V6wNu/e4nrdY28OeqwrE3fnq8ajn7A5unqwv256vVi56ldYWIseer1RnYE3PLqrVYnYW43VxWEvrpz1WrE7WN+er1YOer1cD9sc9Xq4Nt/d56vVHk789V01j5unKis193PV6uLNu5qmK4HnqcTWEdz9fN1esdxz1erA1v3eer1YjYoQ3hz1XTtqO9m7c9TiaxyLtsBz1O1gItoeer1cGLGwvc89XqxzX+yRblE7K1UYyaW5erRWMsbezmqtXSuYiZLajt8eeqp2Vikk3Hf7deep1Irq4+1489Va4MwtoNDyor1RHlBJUHty5EVtQgTSvzORh1JQ5bhDBqaISzgt/u03vnT2qllPx56i5gayVGkit9Ap+njcCjHRWEk+Ph48vWhtrpWJJHhz1K6y7iFtbT289Xq4NYty0VTSK4AkqTytbAisim1+epOrbUoEUUHmt/lX+zcfZH+I/T4c1tpGTqNQAQvu31ty420YpTArG+4fSeVp2uZUxwCAnWT3j/AMR8B+3m6QDxVx2g/ZGnNUqUqK5MCRqbc9TWo1xIvr2tz1KqhSpc7hrfnqTr20w4xTu9IYkUWcgamwt+8x9thxhVBa7udOFIbFMOpqZhieIyKJIgzRowK7TeyNbwIHbxH18Jl1CuZrClU85XxKVYqzEpmAldIlBUH7IcEC3a24fRxPQKcxNLLCq5qydKRAWWOImY3+1t1IUmw9/t37Am3G6oqhGrcWpqKAy4kRDKApRQbhQ42jwufDw05qmqfKWKkpyilS7osdox/lGCCwLey5547K9TdiUOJTzvLVG5/etfsDfy7+w9jxLVaZ8Www1MtNRysUQHzJNbaLb3T8S38Oeqs00ZupJ8Ow2KaFg8zyBEW9tSpNh+3nqtQZS0QFDS04G9/PYOyG67o1LyN8VuLDnjspRSExOmq5cfdIyQisEYeJt77bfrNuMVuptdDCBKKuMHcDIig6Ak6qeer1ISXBRQ0ccSG7hJCoHhu1A09gPPV6kGmFVFOaeTaHmkkuVvYKqtYkk/Tz1eoQZMQFKBSxzNdS920CsQNq2v3CgEjjidlaprxCuihSTEKmNnJVYqdW1AO25cr46+3mlV6ptNnLEaw02HsWnPlwRmVh75vuU2A0XUjtzaa9TNl6grcOzMcNgUEzrKoHsVySNR8AOWRtrdKyod6eu8uIA+WxYuRcltQLe3VeXiTWqZaymgWeimxSW0l93kg3YbbBma+gsPby2ivU7tmufF8PxBIgqNVGRIgttAoZvMv4sb3/hpx+vRQNqq/Ij5xyZZoPL83U7Vjc3LW8ba9ubrdZ8DSplrZMbnvTrHK4QySDzUUgKjKBorsQCCdbezvxlNapxlr3rsOagacyySCWOWRDZ9rsPdRvYG7nx8OPVukLnfM1XU1oy1hDBhvhpXYN3kCszOdvZEsCfhfiNdeApQ4TRhpYaWBSIqRCqyH7IElt7E9veuW44jZXqGJcZy9TYKaWip3kjpIIqaWUk6m5Kg3ADuWJZrdhbw04or1F9rsEStxyRcZjdjiMyCIqQGWCErGshPZVZr25qtGjTY5j02A4XheF4XBvlrlKMv22jQykLu1GpRR2/bz1NxSR9SOKDDMXoem2AMGhwBVppCVCoKtlE9ZISe7b3C/QNeMvHRhTTR1UDOVA0mBT41iV3ZWY0kOm4sNNth9lT3t9fG0bKVKEVKxFJRTpRVTAzI0rrrchmt+jv9J48dleqfl/DJaejmariKxkMGvodxuwDfC/GUVqmitqogIXWyNM0KIF0C2A3EE+2/biut0tqDBqXBMQvWm1RURtIbLcogOgAHi/e3s42dlep+LU1BRRQwLKZFjIR5BtkO59Syg6jjFVpUYJD8xKCYyykD6mte/wAOUTW6VSUzUzwVAUvILbYwBYG+pZvjfjPGqHZQlQMZoomdLGoDD4BgbAcUU1Smy8Ixl+Olv5gj843IuVubWN/Dnq9T5RSedhQoo++26sO/18T1ulzDhjFVKoI5ASQD9lhoLj48Wfw16kJmjDKimwSqwjcxkWyxFe6M5JRb9tpvYfdxHXqGsLS4hhlJXKh3GFGkB1ZSB3P0HRvq44qqJoUspqTXYcTZYZIyY277XT3jFr4AXsP6OPp2UmXtoQ6rB6mbKtTheFMDIJN0HcgOtyPjrrcfDiiMKbpxwbMdFi2CbqxfKnicra7ANeISod/2Qe66i1x7eUBmqxS8oXqWpTSSvI9M6qkyE+/G7KNsisLaX7+3vx2atNOlQqU2EU/85qyFhmXbMAC9wDcPbX3QQb99ObpmkVnjMf8AIcagasiMu9kdXjZS4aM6TI1/tW1YE634+owKeQnVTVmHL0NZX1OZMqyOyzzec+0o8BY+7NGV/ccMCSp9tweUWNVPoGnbRo8p4vSY3koYHiKfLsySKC7n3XUXKE3Pfulj2IHLpGoRRc74TSWyzjtRSRVuDlhI8AZlJsCVJKsPj2/LlQYmrqGANYsKlhSZIamZWp5yDBITpobMhP66acZSJNbGyhFytiMmB1E1EAVXzAUPfcO9vhpfl0r0mmnaW1WYqWEMVElPUNdGIFlJN7NfsPDhlspjGRRA/VvmSvyricFdg6w1UMke2pp6iPdHIhuBcHsyk2JGpHLlPRUp5E1+ZVAqq3Hf5HU1Ek2DRvS+ZcmFmLqp7+4x1sPYb/TxSlVZDsBY20j3s7C/e2vHwZo0E8a4ctVq9p4c9XqykKEAUd+/PV6uI+1rrz1erhz1er3PV6vXAH089Xq8Pu56vV7nq9Xuer1YWFx7pv8ATz1erhbtfnq9XZJvz1erGS9iBz1erzMfE+F+er1cCGU2Y356vV4uG0HPV6u7Etca89Xq5M11sPD4c9XqwMCpuO3PV6vA3sT2PPV6uJcAj+PPV6v/1Ns1yDa3Cypxrhz1errcObqs10TYX5UVasPN16vc9Xq9z1erqTseeqwrrm6dr3PV6sB7nnq9XXPV6vc9Xq47156vVh56vV1ce3nq9WEka89XqxeYvPVaKxFrm/N07XXNRWorGXsbc3W68XHhz1erCwDHTnq9XB7X56vV3xo0prG/hzYr1RuOUmrpvDlaeFceeq1e56vVgJF9Oer1YX7c3SisXPV6sDfa5oV6uDGw5uvVh56vV0QD356ldRmNhfnq9WHnq9UcknvzWyvVik1056acFYuWpyufGapUJmvfj1Xri5UjTjNeTWEuPDm6crFz1erC32uepxNYXB789Vl1g1/w89T1cH+1z1erjz1ergzW0HPV6uF+aq01icq3bm9lWrjzVero27e3nq9XFmtoOer1YLgG3PV6uIYKAObNOJ212xtbmq2oca6/1+epquP7nPV6uPNUrrH/ALpzdJKx81Susb9uer1Y+er1Y22315unE1g5ur1xk7c1VE1w4lrde56vVwftz1erCLeHPV6sTbL83TwrGxF789W6xOQdRz1erEZLjnq9WMvY9uepZWJmsLjx56vVwYg9uerWyuBNtTz1bqNy1P1ifvz1eribE6c9Xq4FgDrz1erpu45qrCo5+2ObqtdcpSiscnhz1erEex56vVg56vVjf7PN0orEbk356qzWJz4c9Vqx89Xqj89Xqxufc5oVYVhDAHQ88rZTlYXYkacqmtCsJ7njNerHxXVqwMRe456vVjJ+PPV6uPElKaxknwPFFarHxPW6x+Z8Oer1RZG3Hm6UVjue/fnqoqorEgXHPVesDsbc9Xqwc9SusZNwR7Oer1R2VR8OWNerE4W3K16sNrG3PVsVxbbfXmqvWG456tTUZiNx56nQa9zdXqPz1er3PV6orfvfVzVMVha/YHm6frjIT3Pt56qJrExO/TnqvWJ92089XqjuxB056vVikDFSOep1NY+9iBz1WTXAi5sw056naxPaxsLW7c9XqxkgC/PV6okv2Pr5ROytVHZB4347Jq81wA2WUDX+PKVvbXFpANBoebArYFcOP0qrgCD24nrdYTdTYm9+er1POV6GCtxfzqof6PSKaif/AIimoX/gjYfXz1Fr6pwpnq62Strpq2f7UrMx+s3t9XKjZTzWAiuIAYX5allRpO/189Xq8p2jYeer1eIuLc9SdddX3G/Yc9Siura6dvp56qkTUqljVQamfWJOwv8Aab2fRzdJHFTsrHNLJO5lkPvHv+vs5qraYqK5JIJ0HPVcrrlTRRvId/8Ak0G5z8PZzdNuOTWLfJLM1RJax8PZ7APoHNVpKa5o4NyOeq1c2ay+7r9HPV6o7atca3Fuer1Q/LZwSBoO543xqhIG2k9X4hF5nl0MYqpUsVYj9Gpve5N9bd7e3iR1fCgNf3yWwR1UH2YKulgophXv50kxZ5ZG9tvdCj2DhWTUFvPd8us2CYo02GFJhsjh8tTYe8q2uof/AFiTcDvxqktC/lWYwQ1NYiskCMwRWUFmNx7zX+Fxxui9VPGEU81bmkVM7meCGO9mW95GYKGN/Z71h4AfEc9XlUKWE4SkIqccxIkefvMRWxIUPYFj9m5+/wABrzVMlWmp9YQytTRRmyEIoUe8xI7n/VvrxytahSTxDClarjdmYrTBXcL++97Krf6oOp+jhdGNXpnzHTpU11FSAMf0jVBI17fsJI+7jyttapCmmqqLeoXcDIzlbdvM9630AADjJ2VukUKaRpExN1PnMW3Mewubsfq8ONU6mmWspmqdisPcu5N9SddObq9JeuonaZAWsSJY2A+C+7Y/EcsitVGgw4okj1tiscYjFxqbjQ/SePVWaD2pZmrY5Kk7RCGQr9Vz+Wn1cTfxVanXFYDiOKUbL9lIiuwe3Q7rDTXimtVwkocTwyOSsjS6zBTYtbVWNxz1epwwuoqavNsT1BCIojVxfS2wFiGt9m+nL663ThW47W4nXVFIkApXKyJuChbbdygD2XuNfHm9c16keqipwD+YkgyUsEkB7XvtJYj22uOP1usxpKbLuCxbZfMq2iZwjML3CjWwHiBbnq9QS1mIwJTPFLN8uXD2MepTeNVUD94n6vbxJVaxz1aVXl5Yw5RTgOD5hW+2413nu7hbk/E89XqcMaxLCcAwWTDsOSVqqVLGT94i10Cj2sbHiurU3ZfwswZbkhrrCorWQSyWs0casNxW+t2Dbfv4ymtUu6GKpqaWpfaq0hm7KTvk0ChFHgNPDj1bp9wbFsUrDLNi1O7U8MTMINmjTFryMw7dgBcfXz1eqR/KmFHFmOsqFgggUSVAZVJk2i8UO+9lCtrYd+JFCqzFL7LuFUuMdSXzzjjMuF5MpaOodQL+ZUtEsdNBbQb3qjfX90NfTiwbaYUqMKCbPNarZixDEcZkEcrzyTKGAkYGVt/mOrG13Pct20FuNkxSmk5TYi0zQx0EccS7kSBCqjV4yzjSwG77J08bDty9eqZHhcVJgVFiNVaKnZ6ySnVhcyBTErhQNSAwOp0uLcb016nOmxU43SJXVd1hkV3OoBLxn3b27+7fsPhqeOV6n7JUdJR4tE1ZRpupmISWT3gqgAe6jArvNhYkHiNW2q7afxlEVQqMWqpi9UWLEnxB079/q5SJrRMVMwrLhqFMpU3gLRtY31tp9V+e016aEekwePD4Fpe7RNZtp1uwvf6ubAivAzThFh7JisNLqVkmTfbwCAEH6Dy9VOylhgdJNVw1WH2INLUF4nt2Ute3NU3T/heFz08tYiE+6SdhNh2uVI8bjUfHlCmt0I+FYcscAenW5BPu+JBGq/X/AB5sCK1SqWJvloaaNriMqsbA6lWBN/pU9+Wr1QsbpjiVLPRT3LlIY5SpswO/cknt18Pieer1ClhVJFRVCU0y7TsBjfT31OgJ+I7H28dTtrdCHh4koEiSWMNAjxtu/wCK/e8vcP8AkI8U0koQcGp6z+uE2GUZ2xussyaHuYgUIbwG5D9Hbx5oU0dlJrEKnCIJqOtjU09NXz7gOwjlJ9+Fri1ixvp7fjzRMVuYFLXDWq6GtdxUNFEBsZBfynjeQDcVN9UbS+lvo5cGqnGhBy3R4dX1dfhmN2RpY3kV1N1s9lcofiLH6+aG2qKoGc2Jh2bkegwyCY1mH1EaqykKxaFQPMX2llF/G+o45p14VdJ00HseKY1guL1CR7qfEcKT9PFGwjE0JB3boxoJQvvI1tSLWvzwV3dKUgK20bno7jb5xwSbCsbkSecxoYp1socEEo+ltSNL2F/q5pCtdJHUaa5T0ddgmNzQ4pF/lIhJFJtNwy2V0Y+wix+rjUaDPTVAdYiktjSzoGNmWgMjMwiXcYZh2IUeDD7+aJKqVogUIGVsY+axBaaOQMPCRu1wdBrp9XNNbaSr2ULVLVQQYbPheIMFSqkYpfUK9tVN/shrXA7ffwyTSOJNV/esStrP5ElXQkVHyDeTURbBu2t2c+Ons7EHils41Le7p8dVYVyIakNDrGxuv0HwPxHFadtZDNU2yhNVNgQT24/S6ot/Dnq9XYbbe/jz1erksqg+23jz1erzybtfDnq9XC9xz1ergzEHX3eer1eFybdhz1ermCD256vV1fQkc9Xq8WF7Hx56vVjYJ2tz1eriUG23x56vVHsC3vac9Xq6tt056vV7nq9XFyLgc9Xq4pa+vfnq9WQsA249uer1cd5JN+w56vV1qbk+znq9WLxB9nPV6uZ2kXBvz1er/9XbMZt3Cypxrjz1eriDYX5s1RNY97c1V6489Xq9z1er3PV6upOx56rCuubp2uLHwHNU3qrDbm63qr3PVesclr89VRXG6+znqtWNrW156vVjuvs56vVx56vVE5un69z1er3PV6sRcBr89Worh356t1yXlFVo1if/ACnPCrJr3KmlFY3HjzYr1YgLctVAIrgy+I56rVj5oVuvc3WqiN3bm6UVxftz1erFz1erC/2jyoqorG/2eWq1YeepXXEkAXPPV6o8huL89Xqw89Xqjcqa9WN/tcpTtceer1Ri4A0049V6xyeB4zXk1i5unKj89Xq9z1erC/2uepxNR3+1z1WXXHnqerC/2uer1ceer1YX+1z1ergex56vVj5qnK63WNuer1cJPDnq9XA9hz1OJrg/2eepuuBNiDz1OJrzeB5qn66LXFjzdJK4k3Fuep3RXuap6sPu3tbTm6SVx0vzVK6xOfDnq9XDnq9UYcbVT1dcerdYpDrz1eArFfnqtFc78S1rTXF+3NVSsXPV6og46qlFcGIJ9vPJrYFY2IseN1vSajAW44qt6TXiwBseN0orhJ4c9Xqx89XqxMR7Oer1cOer1R/c+PLU/WJmF9Rz1erixHs56vVwLaduer1YyWvpzU1fTXiQBc8rTtYWNzfnq9XEt2B56vVFf7PPV6sV9Lc9XqjyG7W5unhWJyQOerYNYixPfntlbrCXbnq9WKQkrzdbFYByiqdrx7c0mtCsR7njNerAftjiurVwYKBpz1erGVB56vVxseJopTWDj1ar3PV6o/PV6o7/AGjzdOisO5fp4nqxqNvHPVasT2128umrprA1gdOeVT9Y2AsbcpW6jslzccsa9WNk015WqARWPYBzRE1asTJrrz1XFY/LPLajVqjsLtYcrWwJrjs+H5c9WqjEC/fm6frrnq9UZrXPNUxWDm6frg97c9Xqw63JPPV6uD32nnqunbUaS99eepTXBrlSfhz1I6wDff3rc9SlOysbvpb2c9V6js9gdDz1erh5gPvflz1erE5G2/KJ2Vqsd7kbRy9brHZr3OvKHZVpqK3fcfbbjqadTXDe1r6X+nlKUVjZiwseer1dWt9rw56vVju6owViocWYA2uPYeepjSDUdlP7mnPU/WQMTZQeer1cXW5tz1erxIGvPV6ukO++o5vbTZTNdHarEjx5qnKz08T1MnlCwsLsfADxJ56kTiuArqpnR2EUOiR6KP2/TzQFbbTUX3ms3t5ulIM1wuQNp73t9PPVUgCs9SBTKKKP7WjSX7X8F+rm6TVFsy6+HNUsBmsG4hSp8eephSYqUlxGNOeqtRJbgkjufDnq9TTUxJUKRU3dLaoDZP8AgiO/KKpheym6SsEET7ioVR9lV0VPAAC2pPCd7GolzlsNgqoMcx4xhNOpxCRCIhYliAfboFPjftxCRNRINs0lcDxGnANIQIjVWqnW+vvnaNxP7xAGvNARVymBNGSwrGkw7LsZePzJqlgBptvoSSgN9ANL83pgTRdFKHLFHJW4E1XGv6GaeIM4JuW02p7vewBv9PKVo0MeIM0GFwUQY7EMReJAANqG7LY+3ufv5qk6kTTlUJJFhu8osJkAfTuPj93N7K8lEUm8TnjFOzgHYQug72Gt/pPElOUkIMUjxDqE+X1W0NDhYq5m0sGlmMccenwUn2WB5Yma3XB4q3FqSpqIgEM1SUivb/J7V27R8R39nGjsr1InNFM9DgyxhrGncA7Le8O4vb2+zjVWBim/EcEaCaOGUAkhi1vYOwHxPHNM1vVSGxfDZIJUhVAsjs1vbZRrf6ue016ZpO4/DJBMYqZwFZjcnvcAAfcOO1YUmMRpIpY0qXHuhZQRa+4qoIY/DXXjWmrU1YdCzovybbUSMt5rnw0LgfwHHa1U+gjrMX3GRbpHu91j2UgFfvHPV7ZTPiFKSag09owIJE7EnQhgRY9iOJ6tXo8ZpoJnFQ6u8sIsQbsZEIJuO/jxQitVhoHpqfCvMbaId5Y3+0QRuP03P9HFVUBkxSRapqsbpoKaoGyWCOQOR9pgxJQX9nx9nN05SPxOhoMNrGnEQZkZSzaHex7LGPpPfw5qvTNOWC0jpXDEakXjYjdqLWB965I1uTa/jxpNarE2Dti1W+Y6r7TFQkQ1LErptUeFux7cerdLiiy7VGnpA6GdErD8yIyBGCACIxK2hRDo5H7wIHKaRXqXlDR5fpkavxKpJkAZdypZWc/ZijU6n/iR+/l69UWgxVq35nFUhZaKmRgFlO0WZS3lkDUs5BJ1uBz1eoHcTzBiedcbg+Y/yYngCU8ShYgm5S11HfavtuT7eJlDUapsoZc25hxPJ+Hw9Padt2J1lauP4wrpqpqfepqXb7aalPmEeDk8edPdUhjjRX82CWbMAkri8nzG5kLH7ZLD9GxPfd3Xw042RFGFKZY/IiSSsdHkEST+WGuqByWRHI7krYn4W4/W6cIfn6vD/NxeQ+TSLJFEQf8Ai4q0gQDwUi4+N+er1ZRLTRVFJiEhK0sDbWiI7DwbTvuPG016huxGKOOeL+XnzA8fm7uxuLC7eFiToPpPE69tepU5ThqcYxL+Up4KxsdAfZc+FubSJqhE0sKyngwesNFToHMsoST2XK2BH1jjmqqxUvDPMbEJ2VQ7LLHE9yABdb3H0DjRVJrUxS4pYIqmV55FVpmQohV7C6NYlgNb2txyJE1Wn7BIzLPPXuU99SW2iwug97T6uN1qnXBqR48VSumO4YhIzqCdDsjsFHsuBz1eoR6CSKNZGjFpN24hRqrAa3+BPPV6pEgnMAr6LTzmWRlI0BX3SBbsrfx56vU1Vt2xhqOP9H50ZZXI91SCNwbxI7fWB7OerWyhNyuK7FcBEkzAVlMWje3vbZEtdb+xhqPhx1J40wVQaGPLCHHsOkjpj5c8chUAWO5tCVYH6e3HNVMlVCBlPEsOl8zFqsNSVI86KFuxYBdzAqfBXB48346aJjCgxxMJiFJiuATxJJGXSuo1jk2FzJf7BYEKQ408BxheB00pAwmlfl3FcOeopYp6h4ZWi8xPmEVd0cndWIJG9SAr3HsPLpEU1EUpMPw2dcfempwKj+XLKqMAY7eYNI5FU21GoY3B8Dy4GNepNZ1agweuw/FIYGiepnikkZSu1j5bLKrR+De+L7db+GnHD4RNUQZMVzly7BU4zFigMUtdBF5dn0eSJ7nahtZipBG1zfsRbXmlU7NKzIlO2WI43jkaSWGVwQV2g08zbwuugMbm3w0PY8ZbHdmacc8YowWP4jBjGF20eeCMSqdt963IKE/Rp8PHiuddFgGk0jsMq6KSSWhC3J2I4a+657C49o7/AA5tKhNOqEY0/wCA4PT4bWPQVqqyTfv3Avr7oJGn0cTJTBqyjhS7hwyOow5IZhrKGQE6FiDdVPtNvHisYikowNEH9UeCYs1BNVUE4ixHDoQWRxdKuhJNiTbUxs2t9bccQak/I3AhdVUVpYMWVfK11QG4B+HDQbayRb2TTM7FmJbx49SwGaxOdw3c9Vq6vp73hz1erFck+7pfnq9WTebWv8Oer1cvMFrnnq9XCwbUHtrz1erkdNQeer1eDDdfnq9XTE3IPPV6uA56tCuJI7Nz1briNt7nXnq9XFrhfaeer1cCdo9vPV6uB+1f289Xq7tuO7w56vVxuC9vZz1erosH7+PPV6uPPV6unZh7w56vViub2N+er1ZuV2V6v//W2yuFlTjXuer1cD9jm6qKxc1Vq9zU16uibC/PV6uty89Fer29ebr1YnKg89W9tcdOaitxXAtYX5anaxXPt56vV1356tbK7tz1V1VHLEjXnqvXDevPV6sbNu56vVjvzdO6a4Fvetz1e2Vw8w/4eVitxXDub8tW64sdosOer1Yibm/PV6uJYL356vV7e3K0orgzBhc83VdtYmIIsBzVeiuPPVasbtbQcqa3WPlq1WF/Dm6UVj56vVxuON1qawEgd+OVuuDEFeer1Y+epXWFiCdOer1YXPhz1erHypr1RJPs8vTiaxL242asaxP9rla1XHnq9WKXw56rprFzdOVH56vV7nq9WA9zz1OJrAxub89SiuPPV6o/PVXZXueq1YX+1z1ergex56vVj5qnKxyeHPV6uJJDXPPV6uj2HPVZO2uueqtYX+1z1OJrokEC3NU/XHnq9Xrr7eWNU0iuG5d1+Vq9Y+er1cGcDm69WJ2HflTXqxllI5avVga9x7OepxNcVb3ve40qrVw41Wq4OxGg56vVG+zrxXTuquLPcbeJatWPzCDa/PVqKwM/j7OerdYi48Oeq+o10xvpy+mlFYi1hflK3WEtc/HnqpqFY2YEWHN1YGuBJPfnqttrE7G/fmq1WPebaHnq9WHc/s5an6xkkm556vViZm56vV1vbnq9XXmX78pSiozuL3PL0nrvep42RSmsbuL83Wqxu+nfnq9UcvY256vVhPf6ebpwGscvhz1bTWLnqvWA9zz1erg/2eer1YByqqerx7c0mtCsR7njNerHxXVqxyeHPV6u+UpRUU8ZNbrEe549WqxH3RzdUAisfNVeobuL3PGKUAVhZt3PVuopYE3J45prVcGfT3eOU6isW9fbz1PViZlK2HE9brC7+A5Yma9WIlbc0DVQZrizW5omrVjJ1156tg1iu/s56tVGYkHvzVXmuF+erU1gcbrgc9VwYrC2797nq1WBhcnnq9WBt37vN0/WE3vrz1erh4tz1erg/wCv389VgYrBJe9+aJrxM1iZlsVHx5utp21GLMe/jz1KaxsQQRz1eqI32eer1YVNrv4Hl1U5XIn3F43VTWIuAe/bm6rXW/WwNhypE1aKwta9wbi/LinE7awsNtzytKaxlSe/jz1ersm8Zvz1erCCGUC/PV6uBUgXPPV6ukU3uvPUzrru1+/t56nq6IJY7iCBz1erHtG8g89Xq5NGXO1BqdAB3vz1JgqKlShKaP5NNZDrIfj/AIf6ebptI1VD0Qff/dzVKUpio+9SLjnqd2VLp3FPCK+RbMbiIHxPYsfgP483SBZ1GoQvbc3vXPfmqU/YK4s5JCjnqYBisTFWUCxsL6fHnquo6q7WV9oN9OeqtR5T5slr/dz1epsrdrR7ZdUH7o8T8eUVspI6YFJOreqRngK+ZJ4qp0QW8SO5twndqIM9XhFBXmKBMXrEiqkDRRkDafs/WPHTiKowFIulmoZcxVWLLZhGYxGjC1ghCD3R3A5WaudlDQ1ZNi1JFQwuYyrKBtJDrEFXdqPbc/VzR2UWmjEYZikbNR4WLLHTi0aRCyqiatZe2oGrHnqoRFCHDDiFdh0U+IKRJNE86Kq2FnYBBfubJ3+nlarS0mglqoflSAUihQM3xPj9A55WytU3/KLNDNiWwERIWRfC5BC3+AFuJa1QfYdhgrKdsTooRHUY1OIS1veNLT7gD9ep/wCDPPV6peHUrMBiUm8SCRBErLYLuBBAHibDmjsrdRMQwKKpxGc1AAWGOKw8CzLY3HwHGKrqFNUtDHETQkWmgqBHdtQy3NmH1cUVug0xGimq8cauVLxgeXHc6kbWLt9ZHPV6kljOFw10zT20jtYW7XHdvo5un6DXMayUcN1vI5uV8FGm1r2789WhXckaRQxQwjasiL5ieA0H2fhfvz1bGNKCKiFJKKmQGKM28xb9wBa/NVSZpMY2poMaikhQmKTQqDewOjD43vf6OVVVxjQVV0n8mxehxdFDJKJITIRozEWdSPg223Lp8NbrPizGmwuSahjvHTllcXudm7cpt9Bt9XFNNN7TXLDoFmpmAAWWKFowf8VtFFvbY8tT1MYw2mirEw9Yz5xVGZnNrWBuinsCfHx9nPV6nvMFXhGEUzRzt5UtMsbsdCEVh+jUIulrgm7ePhz1eqLRV80D00a72Kec2yPaGlYRxlN8rn3Rr7Lgdhrz1epxgq8yZgopaKnmWLsoYW7xm8oQMfs99fE6+PPV6lcuHT4mKM+bsplvMxWzO4DbVVPg6i3w789Xqh41T75Go4WbYzM8ihhsUEAMq28QLC5115qqpp76T4Bl/BcfxLqfmGIyYNlGnqauWM/ZlqCnlUFOp/eMkzAt/qqeWSONJ3FRh00C+YqbMmO4p/XvHZ/KfEpp6qSUn3mlbYCqjvpfRe1vhxO54safFNkuUq3H8qUVZShpTFEVisRdlSQBhbuCt9vttxwiavQm0OH4ViGJzR4mu9aSKCOoMWgD7fs9rE2AUcvXqTGOUVVV4nFh8Ufy8LAoiKDZQACS7H949+er1Z6fC4oYnqK5VIIRUjv7za2W48Ap1Y+Nuer1CvhcE1alRJRJ5kKbla5AKlRYrr37/RfjSkzXqcsIkosPo4qeh84xDcm9jZywFzdh3UD7+JZiqRQo1OI09ZhyxygtUgrtlBFl9ywJA78vWtNOGGmOCnNfIdpqgGjXxYruW/wGnjxwJkTVTSwoKWSmxiEql0ntc37FlYtp93GZqlLzAaWAtUhbGKoVvLHhYCz9vovy1ep3wuhWrwqHDdv6SAMim+isxW2vf93nq9XGqSvWSqLtsKSrIpC7fdI2tG2v2twv9HPHCvUsEapl90MI5fLKlf8AiK7gRbmhjXq5VGHy1y19ZAQDDCrRlvB0XeVA7kEm3HlitbIoQsr1FNTDzALCodfNHj70SgN9O3v8RzzWNJjtoUMu1E2A4wMRLBqRdrzaaDXaJV9ttCfZrxTEU0caVIqYKCpgNS3zFNR1U04caSU6te4udHiYX7+24PPDCvATWDCMEGL0801NaZYw7RyoQVeCYEEW+0hsLlTqpvbjmmca0VRhTDU0rR4JDXyxs2IYbuRQQSrEgo2vcBx7eMEwKfp5y9m2m/m4Wh815FiE6aFj5TH3kNu4Q6WPHEmqKTT7nDEMNrcPglxKJIamOYruUXUFlX3rHsSSP4ceOIpsYVCx3B3xfBqqOlnkgsEmSWH/ACiPGwZJFtYkq17r7DbjqhhVtlY8qV1biWKJiOIiOqeriETeUCm5wDuc3O0BlsD43t7OJKfOyjGYe8iv/LwVEijzUcqTox13fBhcMPBgT48dHGi1W2m1qWkTHP5nSIYvNZbAmy7kvdfpsLg88jbTitlPeHwpi8ThHWdZwyqqmyyEanY3g6jW3LExSWlBlnE0qaSqytiMmyohKtTyMexBBVh7fYeeQZmacWI2UXzrkFiw+aWqCSQBJIwJDZo3ce+g8dreHgdRx5GFCbKnCF1TBmunehxyppmXaNzWv2I8CCO/DOsrrQ60UkbgHXUcUUaCuG5R8Oeq1YtF0tfnq9XZAYWB7eHPV6vak38Oer1dggarz1ervnq9Xuer1dlgFtz1erxYAgc9Xq6BA1PPVoVj/wBz56t12SoWw56vV0AWO7nq9WJgBdm56vVjZgpuOer1Zeer1R2v3HPV6uCPu56vV2fM8Tz1ers37AX56vV4D3bHU89Xq4qT9k89Xq//19srhZU417nq9XA/Y5uqisXNVavc9Xq6P2TzQr1YObr1e56vV3J356rprhzdOVxf7PPV6sPPV6vDvz1VNe56rVH56vV7nq9UZ/tc3T9ceer1Yj9vmjXq4c3Xq4t3HKmtGuL7v3ueFeFRmZg3LVuuJJPfnq9XRIBtzU07prpm3c1V6489Xq4XuwHPV6sbkbua21aK656a1UcsSLctTgEVx56r1i3nnqvpNYX7c9VKx30tz1ergzbeepXWJrE6c9XgaxOfDnq9WLlTXqjkX541YVgXtzRpw1h8v48cq1cShHPV6sUvgOM15NY+bpyo/PV6vc9Xqjuyg89VwYqObc9VK9z1LKj89Xq9z1erC/2uer1cD2PPV6sfNU5XEqCb89Xq4MpLfTz1eriV289WwJrrnq1WF/tc9Tia481T9e56vVhDkDTljWttcC1zrzVXiuO9eaqtYyb89Xq4MbC/N1YVhP2BzdO1iYkaDlNQr1Yr2N+Xr1YTJrpz1X01ikk7c9XtNYzJcW56vaaweaeM6avWN5Dfl9NaAisLk27ccq9dDtxOrbVa6ZtvKU4lUVjZvd+jnqfrHvXnq9WHnq9Xuer1Yn789Xq4c9Xqi8tT9e56vVifvz1erhz1erGWBN+Vp6axv4coKvWPlq1WJ+/PV6uHPV6sL/a56vVwbw56rprHL4c3Vk1i56r1gPc89Xq4P9nnq9WAcqqnq6Pfl60Kj83VqxMzBuer1cQ+7XvxlVargxa2vGqsDFcOepRWBiATxRWqwM27iet1gZraDm6UVFka7ctsrVYmNhfla3UZnuLDiiq1iPY89TyK7PKKp6sPg3Gq3UckqbDnq9WIkAc9VE7KxXt4c8RV66Zhe554CtgVgLE9+erVYT3PNU5XDm6bqOzEHTmqcrFc+3nq9Ud2udObpwCsTEjUc1XlVhckG3x5ur1iYkNyprdcH988txrYE1ic6256t6TUZhuBH089Xk7axG9vhrz1KajSeHPV6sIYnQfR9XPV6uRsyAc9XqjNpYHwPNU5WFySbjjqa3WIkt7x8eNVquPPV6u2G4EcUUqrF5fx4nrdcTZLt4W56vVHTQ38Dz1ernrf7PKKpAayW8Dxiq1xsTdT4niqnqxsLAAcomvVw5evVIimFM7SooZ7WUnsCe5+rnttaX4qhG5kJe9z7T48sKUJOEV07H97lacrqmhFQxM52RRjc7fD2D4nnqSLOqsdRUNPUl3AUAbVX2KO1uep1tMCutzeWQPDnqqusG95DsXt9XPVSvCMDRzbnq9XRtIPLvZRrf289Xqiz2XcqEIp/ePPVtW2mWdmmUiBvLSxG/ubHva+n18aUaLnOumetdBSrTYcAsCfak8XP0n8/bwkcNQdnMKVQQ19euL1T01Gx8iG/mObBWb/AA34xUdUgsTxSnp6oSwBYooSqBe29pDtVv8AiKG5t481S4DChuyW2GS1UOEwNIaqqiA8xVJYIbl3PsBNhf2c1tpDQ/YRjGV6N5ocOgeoeNRGZ2bbGJS+wAKLtJe+u5jzyfDSehVwvH48cxuoZXaWKl3hEW+2MKAu230eJ5omabVQkwgYllrEsRp4zuliby10AA2WXUdyTrxycKSjaKZxSOMAaatj8sM9OWUNq2g90H2bhr8OUpdUF5WioanGYkH6LfBSIF0vq7lbeBsF4kUog16pOBUNVHR0kWJIstUxeaUjRVcLtIHsAYnnkqJppVRZMNLU8sTjzJTUIzAW/cYErf2AcpTlIDF8OmjqCVOoKskjfZ3FrEkfRb6Oer1I3N+GpR1tHiTAohqViZL+EoazG3gOVVXk7aZsYwNI3mgFkZjcMfYP6RxsilFArjmGisUwREkwH3rD7S+FuOcK1MVjoIY5pTTsQxhjK9rX3Ht9Q5evVhrZZ5sKhlkezSqQU+INjr9I5qtDbTDjtMj08UkhZGVbG/8AitqNPZ4cfGytJoKsYrGavWgaOKSOpcuh3CyuiX3Kt9C1uO05USsWrpYBMXPy9QiIxuCSbEMrEd9Tpz1erjFWxYLBBX06CQU7AhWO4b3IDXHclF1156vVhSVoKaoxuCpJIkmG1juYBgdQD2+jjemvUHGJZgOFSCfFkWSesaFW3f6oGwsT9lV1J07cYqtCBg0FRRvls1MomlqKiOWViW3HddhOWe1kCavfuNoHH4NV1UsMXWgwGshw+CoVzQ0xdqtmsZjJdnMMZtdnbQA6AC3hy2ytpp6pp6zEIIcWpCVSiVITDGAf0IgEfugd/fudPHty1XrimG/ItSYVEWavqrSRxKCXKTEMkjg9n2myg/dzVNEhNCr1OpqPBel6dK8Gb9JS1YxDESmvm1BPlqjN4pCTsW+m4MeeOyKSA6lSaSuR8KpcerxJWojU8MUHnhwLxyhD+jFvF2tc27WPhxMrbStRpE4WYcjQHAMIbzKtt5Mm4MoeR7hlHhqLn28f2VvbXGp8yOlCZZHk08bPLZjvaonES3kYgX9xVsB2vfl6cr2E11ViSQU1FEsm4NI1Q5UyXH24Qtvc72uLkW9nGzsr1QqipiqMdmlVQlQ6BNovYOBeyAiwG38+IK9Qv4BFNUZaOGorQmpiqpZZh3W5YgeztoB7RxYjZTZqXhtCZ/lJaVdglBjCG/uqBfXwLEa/DjdWpc4Fl+appZUe5iY2UnS5GoA+k81TFLtMuNUukkL3QU0twB+8W90D6OerxM08YQGZo0jbdIdpBbut1uSPb7Leznq9Qn5ew+OmozTOR5kbDaQLXAurED2a89Xqy4dUrQzimUi01mHYdrEj8+bphSZNKLGqUwFqpU3JUFY5h8GNg1vGx0+vl1VYKBryS0fmpEwIYe6pPe+qkadxpxunaccOYJCnmKCKglCVPckbmU/EXuDxUjZW6z4VV/IPQRQR7aeocxsWa5RKcNd2v3uLaj4ctNNKxFDHhrQM1TBillwt40ETX3OwckvtHiFIUj4E8tTNMuJVD5ezDHXzl3grVFPOikBVjRW8wgm9kfddbeHNGvHxCKfMt08+Uc+CSF3NBVskbMCQhRg0iKbaXvqPZe3NbKqrERQgZnlgpl/mtEN7q0kUkUTBr2CkkRt3sDcjuO45s00Aa5YflXBamvw/GsHmFDWyLOIySzLLujLBQ/7hDjt4HjgSK1rIwpF5uwyoxDpq+ccVhFNLTTRxVMpN03oVZnJQ+6ug97tYa8rTiXMaWldRMmBDEMve/IPLuquN58xDZomBKsu4Dt3HHNNXC6e8t4FT1+EUlVl2UFJWEqrtIEo3Ms0ZJHuyxk6DxGngDxuqk0Jta8GD4SlbHI8EmpufDebbW76bgCB4XPLpFIB0VAbGqbHcDWrpZRE7WLBbMPe7Mp8Be4PiObUrXT6EaTJpxweOPAy02G1SyUE9jLT7b7XHeWMjs19SPbxrZWlkrpaNh1KnlYtHN5rACTzLWLg3DKQPEr+YB44mmgo7KQ/XHIM2bcnsMKmELSqD5hQMAy+8pbXUHtxVEijXL3+4cmqYs/dJsz5exqbC6uXzKiJj+h+y6g+8bBzdgbgi19OL2lVk3luYocRQQV2FyUUmydmiI0s8bqfz4qBmhihYWMKapCq2AN+WpTXBgT+3nq9WO7J7vbnq9XJSDYt356vV3tB19nPV6se5gxPt56vV2Lg6afTz1erKQ3ca89Xq8Ra3x56vVw3Be3hz1errVrHnq9WPvz1erHYltNOeqsV22qnbz1WrCHBG0c9Xq47j4e3nq9XLZu1tz1ergQFsD+XPV6uyS3ur256vVxuT9A56vVyBAUheer1cNpvt56vV/9DbK4WVONe56vVwP2ObqorFzVWr3PV6uj9k80K9WDm69Xuer1dHnqumuubpyuL/AGeer1Yeer1eHfnqqa9z1WqPz1er3PV6sDdzzdX1VGZr6DnqcriO/NGvV1zderkvKKrRrHL3HNivCsAUMbjnjXjWO1msOWq4rjtU8bNX1V0y21HLVesZ+yeaFbrvmjXqwt9rmxXq4cpXqjcdp+umuFuOeqmqsHPVesTbvHnq9XDnqdRWOTw56nqxka6+HPV6sT3vz1erHypr1R+eNerG3flKuKjfpOPU7XHc57c9Xq4SEjUcZryaw83TlR+er1cC/s56vVFc3Nuer1YX7c2K9WLmqe11xf7PPU9XBjZrjnq9XTG5vz1ergex56vVwJvzVOV1z1erG19wtz1erGb+PPV6uB+2Oer1cH+1z1OJrjzVP10ex56vVg56vVwbd+7zdWFYuaqte76nnq9WOS9rc3WwaxW56raqjjjSqvXR7nj1bqKe55ulFYpPDnq9XIxAC/GNdM6qweWvNajTlYjHrrxzVVdVcJALcYq1Yh25dW2vVwk8OUr1Y+eqydtYX+1z1eVtrjz1Ka4s23nq9WNiCdOer1ceer1ReWp+vc9Xqwv9rnq9XHnq9WPlKUVjfw5UVusfLVqsT9+er1cOer1YX+1z1erg3hz1XTWOXw5urJrFz1XrAe556vVwf7PPV6sA5VVPV49uaTWhWHjNeqOw97TiurVwsRoNOMqrVdP3HKpqydtY+UpRURmvccU1QVi4mq9YGcntzdO6ajv356r1w56vVg76Hiiq1gZbajienk11xRT1Y37cT1uo0nhy6q1WJ7215St1hJbx56vVidiDYc9Xqx89Xqju1mPNU5WNm3c9XqjHueer1dc9Xqi83T9R3Yd+eqsVhZt3PVYCsd2Jueeq+k1iY6nnquisEl/DnqerGbbSx9nPV6sF7AG/PV6uipIJPY89XqxFNmnPV6uibm556vVhkIQDdzVWAqK+0tpx1NXrF3uDoByittaroEdgb25WvV7ftG2/PUrqOxY6jvz1eriSLbfA6Hnq9WMnSw7c9Xq5KFOg5U7KRqEVm22I3cT01WMuut+KIpSE1jLEi3LVbRXZUWuDz1a01jU3F+ereisc3u6jntlWSmK4xxzVMiwx99b+wAakn4Ac9WlL01zrKiNwtFSE+THc3tbcT3Y/rpzdJUJnbUMFr3PNUvriw3DQ89VCJrv7K2XnqaKdNdFQjsRz1aAmuDkXDHW3PVfRTfUSLKSzi49nKkxTJM02SwecRLVy+TD2F+x+AHieJHFUQ3awhM0FWZcenxDfT4QDFQQNrK377X1CjhKrGsf714uKxpG4nU4fh+DNW19o0RdVAJux7aDuSeeojoOcCopMSx+jxLEYCEBLeS+gB1O5x4BRr9NvbzVV1YUY3AzTzYWUZRE8xllfUrK6rtEcdgRZDe9ueFJqUuBQy1+Bx189UtPIlVDIsUalyFDBvaqjt3J+/mjXqG3I+PYLl4LQYUBU1+KvKxeRzKqLuF2soAGunx4xqgxSNyaMP5sdTh9dUYW93WGZEbUIGQbLaaC7k6fDiomaTjA0+QYXTQ4NSUeIEvJEigkju4AG4a668rV1LplekWatpsMjKx0tPoBr7xsPMa//ABNrfVxsgGvBRNOu2jnnWhpu+ik7bGygggH2kn8+a0itUwyUAoMUp5Q1zJVySut/Awn3R9duNlMV4qpPVlI9VRkVCAGOSZfYLk9j9II41W9dInM+GASBaob4WlKhgbhAq3976DpflDSgGKQeLUzV0UeIofswqht7QT7w8DoNOM05qoK8bw9JZfn41KhVlkBOhUA7W+7vbj4pyk4aMVUE1e9veRBIyHv7Sv0d+WqhMU04rWwrLPFIu00spkCnuYybJa3he/NgTVQa41GKUi1UlJNH5u+RWX2222YC/wCp4/srcUWjqrSVlA1PiuFbWNFOrjtqm62726KSD9PNKp2pNTW01PlWaOllVUmEdRBKwv5LbzbTuR+6fhY8cr1Ns0gpa9BTOTTTqyPESAd7AbZR7bt3+HK6a9UCixSPA8ejwmoU/MVbKxX2AMEbU/A35tPhqp2Ujc3U8WEYviWP1Plys9XSPTmZboLRaOV8SCdPDw15Y1aptH1Brq3MEddMPmJYBIjvYXcOpBDDsNlz9Wg7DmppMDOFT6Hz8wVM+KYkdzVKo1ibhUJJWwPYAdx8OVjVSmjHgUmF4RQY9iaFjMyNQxEG0hW4+ZkAI/RRm5UGwJAHt5YCmiZoWoVlgwmv6749XsKjEqhYcKBppJC1UyiMT+WijckMd2U9t5Ud+eIjGi6MYpL0ktLXYact4GGX5YmGoqqhr7o6eTYzgk++8rgjaL2JvxsdFLtMY01U2HYRgOU6/ONSvy09PVkJHuYs0flsvmv4DTwI7nlSmcauTOFJDJFLh9fgH84u1PVVcOkkq3CRqzNcAC+8Le31csNlWNS8qLDWZslwcSmOhjpDsYH/ACQC2jZ3t9pzbTxuRypMGrU6ZbwKkTE6sqoMkMhKlQbhGK3cfQbacprqqq4YVhEOIZgnxNySsar5kJZQCblQ6j7VtOVrdDBNS4XhKq9TKFaeSyorFgEAAUBBoLncdeeB00yTS8osIpa7FRVYgXpKKEKIgVAeQNoPLT4nufHmq1PCn3E6WHDx8pCmyWM/MbFOiAj3FP1a88cKqKf8HC/NxwTf5HywikdjuJufp154Y141Hw0UoiiqZVNqepSNQDe+66i572Fxz1WoRPmo8NxIyVVwRsVfgSSGBHs8eer1QsRMNJiEVJVLtmb7DeHdbEHtbnq9S8gxMALR1tryrKyE+DgCyX9t9eXJmk4TSTw2aV6iWolveG8ipft42+snlKUUqcOqojVyoxtCE3Rqe+5NAwHxBANvZx5CuFMFdO+Z0+RwA4nhSGSaignGvch/ecLfTUW+7j5rYOrA1LwHE6uudMLjkKCDDqeVNwBbfGoDk/EMgBXm69ppTM0WP5UoagRvGsqRvuP+4ySsSVIOu2wFifAgc3VB4TS+p4GxbJcEFWBFMWWUFTqFEgD2A1uJLnT90/DmyMJqm01mSuiqTTyyAOHZKacIQ+yoijSPzAe+rABvz5qvExS3khgw/CKSgq7rUNUQVChHG1Qku9yt+4YaMO+p4+DApmZNIzJdXHTwYzknMhY0lW+2zHeuzyyv2u7WFhrfxt25sY4GrnpFTsqfNZQmmwFQb0Yiq6NVbSSNWu8aXBH2NVv37cZOFXA1UKmXnoqzE6iPCJt0FW6ViUkvuSxSC28C2mxhYgj22tfm9VNHop+kxSnxWDEsF9+OogdYkV7bwxVnCEHUkWuOXCpwpnTGNAvgtRW0+N1GEQCMME86Jd3+UV9WVVHj3NvZxKEwaMCARQ1ZTgtVU9ShZPmA/mpJ9hvoPtHidOOUwTFCNgtOkU82C4itof3XHiGBKhT/AKvcHjiRSZfA0laXFak5kqcj4uyt5se+kLtbzoyPeQeF1Oo5VLhGEVYJx1Cqw+vNbi0uIPkvEZDNJTMTDHXRqJkS5t5c5F3S/wBn4aX4aNmp2yUJDeoUTHEmxGKqNJXF1KabWa9vZr7OLwIqZGoUkEU2KCBY8vSquFxu2c9Xq4HapPx56vVwBs1+3PV6uRYdvbz1erj7yi47c9Xq7Nz3HPV6stm2gHQHnq9WCQabU56vVwt/i+rnq9XZcDXw56vVj3KfDnqc1VyO0/w56m6xsFH2eer1YTZjcnnq9XW5Qdynnq9XF2uR8eer1d7mA3+znq9Xe4HUm3PV6vBgDddeer1cgT3v489Xq5M+tm56vV//0dsxrX04WVONceer1cD9jm6qKxc1Vq9z1ero/ZPNCvVg5uvV7nq9XR56rprrm6crGzAjnq9WPnq9XEtt56qmuPmH2c9XorEbW156rViJHiOer1ceer1RObp+vc9Xq9z1erAe556vV0RcW56vVw2Dnq9Xn/ynKCtpr3KmlFYm7Dl6oK4c9Vq6PPVdNYSbm/PVSuPG63UbjtP1xY+79PPV6sPPV6scnhz1erHz1Oor3PU9WAm5vz1erA/2uer1ceVmvVGJAFzzxr1YmbfzWynqx8cq1YXf7uer1Y5fDjNeTWLm6cqPz1erAxBNxz1erDJ9rmzXqwuR28ee2V6sNx7eeinNNcPM+HNUorge556vV1z1ero9jz1erHzVOV1fW3PV6uEnhz1erp+9ueqydtYT9sc9VaxE3N+epxNe5qn66JsL89Xqwc9Xq4t4c3V01h5qqV0b3tbm69XCQ+HPV6sfPV6o79+bp+uHPV6uy1jbiSq1jdu3PV6sTdjz1erFz1eqI/2uLKVVxe1uJKrWLnq9WA9zz1WTtriTYX56lNYO5ueeplQ417nqtprE/fnqcrhz1erDdfZz1erESAbctT9evrbnq9WJ/tc9Xqxs23nq9WHS/PV6unI040KU1w5atVifvz1erixFueqwrA/2ueqtcG8Oeq6axy+HN1ZNYueq9YD3PPV6uD/Z56vVgHKqp6um3eHGK1UbW/w4rq1YDcd+er1e1A04yqtVxZgRpxqrJ21w56lFRHPvEcdTWq4cvXqiH6LcYpTWF+/PV6uHPV6sHFFVrEzaduJ6eTXC49nPU/XAnQ6c9XqjuCe3LqrVR3+zylbrCb9/bz1erC/2uer1ceer1RJBZjrzVOVw56vVgcEc9XgKw7Dz1eqM/bm6frC17ac9XqxNe+vPV6sI3bhyxr1cGPcjladTWFzc256n6xPopPPV6sF72056vV4MV0156vVxkFzcDnq9WFrgg89WxUWUiQXHbnhhVxhUQs6+6LE/HimrV5bgkta3E6ttVrG7XOnbla9WO9zb2+PPUrrvnq9XBtouD356vVhIsDbnq9WSMgD2cqdlJ11kMgtbjemmYrAbX3e3j1LE7K9u8e/PVauK+1jz1eronQgeJ56vVwMckzrFCpZyQAALm/PUypWmp1UUoYmooSGkcATODpf/AAD/AFQe58Tp256kwHeU0k2929+epfUYOdx79+er0RXIMW9y3bXnq9WQg7L3v9XPVVWyvM+5LgW56m0VFlWyafTz1XVspvdnZiq/ZHe3KKpGaTNbS/zDdHUuABoWNyFB8Ft2J4XuUC8xPhxpP4vDS08aUFGylj2UG/1n6OFRxrHt9XiNBFmSarrkaOBRFT025mIA1bw1OmnN01wpF0mIx0ofEK+ygqQASdzXFwPov4c9XkUOOE1ESLNiNWR8/URqF0+zGygm4PYG1+eqqttKTDpJoMIpMMCb/M+zGf3R+0AajlTVKX/T+gqMNzDU4msKF5ZYo4fMksARGUDECyqgGupuSe1uJ+NNk0ZHB870GD0lHlHBwuIVslTFR1Et/dMjXlleNf3tp90nsB24+DSRSONCHWpjE+GTVsb3nlFSElc2CXNgqKLWCi+tvDvzUVoCabqWrioqWlk80lTsC37kBwB39pF/p56a8RFKvC6RJduKSH3tzyX8NtyCfr5emzTNX1zT4ksqqBd1CWP+IlR944nVWiJqJiaS+WYbe80ykjv9nU/s5bTXopI4uVSrZIwf0sxRL9rmME9vbxtacKW0H9YiUgf9F7symMaW/wAmNfzPEVeoJMXElREkrxAb1kJUHRg4NxftxSnZTgoOxh9ZSUkmH0i74pafS+jbWBjC28PeA5SKqqkRUVFZWVELwqHeak8v6HTXZx1FeAiktmSqmfEagwfbQBwQdRtG7T48U09SVxyupcx4NJ5ShqpIxMQdL2Uki3j5i309vKfdXqCDA6iPEKeqp5VISIKyJe9/e2j/AJBOtuNaTWqwYcI6SianrGLyxSSlHI1VW94D4bWtpx6k0mkz1Jmlq5KPH6WTypEeN3ZewdGG8G3hIpuObrWs1Nz/ADJilEGkcbpo4npz32SKAzEg9xt7fHnjWgTQWUEs70zYfSttdCTIx0LPKQWdm/wqmo56nBtox3RjCYc24moq5DS4Wjok0m4DeH1SJb67nIv7FAJOnfyRFaWY2UZPpPSUPWDH6yKCsp9j08tTPVzEj5WMoBAsEJG2OKGnAK3JBvci5PHQJpOVEU6dSM/UtXn/AAKbCqZ6qioSsOD0ygx2KC0dTUXIYh5G8xwAAAuvLKirtpkY0HFPm/HMwZrnwqkxWSpijEyGUoiCVlUBJERR7scYu6jxfU9xZilIptxCoxLGaeTKNPI+4uQt2N5JAGIDHxt3Px7c3TtLfLGWKjC45MQaXzaTD/0PvEXkYLdlGpv/AIR8TxsbKoaw0mEYhhdbiuJYmjQ0jUreUnZpJJCpUhT/AIANuunfx42utzSryuK2WjOIIB8xVBFKqSC40lFvidv7ONDZWjUqamWKZaGkjEU1RHtL7f3EYtofDU/dzdaTShpMQhwaOLEPK8xgll3fYZ72v8Lan+PKKMVsiaVgxiqrqmGpqd88oihDu9gVYLdDtH2ee1V4pApaV09VUwQYhRWapq5KNJi2i7Ag1t30Da+w82qk4pTLJ5dJKjDbEJHAPsBFxY9+eGAryq4YbSRFqyh83aq1TSKWP2x5a+Wb/Bjy1WpbYgIpDTPK/wCkiRd/xNrH8xz1erLjrU+JmlgmX3UKuDfUEG9xyp21unesqTFFRU9Yd3lvGzN47iO5PYd/y5atVNkoZMNLONTHIjK51Ft32H+HN03M1mw+KGu+bqaQF/KnYghvs+6dyg+y57ceQONO1Ny/Xo1c+B4nJ/o9MBHNuUEMu64YD95WU2PKAyqqkTTyuV6GPEqXF6CaxnWSnliEnvhZZd/mITqRYEi2o1HjxTFe1ClqletRg9RU0cfn2lmSpWxBj238tW8fbY2725ak5GNCFlevnxKNKp47yUdL5hQCxeMkH3AO7HXlzspo4UmKk0+B5rWGJH+Wx1p5UNgClTtDa+wtKpA9tiD35Srp8Qpc5wxClraREEZJrBGEYKbq8lnBse1nFreHNSaZjGg8lxiurMqLjNHspqqmqtsydy6ghjYn2iz29hI8ObBNKAATjS0oauOrkgglf5PF4WjNG8g/QSAKbodv2kcX79uPAzTRwoUa2DLeZ8EjxfDYzS18J8mrhiYiNZQDeKOT7QDMdFYA2NxccqoTVUgg0DMma8Sp80Ukc0hnnSFYgsxJO6G0kZLj3i2lj9GvEqlRspaEiKE+jSH+bQ19CIi8hEySgWaFiSQpHsQm3xBHLg0mBJMUIWA43SSJUYdiS+RHGwKvHoIyTdhu9quOx8ObwptQpR0E2JpisgjtdfcIH2blSwdb/ut3A8O3NkkV5QwrNnbDosQoROWKzLEm1lHvLY38yM+xT3HHCMKo0eBqtz1U4vjH6ChrmWcwoCG2A+7bS1xcL+3ipJxxqYd2/GdJohFQXqgsy67RY/Tw2BwqcW/BhUBmLd+X20vFY30seWrddFgUuRz1erjuDAX7fDnq9Xe1fteHPV6uF9dNOer1cyxK7f289Xq4hiBYc9XqyKC17fx56vVxeO4v9XPV6sbADT2c9XqwlGAve3PV6sd29nPV6s23S7c9Xqxiwe9+er1YmDXu456vVjJvqNBz1ergG3Agc9Xq57rG5HPV6uze+4ePhz1erIXNiPDnq9XAN4A89Xq//9LbK4WVONY9y+zm6rFeL6ac1VqxE2HPV6ut3wPPV6uz9m5HPV6sHPV6vc9Xq6PPVdNdc3TlYCSdDz1errnq9WFyCdOer1ceer1Yy6kc9VorBzdO11rf4c9Xq756vVHb7f389Xq9z1erF+9z1WFdN356vGuCt79uVNUNcX/ynNCrJr3NGlFYm7DlqoK4c9Vq4v8AZ5U1usRvfXnhXq48rXqjMe5HHafrg/bnq9WLnq9WHe3PV6uPPU6isRc+HPU9XDub89Xqwv8Aa56vVj3rz1erASALnlTXq4M27lKdqL5nw49V64uVbnq9WOXw4zXk1jHPVtVQ37c3V6xc9Xqwv9rnqunbUd/tHmzVK481Syo/PVROyuz3PPVeuuer1dHseer1Y+apyvc9XqxsbMOer1cC27nq2DFdc9WqjsRe456r/bXuapRXBm29uer1Yuer1YpfDm6umuHNVSuubr1cJPDnq9WPnq9WJuNKp6sXfU8erdYDI3PU5prE7nTnq9prkzAjiSmaw83T9R378V1esUpsvGE1WsHvHsOWVW6xj7R44acTXB+3EtXTsrEeWNXrH5nw5WvViYknXm6dFY2Yrpz1aImsG9ebq9cS4B056vV7zPhz1erCx1789Xqxksoseer1cuUpRWOTw56vVj56vVifvz1ergwNtRz1eqOxse3PV6sbGzfRz1WmsTP+6TzdXTXBjtHKmr1hJub89NerE7a25avVhdgBzdXTXHe3EtWrAWUGx4rq1YHZQeer1dBxxlVarolT25QVtO2sLN4DlaU1Ff7XPV6uLGw7c9XqjlgfDm6UVHcm/bnq9XA/Rfnq9WHiiq1jftxPVqxc9TuiuJIseer2io7Nt5Y09WFm/e5Wm01H56nKxMSW56tisZ+yearYqI/2jz1Wrjz1erA7Enm6cTXDnqvUV91zbnq9WHnq9WNx489XqwWsfu56vVwZSb89TyKwMttRz1eXWNgSvh9/PU9Uc6kEeHPVROyuWlwB3PPVesLn3iAf1tz1erC5NrDmqsKhEMEsfbxxNWrC6BtRx6rVwW1rNpfidW2q1wNrkcepVXuer1eW19eJ63XUgBG7xtz1eqMdDY89Xq6uL256vV3z1erju+B56vV66bjt7Hnq9Xh2Pbnq9XCwMd7am1h4knwA56mydFT2ZsPjMaH/AEphYn/AD4f8S/hz22kf3GabWGlhpz1KUCsBRR72luepzXWNtjHt93PVeZrgBprcfRz1erML7Rz1erDI4GnPUyuorjeNe3PUyKjuVCeWTYfRxvhVT4aZK87Yg6CyMCEBPf2vb4cLHaiXOLglJFBljdWtG5gTRtt2Y+w+HC1NQ6RNBJmLH6OLDmmcEIhuiAXDsPG3jblqYoNqXMUMcayR0ollY6mYbmBZra+AJHa3blJq+mh5yFmCodJ5KyEs8p8kltdthawB1sBflqsoYUJlOW+bpaeJStTKV1HhGB7qi/tvrzRpqnnCq+i/m0bzxT1CgGOxYIokAYEtt1v8RxpOyvUKGTsRiinqaGljSGWnnpYisK+9EZlFrSPdmYi9zf4ctTaqMHhkk2HZZqzWOZXWMrGuptubafiLnx9nHKRcah4NST1eLeRUMDFTSSLubsSiMfqA1P1cRqEmlNChg0rthMlUAVLKkcagdrDS1/8AENfr4spCdlN0cO3FoqZo7FFDk3v74uWA+gHT6Oep8bK88DSyvTKLLaeQ31IO1VXX4kc1TdIcQpURCuPZplZQe91RQbfAa8ZXspUTFI3HoiqhHk1iMjkjsdw7W+rievUCmOUUmG0kUe64Nyp8Lbri31HnqcBpH49UTV2JKaLSFIlVVue6NvuT9PN1U4Cg6lnhWpjlpLxjzGCMBoJQSSmvfcNBxnjVzspHY3RyUWZ53qATHLVokZOl1kAsR8LMOGFWTQRYtBVZezJVQ1F9sZG4eJjZT2/4j3HGlVukzUzL89UUsAXfLs+zorKxDEi3a3Lp2Vuoa1CDDjTpteUyqvvLfcrNYgeNwOWptWykjHSvi2EQ4cyBGSRom17qD7jEeB7fVy6aTp2UwYtiSVMcEc8hV6arRCCvu+UFLAt7dARz1OUm8JwiqFXi7UzxwyOjx+dIx8uGBmu1QT8VACjuey8uBNNaqF7p5nTD58wyvhUjRYbhdJJDTKw2s8pjWESSFf8AdH3FiB2G1RoOeInZTVGn6b00eQsl1+W6Lccy5roVnZvGlo77KOmVeyWjIdydb7BrY8ulWnCvUF08s0PUenjmqx8gkFUssgYecRsZFjjJsAzhdPE3N7DXjVLlUnsAplxPMho6eRKSV44ZZYo7l4KGOQMqsNFLThWufZbTXSlOUZauSDBYKHMtBEIq2sUTJTkAsLFl3OPADcNfZzVMjGo8OZqPJOCUVVWQpvTzCIEaTfJ58huWsbISQCT9oBewBvz1W01NrcNxitx6rnx2YRQMIfLhGhEdkMjItySoOgJJJOvNVShKwnLJxHGUXDj5IomQKL2KiwUP8bc9XqixVmH1WIz4o9yXlYIWQgMo0Vh7AwHbianab8UoYzSim+1ErtMGVrgBizHX6FAtxtVbp2oKhq9Y8Rf3fPUM1uxGn8ON1uhcoYz5VD5BbY0RYj4my3N/ZpxSnbSVNKqpXDqyiqaSBwyIvlX8S5Ni33cs5VqYoxII44XK7mS2psTsYJf8uVT9tepVTvI8hpJju2x3LjsdPdH08rWqi0E/zC0kkjAqF7jse/G1ba3TxWTGpemVzfzCF00Fyfd/LjtNnZS4w6tMW4zi7OfK97/EoVVJ/wCJEcUpNJRTO1QtHXYhHAnkUzy/pEUXuLWJUdxuJA+kcTU+NlcYY4DjvnvGZIFhWJizWKiVdoY372Gt+OI20/SmbMPydXT4BicIkeLfNSugsUjNhGN2gJ+1+ziiarpFNtLXz1GKz47htSfMIl82MbvecMDu3HuD2II08OM68acOAo3WSZMIHkyzHY9TCEUgbbbtACNe3w4+mitVJ/qphxo8x5WxKnilXyp6iAlU3RsWaOQ72DDZu3EqSPbbl17asx9pp+xQYlNgYhnWNxh8MpbaCWLhyyHcPAgML+GnHqbTSAwWTDq/OzZYp7NR49AHWVlAZZBaRNim4DG5Bv7bcbTTpwpT4J/KMTp48HxItFPhLShD39xSTcDva3e3a/PfdWjhWCtgqsDaqxuOR444vL82SNiVmhS/6VbC3moLH229vGjtpWPFtpPZxnhxKMYphU8a1KBCjDVAWCkNb/W0OvttxJtNXRTrlzMkq4dG+NKIajdYrF2LMbEKT3F9dp8O3LlWrCqFEUY3AMAiw3GYKqxahxBf0kR1AYpaRGB+0rGzKe4PLhMUicXNLuthmyrJ5NYrTQB9gOhIRgCl7a6DsfDigiK8DrpsxWGZ4pZkAZVG/TupIuT8QR9RPK1UGKIt6kMuPNh0eaKGRKmAbrDcN4Ugh4rX1ufeH7OOzjUgZO/3agKrbr6SfDp1ngs0TjSxuCPj8R24dAzWRra+8ApoLo5LAWsb246mjIVidgSN3HKvXfukbRz1erGCOx56vVwuSTz1ergAe3hz1erNuAG1uer1cb21GvPV6ut+tgNeer1cgXP9/PV6vKdwLHnq9Xtqr2N/hz1erAwANuer1dkm1vDnq9WNmUnSx+PPV6sZYkn489XqxFl8eer1d6faHPV6sbm5tz1erKraW789Xq4Ea2Fuer1Y17d7csrbXq//09skgEWPCypxrjsHPV6uiBbvz1erHz1er3PV6uj9k80K9WDm69Xuer1da3+HPV6uubp+oz9256vVg56vV7nq9Xuer1RObp+vc9Xq6Jsbc9VdVY9zc1NbmuHN1usO9uer1dc9Xq7bvz1WNR72a456q10SSbnnq9WTjRpTWN/DnhVE7Kx8vVqxs3s56vA1wJJ789W9tceN16oz+P18dp+o/PV6vc9Xqw+58eer1ceep1FYGYHTmop6uubr1YX+1z1eqJfm6c01wk7c9Xk1jXtxs1Y1H2NxyrVwNvHnq9XUvhxmvJrHbnq9qqIzbebpysPPV6sDfaPNmvVhc6257ZXq4c1SysBJJueeqgM149zz1Xrrnq9XF/s89Xq4c1Tlcf3/AKuer1cGUlvp56vVwI018eerYE17nq1UfmqV17nq9WN/DmxXqxXtrz1UTsrEdpbnqe1Vx5qqVwYrfXm69WNyBa9+eqwE11z1VqMONKp6uixJsePVuui4BtxJVJrgxub89W6xN2PPV6sNubq+qor/AGuK6cTWCVty8SVuoz/a4rq1eJsL8SVdFYSxIseep6sbFr2HPV6sRue/N1YGK4PcC456rA1iZt3N1esPmfDnq9WPnq9Xuer1YWN256vVx56vV7nq9XAknvylKK656vVifvz1erhz1erC/wBrnq9WI/bHPV6sDAe3m6UVjYC3flTXqx8tXqwEC556vVikCka83V01h5unKwHbfTtz1erC/fnq9XEcbVWq8Tp240KcTWEkd+3K09WFmFzxRWq4Fxa456vVg3N7eN6aUVgdiTylbrhz1erBxRVawOTex4np5NYm3fVxRT1YixI4nrdRpGPccsa9WFyx5WqJ2Vi8z4c9V6wO5Dc9WxXEknvzVXqMzannqrNcC1uerdRySWtz1OAxXW4c9W9VRGJuebq9YybC/PV6sTNu7c9Xqxf2csac1VwYm5HK1ZFYXP7vPV5dYH7c9T1cFubac9Xq87KBpz1eqJuBuRz1erEdAH8eapysMxt9o3PLJ216sBYixHFFWrFbdcePE6ttVrG4s1lF+VpXXHaWFhz1er202t/Hnq9XMnbHca89XqiMWY+6Oer1eFh37+znq9Xuer1cSAdQNdeer1dD2DT289Xq8XCe97Pu56k5VUpZBQXnIBnYe5/qA9j9Ps5uk0aqayZNxY9ybk+JPNUvAArnvXnqtXFV9woR+fPUkqMqkkg6HnqcRWRQdvt56n6wGYi5056mNVRHlZxa1zz1V+6uHvmwJHwt/Tz1X0VEqayGji80KWc32qO7H9nGlnTRc6YmKRuOVVX8i9XXlQ4BLeAAHZF+vvwlcWSahHNniMMKCKs+aq6LzKqUCnk1fT3iD2AHstxKDFRyoyJoH89Y9TTTmgKeQFGyNh2UD2Dvc88DNMnCg3RMTopC8LrItwVCqWt8Sx0vyqsK9roVsq478tVR4Oob56uKWcXPlgAgm17F25sCndVGnwnG6aphpsTKWHlrHDJcXcKuq273Nu/tPPETTJFPNA8dXSU9JHdZVjYuLai7EXF7dz25qt0vOmslFSLV45L78jzRCNPtWZFKeYSNGcgmw7DvzVNqofafEIo6aKKoZllqlaWf6FF1BHtHYD48vSbRTxhUPzdNLI5KrOJg237Q3OoawPixFr+zjRTNVJg0JUEsMEZeQjZEyR20Auosv3cepOQTSXJKYkcauy+akoC3vZSpIY+wlhxqngYEUoKTbJWmRztRoUYL2Onf69eW2VWkDDWtWYjMHQCNWdUC2sNqj3fr4lK9WFK6RWKSpNDNe6rFscfAHRvptytaoLM2xLPTxwvaykp7puApBIPw56tgxQTYjelhfZo0ZHYd+wP5HmgIp440DmZZ6nBcShoqZCY5Jlk23vtdTu3j8xbjeyt7afs4bMawKgr6chZYFUMb6Nta8Rv4ErYEeBHF+2mwYoPsz4dDmSnwzMBAhki3Qy7jrtv5ZDg97Ei3LU7RdkixOjqvJr1PnJ5sLj2BJCYn+O5SDxobK9WWleaST+XSsvnJJFIrXt7yPa3/AAY044NtNqpIYhHLhGM4jI7lElSORCCBtAJ3AX8QRy8RSZSophqKamxOiTEoZmjpaiEgyyKSPMBNlCjuxXW3Lp201SIxDODYmk+BU/8AvNRyxKyMv6SVohtjklNuwJuEGgXlavAoRfTvQ0NfmWrzDVKZcGywfOqSe9RM11ipxf7byzae0D6OPJxqqjGyjJ4LnE4fi2KZ+zS3mVUwWFoUtuVSQxS50XaDb4C2g42emnFJiguwnH6bNWcajPGNkQYTglJKaeFGsPMkhYEA92Ykkknx41tqxURUrplWzVkldnCtv87iTq5cGxWMnQMLaKsagAeH181TyDNC3hFRiuKYcXwoyNURSCOO5JkkjUWbabkl9bEC1xf2comnaGPLmUBV5zw5MPpYJhTCCkhD7yQFKNLKUkPl2RQBfuST7Dy1MUJxwWlwGsmzpmetR2Mk3uiQMbO5aIsovYt+4PGwvz1ep3giwzBqRcyfMlo6paNASpB2lHZtwt9ovYEfC/bnq9WGlooJMJeqqQgeSfy4/wB1bKgZiL/4QQOJa3qrli8FJHSJTxWkCQh2+hiV2j/iJ1PKkTVgZrNSYSYMPvTANsi94aX/AMX625pSYq00vsoVDYphaGBSfLXyiSezO32R9Q44jGmFiKU+E0ytO1JTKNxlJb2HcAbfTY8dXiYqiqiVkcU9bTsQNsMu1lsLkFGNv+QrHlE9FbJinmlo3qaeSpN98xZVBPZQAAeO6BWgdQqLlehaty5BZdj75Y7exQbft4wRFXpTGh8qHD1+07ugAIPa+mn0c0EyYptRwoR/lqM00qxCzQMrm4uSN1vd08DrxYBFJKTePRUr5gnrKFxAqJGrK32bqblifC5sSTp8eJlYGlSdlcsv1y4nRLBJF8tilLJMvlsQBJAr3AU9mHiPhpzQMU9TvRQYbisdZg7yBaqGC1LuG1Ru1CX8V3bbX1GuvH0qmqaq6wWniV2xiIKjyM9DUxg+6HcraUX/AHWWx08QeNaZNbJnCjA5GPlpS4FWurzQMrqwJuLEsAT7bC/FgFIFUs+pGHS4blyixymluUlR5o95sQie8SP+IAEHwPH1o41RkjZTHlDM8mYsKxDD1iNPUQl5UAv78aMXHlsNbMqsCB2vxlJnCnlpCNlBVmN5oc9SVuDKr1dJL7vulS6sqOjLtIG+1r6fEE68ucMaugSKFGkHmY5SYjCiEyQvtuAQ17b0I8QRr2/dPt41XtNK7EEwHCZ4cQpqc01WWDVVMJLxSxOoRnjVzY+WdWXQgdr8sRFaCicKCzE8OTEcOrcPihWljYGASxMCm3dujJY3Gvge3GIilQEU25cwz+rE0uVMyBPMqUDwSyA3V1Fw6kG1wCCR4jUDiUEorZVro3fTuuM2ESYbWyGpBKyRKUsYinfa3ihNyp4vaOqihxMGhR86KtkVMUs8i+6h8HQ/u8cJ6a8JSMKT2LxTYBT3w9N0DBkBJuQO+xvhf+zmiOirJOvbRTustPRV8FRU0FLFL5qAy0tQu1XuACydrMT7CLHlcKEll94qr/MdFl+v+YrcIkkw+eOQrNQ1QJCuPtCOUAaWtYML8OUddZH2TqtIBjzoLZEWNi6DTxHs4tiKFwrGzr3UW+PN1eo5LXJU89Xq8lydx56vVkUodBfnq9WI6XHPV6vf6/PV6uaFiN3fnq9XBgob4c9Xq5KADodDz1erpmI56vVxNxdvG3PV6uAP73PV6u2JPb6uer1YgwGi89Xq4k7Rrc89Xqxqt73056vV4brWtpz1eriApOunPV6u9yoNqix54CvVjNwdeer1cWIKg2v9duer1f/U2yuFlTjWLeeer1dFmIseer1cDe2nPV6se4+3nq9XRZux56vVx56vV0e3PVYVwZtvN07XBnJ7c9VYrA3731c9Vqx89Xq4kgDnq9XDzB7Oeq0VjbsObqya489V6xeDc9Xq4c9Xq9z1eqPz1er3PV6u7215U1o1hH2jzZpxNcuUNPVw3Luvy1argzbuer1Y3+zz1erDz1erx7c9VhXXG61UWTseO0/WDnq9Xuer1R+epXXV7C55rZXqwc3Xqxs1tBz1erGxvrz1WFRebp6uMnbnqbTWNe3GzVjXCTw5WtVFP2xx6r127A9vDjNUrBIbC3PVdNQuO05XEsBykV6o7se/NV6sHNmvV7mqWVH5sUymvXt35qnq4P256vV1u93bzVOVwHPVQV79/wCrnqvXBtu7Xnq9XE9hz1OJrh+/9XPU3WHmqV1xJtz1erg5ubc9Xqwsfd+nnq9WLnq9XV+bq+msLd+eryq4nnq8mutwtfnqpWAduMK209XB77hbm016sQ5tVerHIT243Vk1wL2B56t6ai89TlcG79r89XqwP9nnq9Uckk3PFdWrtzYW5SlFYSfE8aVXqwMQTzya9WJnA078rTgE1jZ93PVvTXDm6vWI/YHPV6uHPV6uDb72HNVaKxc3Vaxve3PV6urv7eamr6a75WnaxO1joeer1cCw8Tz1erASfbyprdcCwv35atVwY+99HPV6sW7XbzdKKxuwPbnqqKx89VqjOWJuvPV6sEjbhzdOJrEzW0HN1evcpSiohY37c2abTXAufDjaqcrizG1zy9erhvHPV6orGxI56vVw56vVH8z4cYpTWJm1vbnq9XAv7Oer1R97cUVWsDseJ6cTtrCSB356lNYSTrz1erA/2ueptVRyxbQc9TlcSXvz1erEwO7nq3WEn2X+7nq1WHW/w56vVwa9+erYqOx976Oaq9ceer1YGtc35un64c9Xqj89Xqx/2csa9XFiLEcrTyKxHufo56vLrAxsD9HPU9WLeNLc9Xq4Pu0tz1eqKSq6i556txWDcLd+OKpysbEugvzSa1UbX7Xh4ceq1d6acTq21WuOjMb8rVgYrGD3PYccVTZNcd5Pfx43V0zXbEhSOepVUPaPtJz1ernqLnw56vV3bw789Xqwk2OmnPV6vB0tYH7+eqpMVJhRYYzWSfQi+027n4DnqSmojSGfc8nvMe5PPV6IrhtC+6bE+Fuep1Jrg5IJvz1P1x3qG00+jnq9Xg6sTrbnqrgK6aRALjnqtUZi5J+PPUkrGRZd3PU4mo6gNe49vjz1e1U1yWaVoYPtXG5zrb/VH1d+I3TFEV0rQCaDzNdZHiEfy6ttiJ2KCO5XubfHhMqsd790uKNB3mQx4fhLv54Dvbaptc+zQCwA5Sg2s4CKLDjVNUmveTcJKsncGbsg+rt9fKitqOFTaDK+ITKKqKp3ga7Ru2m/+KwsR9fHcaY1U44O9ZhuYZZ1YPKse3zStkVuwsO4A+88umlGqjWZLrE8umpo2DpEjxbn/wBzUBSdgHbS1j7OeOytLpXUdak2JmSF/wBEsbF/d1ZtgAAPsHhxGdtNaqV2SWEKQwU21jDUIhAF9fea30mw54CK8aFSrx04TmCGjjDSn9NJJKNbbVCItgLH4/E83TdC1lSuZq0moYstPCHt3AJb3QfixN/ha3LCm1JmnHEsXkmpRT05vvdT8QAxJk+o9/q5qRVQBXPMc7/yZ2pveaJVlP8ArgGzKfHtr9PPEitpqbTYxTrHSOu4yyU4HYkAqdR9XNEiKaUKbo3T/Sp40BG/QdhYqob7zxMKdVSAryzwvLApMaLa3iRu1H0gc1V6RFdRkQ1NLVgWBG23iDfax+jS/PV6gszDHFLQg3/SL5d9LC/7303F+bp+g4zDgy1dUkFSCgdS8RI7PtOhJ/xaD4H6eUVW6Z8BwmriyVXUOJp+np2kCPt0Ce4LfSS2h4p4VRVBpjNbJNE9FUkhpo1ljPxa1738b8dpygrxqq/mEIximYGRSkch8SVuoFvaLW/LjYxFV2UjarEIKvEaeosqybVleMDV132uPYVcA/RzY202ozSYkxUY9T10lcgVIEdkkY6EvKBYjxNz7o49tpFQTVGaplqo8KgTy6WnqZmSIHQI1tt+92te/NV6kjmjE5cNxykmw1SscjhpEjBYuXAWw738OPaTWtUUP9C8WSaGn6X4SxOISPJX4iUIA+bl97ytwvcwKdtxazXtrfliIwrSfFjT5i2JRYpUnD8PVXgC2Hvd5GW129pYga+OvGKMFUkaidZDQ5SpbKyNeeMX2s7m93btZUBFvjxqk/3UN7ztgdJTZZw0xCZYmmqJCtw7zkxU0DHxVNnmMPEAeHKKpxulvlfBZq3MK19DI+zC43SkVrL5jA+UJpD+6Xdiw9hI8eO0pozGT86x4fSYePLafEKr9DSUwB2GM7Y3l9paSRzqbG5PgOapo0rqPLWF1GYJqrE66CooaCqeWok0/SzRbjKIxqbJZI2Paw0781VaUeJtHmfEYcUmi2U9P50jQj7KrEsMaIPiSbn6+anVsr2yuq6miGF4Th1XHc1STOWtawmcEt9JXT6uJqrU+npqWtxxGRVsVdhe1mWwFj7bgjm62MBT9TZdmaBljZQyyKGDXtqhbv7LAfXcc1W5pSZVoYsOwn5ZPciY+ajEWL2bTT4X05sGKqcaeMtRQ/z2RYhY+ZuUdwW2X0+FuWmaqqss9NCahqqBAQZo17395hr4d1Hbnhga0dlKNKFsPo5Ydu5IhNIt/wDCPe8f4cUSK0kwK40GBNR4VKWK2MbTjXX3ha1j8QPz4woSZFWJmpWIbaVqGvjciWBEcKSCbMtiCfr5sAg1VKZpT0NV8lTiOp94VjsIifBT7y7rdwDfj4r2imapw2rlxCRa5QpmLoNNGEi6Ak/utY6+BHEyttOU2YLhkwrcMxXEwI62i3pU7tNixv5Rb60B+gj488kY1ulZV5ZxGHGp8MQlpZmRlCgagqxZVcdwbWOniObKSNlNyK6wCixAYVathCT1M8LSRKNu1kUk6Hwu55tG2tEih7y40EWLwYwzBIyVjlDjUOtoti2tY39vjxWDFJFYihumOF4j85hGJL/o8qrBFcj3hJHtTbcWBJ90j6+KyZpAJBoD8IrIcn48MPxEHzMMWHfKwEYK3WzqezJtdwQfoPEgwONK1HVsqZnLA6GtzvHjmHPtmkju1NYxuFh/Rh4r9zGQNw/wn2cfp5tUDGmyIwtm/DTAQlHNHKFDNojsEYBgfeurBlv7b+3lMKf1UJeLthldBUVdcp/QqryROpNlAId1INxcfvAlfhfmlUyBFJrLNfhGK4NLUYKoMULfL1tLJb7DfaCra+1lsy+z6ONThWyYp+GX6CnEJqVXFIqQLJSTzLeRUBssLm9iy6gN7LA+3jSk9FVknZQn5PioITFicSmKjrWKIDfdA7XG0nwUkXAPY9uXaNMu40JMOHNikz0sjGOopXUE2uGAF0YE+3vf6uO6ZprVApwrXq44zFXBC1rTADSx/wB1t/RxydNeRB20Vzq/ldMYophTAsssZCWbv7p7G9jccT6QNlG9ustLBqrHPuW6mlqglYdVOynqm7kC+2KfW+4agE8WJcJ9KyBsLoOACfSgNcTQTvFKCrqSNeHEyKkoGRXJgsikv349TtRmkAFxz1ervdZRz1erkCCLjnq9Xd/Hvz1erhoextz1ermD7t9NfZz1ergdzDTTnq9XXj3tbnq9XIKik9uer1cXYdh9fPV6o6kMQCdLfRz1erkQBrpfnq9WIgA3/bz1eriDdrk89Xq7dgpuOer1cNx9nPV6uBYBdNeer1dXJFjz1errvodNeer1e8f289Xq/9XbGe9uFlTjWPnq9XiCvfnq9WHe3PV6uPPV6uz2HPV6uF+Xmn69yterC/2jz1VFceeq1cG7Hnq9WLnq9WOT7PPVYVj56q1xPN06muueq1R38fr56vV7nq9XH3/hz1erDz1erkzEHlaUV5+3PV6ovLUnrmxsONmlNYeWrVe56vVxf7PPV6sBIHfnq9XfNbK3Ufe3PRTkVif7PLVesXPV6sBYnvz1erAzX0HPVdO2uBtbXnqsiuO8c9T1Yuer1e56vVF5ulFcZO3PU2msa9uNmrGo7/a45Vq74zVKjP8Aa49V64SeHGapULjtP1jdgdBz1erA/bnq9WHlDXq9zVLKj82KZTXuap6sbkdubFarHzVbrq+tuer1dn7Y5qnKxc9Xq7PYc9Tia656m6j81Suscnhz1erEex56vVg56vViZtdObr1cOer1Y2cDtz1X01wLeDDm6croMbHmqrFeBPt4yqt1hdvf5dNerCzbe3PKq0TWF23W45V01wLi2nEtbqPxXV64tq1uJKrWJtfd9vPV6sI+0eKjTqaxuT24lq6dlYj2PPVeon744+mnq4NflqqKxP8AZ4xV6xv9rnq9WN/s89Xqw89Xq5DQ6+PK06BFdSEW5qr1jJJ789Xq4XO63PV6sRN9TzRNbrgzAc2DXqxkkix56tzXC3N1fVUc9zz1Xrq4Gp56qKrGJDfXnq3FcXcEXOluerYFYvMXm6tFYSdTpzVarFJ2Dc3V01wHGlVeopFxbj1brFIoB4wmrJrFxynqxm2zXm6qKx7k/U81VqjlkueU01aK47lt35rTXorF5h9nPaavFYHa32eair1g5Wt1hPHVVqsD/a41Tqajv9rl1U9XAm2p5Sqaawv3Xnqcrrnq9UclQeerYrEbX05qr1ik8Oer1Y+VOyqmorC4ty1WrCeVNerG7EaDngZqwrDy9O1hkNjfnq9WJmsLjx56vVi56vVjZiDz1erGW1v7Oep9VY2KlSeep2sI7C/PV6sLyAnngK1UaRiLL8b81TtR1UAcdVW6xtuQc0mtViMjKoUceq1cdwIBU6cTq21WuEgJB2+Pblaqa9IbLuA1HN1WuHv28BzVL647u19Rz1erGbKArePPV6uPmKNLduVmvV0+rW5avV2BuPs56vVkWngIMszjautgdSfYOepOuo8shle97advYPAfVz1UqMxULst+fPU+dlesWtv90W0tz1MVwUjaVB9vPUpTsrGpK6t4c9Vq4g7iLePPU2pM104F9COeqmmupCAdBz1P1iYIV10I56vVEleRFun3nnqSUxVM3l0ciQe5dbM/+Be5237seF7xoFZq7pThQL1zQSS/MTuVVSBEhYk/Tb48IyqsflKKyZ6aDvOktJBWLPUbS6AElz9gd7Ae0jlppFqNBDi+L4VXzxQyBqoMfcihsPGxMrnQD7+bpOoTUnGuoGEw4WMAwakIt7r+WxCm37m6wJufo4pBpOBjSPiq68Yf5uIkRuJA+0H94NdSw7n6OVVSyjTUuYJFangjAkYRkuANR2Uk/Dafy5VVeoRcpZg82OuqKRWklUUsESAdyxf7Phc7fHjdNqTNL7KFTRYIjSVU3m1EspeUqQEiNtl1NtSpP38brxEUJ2VsSpsTxLzqshVQ+VE5OshMhBYX9trnmqrQsZSEU0LSQyeY0zRu+uhVNx0+F+WFermtdJLidTIvuQmPZqNSwN2b4cR1Wnxq+XEsFlrpNqRBEUXPdVkBJI8b256vVHiq3hxHDqWIn/SfMk+AjkXcD/yEPu56vV3gU/mz1JZrRQum4377gLA/WOeiaoqmhnmYTQOl2UONp7C7HnqvTU+HxzSWBPmuljft23c9XqCXHIVeeSQx71KFAF8dpHPU4mg+zPHLTYUlRIpJc2D9yNtv6eaOyrbaaqCuoKenrkxVGkR4kC2v79yb6e0WHFKdlN0XzPOGy0FTNDK+8UpDppqI7K+v0m/NK2U6NlBzsj+TxOshXy1WFakItvAqzW+m5+jm0UyugjxFUwnN2C1NYpaKscCJUPdJ1DRlm8FsD8b8dG2mk0ma6hraiDE8L2hEjkCQIosLEFx31J3AD6ebpmkDmumooq2nrafakre7Kg7Ky3X7+er1NWC1EeApP1Ix1SIMKjdKdWFxLXsSIox8EX3z9HFbYgUy5tiuWRHrmnqMwVz7p54DLJJ4+ZI25yD4H3teMzjSpBgUv8EmxDC8Wp/l2CKG3OzLcgbW15SatM4VFylFDLiZmjVi+6RgzMdoVTcM/wANCT93KK2VtND5l1KHFcSTEKslB5aLDGRu1WNU82TXTcBcDX2eJ40qllGfq8Owfp5lOplxJr4jWCAoJCN4UOHYsoPuhmZTbwCgctsprbT7gdfXZTSfOtbTNLUxwCmooWYAx2DyPPbwQBQEGlzzwwqxxqHlCor3wllrbNLOwd7Aj9GR9hR2C7xf+N+NHoqqqHTAZwlPhWBzHe7VLu99PNdwWFyP3FVRzSRpw6apUnFsSLvDUQbmq8QLx0i6hRErmSeUDwFjtHLKGnZXqe56aNDhcFOBeWVtxG7RI/cjN/YVOvxHGiZrVLunnhro7f5K0Jc303Ae5r99uemqaam4LS1NXGa5Et+jiTy11G3zFDW+leaq9CJh2HRw1cPlqFQBwlraAAWufovz1epsmoI5sHZoUAkkrPPjJ77YzaxHxA56vUojvELsIjJE8MoNzdgXW302DHm6TLrBifmUuKUZjXSdDC6EC20C2t/9Y8VDZTyNlShhEGK1TGN1CmJ4hu0tY7QBf2EcvViYpyw3A9lLRpVLtlhj2bX8SA20i/a556mtVQqtqisoKrBpUDukQeIX7Ejaff8AD39RxKvbT9TML+RnrppMwL5sQiQSDXzlaSO7MbHs9+x7Ec2jbTUSKFCHLdBjdPh8eCTv85S/pIZZDYVETrtmiLjTcFtb2HimKTnw0pcCynNDj0kM8YkpDSSHzSNzK/dPfB1uD7OeQnGqappEZWqRT1OLQVDNJNDUYfUIu3Vlqotslr6WV1H180cDT1DxQgY3UnA5oiSwo3p2JXcQtplZQSAR7fr9nFCdtI1bKRfWfKtZj2eY6vBo1qaOSnqqarWJLiN2gDKrReDMx90+NjzToxrbJrqbDsQxHGKnMvly06iU1MDmNrKxGypjt3UGwbQ2+HNcKcNSs3YS8VXQZ4l8vyKNoi9l92xkIMjWtuRg3cDTx42rpq6dkUsJ8SoKnEA1I4paiGMhEYAIxbRlhlv2fQjw8Dy52V4ig7h+YwvG1rMIphA1gZbJdG199JEHYoLFRfsbdhxKulcAjGhuy1VUFWr0SFDFWt5tMU+y8qgh0sezWGq/Rx0bKRHCl1gUUtBGYZ4y0NRYsrEXOt0bUdzbUeFuUSIptWNL7DKQ1VQ00NVtsllF9Qt7gewkcVgzSXZThKtRPCIp13TRe7dbHzE8GF+/HKrQW5twQtgktBFFujbcVN7GO/vbQPFT3Hs4nPgpeFztqnbqli9fhOY6zA65FljVveDiwaI9tvxB+vj7dT3lbaVJBG0UAGM4fIk5mUl0ZRtPjbwH0DhoKk9hUnGk8z3Hl3uRxXRmKwOAgBHPVaveYG1A7c9XqyLq1+er1d7QwuOer1cdtjddO3PV6uRIB2+HPV6vFg1r+HPV6sbOGbnq9XXPV6vHUWPPV6sLWvpz1erl+j56vVikO4EnlYr1YittT7L89Fergpcj48tXq6beB256tGuiLqAOerdeQMNeer1dMxBsDpz1erhvHt/Pnq9X/9bbC4WVONe56vV232B9fPV6o3PV6vc9Xq9z1erjzdP17nq9WF/tc9Xq489Xq4N2PPV6sXPV6scn2eeqwrHz1VrhzdP13Y81NeqH4tzdernz1erCQSfjz1er2089VorEyWbmpq2mvc1TlYW8Oeqor29ueq1YmZg1hz1ertST3HPV6uLmwtz1erERcW56vVic+9pz1OJrHzdOVhYe8eer1YX7c1FerHzderEy2Fxz1K6xm5GnPV6sHPV6uuVmvVwZiDYctXqxacrNOTWJm381sq1cdFFzzW2tVg5qvV7nq9UYm5sfHnq9WGX7A56vVE5un6wnueOV6sD9+N16sLkjtz1erHc+3nq9XB/s89SyuO7936uer1cD3PPV6uuer1Y2781VhXgze3nq2MK4P9nnq3XW73tvPVYGKxliTfnqvorEzEGw5qnq4Fie/PV6sL9+er1Ym+yebqwrEe556q1w263PKaqerhazA8crdY3+0eer1ceer1YmZlbnqsBNcOeqtYWbcRblTsq4rge/L1cVH1t8Oeq1YSWK89Xq61v8OJKrUc9jz1WTtrvnqU1hf7XPVROysLXK9ubp0CahlbNbm6dro8cVXqxN9rlJNWG2uj2PG6eqPbjmqt13xutVifvz1eri9re99fPV6uuer1Y/d3m/PV6sTdteVNWFY3tflqrXA89V01jk7c3Vk1gPKKq9Y3PvcvXqwM9jbm63Fecgrz1eFcOJacrCxsSOKaarC32eUTTgrHvJ0PNkTVq4lgDbldNO6awOx5enKxMxtc89XqwMxPflFV6uJIAueXr1RG/e+rnq9WK456r6awMFXw4xT1cGtfTnq9EVxY25dVarDx2tVGfx+vien0VhK2F+eq+kVwsPZz1XrFIo056txWFrjQc9XoqOx1tzVbFcCbC556rVHZyO/PV6sJJJ56vVjftz1erCeUVXqxSd+Xq6ax83TlR5jz1erAe556vVwPf7ueq6dtYDe2nPVdFYve3fHnqermdFJ+nnq9UNu4+jnq9WMljofDmqcqCwIv7TxVVq4GS3fvxpVarFJdiFbjVarEwROKqtXIsvh34lqtcJE3+7256rkTXRA3Dnq9ArsHdz1KKwye7256vVFMoY689Xq6Dhm+PPV6uZmDC31crNeridxNl7jlq9WPcG7i9jz1VImsbxgja3bnq1pFcdnhe456r1yaypYAc9SdQ01hlkZLBdLjnqqFRXFmCi/t7c9Sqo+4Xtz1ernt7BTfnq9XRtbvrz1erCSE9/w56mlKimiurREm4DcfBR4/T7BxkmaSFVJTEpXlomNS4dSSXUadv3VHw4Xu1HGbugImgaxHEKmkqJMUni7+7Cn9PstwlIg1Cq1TQN5yxWjmgOJYkvmxbg5G77bdlQe0DjlICcaAilx0y1zJhaEySgqXKnaB/qAaa/s5sYU2RShxHMcGAUi0NOy7gAGul3Zj3A04+DhTZEUmosSankpJpFaWSZy7Fxb3UBbtqTqPr5s7KfnjQ9dK8TxA4djGK4qrOZIBBGx+1vke50/dCgcb4VbbFGIw6iosJnw+KOTfLXCQqysbArGygW7Xu+nx56q1MwiNxKiSsNfedDqPdXWMf8SNr/AB43ArSsKHnLdPKZ6PEMS/RlZQAgIsoKnZEg8ST3Phrz2yk4M0PWWvKw3DhKsgLyOqMAtgtkttAHx7jl6YUqaZ62V6yWSppHvEGKkjux3C4A9gsb8QU/TpFiENVAKcD3AFjVfAsVNifjfnq9TTitdLRphM1Q+4xkxFuxv5ZHYewjlTXqUmDMq0lWrqU80iQgjT3bKPvI56TW6zz1ESFqogL56zgXPYqbg3+rlq1TAsvy9eaiUkI9y316A34+Eit0hsXhkp5PmZImSYAhU9hN2B+sDltIrYNIvMOGtikEqzFYaV6h6bTQrYRnd9F23c9pFWBigrTCqqnwuoec7vlo5FZ7e7ZHIIPxsRzwEVWgSrqitzDlRHmZJJ6R2p/M2+9JGo3xi4+0ACR9GnL0/QV4hUxUmDytTxNIKmnEb79NN/umw190jt4jjMxhTRGqkLn5Ia8xrFHaXDJkZHU+75cJB8PBe30ceBxpOPDtoPs04rUpBCY23SMiuSF/eRw9vjp+XHRtrYRQUZt83EcSihwyHaaqUGIeJZtQf+JbuVpknTSc6y1rV1PSZGoSBTUWyebb+9VXHzLaeIvYfDi3ZhTO3GnTAKz5KhwujeypVySI3fVV91bjw7DjCxFOpNCxglNW4ozLDcqhjiZ7e7Ygra/t5TTTumlRlTKojqo8DEsULTu7zNUSqJvKiuNIFu6i3ZWtfufAc0QDToM0L2Dy4FGsOL5cVqg1EzR08joQt1spkQfvG/bw9nEyhGylNKHH45Z8XhSsDVbwMm4ysW37ZN1nPiWbuB7OVVVYobFw+qq6EPVzGaesqmqZ2JJL3iCLGuvuqg8Pp9vGdRr0UqsreVJVGEC6PGkaXH2mBbfb4XItxxOONVNLaqg2V+ExszRyxKXkHsRwy3FvEKPz48capSvzC6V+L0OJYNExip4loUXsYo2ChRYd9x7/AF8ZcVJrVP8ASrQwrRxYo4DUb+SyobHY7hvev2C6adzxpOFe20qsMxKiqMPioQis9U7Mz9z5ahtqX9hFifjzdaIpZZRw/wAuBDUIbmEstj4KxI+/tz1ep8waiqAsqncGi2quv+Jdb/QOW21RVS5YxLVx0tOdFBSx11A7/wBPNDExWlU8VVRDTl6Z4yVTajMdPBmKj8uKNIpgma7xJaatxyloJ7geXIxJ7gswsD9HNExhTo8Ip2psINL59LV+7I/6NNNNAxDbvie/H6oVGnUSvFRRy1jBlhju2l9S/h7RqearVM+HYYcVMlZvIkIngK3tdR+kiIt4nv8AVxkDUTToMVj+Sd56mWSIrIYBJvVSW/Royi6/vaE3HKnA1uYpQ4JUY3l+gpq/CCTJSmOanYablddrD4gsBp7D8OOgyKqQDtocsPjwnGsVfFsAkMNRCj008BeytK4UspYaAi1gbaAg8VSBspCRBoOqzBaenxOmzBh0zmBkh81ZCokiAG8K47FS4uG8NeJ1JMzSkL1YUIVHVTDA3zDRSslTTNSRKrC20ebvcKR/x2xt4EacUCk8ThQFZ3zbmKtzm2PSboYaasmpKzabeY0ZBpqmx1s6EobaEgjjS1EmnkpCdlCfglY2FQQ0UMhCTO1Ttdib9iSvxuBYdiea1RVVChZo5qPGaSGjxuMQRVCyr7oAUlnupS1wh8SDoQbW5sY1omKj51y5hVJTxU1PGGjA223qu0qLfo2sVBvfT29uXUMKqhRUcaaMMwSgqK44lEGSojCyFA1/NjFlLhexvcA2+njBp0knCn58Bq8t40+FgokVQIq2hBYkLMGvGCT2WQDafG/flBIwrSTNCbgVbR51w1JDdIatJdpP2lcOfNjPiGR1I+728cBBpOoFBp9yzNVQRwwYjKFdXMRlA9t9pZfANpry86abUqaVNI0k87TxOY5aQsQCNNt7uv7Rywk1QCaxZhrqDEmPnRGGoN1PgkqnsVt48VLSF7a9sMVUL6n8nU2GY+YokHy8o3K9juVje4F+44mQrGKmjI7kpMeVE0kqJ8PJpqghtvY9+HIqb0w7SfqljlkMtJop7j2HiyjATUSVA4DHmqdroIFW456vV4OxsvPV6sbEhRY256vV7eFG0annq9XIOvjz1eriz7Tbm9teriuz9481XqyL2sO/PV6urAk356vVxQra/PV6uJIOo7c9Xq4Of3fz56tGsQNzY+PPV4VwVGVr+znq3XJi1wxJ5Ybaqa4aMTfw5WrVyH2e1h7eer1YH77QLg+PPV6o6bVuzfRz1er/19sLhZU414HxHPV6uBkutuer1Yuer1e56vVx5un69z1erAxub89Xq4kjxPPV6umbbz1erDz1erjvXnq9WNmvoOer1Yubp+vc9Xq9z1eqJ4tz1ernz1erCvfnqsK489Va4nlaeFcG7c2K0qsRN+arYrrnqtWNtu7Xnq9WM6d+er1e56vVjLhdAOepzTWNjua45urbKx7156rVhYi5PPV6sLEHtz1ero28Oer1Yy48OaNK6xuVI5uvVhJS9+er1Y+N1usT/a45Wq4cbrdYF7c2adNcXOluVrVRyQwsOer1RySTc8eq9cZD4cZrQqM7XFuWFbTWFm26c1TlYibm/PV6o57nnq9WFyD256vVjuPbz1Oaa4lgug56lFcG+1zYrVY7kfa5qt10/bnq9XAEnvzVbFcebrVeL2Nuaq4NcSbLu8eerdYgwJsOep1FcZPDmqerHz1erE/fnq9WPm69XAlb+3nq9XHcns41pp6ozP7OPVuuDlQeer1cN689XqxE3N+er1cCwBtz1eqPvG7XlFU/WOZhpyqKomo7MCLDj1OVhLAd+er1cDtvpzVOiKxuyWsDz1awrq59vK05WGRiO3jxirisbnTvz1WTUd+/N1euB5Y16sbfaHKVYV0ex5Wnqwc9XqwswDX5uqzXDcOeitaq4vqNvt5ZO2nK4FrePKVqsBfXQ8c01WRXTNcXBPG6uDWPevPVqsTHXuebpRWNnNu/PVUViLtypq1YnY7r8tXqxM373PV6sRkuOWp+uO889XqwsSO3PV6sbPprz1ergXsbDjaq1WHjlbrG7C9+JKsqsbGwtxzVXgqKwM9jpzyqvqrC0hvxynQYrCzWvxPWqxb14pp6sLam/E9eBmuueq1YpCd1jz1VFYPM+HPVasDnS3PVcGK4FgVtz1Oaqxbxz1OVglYm1+erc1hPLqqtY3+1xunawMCW56vVw56vVgPc89Xq4MLi3PV6sBFxbnq9WBvtHm6cTWNm289V6iSElteer1cN3fnq9WIt71/Zz1erExsL89T6a4h9deep2uLMoUnnqppFRC22689V64OwJtzVOVElNh8eer1Q9xOtr89Xq7kYgbvjz1erBcObnw56vV2LEe6Neer1cWZgLHx56lddB7Cx+vnq9XHeF08Oer1Y5idpY6Dnq9UEq+7nq9XIkqdO/PV6uS3Um2vPV6uG5na4Gt+er1dbtf0f1jnq9XIurHTnq9XAD3Sf4c9Xq6LLaz/lz1MKM1hJRjfUgc9Tdel1YEdhz1K6jXAOnjz1erirtuHPV6u3cnRToeer1R2Yn3Rqe3PUyocaiz0kbKTe1tST48YIikCxQYZtxOhobYdEwadiWaxsq39p4UOqioXz1YHhSZoG82zRbIiZr993vHXTw+A4W6qjBSp2UXTHmXF45ZZrskZZIx2FzYWXw+vjQE1SIFYcGwiTCKaSvMl5ozs2xJf3rXVb9gB48VJBFVpkrcNwTDIExbG1M0sm5gFYk2v72vfvx5O2k66aKPEJ0xnzjHHEhQ7LdwvjcntpzfCnJFDZlbM09VQRYJhkJaOR2lc/vOwPgPBRzU4RT4E0Mzy14wqSjSQCSILs2sC6l7XAPgD25WtqoRsqVGHS4xFDSx2YM0TF/ba9l+P+tzVMK2UJoq6ahw3Damp3kzS+VGFNmDSElpGDdtyaL8DyhpOih8w3F/5phLGCJY4aRrIV92/tPxsQdeXplQM034bjNJU4k0tCF8qFxs+G4EEm/tOvEOk0ppyy9X+clTiMv2RUF41YWtptX8781WqeVhp6ry2JLNEQ1j4k322+N78vBNbr1RNJDiMeGLJuj8suCf3lC32n47jyuk16uWK1cVNSQioSxcxML+DMNzKB9HfniIrVYsUMNVCET3RUxBATpY7ih+sG3HgoRW6T81fHV0S4vUL70aRpICbgvBdJAp9lrMPp4/XqBt8Rjmwiqp42M7LWSyRg/vBoxZT/AMggDlKuBNIatqGq8j4hiFDIBPiJVYonNmIkjViB4ajT6eV4VvjQSZSWm+WbDsTTZJFAGCm6qXVfFh2PwHfty1WVSJzxhkkVDJWmNNySI0TINNrR/pFIGmjaj6eNKrwotcPzk9KcLqiC0xlgufEP4+299ePCk+kUms5bWwmmxLD4x5g2Myd7OreW4+sDlya9qFN9RDhtFhFTnRx+loEMVJDY3eWbbtlX4RG5+nj6I40kNFglnkqFbzVYzN5j3B95mAHf6SOOEzTdKnBMTnqqjC3qEWSKnapcrcgWZy31nw42unBQ1R5irv6uw1cClmmI8qBSFRXLOENuxa+uvKaqVJ2Us8q5fTBMJkx2ePZUVSCMszEPt3fpGXxsddfG/E5JNXAM0PmUakUMMWIRRiOWnRFpom0CHb7pYexAdxHKSaUUNmV8m0ksaY9i8jBIUaUFwF3G12kKnUa/Z+/niqKpqoRsEpicHFVEgWadGZQRpHCfdCj/ABSNpr8DxnSatSmyvlOZpYVG9iuxd3h77hr29uluOIFNKUBSilR0xKsxuQJtgDCJO52KbXf2IL6csSKrS7yhClIKkYrGCZ5o5IEGrIm4qrE+I7kc2kdNVVspJ5nlpP6x0tBSe/F5k7zsDYOyom1rd7Dja9tOClXhFO6yIZkEPk07CwNrlwu0r8AL6+08arRoWsMjadYnR/dRZIGCsLjcw26+BHPVWlTDVKJWYRhVgYiQki5J91T8eWpPUKnRKCshrH/ybws1u/j7fjzydtOHEUo2CYpKYrbT5Zm/5Ntc38Re/Fe2maTMtZ8xmZqs7tqqqhh4hlsv3trxKo40ojCKFaFjW4fIFHvCeIC+vugbnIHxBIPFdJ6g4UlJV4dJBVn3grxmw0UOjPH+3m60aeMihYbS1BW0gUke1Y1KMdfajgj7+eTga0aj5wxWDDjUJTyeQ9PLEsEwUkkuSHEi+KAkEka28DyjgnZVkYmlHkOroqGKPGKrShwtIGmkRtwMUxXa4095EvdhYEAHlUbKaXNKLM+Gw5frZhhSFJqisinujkxttQKCrHwYKdD7OKCmK0lUjGkLJWPPjdLv/SilLRTo72M0J0aMqe/um48dNNeVJOyrgDbQk4piVNg2B1lBWxyTwFI/LZSTIhJCLZgLHaCbE9vHjwEU0BjQLtS4dieJzNVOtTSVbSB9zGGpSFm37lsChMTa7WGtiA3GFDGnsaEaOiwjCoqKmEjN8pIIVWY++FJS6m32430KMPC3t5WJqqqF+hwPC8wIaekeRJCtxG2ikXAAUnQMDy6cabIIppz7TV1GMOm+YUmU/Lyxv7scrqPddiARvFgDy6qcaIqHgnmUfm4bMhaqoXLUcpGse4gmna3hYnaT3BHGhV1EULbVGXc64a8s++F8Nl83cTZkdgGKgjvGb2t7RcctE0hEg1hw6qrMILVuHWndKoM6KRb3yFkfX/Fa54kGGIpYs6qWmCU1VmCSsofMVHqIzLA66HQnZu7/AGCLMPZbipI7zA0lUAnZWKLEMzU1Oz19MDW0xMdXHG3um1irrf2jmlEoqyYNK+GlpMZpI8TomMyxtbyidVJ1AF/aPz04sQZFJ1A8aKp6mem1LjuSKnGsPWV3gs6qq3ZB3YW9nt42U0J8sue7cAJqm3GqN4pnjNmFyLezXv8ARxayemsm7NyQDSO1gkKEdu/DShRtrGzC5YaDnqtXBmOh9vPV6sW4pz1erwII56vVxDG2089Xq8bk9uer1ctTrz1eriAtu3PVoVk3Em48Oerdd3W5JHPV6sYtcLz1eru4F7jTnq9WPeT2HPV6uLWPvDnq9WHePtdweer1dMQbHw56tEV0x96456t14Nrt7j2c9Xq8Rfxt9HPV6ojR2Hfx8eer1f/Q2v7gLY8Lam8Vi5qrV7nq9XmvbnqsK483TtcX+zz1erGztbtz1eride/PV6sTn3ueqorhz1Wro9jz1erBz1erhzdP17nq9XDefZz1amuvM+HPVusHi3PV6ufPV6sQ+0eaNXTXfGqaqHx6rV01ra89Xq6IsbcrSisVgRqbc2aomuL/AGuaq9ceer1cCwXQc9XqwaX5ulFcGK3156vVi56vVjdha3PV6sfPVfUa47156lFYeaFNJrizAd+eNO1h5uvVjL2NuVivVwZr6nlq9WLzF5WKcisDMFHNba9trhfdzRrdQ+O1evc9Xqiv9nnq1WF2uPd8Oer1Yrn281TtcGNhfjdeqO7G1+er1YObNerFvbl6c1VwJJ143V0qmuBLH7Xbnqcrgzbuerdceer1e56vVxJs9+apyuG65vz1VFdE2F+eq1cP9056vVid9e3PUo0iuHmfDmqvWJ3F+br1cd4tz1erDuBPPV6sJK39vN0/WPnq9WJyNOer1cSRbnq9XEOOMqrVR3Zb8ep1NR2YXvzdOVicgjQ89Xqw7R/i/PjeqtV4/YHGK1XDnqV1gYC9hz1erG1t3fljXq4v35WvVjPY89XqjctT9e56vVhLDdfmqsK8593laerDz1erC5G7nq9XHnq9WJ+/PV6sQ+yebNUTUfiqna47mPbiSq1wJYH489VwJrCzm505uraa4sT7OerYrES3s5U1ascnfl6smsb/AGeaqtY9x8Tz1erAW178tT9YZW8Rz1erF73NVaK4tu7k81VgKxE378Z1Gt6awM2vflK8pM1idiR35Yba1prGWHiebVTtYS5vx2tVhZ9O3E9brH5n+r+XPV6sDyfDnqumvBwVsebp2uEhF+/PVUViuns56rVHc69+er1Yz2PPV6sHPUrrFISOWFerhzxM16sBNzrz0mtisZb2cpW4rEGB7c9VqwuwDa89XqwOxNrac9XqwFiRY89Xqjs+vu83TorESBqeeq1R3fW45YV6sd/tcrXqxH7Q56nkVw8G56nqxMSDpyxrwrETYa8pTlRbktxQrZW6xSsbjieqmosjm/PVusLN/i56vVwmItZeer1dIdCeer1dg6k89Xq4Mbm/PUrrq2l+er1YmJ7MOer1YyAQQfHnq9WEvZreFuer1cmOobnq9XQBsTz1erAbg6m/0Hnq9XvM+HPV6vAjabd+er1eY7R/Rz1VVsrAX9nPUmrhvtcnnq9WRtvca/DnqV1HkFtLa89XqwITtJN789XqzNqtxz1erGotZLannqTK2024hUxQ08jSsAqi5J/ZxPRVcq0igCxp6Sau2vc+YLsAO5PZdfhwgerHvMXCpygvzVQTVM8ksrpTpEgVL6ge1mI7fRxJtFBlQCdlBRjlLhtLHTw4cfm6uawSRl2gM3c7L208L8uik1N9VP8ALucHgdZNliSL6udWJ/W3FFepF4liGLY5ik8GHtHDHCg2ytHYA+IGv58smk9ICokWmZ6GWcyosoUl2szsPtAW1sPhywEV4YUN2UMf8iWFKSNVBAi93Sy+Nz37ePNTjT+qaGjLU/n1F5Z1/Ts3mMDb3UvtsfYNL8pW6GDK1YmFTfzCoW8iHZGvf3mNlsDrc6a81VVChwoKTCKbAaSDHFaaf3SkN/eaQuCXfX3UXXTxtzVJdVLGPHY6XEUwVJv0dOsskqrYAq6DQ/FT+3mjtp2uWGxQyT11PRAn5gQFfhou36NLnmhVjSoo4J54okH+TG//AIjZbWJ+vidSKpSmE0MUEYQ3kIV373uikKbewm546nZXqi4UGmxlsUke6Bd6Xt9gKCwsfHceO16nDGYnxOWmDglYVVg3iXH9htxIrbWqSOITy09D8pbcoJO617WZCT8O3GRsrdTMdgjlw6vwiFhCl2dB/rgHaL+x7C/F9bou2I1IolpHhUopmSCUi+rsRr8bLytepIdQIEFZh8uHTEweYzHdoAsbb0YaaEjQj4c3V00C2E468bV1ZIWjhjhlkchr2ElSLOFP+AWP/Eb83TlCpDBDNLVZaxMI708QaJ1Pu2OwxjXuu02v7eapvVRHc1RyYDXV1ZLGEkgrpFAN7hVktuHwsy/fzdVXspmxbDowlLPSEFX+Y2ofs7tytYnxOpB5akVIPO001Nh2HEoRShpNgGuy2kqn4ga6+HN1U0WHHSmA5qpWXWCdpPLYHQJoyHXtfiimVUrclyT1CVNTRwNNDAY44tqli8jEqqJ7fdO5jzZ2U6OFGZpsGgwTL9BWYsY4ZYHaQI7XO99gB8sanbrxgiKWINKXCK6sxbMJxOUGopoNIjL3cg3DOo0VR+6vGycaVUNuR8KpahRjWZ1ISml82Kn1u3v+60xHg5J+J+rjadleoe612qcHOFFvMq6uRZJ1GgSNhu8tR4Kug4mVtpPQlYYaqVo8OplARBtY30BUbSR9R+8niqt0MWG+fRpS0cV0Wb33Yd76aD2AeHPUmXtqFh+HRQ1/nVYE28ujr4bWFmJ/4iO3x41xpRWKkp6+vzREsUpMUYCyv2ULsCpb2Frfx47W6htCtemHyYfERUVazhin2Qwks1z+vbjKttbFCJT+UuKGpmXesZVAGHfdZbH6uN1ShCpGpKKNa+odUUSMCttbdl0HxHfnqrtqZh0f80jqpYzZC8TgN7Ve9/6Po56rU/O0U9O9JULZXJKN2Nv3gfYOOg41RNSVq46acRxAk2dSviwMZJ7+BGn18U05UDG6eKKvghUC00sRVwO6C5APxB4jV91UTspZYR8ycZkSJl+WmdJYm7rZgI219hUX+vikUkTUrLyU1BXYhWSoY6TchV27L5QdHUqdbXKn4g6csKsaUFXhWH4dEZ8EDyQeQZUVtXG4KnuH9+MRkn2gAHw5o16a49TKCGWnoalSsckkO17AOSrIqh1+K+4fv48dlbRtoMchZyiy5mqqNeS+H4hBV09SpGt4HVlKjWxERa/e4HEzatJrahJoxVXWQ4HR4nhmJxM8MNTOFZbM+xYhL5sIIO4e6SUJ7XtxWTSTbQaVlQPkJ4cQKEEJMsqKwuoZGV9CCylWFxfTtxynE7adnmrjLS11Id8bymkneGTfHdVZF332su64ALDQ9zz1bpRYplanoJ6XEK2d/mUREkiYCzLIzCNyG1XeNynUjcCPZxPpirIXjFOWDpQUqUtLjCqkaTeVTysAN0T3CRSHWxQ2VT2tYd+aKq2oY0Issc+S69JsS3PSMVs+u8XNydv+JR3HsX6LuJqkzTNmOM1BkjndJ6SqCzSRo3aQn3Z4g2oBPf7tOaVXkCkvS45Lh+GLi1XF8zR0IAmqALt5QcbZgAbsIjpIpvYdu3KU8UxQr4TFhEUslQql8OrUaW3tQ3VgPGyE3IPYa89VYNRenaVkE0mFVU3mmnYxrIwHvIp93dY99hBHt4lTVnNlCdQUMWAY8MSoHPlxkVJVdBZtJAAP3d3FYOk0jONCZmk0klScbwoXjqVCTKi2YGwvb228RxQsTSZGFBnh5q6CZquhlDJqGH+MDXsPEcTDClivFTxWtFmLA5Ifsx1SuC5BH2hYg/x+nikHVTDZ0KBqjzrx0/zB08z1VYXjMI8h3Z6eqSwDKx0B8L30P38VJwrJjJ7pL6KL1XkNIJFF93w00PDEGakRpU0167OOUsrwvYgafTz1erEl/wB/nq9XIknU89Xq4sutweer1cSSD356vVyubC2vPV6ut21tdeer1Zhttftfnq9XAnx56vV1vN7t4jTnq9Xgym5PPV6uDDQ256vV0SAuuvPV6ogJDEeHPV6uf6Pnq9WIgkhh256vVwMoX6b256vVzDsSQCLD4c9Xq7kuNBz1WAmv/9Ha+dQBpwsqcax89Xq9z1ero9jz1erh+k56vV0/bm6frGST356vV0O/PVU1hf7R56vCuPPVauibannq9WDnq9XFrW15unE11z1XrAeeqqa656rVxJ0PPV6sW9/1PNRXq4m4GnN16ut3+rykVvTWHl61XN/s8rSisPPV6sbfZHPVUVj56rV7nq9WN/DlRW6wc2afrC32ubFerrm69WF/tc9Xq489V9JrH5fx56lFY+eptNYD2HPU5XXPV6sB7nnq9WN+3PV6sNueq+quEn2eVFbFR2YrqOXpyuHGapWFm3c9Xqjuxvx6risDN4DnqttrHyk1ao5Nzflq9WFySbHjderE/wBk89TyKwXHt56q6a4eZ8ObNP10SQ9xzVerGxsLjnq3XAP7eer1dFzfTnq9XAuAfe5uKsK7Y2FxytWrGHNuerQrsEsbHnq3UViToeep0K6a65qnqxP35uvVif7PPVROysCfa5ulVd8rTFcT35unRWFuw5urVjPY89Xqwg8aVV9NY5LX41VgKiv24rq9Yuer1YuJKrXZ7DnqsnbXXPUpqPz1erFJa/N1sCuLEXuOarVYNw8Bz1ergW28tFerAzE9+ap0ViZjpxxNWrA97cpXq6BINxylKKxN9sc9Xq4+58eer1dErfX+PPV6uD9uer1Yeer1e56vVHc+9zU0oqOxO7lq9XVye/PV6uBDe3nq9WFwxNr89XgawyXt356vVHa9/e56vVj5an64P256vVjIA7nlZpzTWMn281TgFcLjierxUNrfXz1bVXA9jxxNUrGxTm1VuKiFidTxyraa4MSF56vQKwEse/E9PeGsDOSdOeqoFcLj289W66Z7HXU89WwJrhvPPVqsBc3PPV6uJc256vViLgduepXWByo56vViJJ78sRFerCzG+h54basKxlx4cpVqweY/sPPV6sTG5uOer1YZDpbnqsKwkhhYc9Vajuba83TorBz1WrjJ344mnE1iJGtuOU1WBiQ1+J6W1hZiDbnq9WJ2ude3PV6sVztbmqcqMSbX9nHCZqgrxAPfjdXqBI3cc9XqxHvYePPV6uD/AGf6Tz1erIhtpz1erpr393typr1cCwUm45aldcXa3uePfnq9WE7ftG9jz1eribHUdrc9Xqwixtz1erK+ifRz1erjESQfp56vVjYr2Ht56vVHO1vd56vV6zEmxtz1erj7xW5+/tbnq8RWIkW1Op56kldFXF7nnq9XIWVhfx156lddswJ056qK2VFBOo8Oeq9ZG007jnq9UWS7nYDZfE8qaYJ00mcy1kFNQNJIm5E7ewnw78TuGBQOv7oJBnoNAbiVZVyzpUFUSoc+6reAPifZbhC5jWP9y4XTNJLGY4amsRJpGnCgs5tZRYakntbjCRO2ixYigxMVOJZ8QupsrJGQl7NqPdA0so8fr45sppdB01eWlEKyKqsSvuj3tv7xY+3l6aJikzjVPLWvJg9D5qwhSWZLC5vfufbyyabpI/ymgepFKVaWeEDaxILHW+12+yBfx49VTsoR8sq0MFRU4iHiih3NIYyL7QNI0PizHS3KETVqFvK8bLlqqxesUrNU7kgj3G8SbxcMP8W3v7TysCnSYod1q0XFad6azOgUsCO+0C2ne4Hs5WMac20LOBV8lPEtXVMZaiKUE6ag7tVt/h1ufo5o4UzpFOuTKVqzE6gS7zUV679R7wAG4i/GQZrxEUOuD4e8I+amXy98cSKo/wAo2psdo7EWtry4pLqJNTsSqHirqfBaMKyBVeYL2AUXtu8e+vPGlFRKerSqxpKwW2QjaR/ivey/UCeMao2VQmK9g7SRYjMkzuyxmbT/AFZPet9V+VCjVqdlqmmnp6SnFiIEdWPclm0B+q/KzNarDXoslBJURuG85HYIPiQABx0JEVukfUS1XyC1U1ylXGjAlrbSt9Pp3A/VzyVE01jQWZgpDJE6gM0tKkksa393zBcLe3chDfm1GKUCgkznXtDleknR7qJArM32LOQytc9huXafp5v7q2mgorsIaHGY6WnYrS4iimbTcEjaFy8bfQdB9R8eOU5T3heYEkqBNGTIhjSKVWuSgCiMD23Urc/Rz1eoNOscMEiVtTSRg+avmOE+0CQqu631sSqn6b83SdWygBpKqKqqEqE0jlkR1Q9tj3DMPiCLHm6TERUDHcSjq8OakiTcsbPvVgCN1irD23KccnCtRNFJzhhc3y9HQB1dqQzCFm/whtQR2ut/uHFBpoCaUOWM1vX4tTRU0rtSUELFIlO1CVGrbVsC8h1v3AtblauBQsRz1WaMzwYDKAwpYo5J3AI9/wC2V+AF9vxP0cSk0vQIFGBwLDMUxDEoqTCdZpAAsSfZXW25j2Fh9w4ySTTtGHwOGLBmFBEBUvGoZLNu3yge9O7fZ2J+6O1+bBmvUvcvYLU0kj4s2+eoqiQoYaub7tPZdjblVJmqaaMlgGD0uE4VJUSODIqyEqRe+m+TUaD37JxzZTdLLB0lkuYwSAVBY20Bax+4c1VCnVS5OFUpjino9jBoCAbgktuO9iP9UDT6eaKRtq1M2G4fT0OPCjn1V5QXYjupF/uXt9XGQo1rbSYwPDJYamLFcPkBhie40IPvgn7PYXIB5Uma8TFKGhhq/wBFQN+kkaQ1Ejk9hc25qvUtstSx11dVs8doaGFmsw+2RYAn2an6+er1POX6o02Ez18o2rIVUDX7XdbW+PFCRhTKjTjiiLAwWCQl1AXc3bdIdfq5bSBTqdlS6GoLSw10yEBUaMC3Z/d1+g68cq1TMYrIvlGMxJSJQVBGoDKTcH2ryhSDjTaa4Zdr6/CvLVSZkCwKy6BWTy7MLN7eeGFVIAoQPNpKeqr8GZDHHDC5db7kvKR5era6gXH3ccpnbXBs2xJjGF4RURkiIFV2m22ON0Vdht9tUBAB0KtblTWopv6iYiExiTCmYpUpB59JKt/LdYZL+QV7gzQkC40uPaObNOIpD01Dhg6nQ0U7E0M6R1ij2x1NOwIA7HaTZvo41oE04RIpd5pq6qfpbWYpLI0E6U0L3Q3IkiuVt7DZdrX0N7cUDZScgA0xZazA+NwUFTXtG1VHThZV2qsbxspAvYe6dB9J5WtUwYdiWYMAqMKzIjAU0pqhXQsptLA810LEe7uS5I+K89VttGxx6TD8w4I7vHZqcOpNyzCN7MIye/lrJZ1Pdfjx840lQINZKTAaTFcv080ZSFYCfMLA+5e2tzoEudQdbe8O3E6k1fWQam4zW11VhcqY09zQna1xcPGbqGBH7wuAW8eO6p21cCNlInBMYizbJVyYeDKaC5dQ4LtGTZzfxK+Fu/jxqZp6Cj1pa5fy9LgVfIwYjDa5iZtwusbSWWT3O4jkuHI9oPt5o4VvUD5035YwvHcCwSbCayVTFh1VL8s+8llia6lDe9wpuuv2lsw4l1KFW1A0K+U6Soeqk+RiVajy0FmG1SLWt8bfZPHEY0lWqhcFBFUUgxelQqKQsrIh0UG2/TxsfbxcUjbSPVWKvkqaSmRaKVmRSNiAj2hgyk9+9vo05TUTTiRSFwR66kzEwuYUqLyJuU7fMvfa48A3geJ0yadIApRYsFw2do1DIlUb7T+6T3uD2+HHcU7K0AF7ar+9TmXcxUFFLi+DSGZlLOaeZA8co8QwbsCPz4uQSalDIHRq0mq5qvEMqY9TMxp3wmsQXsvvwub2Oh95D944ZoqdWwtB6qRk0EkRsCHBNwy6i3HttHoM7KiuSptpzdbrESTY+3Tnq9XrhdPEc9Xqyc9XqxW1u/PV6ugzDseer1dsb6nvz1erIpBGnfnq9XRFxY9+er1cR+9z1erwLBeer1dhg2nPV6sDOW932d+er1cD9gc9XqjguWUP2PPV4mayjUk3B+jnq9UZLbixaxvz1erMIwRdTqeer1eMu86GxGmvPV6v/9La64WVONcdy+3nqtFcySe/PVWsX6Tnq9XHY3PV6vNu2689V01j5unK6uBqeeqprCxub89Vq656vVi8G56vVw56vVjk+zz1WFYObp2vdtTz1errcOerU1jJWx56t1w56vV7nq9Ufnq9Xuer1dn7B5o06msTduarZriVNtOerwEVi56rV7nq9WN/DlRW6j+/7eeNX01jf7R5sVYVh3jnoq1Y2Pc8tXqxFz4c9Xq4c1NerCWLaDnjXq4Hsebp1FYmbdz1PVif7PKmvVwf7XLV6sZIHfjdbrASB35Y1qsbsPDlKvsqMXL9+X2VfZXHcLaa8rFaqE7kHjtWrgde/NVeKj89Vq4FrG3PV6sT+P189Tia643Sio/PV6sT9+er1YiWB05qtiuLNu56r1j5um64MfeuOapyuBF+/LTW5rs/Dla1XWhHN7K9WG49nNV6uNx7eepXXCTw56vViPY89XqxXG23PV6uHNV6sR+2OWp+uDv93PV6uN7689XqxF7i3PVaKwFlDc9XorETc35unq4P9nnq9WI9hz1erF5Tc1Vortl28S03XHnqV1gPfnq9WGXw5urprGex5qqVG5an64S+HNVRNYj356tisTdhzdWrA5FtvPV6uG481FX1VwY3N+Vp2uDEdubqprG/fmqtXA9ueqwrHf8A1eeqtcPMbmjTumuJNzflqvWB/tc9XqxsSBpz1erDz1erCxO7m63FYn1XjSqtFYttu/Gq9FceK6crC32TxlNOJrCebNOVxJsOaTWgZrCSBqNONVasbsDoOKK1WByQLc9XqjlgO/N0/WDxtz1U1VgZieNqpyuB7HjdbqG/fnqsnbXDnqrXB7256nE1w9/489W9FYWL3056taa4kvbXnq3orriinawN9rjIrdYpO3K1uKjN35qtiuBIHPVao7OR356vVwZraDnq9WCRzpz1Oaaxbm9vN17TWGQ3PPVesfPV6sT/AGv19nFFKqw+Dc9XqwN9r6uJ6tWE+Nuer1Ym26X+PNVYVwNrdu/PVasDEgXHjz1erEy2a/189XqhOxvYgc9Xq4BtzEc9Xq5mMbAfjz1erFpoV0t489Xq6O0EE8qa9WNyCeWpXXEXvpz1erqxBI56vVwKswINiOer1YrbdPZz1ernYILjseer1dxvuHPV6sDm7bRz1eqMQS1ibt7fhz1er36PZz1ernt0AOnPV6sflvbTw56kuk1jfcDYc9Wq4gsH3DnqV14st9fDnq9XQZSBtF/1+PPV6uR27bt93PUzrpsnnRTZvs21Pj9AHt5U7KTrXFBnnesqPMjjjHlInvXOv/JvYHhQ8uahjOrrGBQK1OIxRzzVsg9yxAd+4Pifr4gqNVEAUnK7EZcXpDhdJEY9+jMWtdR7Tz1JSukLjUk9NSmkH6GmTbGqqRve/e1+3KUnoNajE8By+ZJaoMdgYgRqDYHTV27X+jXw5emV0lZsclnj2RxMhIG2IsVVSe24ra5A178ummwZpACpkpauSUyl0IILbyqH6FvdiT48crdCvlOmmmiSvzAxWnDokULWXe3cn22HiebrwIoccHxGlmxWOmw7dU7hvLAe4SCQWAP7t/Hx43xq5M0K+FVMD5lh+XcyJAsklXJcWVEUXFva1iB8eaAxp6hJosZqvLk3xWk96cvYAnzLtt/4FCL/AB42rjXqFPKWKPh4xCnpSIkaJkWaMe8d7hQoYe8BtU3tblKbVQoYbjLUOESeULklw7HuEFgoHs5qk2nGsVfNBSUsOIsvlNrFoR9gre5+u3KKmnag5fjL07zGTu6KpOgFkaQn69o+/jWk16lHC8jTxyQ23y/aB0BAW19fZe3NATWqnvWFcTeUEGNdqfAArYEfQRzek1ukzhdfDLSwU9UxjWpkkjFidoIaynQfQeaTtqpMVBxoVqZYp6YaEVU0Mij91dzMbHvYFhb6ePqEir0kamuZZWmkFmZPMJPchSFYfWLi3PJEV6gdzBh+Fy4ZNgBltRVcUbQyEABJN2+JiP8AD2uOXp1NISLBqPHKhMHQ7MTw6dn3bvdkRYy0kVydpF1uPZ256vExSJoqOrp5K4zR+U3zUcDk9yyqz7/ouLHjX3VrVQd9UY8bwrNpld9DSIzqqnaCrt7DYgqNeP8AGmzjsoApq+KniqKWmutOBJNHf9063X6FPNzNMlBqPjlVFFiUgFnjqlD3BsPMABvz1UTtotGfatpcUjptgUVsUgYL3DabWt4Fj9q3FqqTUydPsMq6TMaVEcbSU9OAse0Eh3chfHstx4+zlNlOijpZDyu9NWTzyutRU1EjGRleyKRqAXOgA+HEhFLknTRlcGphhmHx4RShaVKpe0a7POudWeQ+8UPxOo5qnqESmonwzD2xNY1dqpgoQA+8qgWRR7PZ8earQoxmV8u1az0+G1QK1cqByT/yLxkXa48HI5UCKoTQkxFQJqagjDwOuxA177SQQT8Ta557UKbpQYHTS0NE9Bv1IdzfVjrop5vUK1M0/wBDCtNVpWW9wR7LX0+17PAX5rUDW69iMFZ8qtdBtZ3eze0L2t9ZN+JqoKbI43o6aCnRCGaQqwvbtoBz1bONK6XD/lo4PllO+VmjI9m211+i3PVunrDQkPz9RT+6JBGGXxKbzdfotz1ep0FUsGCulOA0UALRqR9rxuL63F+/H0qwxpMRNM1LVUu+nWqLNFMGpwb3+jv48tqFKqUMccXyIKF5Fl3P737pDE2PsYG3NyK3XWMYisckdFf3UhWS5GjG+3afDUE82VAVROyms4lHLiQw+hANO9OskZ7srhWG081qFVOyhqjkwvFKujqXA34nBBZSLEiFfeR7/wDHhJHjx2JpPGmgzxypanx5ccmu8B3hu4aOYMttxvYGxBXlDW6c8wSw4tjlG0rFaiEMkMrNYCRHMfkvY9pbDafB/hy9eTTdPS4tmHEI8wJFaqw7vF7q/wCjuN3l3Av7pBFh2N/aOU20q+2nRGkfJ0NJSRSSxYqlTSIBZgshBkRZjf3RvWwb26ceGykittB/0vhmxTHpcJxZGp/lxFEd1wwk2fow1/8AWH0EcpWjQh5JxKkK12QM5Khjjmljj2sAIWJ27b3+y5a6+Go5dNaPVSowqsr8Capr6DzK2OlMcM8UpI82ilGgdT9l4zcG3YgHjRryhIoasv5gNFemhZhGyqkbPruRyf0cnf7Pa5+vlq0oYUzVuLYth2KSYSCuwq3lIkio4dLWUxPZWupsbHadOVJircKcsrYfRLjCZqy9TIgmKiqWK6uATskVo7nQMBcDmxjTqjhBoV8GpmocaqsoyTiStKGooxMB5dRTyHcilr/bX7DfG3LfbtpKBGNQnp5IM1REwCHDsUDU9RFISDFVoLxMtzYBgNpsP3eMGK3Sty7VeXjUmF4oxScylITGRtupuVuf8Q1HxY80iqKEihNw/FKelrZ4ZAIjVnfBJ+7v2m8Uq9jp2Ps078WyKS6TSXxiKQw/NRqVhRgpVSCF3aqQP8JB0+HGaeSa41tREkPnYmbiSO3mDttGoNx7OWGFWIPCpFei4rQpGX+Y3IGikGt9BY/dxwiaqk6aCfqblZ835FrsOqVvVwxMYnHfQWJA5ZANHOXvllYPWPjVFubKB6DGp4ZlCMjsrDwJv9oH48OE1lpZO98maSJZ4zuXT6Dx4bKOIiuRlRvddbH2jlq3UaRAre6dw8P7eer1YGK77Ec9Xq6diAdvwtz1erpWlYXbXnqdwrhdw93056mjtrJvHa/PV6sw95rDw56vV4k2sfbz1erAQ/2Tz1erKCoFzz1ersuu27c9XqjG5B1156vVh2MWs2vPUrrmyIrC/NgxSSJqO+wMVYW+PNV6uTCPbodfDnq9XFGIUbWta/PV6sLkk3PPV6v/09rmTseFlTmK65una9z1erjJ256qJrDz1Xr1jz1VmvWPPV6axP356rVw56vV6x56qzWAm5vz1Wrrnq9XB/snnqsKx+X8ebp2uB56qprrnqtWAt4X56vV1z1erETZrjnq9XW489VprgWA56q1yZgRYcrSisJYDvz1ergzX0HPV6sZYXseer1cS48Oer1Y3IPbw5oVfVXXNGq1Hf7R5sU6Ki8tVq4v9nnq9WHnq9XAuvhzUV6sRJOvN08ivc0adqJ4tzdergxN7Hnq9WJ+3PV6sPKzXqxsQ2nNbKuK4E2F+Vq1R7Dm5r1cJPDmq9URzax49V64capysHHK9WJu556vViY2F+eq/wBtYmdgLnnqUVg3NysV6sTsdOeFerEST357ZXq8OUqwrHuuDzdarjzVOV7nq9XAtY256vVjZr/Rz22vVjLWNuerVYmIvcc9Tqa9z1P1iYkNz1erhzVerC/2uer1cLDm6tNY3+yebp2uB+wOer1cOer1YJPtc9Tia4c3TlcS3gONqrVYHJIueOVusZa4tz1eriZNO/GtNX1VxJs1xymmnawF9dOe016sTML81FbrgWFjz0V6sG9eVr1cGYE8dArVYJG5WKdTWJjc3PNmr1ib6eVr1e5SlFYn789Xqxt25uqmuDN7OaqwNY3Y2vz1erDvbnq9WJrjtzdOaqxNduerYVXAncCeeq9YLDm63NcT356nBXIcZVW6gn976uP1uvM9wOMJrQNYN68frdYCb6cqadTWJ2G3nq3NY+aq1YCRu789Xq4Ej28omvVichhpy9erGzW0HPV6ohYA2PGKU1iY6Wtz1VmsbMpXnqtURzc89Xq4Egd+er1cWcfu89TqK68z4c9T1RmcAniimdNYmkU+PPU7WFjYX42qvVhMgItxqrisbyKBfnq8awO5J0PPVasXPV6sO9uer1YyT4nm6frHJYW15YV6uPHq1WFyL256rATXAkAXPPUpqLI2v1c9Xqxc9Xqjv9rjO2t1x5Wt1if7P381VhWMkan6ueq1YbgDXnqqKxMd9hz1WqC6MGFtdeer1YRdTY9+er1ZS21bHnq9WH3t3PV6u2PgPHvbnq9WB2uTbw56vVxUkD6OepXXdxbQ89Xq5HavY89Xqxl/Zz1erGWItb289Xq7DhRf2k89XqwMfevz1ermtgfj2HPVUmKxG3bnq1qFYixW5Pj256r1x84sNP4c9VNQrgzC3vf289V6xs7Eac9Xqxsmt/Hnq9XIswX3VBI789XqxSCcxWLbR7ANfv56k52UwVtQ9LCRAAzjsSe1/H4n2cTrVpoluVaRQV5tlWloQs4Mk5Fj5h7BtQTwkXjUB5ksrVQLY8KicC5G1j77N7bfdYDjVBg7KlJLh2G0vz1KFeV1AVpDew8Lj2Hm61QP54evLiXzB5kvuxJ2ub6sPj7OUNJKBylylmvFKgGaMvGG3bibgkaDS5JAXQC3tPLU0qs2Iz1E9LUR1wS8TeWqJ9om1ttx9V/Hl00ynZQfYflDE63EFq65PNamPmLGpBRb+Lj2exe99dOO140sTBX0dUcQxSVI3gBKoTuUFu5Nuw9g5s1VNCzl7MwhogtE5aSqUIpAB91fC3gP48qDVwMaE9GraWjpMEhKxhXDTOBqzkH62Vb3t7deUTToofqetiGMYbESIY5Z2Nz3ljSIoXPsVmOg+HGjTtCPBC8FOlPSnZLPUTME7fo422Ko+Dnf9IB9nKUnJ00NGXoIaky0czBFVA21j3GupHsup5uK3UjGaSOtwlKeECwCncD2Vraj7rc9FeBisUEkNJRSpCvmKU97UX3HaVt8Aga/s5rZXq6gZIcJomikvICbse4BYffxMjbWq7psWqI62po6lFH6GJmFibiS9iD7QeKga3TNFiFJTIrTi0dP5jAEd2J/iCOJFba1T3i8caYRFUTOZGVDI6L4l21NvaLA8U1ug6xeaipp6ddoeIt5W697sTuuPb315unE0HGc8Pw6OlEUCCWmYiMPe94zuI+go1r+znqsKD7AsIvgBxWQlZq39BCbfbZWYsCfAsilb+JI4wuqKpkwBJocwGLEwXjlHmDdrqwVmv8ARbT6TzaeFe4Umep8NLVVFPi9Csbiin8mfeb+7sGuliA6t9/FBryaKTjGAw0lZUU6ARhgylT7wUWaxBGpB5obaoukzi0YmwVJlK+bBOQfZYxixPwJ5ak520XvEKKCsraetqgXtdkW5JLkgMDb922vHNRprSaE7KOBzYtjH9X0DyfJOkZSIWTzrXESnttijUlib2731HPKVNOIEUdTLGW4cKhp6AxLNOYjI8YF44gFuDM40Zjp7t/H6uJl0sAowODZGFTCc0ZndnimIWOMaGRQLWOnuqe2lvh7ea0itk0MNHl6WZqdyipMFSMKwsI+zPt9ljoCdeWpuhjp8FFBK0kUnmSzAtIQdLnsqnwHt5uK9SswbDGho1qJiDOsbkaWG7QMba32qDyukUn1VnRoTUmUC6syrcjWwG77yOMqGmrgzUuGnNRPPJAm6wBCnsCPbp2tylXpzhpSRJLe4DhQGJ1IAZtD+XPV6py0lC4p6uRT5aSksxHit9bfTz1erHiBr6ysp4kUMahjJ4iwH2iPZdbffz1errFWeOWsaAbt8bpGF8LqFN/9a38Oer1Yan5qiFOlQ1y6rCinwK2Zgf8AiQ56vV1V0CyYXLh282LK6ug+x4gj+HPV6plFimJUVc8oFvcZnW11KSDcQR7B9/x46jA1unzE5qL56lkpCUjdFVkOtiybltftY88vbXqSlVFLS4r5DnYDENrAW+wwAtb6eUBiqChKwOU4l8vLUSECkeXYV+0QIfNVh9JH5cUpVNMqqTT/AC+LzVHzALwVIMsii91MLbwSvtGt/bze2qRSK6g0ksMdVUFHECSyFnttVrKk0ZDX7tuuOVp1G2lpgOJUqZdbM1S0rNFA6OyvtkYb45Y2uBqyafT2Op44mnFU1Q52goVoVy4sRpqxmlkaMAruaUoZYyTby3U77eBuCLdnNVJ1DGnnCqaCTCcR8i0dRNTiZFlLMjKiiQPFL9pRa52n47TblKrNRc4YHCxwvN1SXlqV+XpZ5VKgSx/5ajd9v+6KGaK/7wWMnUcc014UIuTq6rkjxDL+OtHFWIdsJdrLUU81midJNLrICND7yv8ADjJq1LTLJ+Uwxo65RIkd0kSUH3kGjRyNa97AG/t1Pe3LpqisaecT/leMfy6pqo1l99FilYByPdPlhnU2JUe7u8dOarYp+yVg70ec5avAkIUM0ZCCwHmKDZ11sBIhB/jxjSUmtOHDGhNx/DKeuwyuzKqMarB7TwNCSGET6VcCn2r9pQdLXPhy33elNT764U9OOoGCLDVVariEUsMiyKB70sY3oQuu68ep9vt42nx4U4RopbLhNLj2ETUYjakxBYxItRaw8+O5iqPaB4MPvHHdMUwFTSIy9m7HqvBzQ4zS/L4nSS7KhJF3ByvZl7XVxZlYez6uV1U4U0qIKh5qdqdA/mIrARvcbojeRkPjcatGR8Ry01WKesKlpZsMNBOfMjXeVYm/uH7cb/Edxy9VpmjhOGYecNEy2is1NIptqNUBPsPbnq2RNYMZqq2uyxJicFORMis5Q6AkfaT4H2cUJNPt+E1Rx1TFPWZjqKtypjmd/etYxyBjdWHhwxbVqrJ3KXSUUBcwkUmOXUg8MKHgMisLvZ9Po56r15uwXnq9XTe79nnq9XB+9iOer1YyGH2u3PV6utCNTz1eriqljYc9XqzE+8Np19nPV6u94Iseer1eVkcAnnq9XlNyfZz1eri9gu49uer1YQ1zft9PPV6vMwUE89XqwCQltxHPUrrG7Brlu/PUkrEXU9xxzSa1Fe+jjdbro8snbXq//9Ta5k7HhZU5iuubp2vc9XqxMRt+jmqb1Vw5unK9z1er3PV6sUn2ueqorCzEG3N7atXHePZzVViuHPVasXmD2c9VorpmvoOeqtYubp+ui1hfnq9WDnq9Xuer1cNyjtz1erFpfnq9XDeOer1Yz3PPV6uuer1ef7XK0orFuHNxVNVcH781V64c9Xq6P2TzQrdcGZSPbzdarG5Ba45unU1F56r1jdv3eer1Y+er1YWLHvz1erjz1OorDv8AdtzW2raqxMNzW5unKxsbm/PV6sD/AGuer1YydvG63Uctt15bbVhWBmv35ergRXt3GorVYOWmn6ws1zbla9WF+3NivVjYMO3L16o57njderE/flhTi64P4/Xy1bRUfnqerG/hyor1YuaNerrdZrcrVhUfj1O1k4zVa4FrG3PV6sLMAbnnq1XW9fbz1erFuN789TumuD/Z56vKrgTa3PVdNcWNzfnqcrG/bnqonZWNjc35rZV6656vVhP2xy1P1wY2Fj4c1VRWPevN1asLG5vz1XTXW4DQ89WjUe43d+VVsp2sbmwty9brFz1erH+6OUVsrVYi+w8vVgax7hysU5qrG3hz1bFceaq1Q9B34zSiumKk3PFFarAbX4mrQr3N1asL/a56vVxLEC/NVaaxF79+air6q4lrm3PVbbWNmP2uardYi/s56vVjZxfXnq9UZnB783SiuDuN3bnqomsRJPfnqvWNm8Bz1eqO7WOg5urg1x3/AA56t6qwk2F+bq9cJPDnq9WFio789Xqj7l56vV27i3KUorCSh789XqjsVB0HPV6sfPV6sbMF0HKmvVid/v5oCK9Ue3Naa3WJ2W/t5bTTgFYmu3fldNbFR+O1usT2B7crFXTtrEx289FVqOWANjy1K6xSsCvPV6o5a+p56txWMyLzdW01h3jjWmr1wdxbntNerCbDU8drdeDrxlVarFx2naxk24nrdYZX0046BVTWC45evTWNm1056nE7aws23nq3qqPIdPp5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jjlO1g3njdbrGzbebNarE7A9ubFXFcma+p5SrVwBB156vViYgm456vV0DY89WqxsxB056vVxf7XPVdO2uPPUprE57a89XqwuSO3PVROysZYkWPNVesZYgX5urERXDe3NVWsBJv35an6xuxXx56vVwZrC45qqiuBcEW5urVh3qGseUVsq0VjYgm45eq1iYr2PN08KwnsOeq1cN3vbeer1c31XjGqrqrCNOe1V5NcH+zzUmrp2Vi56a8rZWJ+/KVesTfZPN1YVH5unaxN3PPV6uB781VRWJ+/N1asTn3eX1V6uFuV1UprhJ4cbrVYX+zz1erDz1er3PV6sMhBPN08KwlwPjz1WqOz69uer1cDJp256vVhMg8NeeJrcVwL69uWFVqO8gHbmqeFcGYkXPN1ao5Jvc89XqxsTcDmqsKxX9zTmjV01iYgDXjaqvWJm976Oe1V6o8hN9OXr1dc9Xqwy+HN04msDNt56r1huL256vVxLrz1eqNuX28b00/prFIw3ctFW0ise/wCHPRV6iFye3L0/WKRhbvz1eqN736kc9Xq68zTTnq9XHe3PV6sbNcfTz1bFYj356vGsJ+0eerYr3NVasL/a56vVhkPa3PV6ozMwPs56vVGkYAW4np5NYSSdRrz1P1hZv3uer1Yizduer1YXf3hfnqonZWIsR7x56r1ikkN7D489Xqxbi179+erZrExub89WqxN9oc9XqjuxXXnq9XrX1vz1bFY2kB15qr1xL62HPV6uW6xseer1esD4c9Xq42093x56vV2NO456vVi8wDvrz1eroybuxtz1erE73Pfnq9XW8EEc9XqwI7XIJsPjz1K65lizbifuPPV6sMjvaxFuer1cQpBuTz1ernz1erpm118eer1Y9y37c9Xq4tJrr256vVwklQJvuLj8uepJTDVyN8vJLKNFB0Hs8C3s+jjSzAopvXk27ZVNAHjVXPiWJ+WGtsuGv2Gnj7eBxR1Gsabhan1lU0G9RC8eNGWoQssdrBhe7eFx4DlZouJKdtN+LR1U9UtbWsqxG7gCwLOTfw7AezlqqTNJjFdrt5SSCBU1kIN/tfxtxmt0wUsDTJtpA8lPHcF3Hfabm/Nim1VjZcNl34jLJ5skO+QjULubsoHsUDTmlbKboN6SnxLM80klDCVpUk9+WUDbb97yx9onl69WOprsu0Exl2y1FRBdEF9q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9WBtW56nE1gk+1zZqyq4c1T1YX+1z1erhcXtz1arizKV56vV1uIHNU5WLct7Dm5rdd715qtVwZge3PVcGK4XHt56r66wnueap6sbmwtz1erEST356vV0bW156vVx5an6wHueer1dc9XqjO5789XqxGQnnqvpqNvPN07XDzCDbnq9XFjb3uer1cL3a/NVYV2TYX5Wnqh8vSesh4yqlFYyVDcardYmI789XqxMbm/FFargSB340qvVGHK04qsUnfnq8msZ789VhXFu3PV41idPA8U1usVxxPpNKqj2vpylarA4seOprdYm+zx2nBWI8ZVVqwnueO1quD/Z56vV7ierVFkPfm6cTWA8dVVqwOfe43W6489Xqjuy7uWNerGz6XHGzTia4eZ8OapysTPrrz1erEXJFuer1ceer1RiTe55un6xS+HPVRNYT2PPVesHPV6vc9SysD9m56vViLP4Dnq9Udg9+VmvVxIbx5omK9XA7h255NeqNxyn66kJt256vVg56vV0ZBa443prVYL2Fzxyt1xl8OJa2mo7MAebpyo7sd2nHE16sJIHfjderCxBNxz1erEx9h56vVHf7XFFarCWHt4nrdYSwv356vVjdx7eep9Ncd2tr89Wl1iYjd93PVtNdK3geep2sfPV6uibC/PV6sbiwsPHnq9WAJub289Xq7KEC55qnK4MpUkDvz1erixA0789Xqw89Xq7HwF+er1cSu0gt7eeqydtdnvcc9VajG1v289XqwO37x8Oer1cbqPr56ldRywB56kldK+hA56vVFkuWPx56ldZCAdDz1erjtWxvz1U1CuBFjY89V68wsbc9Xq6Dquh8eer1Ywbv3056vV1++fC/PV6JqOzRqC76kdrDnqoUA1FZWMbSyG4W19LD22H8OFjlRlna9CMKA7NyyQOtPILybwwUX94nXafq4UGoJVjRcMdEmL49NFIxZtyqLk2Qdyo9gHG6pSlr6eVIRFtCwspPhuZuw2+Pbj9NpoKsw0SwU5pwwEqWZRfsSNCx8bezjJNaJig9w2qWOpixOqIeCG6xGZNZH7eYBfsO/HAMKpSpo4qVMRE8qmSurVbyy6myxH7Tbb6bj2PK16lGYTX1SVmInawIWIDXYFG248BYdz4X56vU6VeIR01I60ybhYINpsSAOwb49uV2V6gwpcPOM4sJ6wraIFiiupSO2uxbC7E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vPaa9XXhYHntVerwce3ntVergdft6cbr1eJIFh4c9XqyX93Zz1erin2eer1c1up2Xv356vVkN7accVXqxC9rX5UGK9XJiDYjluut10SD38Rx6t1xDhRbnq9XrEr9PPV6uLIx14mOFVr/1NqZl3cLaniuXPV6uD9uer1Yuer1e56vVxf7PPV6sPPV6vc9XqxSdhz1WFZuKKpUPjFKK6sfbz1eruwHbnq9Xuer1R+er1crL7eer1ceer1cN456vVib7f389Xqj89Xq7b3TzU07prpzc25qr1jIuLc9Xqxt2HPV6sW9eer1Ymbceepz7axM23m6crETc356vVjftz1erCSALnnq9WEm5vz1eriWsO3PUrrBz1JKxP356ldcOer1YD3PPV6sZcDnqvprCxub83TlRuerdYme4sOer1YXOluer1YN689Xq5bh7eM1Sozmw05un6w99Tz1eqPz1erom3PV6obm55s16uHPCnk17mqeqPz1erASb3PPVquuer1Yuap2ujobHnq1XFit9eerdYmb97nq9XC7+znqc1Vw3Ne/NU/XAkDvzdV+6umYrqOaq1Y3ctzdWFceaqtRT3PLU/XXPV6sB7nnq9XByANRz1XTUcmwvzdO1jDbmHPV6snPV6orNt56vVwvawPhzVWFcNw9nNU5FeZwV5qrVw56vVhlawsObrcVx5qtVidrC3GKuKwc3TtY5LX5qqJrGxA789WxWNmUj283Vqxta2vFFarDz1K6xv8Aa4kqtYJAN3fjia3WGQD28pV01hPLqq9YW+0b8drVRZdbDierVG56vVxfx+vlqfqPz1erH+k56vVx13a81VhXB/tcrT1YP3TzZptNcOapyuD9uer1YSQBrz1erjuHt56vVHLC/fm6frE5F+/PV6sTW2689Xq4MQe3PV6sJIv356llYXK668ppr1YWNxqeXr1Rz3PPV6uuer1Y5PDnq9WPnq9UR3XdzQ2U6K4F9NOWq1YS52356vVj3tz1erg7X0IHKDZWxWI80qr1glNjrxyqGovE1OViY3N+KK1WN228aVW6hliCeUr1cOer1YX+1z1erDJ4c9TyK4lri3PV5FYpD730256tprGGGo56na4sSWF+er1cS1ludeer1cSyE9uer1dCwIIPPV6se69789XqyKBY+FuaqwriQO58eeq1YiRprz1erCxN/jz1ergS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iawkgd+eq9R3+zz1erExubnnq2awa+3mq3FcLjnpqlYr3156risTstuVFWqJzc16uJfadObr1YmYXvz1aqO7+J56lCVTWLzPhz1b0isO9eeq9cGJDacrNerjcnU8pVhXVxa/PVesDXPLCvAVwJ288TXqxkm+vK1quJawvz1KQZrFc+3nqvWAlj35sV6vbmXmjXq6J3d+ar1cOXNP1h929rac1Xqxljc/Dnq9XFivY89XqxEgDXnq9WNnBFuer1YN49vK6RT9YWku3089pFV0isDH3r+zl6vWNj7t/bz1erEd1jzU1fTWPladrC/2uer1Y3+zz1erDz1eqPIRfvzdOJrE/bm6vWLnq9WA9zz1erG5tbnq9WIm+p56ldctbcSVWozOQ2vPV6u+er1Y5fDnqumsamxuebp2uN7689Xqxyfa56qio8nhy421cVwbs3KVqo55Y1quB781Twr3N1aoshtf6earYNY93NRV9VcGPvfRzVOVhLEjm6oDNcd7c1V64s373PV6sJZvo56vVGk783Tiax89V6xOTbtyia3UdnYezl61WJnseer1Y954nq1Yi5vxRV1JisZJPKJqwTXBm288TTtYeXr1YD3PPV6uuer1YOJqdrBJ4cVV6ajFtx42qt1jPcccrddN4cZVWqibzx6t1j1v8Oer1e9/2cZ1Vqo7NtNuUpwViuSdeerxrAzMG56rVx56vV0b2056rp21ia+7jiaUVibdu045WqxD7RPt4nq4ru9yQTbmqvXE2Cjw56vVDu26x8eer1YnZUGgB56vVEd9O/hz1WTtqO0jbgOWNKa5mTTTvyterCzanXl01qm92Bvb28pW64ByLDw56vV0xubjnq9XRJJ156vVjEQA3X1PN0/WQbvEaDmqRLrxYFrduepqsZYk2056vVw3f635c3RlXYKDUc9Xqx77vpz1erMHKggjvzVJnK5M9xtvpz1Jqxk7yWX+/nq9XTs2gHx56vV4f4l8eer1cpCroEUWP8eer1RmV2XZ4Lz1WAmmjGEd6UQofedgpPsU9/v5U7KTuJqCaJXjiaMWZDv2j2MpW3GSmi1LEzQQY1l+SXC5VeytEXkkv23MxNr8LVpqN8wtttF7roZBPHUoA7C6rrZUDauy37seM7KhpSCkkUHWY0goapsSswknNig+0qge6p9hPc8qNtI1JwigJrJIZKo11U5e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gr8NOGIwqYbVHdiKQJe5I+HHKOK4F/8AF4ePPV6sgf3QTz1erDcgX9nKzXq6uRHr48tXq9Y7e3PV6vNot2HPV6ukC9/u56vV5SVIB1PPV6uVypA7356vV2d3c+HPV6uAcMTyoM16uwQpsOeJivVxd0YWty1eriq29089TuFdtc99Pjz1ewrjGUOvblSYpqsln3378rjXq8dLAaa35YV6umYDt9/PRXq6sEF+Wr1dAWG5vq56vVz3AC/fnq1MV//Q2muFw21OQr3K1quJ5c0/XCTtytUTWLnqvXuer1e56vVik+1z1VFcOeq1e56vVHa9zz1eqPz1erjJ483Tqa656rVFa4XTnq9XC/xPNVvCsZ7Hm61WDnq9Xuer1e3D2/nzUU5qrp/tc1TlYyQRbnqrNY291ueq1ceer1Y2Uk89Xq8V8WPPV6sZGmvjz1eqOwO6x5unhXAruHPVomKwc9V64t9F+er1Yz27W56vVw43XqjOraccr1Y2BGp56nddYWXxHPU9WJrg9uN1usbjx56vVi+r+HPVuaiOviBx2rgzWJ1b2c9W5qOQQbHnqtXrP7eM1SojBidOPVesUgNuapysBB8Dz1erCb3156vVHa99eVNerE/bla9Uez+3nqWViN+eplFcff8Ahz1PVwcG9+eqoM1xueeq01iKkduarc17afZz1bmuiCNOerdYiDbtz1erHtF9Rz1X1GsRGg56rJVFdFCBrz1b11xYbbgcpqpzUKwctVq4296/PV6sbKxbnq9XFviObr1YG7dubp+sR7dr89XqwEC/bnq9WJ1JOnPU4DWBhcW5unK4bdvGlVquBGne/LUprCwJFhxPW6wdtDz1MhXTWFtTf289TgM1jK3N+WFWqNIGB05qrgxWErp356rTWBlO61u/PV6ajktex56nJrokkac1VwZrgxJ0PNVeuIDEajnq9WF/tc9Xq61vz1erojnqsDFcHJtpz1VrDY83T01jcHTnqtWLnq9WNh3+rm62DFR3+zzdPVhPfmqqK7HflVbK3Ubl63WOTw56vVj56vVwl8eUpRUfnq9XTH2nnq9XHeOer1RiRc89XqxuVPbm6cTWJz7vPVeo7MBoeer1RXtfnq9WPnq9WPb73w56rq210/2uerydtY+J61XVh7OepXWMhbniitVjf7PPVROysPPVesL/AGuNJr1RByyqerg51txm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p1DCngqNtAdUdIYJa752OWaWzkmKViQt+4BOpX2C/EBtyaWB0ULmX8s11NCsdO72QWVAbgfRuuR9XFKGlCk6lA0rUwvH5fceNLHvdBfinTSYqAp6jyzUToPmwGtrYjjwSarrFOkWW6EAefGLeFtP4ceCabKppD5iy2kdRvRdqWv3vxwpq6TNJjyYae7FdzHtyumn67jhMjhmGg47W6cWqGK+Wngb81VCcaiTb1BkbU+znjT6aZfLNr+y3LRRklMVl99vsacrTtYy8o789Xq6LX0Nhz1erkBc2PNgVquSsbH4c1W65CxbTl9NariQ6jmor1eVnPe3K1uuirg+7y0Vqsihilz348imFbawMpBvbjJp+uQ3kWHPRXq4EupuPHlarqFeEjg/RzwwrUmuQkJ988c1Vesyvddx44MabJisV9L88cK8DNe3MB278pqpyu/LB97ty9Jlba7VSDoLnnqpWfa/s/Pnqc1VjaGUC4HPV7VWJUdX97lAMac1V//R3XzwvNCivcrW6xEFjcc9Xq4c9Xq9z1er3PV6uGwc9Xq4MADpz1ergQD356vVx2Dnq9XBl289Xq4X5uraa756q7K9zVeqJy1P1ysPZytMVhZbajlqfrhz1eriy7uer1cfL+PPV6se1P1HPV6vc9Xq4bBz1erhYbrDmqsK62nnpremuDKb3HPVrZWO7eznoreqvFATfladrCQR25aKa1Vx2LytO1xKWF+er1Y+er1e56vViZQR356vVw8v/W/Pmpr1YWXxHLU/XTJt56q6qxka3Phz22rVjsnt56vViZCeerU1jKkd+er01i2Dnq3XArt056vVj2Lz1erEyC1+/PV6o+xuN1uuuOVqsLR356ntddHae/Gor2qsdjz0U5XmAvYc1Wq47QTz1ervaAPp56vV0ATodeer1cQoHfXm9tbrkAB25qtV0VBN+er1d7QfDnq9WNhdvp5uK3XLYOarVeZLm456vVjZNvPVfVXDv25unK57D/i5qmKx2BN+bp+uti89Xq6ZLm456vVjsPbz1erkQb25qmK62n2c9VprEUBOo5una5eWPZz1errb7u3nq9XHy256q6qxkWNueq1e2fD8uer1e56vVwK3OvG9VbrwRQOOVquOxeJ6tXIxjvxRTequgoPhxs4VeuXlfDjdbrrYOKKrXALfsvE9WrkEAN+er1dMl2vyxrVe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/E+A5umtNKzLdbUzSJvZju8O/hze2tERQhrNAoAlcA/VfjgEVSsdXi+HU42ySoG9hYX5eqzSXq82YOrHbICV1NjxtSYrYM01U+YoqmQPSnapPidT9HG6tS6pXSSPcrXv4c9XqcUttsPHnq9WUgHvpxzTXq6M8aoW9nHK1SDzJizLGYEsfgSL8qTFWAmg8jUTSFj4dgONU+FCpggAF+/N0/UcL3ftz1erBOu8bQNeap9GFQ2Q7uKKXaq6EY8eVina7VLanvz0V6u/LU+F+eivVx2W963LU1qrwS/089TldiILccrFbroIfHlq1Xii3va/PV6uNgQGjP189Xq8sVtDrysVuuRjW2nfnor1cdjctWq4mMkd9eer1diOx7c9TSlVnMW7vz1N6qzrFpZubpsmazeWvNV6K589Vq7A7W789XqyEAj3u/PVU11aw93m6rXInb28eapysbNu56vV/9Pdl2LwtoU1y56vV7nq9WNvsDnq9XHiiq10eNKrddcpW6xEFjcc9Xq4lSO/PV6uuer1dEXFuer1YOer1e56vV7nq9XRFxbnq9XDy15utzWMjwPNVqsflrzdbmuPlnnq3qrHs+HNTTlYyns5at1wKnxHPV6sZQX56vV15fx56vVjZRex56vV1Y+3nq9XBkuNOa2VquOxvZzU16o5Qj48tW67s/s5SRW9VYm3E3HLRVtVcLt7Oeivaq4WX481FW1VxZdvNVeuPPV6sTKxbnq9XHnq9WNwWNxz1erFz1ergykm/PV6sbKfHnq9XDm6frBbnqpqri24duerequEgOnG63NRdjccrdceer1YymunPVfUaxkEacbqtdc9XqwEEd+WNerrla9XZBB15s16uVyew5WKvqriQR35Y1SuQ1NxysU7qro3+yeerQNdLYd+eit6q6KG+nNVeuQQePPV6utoI05s1RNd7BbXmqvXAISL89Xq8wsbc9Xq6sfZz1eror7Rz1erifeGnPVoGuKhR356tTXiLtcc9XprsJ7eeq1cSnPV6Yrvy/jz1eroRk89Xq78v489Xq6KEnlNNerxivqeXr1eVbdxz1ersp7Oer1cAnw5TTXq78u/fmpirgxXEqLduN1tVcih8deOfbVK95YI143Xq4W5fTXq4lV9nNGrTXfK1WumW/LbK9XEIPHla9Xtb/Dm6UVx8s+3myarNdiP48rVCZriU9nN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H2c9TlesfZz1erE4sb89Xq5qLc9WhhXYWw56t1jKEm556vV3tO6/PV6uins56vV2qkG/PV6uvL9vPV6veW1/dHPTFer2wjuea216u9reB5urTXrG1ybc9Xpr20jseer014Br681Fb1VxYHm60TNd7W9vPV6a7s3w5qK3qrgQb3PKaqoTXHjlerII2PG9VariyhTY68191erGF10HHa3WUJYXHEtVr2wXueKKVV0b204nptdY9pLacUmtJrlsY9hzVO17Yeer1YzGxN+U1V6vbGHGq3XRAPfjn216u7W8eeJr1dcbr1dEJfXjumtV2Anhy9ergQNvG9NVTsrtUUj283pq1d2XldNa1CuLDsOWAit11sbl69XtsnGtNbrhbm9Neru3x5WK9XHnoNUVsrojcOb015OyuOw8dq1cdh4nrddstl056vVwAJ7c9Xq5bG56vV2E9vPV6uLR+3m9lWAmuPlfRz1PVk8v481SeuO089VorgYy5ueeJq321y8n6Oer2quOy2pHN05XvL+HPVTVXrEc2RXprrafbyta1V5tBfnq1qru1+44opuuPlrxPV5rmsYbnqrXMRKO/PV6sbKL8pqrdcNg5Uma9XWz489qr1e2fHntVer1l9vNTXqxELfltVerravKkzXq62Lytbrls+H5c9Xq7C6nnq9XTKS4+rjia1WPYb80qvV15ZvflK3XYjNr8tFarKINBt+PLaa9XhFdve57TXq4+WO/N6a9XmjufjzZTXq6MenujldNerooPDjdbrrYd2g7c9E1quZjJPwPHNNeriIVAtz2mvVyVAOe016vGMWsOb016uPlm3N6a9XIIAeeAivV7at+WrVeKAiw56ta65hLe6OequuveV8Oer2usXln289V9QrOEJ56ta69sPa3PV7XXit9WUc9TUmuLQ7rW56nUqrgYDz1O6q95O5bc9TZxpir8PJBa3E5EUgWmmB6a53EduepAqsccNz3v7Obp2uTRXFra89Xqx+Sp0I15qmZiuhTBSSSTfm6cmpG0LqBfnqtXEIb25qmlVylJY3Ya89VNdcoxfw5qmyZrrb72089VK9sbdt56vVlVCF56vVyClu3PVaKytGT2HFFUrFsbiet1ksCNe/FFarvan2fHnq9XgLn6uer1d7blRz1erNHErSC5tbjaq3T1HAqqCNdeN7a9WRKaz7uWivVnCe9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", + "text/plain": [ + "" + ] + }, + "metadata": { + "image/jpeg": { + "height": 600, + "width": 960 + } + }, + "output_type": "display_data" + } + ], "source": [ "display(Image(filename=\"./19319_en_1.jpg\", retina=True))" ] @@ -293,7 +612,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "caecab58-2d26-4604-a3f1-ab4a11400038", "metadata": {}, "outputs": [], @@ -303,7 +622,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "995eb899-0397-4f60-b587-18fcf8a4cb0e", "metadata": {}, "outputs": [], @@ -313,7 +632,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "bc73cc66-911a-44bf-9710-920328b40609", "metadata": {}, "outputs": [], @@ -323,7 +642,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "8a5dafba-c901-412c-bf53-e418dc558787", "metadata": {}, "outputs": [], @@ -333,7 +652,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "e183e629-7f79-45e3-810b-294851ca9abf", "metadata": {}, "outputs": [], @@ -343,10 +662,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "eb8e4a80-2eec-4db0-b919-7c3d4486d8e0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'$6,666,449.00'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "d3_max_project" ] @@ -362,10 +692,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "8d7e68ad-79dd-48b6-8e17-90496d470b69", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "

District 3

\n", + " The median score for projects in District 3 is 71.0
\n", + " The total number of projects is 7
\n", + " The most expensive project costs $6,666,449.00\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "display(\n", " Markdown(\n", @@ -389,10 +736,101 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "38d84ed3-9626-4f91-9aea-e2449aef4cf8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "

Metric Scores

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "display(\n", " Markdown(\n", @@ -412,27 +850,693 @@ "### This can be a function too\n", "* What if I wanted to generate these narratives for every district?\n", "* I can simply turn this into a function.\n", - "* Remember to look at the code in `_starterkit_utils.py`" - ] - }, - { - "cell_type": "markdown", - "id": "674c3407-fd80-47fa-9402-d2e18419583b", - "metadata": {}, - "source": [ + "* Remember to look at the code in `_starterkit_utils.py`\n", "* I only want to print out a couple of districts or else this notebook will become too large" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "6d6f524a-d49b-4729-801f-ccc4bd800149", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "The median score for projects in District 3 is 80.0
\n", + " The total number of projects is 1
\n", + " The most expensive project costs $7,009,576.00\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "

Metrics aggregated by Categories

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CategoryMedian ScoreMedian Project CostTotal Projects
Other80$7,009,5761
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "

Overview of Projects

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Project NameOverall ScoreScope Of Work
Tranquil Truck Trot80A 5 mile truck only lane with scenic rest stops, featuring ev charging stations, healthy food options, and driver wellness programs to promote safe and sustainable trucking practices.
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "

Metric Scores by Project

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "The median score for projects in District 3 is 71.0
\n", + " The total number of projects is 6
\n", + " The most expensive project costs $9,448,986.00\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "

Metrics aggregated by Categories

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CategoryMedian ScoreMedian Project CostTotal Projects
ATP68$1,138,0461
General Lanes87$4,066,0891
General Lanes and ATP72$9,155,6541
Other69$9,448,9861
Transit74$3,541,0092
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "

Overview of Projects

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Project NameOverall ScoreScope Of Work
Coastal Commuter Carousel78A 30 mile passenger rail line connecting coastal towns, featuring modern train sets, enhanced station amenities, and scenic viewing cars.
Waterfront Waffle Walk and Bike68A scenic 2 mile multi use path along a waterfront, featuring public art installations, educational signage, and stunning views.
Meadowbrook Magic Makeover72Transform meadowbrook road into a serene meadowland drive, with repaved and restriped general lanes, bike lanes, and natural stone retaining walls adorned with elf inspired carvings.
Riverbend Pixie Ramp87Streamline traffic flow and reduce merge conflicts with the riverbend pixie ramp auxiliary lanes, incorporating rustic wooden railings and scenic river views.
Laurel Lane Enchanted Express69Maximize capacity and minimize delays on laurel lane through dynamic lane management, utilizing real time data and adaptive traffic signals guided by pixie precision.
Brookside Bus Blossom Lane70Prioritize public transportation and enhance air quality by dedicating lanes to buses and hovs on brookside boulevard, integrating smart traffic signals and real time transit information inspired by the ancient elves.
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "

Metric Scores by Project

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "The median score for projects in District 3 is 70.0
\n", + " The total number of projects is 3
\n", + " The most expensive project costs $9,135,733.00\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "

Metrics aggregated by Categories

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CategoryMedian ScoreMedian Project CostTotal Projects
ATP79$8,677,0122
Other65$2,785,1891
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "

Overview of Projects

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Project NameOverall ScoreScope Of Work
Wildflower Wonders Highway Expansion65A 5 mile highway expansion project incorporating wildlife friendly features, such as wildlife bridges, habitat restoration, and reduced speed zones.
Mountain View Mansion Interchange70An improved interchange with stunning views, featuring public art installations, wayfinding signage, and enhanced pedestrian and cyclist connectivity.
Larkspur Loop On-Ramp to Fairytop88Charm travelers with the larkspur loop on ramp to fairytop, featuring a whimsical stone façade, meandering pedestrian path, and picturesque views of the surrounding meadow.
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "

Metric Scores by Project

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "for district in range(10,13):\n", " _starterkit_utils.create_district_summary(df, district)" ] + }, + { + "cell_type": "markdown", + "id": "c5082a4a-2b6c-4e72-8e2d-267305ad06a4", + "metadata": {}, + "source": [ + "## Your turn to combine all your functions into one function\n", + "* Take some inspiration from ` _starterkit_utils.create_district_summary(df, district).`\n", + "* Incorporate concepts from `markdown` and `display`. " + ] } ], "metadata": { diff --git a/starter_kit/2024_basics_05.ipynb b/starter_kit/2024_basics_05.ipynb index 53efc7651..723ef68cc 100644 --- a/starter_kit/2024_basics_05.ipynb +++ b/starter_kit/2024_basics_05.ipynb @@ -3,11 +3,63 @@ { "cell_type": "markdown", "id": "36c5c03c-164a-4530-9fc6-43f5d1abbf7e", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "# Portfolio\n", - "* Please duplicate this new notebook, along with your Python script into a new folder in `data-analyses`." + "* You might have seen DDS's [portfolio](https://analysis.calitp.org/).\n", + "* We often present our work on our portfolio because it retains the interactivity of the `Altair` charts and `Geopandas` maps we make.\n", + "* Additionally, it is very streamlined to update our work when it needs to be updated. \n", + "* Spend some time exploring our portfolio above. \n", + "\n", + "**How does the portfolio work?**\n", + "* For the majority of the sites on the portfolio are using **one** notebook essentially as a template that is looped over several parameters. \n", + " * This [National Transit Dataset Monthly Ridership by Regional Transit Planning Authority (RTPA)](https://ntd-monthly-ridership--cal-itp-data-analyses.netlify.app/readme) takes [this notebook](https://github.com/cal-itp/data-analyses/blob/main/ntd/monthly_ridership_report.ipynb) and reruns it for every \n", + "RTPA in this [yml file](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/ntd_monthly_ridership.yml). \n", + "\n", + "**Let's make a portfolio**\n", + "* Please read the instructions very carefully.\n", + "* Delete any Markdown cells prefixed with delete once you have completed a step.\n", + "\n", + "**Resources**\n", + "* You may wish to read these resources before making the portfolio.\n", + "* [Preparing notebooks for the portfolio](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html)\n", + "* [Publishing to the portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html)" ] + }, + { + "cell_type": "markdown", + "id": "4dc7d9d1-5722-467f-8e2f-d1e2b8d7e566", + "metadata": {}, + "source": [ + "## (Delete) Step 1: Move this notebook\n", + "* Create a new folder in the `data-analyses` repo called `lastname_portfolio`.\n", + "* Right click -> copy to copy this notebook to the new folder.\n", + "* Rename this notebook using as `lastname_portfolio.ipynb`\n", + "* Use `git mv` to move the Python file that holds your functions to the new folder.\n", + "* Right click -> copy the `starterkit_district.yml` file to the new folder. \n", + "* Close this original `2024_basics_05.ipynb` and begin working on your new `lastname_portfolio.ipynb`" + ] + }, + { + "cell_type": "markdown", + "id": "8cb15ca0-580e-4a0d-9dbc-accb761d77d1", + "metadata": {}, + "source": [ + "## (Delete) Step 2: Netlify Setup \n", + "* Follow the instructions [here](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#netlify-setup).\n", + "* You only need to do this step **once** for the entirety of your career at DDS. \n", + "* Once you have your key setup, you can publish limitless portfolios." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f6cc688-c077-4b6d-9b11-bc6d99cff82f", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/starter_kit/_starterkit_utils.py b/starter_kit/_starterkit_utils.py index e49304fee..ecfdcee2e 100644 --- a/starter_kit/_starterkit_utils.py +++ b/starter_kit/_starterkit_utils.py @@ -28,8 +28,8 @@ def load_dataset()->pd.DataFrame: # Read dataframe in df = pd.read_parquet(f"{GCS_FILE_PATH}{FILE}") - # Titlecase the Scope of Work column again since it is all lowercase - df["Scope of Work"] = df["Scope of Work"].str.title() + # Capitalize the Scope of Work column again since it is all lowercase + df.scope_of_work = df.scope_of_work.str.capitalize() # Clean up the column names df = reverse_snakecase(df) @@ -124,7 +124,7 @@ def create_metric_chart(df: pd.DataFrame) -> alt.Chart: chart = ( alt.Chart(df, title="Metric by Categories") - .mark_bar(size=20) + .mark_circle(size=200) .encode( x=alt.X("Score", scale=alt.Scale(domain=[0, 10])), y=alt.Y("Project Name"), @@ -144,6 +144,9 @@ def create_metric_chart(df: pd.DataFrame) -> alt.Chart: return chart def create_district_summary(df: pd.DataFrame, caltrans_district: int): + """ + Create a summary of CSIS metrics for one Caltrans District. + """ filtered_df = df.loc[df["CalTrans District"] == caltrans_district].reset_index( drop=True ) @@ -162,8 +165,7 @@ def create_district_summary(df: pd.DataFrame, caltrans_district: int): # Create narrative display( Markdown( - f"""

District {caltrans_district}

- The median score for projects in District 3 is {median_score}
+ f"""The median score for projects in District 3 is {median_score}
The total number of projects is {total_projects}
The most expensive project costs {max_project} """ diff --git a/starter_kit/starterkit_district.yml b/starter_kit/starterkit_district.yml new file mode 100644 index 000000000..a373713e8 --- /dev/null +++ b/starter_kit/starterkit_district.yml @@ -0,0 +1,31 @@ +directory: ./ha_portfolio/ +notebook: ./ha_portfolio/ha_portfolio.ipynb +parts: +- caption: Introduction +- chapters: + - params: + district: 1 + - params: + district: 2 + - params: + district: 3 + - params: + district: 4 + - params: + district: 5 + - params: + district: 6 + - params: + district: 7 + - params: + district: 8 + - params: + district: 9 + - params: + district: 10 + - params: + district: 11 + - params: + district: 12 +readme: ./ha_portfolio/README.md +title: Starter Kit Portfolio From e4e95cd3b597f5a0818d36b20248f16c1ff37b0d Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Wed, 30 Oct 2024 19:50:20 +0000 Subject: [PATCH 10/12] more copyediting --- ha_portfolio/_starterkit_utils.py | 2 +- ha_portfolio/ha_portfolio.ipynb | 73 +- starter_kit/2024_basics_01.ipynb | 344 +++--- starter_kit/2024_basics_02.ipynb | 770 +++++++------ starter_kit/2024_basics_03.ipynb | 497 +++++---- starter_kit/2024_basics_04.ipynb | 1704 +++++++++++++++++++++-------- starter_kit/_starterkit_utils.py | 2 +- 7 files changed, 2169 insertions(+), 1223 deletions(-) diff --git a/ha_portfolio/_starterkit_utils.py b/ha_portfolio/_starterkit_utils.py index ecfdcee2e..11869fb63 100644 --- a/ha_portfolio/_starterkit_utils.py +++ b/ha_portfolio/_starterkit_utils.py @@ -165,7 +165,7 @@ def create_district_summary(df: pd.DataFrame, caltrans_district: int): # Create narrative display( Markdown( - f"""The median score for projects in District 3 is {median_score}
+ f"""The median score for projects in District {caltrans_district} is {median_score}
The total number of projects is {total_projects}
The most expensive project costs {max_project} """ diff --git a/ha_portfolio/ha_portfolio.ipynb b/ha_portfolio/ha_portfolio.ipynb index 1c478972e..9b0d353a8 100644 --- a/ha_portfolio/ha_portfolio.ipynb +++ b/ha_portfolio/ha_portfolio.ipynb @@ -12,20 +12,19 @@ "* We often present our work on our portfolio because it retains the interactivity of the `Altair` charts and `Geopandas` maps we make.\n", "* Additionally, it is very streamlined to update our work when it needs to be updated. \n", "* Spend some time exploring our portfolio above. \n", - "\n", "**How does the portfolio work?**\n", "* For the majority of the sites on the portfolio are using **one** notebook essentially as a template that is looped one or more variables. \n", " * This [National Transit Dataset Monthly Ridership by Regional Transit Planning Authority (RTPA)](https://ntd-monthly-ridership--cal-itp-data-analyses.netlify.app/readme) takes [this notebook](https://github.com/cal-itp/data-analyses/blob/main/ntd/monthly_ridership_report.ipynb) and reruns it for every \n", "RTPA in this [yml file](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/ntd_monthly_ridership.yml). \n", " * This process of looping over a parameter is called parameterizing a notebook!\n", + "**Resources**\n", + " * You may wish to read these resources before making the portfolio.\n", + " * [Preparing notebooks for the portfolio](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html)\n", + " * [Publishing to the portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html)\n", "\n", "**Let's make a portfolio**\n", - "* Please read the instructions very carefully.\n", - "\n", - "**Resources**\n", - "* You may wish to read these resources before making the portfolio.\n", - "* [Preparing notebooks for the portfolio](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html)\n", - "* [Publishing to the portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html)" + "* Feel free to delete all the instructions off once you're done. \n", + "* Spoiler alert! Your end result will look something like [this](https://ha-starterkit-district--cal-itp-data-analyses.netlify.app/readme)." ] }, { @@ -35,10 +34,10 @@ "source": [ "**Step 1: Move this notebook**\n", "* Create a new folder in the `data-analyses` repo called `lastname_portfolio`.\n", - "* Right click -> copy to copy this notebook to the new folder.\n", - "* Rename this notebook using as `lastname_portfolio.ipynb`\n", - "* Use `git mv` to move the Python file that holds your functions to the new folder.\n", - "* Right click -> copy the `starterkit_district.yml` file to the folder `portfolio/sites`. Rename `starterkit_district.yml` to `lastname_starterkit_district`\n", + "* Right click -> copy to move this notebook to the new folder.\n", + "* Right click -> rename this notebook as `lastname_portfolio.ipynb`\n", + "* Use `git mv` to move the Python file that holds your functions to the `lastname_portfolio`.\n", + "* Right click -> copy the `starterkit_district.yml` file to the folder `data-analyses/portfolio/sites`. Rename `starterkit_district.yml` to `lastname_starterkit_district`\n", "* Close this original `2024_basics_05.ipynb` and begin working on your new `lastname_portfolio.ipynb`" ] }, @@ -58,13 +57,13 @@ "id": "89858742-9a67-4f10-9f65-29770f955075", "metadata": {}, "source": [ - "**Step 3: Create a `README.md` **\n", - "* When you go to each site on our [portfolio](https://analysis.calitp.org/), you'll always go to page of introduction.\n", - "* Every portfolio must have a `README.md` file or else it won't build.\\\n", + "**Step 3: Create a `README.md`**\n", + "* When you go to each site on our [portfolio](https://analysis.calitp.org/), you'll always go to the introduction.\n", + "* Every portfolio must have a `README.md` file or else it won't build. \n", "* It also serves as our page to discuss our methodology, the datasets we used, and other details to give our viewers some context into what they are looking at. \n", "* We have a template for you to populate [here](https://github.com/cal-itp/data-analyses/blob/main/portfolio/template_README.md). \n", - " * You don't have to fill out every section and you can delete whatever is irrelevant to you.\n", - " * Make sure to rename `template_README.md` as `README.md`. You cannot deviate from another variation such as `README_intro.md` because the portfolio will not build.\n", + " * Make sure to rename `template_README.md` as `README.md` in your folder. \n", + " * You cannot deviate from `README.md` such as `README_intro.md` because the portfolio will not build.\n", "* **Further Reading**: [DDS Docs](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#file-setup)" ] }, @@ -75,9 +74,8 @@ "source": [ "**Step 4: Update `starterkit_district.yml`**\n", "* You can think of this yml file as a \"Table of Contents.\"\n", - "* We are taking this notebook you're currently reading and re-running it for every Caltrans District.\n", - "* Every Caltrans District is listed in the yml file and a page for each district will generate on your portfolio.\n", - "* In the `starterkit_district.yml` please rename each part designated in all caps such as REPLACE_WITH_YOUR_FOLDER_NAME. \n", + "* We are taking this notebook you're currently reading and re-running it for every element that is listed in the yml file. After re-running a new notebook is generated for that element and published.\n", + "* In the `starterkit_district.yml` please replace text in all all caps such as REPLACE_WITH_YOUR_FOLDER_NAME with the proper file/folder/notebook. \n", "* **Further Reading**: [DDS Docs on YML](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#yml)" ] }, @@ -88,11 +86,11 @@ "source": [ "**Step 6: Importing the right packages**\n", "* Making a parameterized notebook is extremely finicky.\n", - "* For every notebook you make, you must copy and paste this block of code in this **exact** order. Otherwise, your notebook won't work.\n", - "* **What am I importing?**\n", - " * `%%capture`: FIND DEFINITION\n", - " * `import warnings warnings.filterwarnings('ignore')`: Sometimes when you are analyzing data, harmless warnings pop up. These warnings are quite unattractive and we don't want them to be displayed in a portfolio so we turn off these warnings. You don't want to turn off the warnings if you are still analyzing your data.\n", - " * `import calitp_data_analysis.magics`: the library \n", + "* For every notebook you make, **you must copy and paste this block of code below in this exact order.** Otherwise, your notebook won't work.\n", + "* What am I importing?\n", + " * `%%capture`: Captures the parameter/yml parts.\n", + " * `import warnings warnings.filterwarnings('ignore')`: Sometimes when you are analyzing data, warnings pop up. These warnings are quite unattractive and we don't want them to be displayed in a portfolio so we turn off these warnings. You don't want to turn off the warnings if you are still analyzing your data! \n", + " * `import calitp_data_analysis.magics`: the library that makes the parameterization magic happen.\n", "* **Resource**: [DDS Getting Notebooks Ready for Parameterization](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#getting-ready-for-parameterization)" ] }, @@ -160,7 +158,7 @@ "id": "2fca6082-1964-43d7-bcd8-8668c39afaac", "metadata": {}, "source": [ - "**Parameter #2:**This second cell replaces each district as the notebook loops over each parameter in the `starter_kit.yml` file.\n", + "**Parameter #2:** This second cell replaces each district as the notebook loops over each parameter in the `starter_kit.yml` file.\n", "* `%%capture_parameters` must be the first line of code in this block or else your notebook will fail to parameterize." ] }, @@ -180,7 +178,8 @@ "id": "f9285e93-924d-4681-b526-97b8e46643b1", "metadata": {}, "source": [ - "* **Parameter #3:** The first markdown cell must include parameters to inject. This line below generates the title District 1 Analysis for District 1.. Feel free to change this to anything you wish, but make sure this is of the markdown cell.\n", + "* **Parameter #3:** The first markdown cell must include parameters to inject. This line below generates the title District 1 Analysis when it is creating the notebook for District 1. Likewise, it'll say District 2 Analysis for District 2's page. \n", + "* Feel free to change this to anything you wish, but make sure this stays a markdown cell.\n", "* This cell is extremely important and read why [here](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#header)." ] }, @@ -228,9 +227,9 @@ "metadata": {}, "source": [ "**Step 9: Download the right packages**\n", - "* Resource: [DDS Deploying Portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#building-and-deploying-your-report)\n", - "* Navigate back to the root of your repo `~/data-analyses`.\n", - "* Once there, install the portfolio requirements using `pip install -r portfolio/requirements.txt`. This will take a bit." + "* Navigate back to the root of your repo which is `~/data-analyses`.\n", + "* Once there, install the portfolio requirements using `pip install -r portfolio/requirements.txt`. This will take a bit.\n", + "* **Resource**: [DDS Deploying Portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#building-and-deploying-your-report)" ] }, { @@ -242,7 +241,7 @@ "* Double check you are at the root of your repo.\n", "* Replace `REPLACE_YML_NAME` with just the name of your `yml` file without the `.yml` extension into the command below.\n", "* Run `python portfolio/portfolio.py build REPLACE_YML_NAME --deploy` to build your portfolio.\n", - " * Example: My yml is called `ha_starterkit_district.yml` so I would run `python portfolio/portfolio.py build ha_starterkit_district --deploy`.\n" + " * Example: My yml is called `ha_starterkit_district.yml` so I would run `python portfolio/portfolio.py build ha_starterkit_district --deploy`." ] }, { @@ -252,8 +251,18 @@ "source": [ "**Step 11: Something not right?**\n", "* Your portfolio should be up and running. You can view your portfolio using the draft URL. It'll look something like this: `https://ha-starterkit-district--cal-itp-data-analyses.netlify.app`.\n", - "* What if something is a little off? After updating your code, rerun this line of code to redo your portfolio.\n", - "` python portfolio/portfolio.py clean REPLACE_YML_NAME && python portfolio/portfolio.py build REPLACE_YML_NAME --deploy`" + "* What if something is a little off? After updating your code, rerun this line of code to redo your portfolio. You must always `clean` your portfolio before regenerating new notebooks. \n", + "` python portfolio/portfolio.py clean REPLACE_YML_NAME && python portfolio/portfolio.py build REPLACE_YML_NAME --deploy`\n", + "* **Resource**: [DDS Other Specifications](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#other-specifications)" + ] + }, + { + "cell_type": "markdown", + "id": "9c8f91a0-e0b5-465d-8f95-be8e3fc036ea", + "metadata": {}, + "source": [ + "**Step 12: Commit commit commit!**\n", + "* WIP: explain Makefile" ] } ], diff --git a/starter_kit/2024_basics_01.ipynb b/starter_kit/2024_basics_01.ipynb index f3123128b..3431b92ed 100644 --- a/starter_kit/2024_basics_01.ipynb +++ b/starter_kit/2024_basics_01.ipynb @@ -8,7 +8,7 @@ "# Exercise 1: Familiarize yourself with `pandas` and `python`\n", "If you are new to Python, there are many resources!\n", "* There are introductory Python courses available through [Caltrans's LinkedIn Learning Library](https://www.linkedin.com/learning/search?keywords=python&u=36029164).\n", - "* If videos aren't for you, [Practical Python for Data Science](https://www.practicalpythonfordatascience.com/00_python_crash_course) is an incredibly helpful book.\n", + "* [Practical Python for Data Science](https://www.practicalpythonfordatascience.com/00_python_crash_course) is an incredibly helpful book and material from this resource are linked throughout.\n", "\n", "## Skills \n", "* `pandas` is one of the base Python packages for working with tabular data.\n", @@ -16,10 +16,10 @@ "* Export to Google Cloud Storage\n", "* Practice committing on GitHub\n", "\n", - "## How to use the tutorials\n", + "## How to use these tutorials\n", "* The tutorials are divided by skills/concepts we are going to learn.\n", "* There are hints and instructions on the top.\n", - "* There are links to references and it is highly recommended to read through them and practice them in this notebook, in addition to these exercises. \n", + "* There are links to references. **It is highly recommended to read through them and practice them in this notebook, in addition to these exercises.**\n", "\n", "## What are we working with today? \n", "* Today we will be working on Caltrans System Investment Strategy (CSIS) today. Per this [description](https://dot.ca.gov/programs/transportation-planning/division-of-transportation-planning/corridor-and-system-planning/csis)\n", @@ -34,17 +34,20 @@ "metadata": {}, "source": [ "## Import Packages\n", - "* Before rolling up our skills and doing some data cleaning and analyzing, we need to equip ourselves with the right tools to get started.\n", - "* Part of our tools is to import packages we're going to use. \n", + "* Before doing some data cleaning and analyzing, we need to equip ourselves with the right tools to get started.\n", + "* Part of our \"toolbox\" are packages. \n", + "\n", "* **Resource**: [Importing Dependencies via Practical Python for Data Science](https://www.practicalpythonfordatascience.com/05_data_exploration.html?highlight=dependencies#importing-our-dependencies)\n", - "### Pandas\n", - "* You are importing the package `pandas` that is the backbone of all data analysis work. \n", - "* You can import countless packages. `numpy` and `geopandas` (which is for geospatial data work) are also popular. " + "\n", + "### `Pandas`\n", + "* You are importing the package `pandas` that is the backbone of the majority of our data analysis work. \n", + "* You can import countless packages. \n", + "* We commonly use `geopandas` for geospatial data work. We use `altair` for making charts." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 13, "id": "50199af7-04a8-43c5-ba1b-4127940749bd", "metadata": {}, "outputs": [], @@ -58,18 +61,18 @@ "metadata": {}, "source": [ "* This block of code below adjusts the notebook.\n", - "* I am setting the maximum number of columns to be dissplayed to be 100.\n", + "* I am setting the maximum number of columns to be displayed to be 100.\n", "* I want any `float` columns to be rounded to 2 decimal points.\n", "* I want all of the rows in the dataframe to display. \n", "* I don't want my columns to be truncated.\n", " * If you have a column with `strings` that is very long, it will automatically cut off.\n", - " * The California Department of Transportation (Caltrans) is committed to leading climate action and advancing social equity in the transportation sector set forth by the California State Transportation Agency (CalSTA) Climate Action Plan for Transportation Infrastructure (CAPTI, 2021) would be displayed as The California Department of Transportation (Caltrans) is... without this line of code.\n", + " * Example: The California Department of Transportation (Caltrans) is committed to leading climate action and advancing social equity... would be displayed something like this The California Department of Transportation (Caltrans) is... without this line of code.\n", "* Adjust some of these settings if you wish " ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 14, "id": "8e18d8d7-2cce-4854-b6c4-56a7e7bdf636", "metadata": {}, "outputs": [], @@ -85,16 +88,16 @@ "id": "f14077a3-2882-46eb-8cd2-27c08e4705a9", "metadata": {}, "source": [ - "### Calitp_data_analysis\n", + "### `calitp_data_analysis`\n", "* DDS also has our own [internal library of functions](https://docs.calitp.org/data-infra/analytics_tools/python_libraries.html#calitp-data-analysis).\n", "* You can check out all the functions [here](https://github.com/cal-itp/data-infra/tree/main/packages/calitp-data-analysis/calitp_data_analysis).\n", - "* Below, we are importing only one function called `to_snakecase` from the python script `sql` in our package `calitp_data_analysis`.\n", - "* `to_snakecase` allows us to change the column names of our dataset from something like `Project Description` to `project_description`. By turning the column names to lower case and replacing the spaces with underscores, this makes referencing specific columns much easier." + "* Below, we are importing only one function called `to_snakecase` from the python submodule `sql` in our package `calitp_data_analysis`. `to_snakecase` allows us to change the column names of our dataset from something like `Project Description` to `project_description`. \n", + "* By turning the column names to lower case and replacing the spaces with underscores, this makes referencing specific columns much easier." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 15, "id": "bd388d88-d2d6-4dd6-9870-22c14db7a44a", "metadata": {}, "outputs": [], @@ -109,8 +112,9 @@ "source": [ "## Jupyter Notebook\n", "* You're using a Jupyter Notebook right now.\n", - "* Take some time to get used to this interface. \n", - "* AMANDA TO DO: find a tutorial." + "* There are many benefits listed here in our [DDS Docs](https://docs.calitp.org/data-infra/analytics_new_analysts/04-notebooks.html).\n", + "* Take some time to get used to this interface. There are many tutorials available on Youtube that shows tips and tricks, just skip the installation portion. \n", + " * [This one looks promising](https://youtu.be/LW2Rye_l8L0?si=B8kojobCe3OIF3xg)." ] }, { @@ -120,7 +124,7 @@ "source": [ "## Check out the data \n", "* Download the Excel workbook containing all the CSIS data from Google Cloud Storage [here](https://console.cloud.google.com/storage/browser/_details/calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx;tab=live_object?project=cal-itp-data-infra). \n", - " * Open it up in Excel and take a look.\n", + " * Open it up in Excel and take a look at how many sheets and the data structure.\n", "### Read in the data\n", "* We are reading our Excel Workbook into a Pandas dataframe.\n", "* While there is a very [technical definition](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) of what a dataframe is, you can think of it as an Excel sheet that holds your data. \n", @@ -129,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 16, "id": "5950cb87-75ab-4871-ab4b-a8f1c41f0a4a", "metadata": {}, "outputs": [], @@ -147,7 +151,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 17, "id": "67ba9264-65d9-453b-a800-a91bd365e43e", "metadata": {}, "outputs": [], @@ -157,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 18, "id": "e2d886b4-c207-41e5-8325-7275619b60e6", "metadata": {}, "outputs": [ @@ -186,22 +190,25 @@ " project_name\n", " Scope of Work\n", " Project Cost\n", + " lead agency\n", " \n", " \n", " \n", " \n", " 0\n", - " 2\n", + " 1\n", " Meadow Magic Multi-Use Path\n", " A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.\n", - " 6265525\n", + " 5245734\n", + " Meadow Bunny Public Transportation (MBPT)\n", " \n", " \n", " 1\n", - " 3\n", + " 4\n", " Bunny Hop Bike Boulevard\n", " A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.\n", - " 3777437\n", + " 6929368\n", + " Unicorn Fairy Express Bus (UFX)\n", " \n", " \n", "\n", @@ -209,19 +216,19 @@ ], "text/plain": [ " ct_district project_name \\\n", - "0 2 Meadow Magic Multi-Use Path \n", - "1 3 Bunny Hop Bike Boulevard \n", + "0 1 Meadow Magic Multi-Use Path \n", + "1 4 Bunny Hop Bike Boulevard \n", "\n", " Scope of Work \\\n", "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", "\n", - " Project Cost \n", - "0 6265525 \n", - "1 3777437 " + " Project Cost lead agency \n", + "0 5245734 Meadow Bunny Public Transportation (MBPT) \n", + "1 6929368 Unicorn Fairy Express Bus (UFX) " ] }, - "execution_count": 6, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -235,12 +242,12 @@ "id": "f959563e-7fa2-444a-b2b3-6c539dce802b", "metadata": {}, "source": [ - "* Read in the dataframe with `to_snakecase()` now and compare the difference!" + "* Read in the dataframe with `to_snakecase()` now and compare the difference between the column names. " ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 19, "id": "e09456e0-dfd2-4388-85de-eb9e95f983fa", "metadata": {}, "outputs": [], @@ -250,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 20, "id": "54c718b3-eeff-4ec5-b012-1cc612543c60", "metadata": {}, "outputs": [ @@ -279,22 +286,25 @@ " project_name\n", " scope_of_work\n", " project_cost\n", + " lead_agency\n", " \n", " \n", " \n", " \n", " 0\n", - " 2\n", + " 1\n", " Meadow Magic Multi-Use Path\n", " A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.\n", - " 6265525\n", + " 5245734\n", + " Meadow Bunny Public Transportation (MBPT)\n", " \n", " \n", " 1\n", - " 3\n", + " 4\n", " Bunny Hop Bike Boulevard\n", " A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.\n", - " 3777437\n", + " 6929368\n", + " Unicorn Fairy Express Bus (UFX)\n", " \n", " \n", "\n", @@ -302,19 +312,19 @@ ], "text/plain": [ " ct_district project_name \\\n", - "0 2 Meadow Magic Multi-Use Path \n", - "1 3 Bunny Hop Bike Boulevard \n", + "0 1 Meadow Magic Multi-Use Path \n", + "1 4 Bunny Hop Bike Boulevard \n", "\n", " scope_of_work \\\n", "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", "\n", - " project_cost \n", - "0 6265525 \n", - "1 3777437 " + " project_cost lead_agency \n", + "0 5245734 Meadow Bunny Public Transportation (MBPT) \n", + "1 6929368 Unicorn Fairy Express Bus (UFX) " ] }, - "execution_count": 8, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -335,12 +345,13 @@ " * `.head()` shows the first five rows, while `.tail()` shows the last five.\n", " * `.sample()` shows you a random row.\n", " * Want to see or less than five? Specify it in the parantheses: `.head(10)` allows you to see the first 10 rows and `.head(2)` allows you to see the first 2.\n", - "* Try everything yourself below." + "* Try everything yourself below.\n", + "* **Resource**: [Practical Python for Data Science: Data Inspection](https://www.practicalpythonfordatascience.com/02_loading_data)" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 21, "id": "5e966250-47b1-4f14-802b-c795e44330dd", "metadata": {}, "outputs": [ @@ -369,22 +380,25 @@ " project_name\n", " scope_of_work\n", " project_cost\n", + " lead_agency\n", " \n", " \n", " \n", " \n", " 0\n", - " 2\n", + " 1\n", " Meadow Magic Multi-Use Path\n", " A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.\n", - " 6265525\n", + " 5245734\n", + " Meadow Bunny Public Transportation (MBPT)\n", " \n", " \n", " 1\n", - " 3\n", + " 4\n", " Bunny Hop Bike Boulevard\n", " A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.\n", - " 3777437\n", + " 6929368\n", + " Unicorn Fairy Express Bus (UFX)\n", " \n", " \n", "\n", @@ -392,19 +406,19 @@ ], "text/plain": [ " ct_district project_name \\\n", - "0 2 Meadow Magic Multi-Use Path \n", - "1 3 Bunny Hop Bike Boulevard \n", + "0 1 Meadow Magic Multi-Use Path \n", + "1 4 Bunny Hop Bike Boulevard \n", "\n", " scope_of_work \\\n", "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", "\n", - " project_cost \n", - "0 6265525 \n", - "1 3777437 " + " project_cost lead_agency \n", + "0 5245734 Meadow Bunny Public Transportation (MBPT) \n", + "1 6929368 Unicorn Fairy Express Bus (UFX) " ] }, - "execution_count": 9, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -426,12 +440,12 @@ "* More food for thought:\n", " * `Dtype` is critical. There are integers, objects, booleans, floats...\n", " * Does the `dtype` of each column below make sense to you? \n", - " * The `dtype` of object is a catchall term." + " * The `dtype` of `object` is a catchall term." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 22, "id": "7f55b33e-d402-473b-815a-92ad935d35d7", "metadata": {}, "outputs": [ @@ -441,15 +455,16 @@ "text": [ "\n", "RangeIndex: 44 entries, 0 to 43\n", - "Data columns (total 4 columns):\n", + "Data columns (total 5 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 ct_district 44 non-null int64 \n", " 1 project_name 44 non-null object\n", " 2 scope_of_work 44 non-null object\n", " 3 project_cost 44 non-null int64 \n", - "dtypes: int64(2), object(2)\n", - "memory usage: 1.5+ KB\n" + " 4 lead_agency 44 non-null object\n", + "dtypes: int64(2), object(3)\n", + "memory usage: 1.8+ KB\n" ] } ], @@ -464,42 +479,41 @@ "source": [ "### Deeper Dive\n", "* We now know a good amount about our dataset, but the # of rows and columns are not always so thrilling. \n", - "* Let's take a look at each column." + "* Let's take a closer look at some columns.\n", + "* `.value_counts()` helps you see how many times the same value appears. " ] }, { "cell_type": "markdown", "id": "55cece73-c3d5-4cd7-8896-f97d43fc1114", "metadata": {}, - "source": [ - "* `.value_counts()` helps you see how many times the same value appears. " - ] + "source": [] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 23, "id": "63f21ab5-0920-4310-afce-2ea657556912", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "3 7\n", - "2 6\n", - "6 6\n", - "11 6\n", - "7 5\n", + "4 6\n", + "3 6\n", + "8 5\n", + "11 5\n", + "12 4\n", + "5 4\n", "9 3\n", - "12 3\n", - "1 2\n", - "4 2\n", - "8 2\n", - "10 1\n", - "5 1\n", + "6 3\n", + "7 3\n", + "2 2\n", + "10 2\n", + "1 1\n", "Name: ct_district, dtype: int64" ] }, - "execution_count": 11, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -514,13 +528,13 @@ "metadata": {}, "source": [ "* `.nunique()` displays the number of distinct values in your column\n", - " * This is useful because there are many occassions when the number of unique values of a column should match the number of rows of your dataset exactly.\n", + " * This is useful because often the number of unique values of a column should match the number of rows of your dataset exactly.\n", " * In our case, our dataframe has 44 rows and we should have 44 unique project names and scope of work descriptions." ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 24, "id": "1d832308-a425-404d-83a0-53ce8bfae279", "metadata": {}, "outputs": [ @@ -530,7 +544,7 @@ "44" ] }, - "execution_count": 12, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -541,17 +555,17 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 25, "id": "55d2140f-feab-496b-b9b1-90bbe5701a9a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(44, 4)" + "(44, 5)" ] }, - "execution_count": 13, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -565,12 +579,12 @@ "id": "7c0c499e-fa7b-4f01-a357-db7b0ec41416", "metadata": {}, "source": [ - "* You can preview a column with brackets [] as well. " + "* You can preview a column with brackets [] as well with the column name encased in quotation marks." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 26, "id": "4e232324-f75f-46a0-962d-76ed9273dac7", "metadata": {}, "outputs": [ @@ -580,13 +594,13 @@ "44" ] }, - "execution_count": 14, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df.scope_of_work.nunique()" + "df[\"scope_of_work\"].nunique()" ] }, { @@ -606,10 +620,10 @@ "metadata": {}, "source": [ "### Lists: An Introduction\n", - "* We can load in all of the sheets in an Excel workbook using a list\n", - "* Per [Practical Python for Data Science](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#list): \"lists represent a collection of objects and are constructed with square brackets, separating items with commas. A list can contain a collection of one datatype...It can also contain a collection of mixed datatypes\".\"\n", + "* We can load in all of the sheets in an Excel workbook using a list\n", + "* Per [Practical Python for Data Science](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#list): \"lists represent a collection of objects and are constructed with square brackets, separating items with commas. A list can contain a collection of one datatype...It can also contain a collection of mixed datatypes\".\n", " * **Play around with some of the examples in the link above in this notebook.**\n", - " * You will be using lists often in your work, so it is best to be familiar with this datatype.\n" + " * You will be using lists often in your work, so it is best to be familiar with this datatype." ] }, { @@ -626,25 +640,27 @@ "metadata": {}, "source": [ "* I am placing all of the sheets in our Excel Workbook in a list.\n", - "* Notice that the items in this list are strings. Read about strings [here](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#string).\n", - "* You can access each element of the list using an index. " + "* Notice that the items in this list are strings. \n", + " * Read about strings [here](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#string).\n", + "* You can access each element of the list using an index.\n", + " * An index represents the location of an element with a number.\n", + " * The index always starts at 0. What we consider the first item is not index \"1\", it's index \"0\"." ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 27, "id": "02380fb6-c55b-477f-acfb-8b483e83beac", "metadata": {}, "outputs": [], "source": [ - "\n", "my_sheets = [\"projects_auto\",\n", " \"overall_score\"]" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 28, "id": "8a9a1a3e-e10d-4447-96dd-92ecb2fe6357", "metadata": {}, "outputs": [ @@ -654,7 +670,7 @@ "2" ] }, - "execution_count": 16, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -665,7 +681,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 29, "id": "a3be037d-b21b-4192-9099-25bfcb660f01", "metadata": {}, "outputs": [ @@ -675,7 +691,7 @@ "'projects_auto'" ] }, - "execution_count": 17, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -687,7 +703,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 30, "id": "ebf91535-a466-446a-9f7a-606503d78b6a", "metadata": {}, "outputs": [ @@ -697,7 +713,7 @@ "'overall_score'" ] }, - "execution_count": 18, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -717,7 +733,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 31, "id": "2e2578bc-db1f-41f5-bc07-3cb82998420e", "metadata": {}, "outputs": [], @@ -741,7 +757,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 32, "id": "4c6f8fdb-33d3-4c44-bb00-6d1447d49feb", "metadata": {}, "outputs": [], @@ -751,7 +767,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 33, "id": "167af2f1-b09d-476d-87b4-b9374ad445c2", "metadata": {}, "outputs": [], @@ -766,8 +782,11 @@ "source": [ "## Add a new column\n", "* Oops! Us analysts were so wrapped up in scoring, we forgot to to total up all the metrics to find the overall_score for the project. \n", - "* Place your results in a column called `overall_score`\n", - "* There are a couple of ways to do this: expeirment!\n", + "* Sum up all the metric columns into a column called `overall_score`\n", + "* There are a couple of ways to do this: experiment! \n", + "* Here are some resources:\n", + " * [Stackoverflow](https://stackoverflow.com/questions/22342285/summing-two-columns-in-a-pandas-dataframe)\n", + " * [Statology](https://www.statology.org/pandas-sum-specific-columns/)\n", "* Food for thought:\n", " * What does `axis = 1` mean?\n", " * What happens if you do `.sum(axis=0)`?\n", @@ -778,7 +797,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 34, "id": "e9321f90-8c99-46fb-9d50-8571f3d94fc8", "metadata": {}, "outputs": [], @@ -794,7 +813,8 @@ }, "source": [ "## Subsetting\n", - "* Your manager asks for the `overall_score` for each project. They do not want to see the other metrics, only the project's name and its total score.\n", + "* Your manager asks for the `overall_score` for each project. \n", + "* They do not want to see the other metrics, only the project's name and its `overall_score`\n", "* Subset the dataframe and save it into a new dataframe.\n", "* Again, there are many ways to do the same thing in Python. \n", "* Method 1: Enter in all the columns you want to keep in a list and place the list in another set of brackets." @@ -802,7 +822,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 35, "id": "4e6d8e70-ae57-46c5-a5aa-9972be77f415", "metadata": {}, "outputs": [], @@ -813,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 36, "id": "48ee899b-3db9-464f-802f-d431189176b7", "metadata": { "scrolled": true, @@ -834,7 +854,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 37, "id": "2c64cdcf-9598-4f4a-b077-5caec0cfe264", "metadata": {}, "outputs": [], @@ -845,7 +865,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 38, "id": "47a96b86-e5d1-4fcd-ba73-7db5badae28b", "metadata": { "scrolled": true, @@ -854,7 +874,7 @@ "outputs": [], "source": [ "\n", - "subsetted_df2 = scores_df.drop(columns = columns_to_drop)" + "# subsetted_df2 = scores_df.drop(columns = columns_to_drop)" ] }, { @@ -862,22 +882,20 @@ "id": "e641185d-295d-4c42-ace1-16d33f2da0fa", "metadata": {}, "source": [ - "## Export to Google Cloud Storage (GCS)\n", - "* Save your subsetted dataframe from above back into the `starter_kit` folder. The file path should be something like this `\"gs://calitp-analytics-data/data-analyses/starter_kit/aggregated_csis.xlsx\"`.\n", + "## F-Strings\n", + "* Save your subsetted dataframe from above back into the `starter_kit` folder. \n", + " * The file path should be something like this `\"gs://calitp-analytics-data/data-analyses/starter_kit/aggregated_csis.xlsx\"`.\n", "* However, remember our original Excel workbook's file path? It was`\"gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_csis_scoring_workbook.xlsx\"`\n", - "* Essentially, the only difference between these two file paths are `aggregated_csis.xlsx` and `starter_kit_csis_scoring_workbook.xlsx` because the folder path `gs://calitp-analytics-data/data-analyses/starter_kit/` remains the same. \n", - "* This is where f-strings come in.\n", + "* Essentially, the **only** difference between these two file paths are `aggregated_csis.xlsx` and `starter_kit_csis_scoring_workbook.xlsx` because the folder path `gs://calitp-analytics-data/data-analyses/starter_kit/` remains the same. \n", + "* This is where f-strings come in. Read more about them [here](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python).\n", "> Python f-strings provide a quick way to interpolate and format strings. They’re readable, concise, and less prone to error than traditional string interpolation and formatting tools...\n", - " * Read more about them [here](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python).\n", - "* Reference\n", - " * [DDS Docs: Saving Code](https://docs.calitp.org/data-infra/analytics_tools/saving_code.html)\n", "* Let's practice !\n", - " * My file_path is always going to be `gs://calitp-analytics-data/data-analyses/starter_kit/`." + " * My file_path is always going to be `gs://calitp-analytics-data/data-analyses/starter_kit/`.\n" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 39, "id": "4c9c53a5-dbf3-4dc0-aea0-832f3a91414d", "metadata": {}, "outputs": [], @@ -891,12 +909,12 @@ "metadata": {}, "source": [ "* However the file is going to change.\n", - "* Save the file name in an object called `FILE`." + "* Save the file name in a variable called `FILE`." ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 40, "id": "db111f34-08b8-42f9-96fe-6852c4af50ad", "metadata": {}, "outputs": [], @@ -910,12 +928,12 @@ "id": "bf96d0cf-7225-4a44-9955-988d982a0f7f", "metadata": {}, "source": [ - "* Using `f-string`, combine `GCS_FILE_PATH` and `FILE` together." + "* Using a `f-string`, combine `GCS_FILE_PATH` and `FILE` together." ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 41, "id": "edff403c-ef37-48d8-8c7a-60b388752a51", "metadata": {}, "outputs": [ @@ -925,7 +943,7 @@ "'gs://calitp-analytics-data/data-analyses/starter_kit/starter_kit_example_final_scores.xlsx'" ] }, - "execution_count": 29, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -942,12 +960,12 @@ "source": [ "* Now go open up your new Excel workbook and see if it's what you expect.\n", " * Hint: you will probably get a very annoying extra column! \n", - " * Try out some of the arguments [listed](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html#pandas.DataFrame.to_excel) and save your file again." + " * Try out some of the arguments [here](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html#pandas.DataFrame.to_excel) and save your file again." ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 42, "id": "bf37fc2d-ac6c-4134-94de-79a9a4141ffc", "metadata": {}, "outputs": [], @@ -963,12 +981,14 @@ "source": [ "* Export the entire (not subsetted) dataframe with the new `overall_score` column using `df.to_parquet()`. \n", " * We typically prefer saving to `parquets`. Why? Read below. Text taken from [here](https://docs.calitp.org/data-infra/analytics_new_analysts/03-data-management.html#parquet).\n", - " * Parquet is an “open source columnar storage format for use in data analysis systems.” Columnar storage is more efficient as it is easily compressed and the data is more homogenous. CSV files utilize a row-based storage format which is harder to compress, a reason why Parquets files are preferable for larger datasets. Parquet files are faster to read than CSVs, as they have a higher querying speed and preserve datatypes (i.e. Number, Timestamps, Points). They are best for intermediate data storage and large datasets (1GB+) on most any on-disk storage. This file format is also good for passing dataframes between Python and R. A similar option is feather." + " * Parquet is an “open source columnar storage format for use in data analysis systems.” Columnar storage is more efficient as it is easily compressed and the data is more homogenous. CSV files utilize a row-based storage format which is harder to compress, a reason why Parquets files are preferable for larger datasets. Parquet files are faster to read than CSVs, as they have a higher querying speed and preserve datatypes (i.e. Number, Timestamps, Points). They are best for intermediate data storage and large datasets (1GB+) on most any on-disk storage. This file format is also good for passing dataframes between Python and R. A similar option is feather.\n", + "* Reference\n", + " * [DDS Docs: Saving Code](https://docs.calitp.org/data-infra/analytics_tools/saving_code.html)" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 43, "id": "22562f2f-8359-4e44-951c-25e5ac033282", "metadata": {}, "outputs": [], @@ -978,7 +998,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 44, "id": "9bc1a3cb-85e2-4203-bdd4-e45bb6c20ba4", "metadata": {}, "outputs": [ @@ -1024,38 +1044,38 @@ " \n", " 0\n", " Meadow Magic Multi-Use Path\n", - " 1\n", + " 2\n", " 8\n", - " 9\n", - " 3\n", - " 10\n", - " 3\n", " 8\n", + " 10\n", " 2\n", + " 3\n", + " 5\n", + " 3\n", " 2\n", + " 7\n", + " 6\n", + " 6\n", " 10\n", - " 4\n", - " 2\n", - " 4\n", - " 66\n", + " 72\n", " \n", " \n", " 1\n", " Bunny Hop Bike Boulevard\n", + " 3\n", " 9\n", - " 5\n", - " 2\n", - " 5\n", + " 7\n", + " 6\n", + " 7\n", " 6\n", + " 3\n", " 2\n", - " 4\n", - " 5\n", - " 9\n", - " 5\n", " 2\n", " 10\n", - " 7\n", - " 71\n", + " 2\n", + " 6\n", + " 5\n", + " 68\n", " \n", " \n", "\n", @@ -1063,27 +1083,27 @@ ], "text/plain": [ " project_name accessibility_score dac_accessibility_score \\\n", - "0 Meadow Magic Multi-Use Path 1 8 \n", - "1 Bunny Hop Bike Boulevard 9 5 \n", + "0 Meadow Magic Multi-Use Path 2 8 \n", + "1 Bunny Hop Bike Boulevard 3 9 \n", "\n", " dac_traffic_impacts_score freight_efficiency_score \\\n", - "0 9 3 \n", - "1 2 5 \n", + "0 8 10 \n", + "1 7 6 \n", "\n", " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", - "0 10 3 8 \n", - "1 6 2 4 \n", + "0 2 3 5 \n", + "1 7 6 3 \n", "\n", " safety_score vmt_score zev_score public_engagement_score \\\n", - "0 2 2 10 4 \n", - "1 5 9 5 2 \n", + "0 3 2 7 6 \n", + "1 2 2 10 2 \n", "\n", " climate_resilience_score program_fit_score overall_score \n", - "0 2 4 66 \n", - "1 10 7 71 " + "0 6 10 72 \n", + "1 6 5 68 " ] }, - "execution_count": 32, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } diff --git a/starter_kit/2024_basics_02.ipynb b/starter_kit/2024_basics_02.ipynb index 97bdd7aba..f9fc0551e 100644 --- a/starter_kit/2024_basics_02.ipynb +++ b/starter_kit/2024_basics_02.ipynb @@ -40,7 +40,7 @@ "source": [ "* Read back in the `parquet` file with the `overall_score` you created from exercise 1.\n", "* Read the Excel sheet containing the project information (scope of work, district, and project name).\n", - "* Use f-strings." + "* **Use f-strings.**" ] }, { @@ -114,22 +114,25 @@ " project_name\n", " scope_of_work\n", " project_cost\n", + " lead_agency\n", " \n", " \n", " \n", " \n", " 0\n", - " 2\n", + " 1\n", " Meadow Magic Multi-Use Path\n", " A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.\n", - " 6265525\n", + " 5245734\n", + " Meadow Bunny Public Transportation (MBPT)\n", " \n", " \n", " 1\n", - " 3\n", + " 4\n", " Bunny Hop Bike Boulevard\n", " A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks.\n", - " 3777437\n", + " 6929368\n", + " Unicorn Fairy Express Bus (UFX)\n", " \n", " \n", "\n", @@ -137,16 +140,16 @@ ], "text/plain": [ " ct_district project_name \\\n", - "0 2 Meadow Magic Multi-Use Path \n", - "1 3 Bunny Hop Bike Boulevard \n", + "0 1 Meadow Magic Multi-Use Path \n", + "1 4 Bunny Hop Bike Boulevard \n", "\n", " scope_of_work \\\n", "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", "1 A Class II bike lane with charming streetlights, benches, and bike racks designed to resemble carrot sticks, connecting residential neighborhoods to local schools and parks. \n", "\n", - " project_cost \n", - "0 6265525 \n", - "1 3777437 " + " project_cost lead_agency \n", + "0 5245734 Meadow Bunny Public Transportation (MBPT) \n", + "1 6929368 Unicorn Fairy Express Bus (UFX) " ] }, "execution_count": 7, @@ -216,38 +219,38 @@ " \n", " 0\n", " Meadow Magic Multi-Use Path\n", - " 1\n", + " 2\n", " 8\n", - " 9\n", - " 3\n", - " 10\n", - " 3\n", " 8\n", + " 10\n", " 2\n", + " 3\n", + " 5\n", + " 3\n", " 2\n", + " 7\n", + " 6\n", + " 6\n", " 10\n", - " 4\n", - " 2\n", - " 4\n", - " 66\n", + " 72\n", " \n", " \n", " 1\n", " Bunny Hop Bike Boulevard\n", + " 3\n", " 9\n", - " 5\n", - " 2\n", - " 5\n", + " 7\n", " 6\n", + " 7\n", + " 6\n", + " 3\n", " 2\n", - " 4\n", - " 5\n", - " 9\n", - " 5\n", " 2\n", " 10\n", - " 7\n", - " 71\n", + " 2\n", + " 6\n", + " 5\n", + " 68\n", " \n", " \n", "\n", @@ -255,24 +258,24 @@ ], "text/plain": [ " project_name accessibility_score dac_accessibility_score \\\n", - "0 Meadow Magic Multi-Use Path 1 8 \n", - "1 Bunny Hop Bike Boulevard 9 5 \n", + "0 Meadow Magic Multi-Use Path 2 8 \n", + "1 Bunny Hop Bike Boulevard 3 9 \n", "\n", " dac_traffic_impacts_score freight_efficiency_score \\\n", - "0 9 3 \n", - "1 2 5 \n", + "0 8 10 \n", + "1 7 6 \n", "\n", " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", - "0 10 3 8 \n", - "1 6 2 4 \n", + "0 2 3 5 \n", + "1 7 6 3 \n", "\n", " safety_score vmt_score zev_score public_engagement_score \\\n", - "0 2 2 10 4 \n", - "1 5 9 5 2 \n", + "0 3 2 7 6 \n", + "1 2 2 10 2 \n", "\n", " climate_resilience_score program_fit_score overall_score \n", - "0 2 4 66 \n", - "1 10 7 71 " + "0 6 10 72 \n", + "1 6 5 68 " ] }, "execution_count": 9, @@ -286,11 +289,11 @@ }, { "cell_type": "markdown", - "id": "58e35b64-d192-4c6c-8f5d-044a3414ca68", + "id": "4c2dd160-ec10-41ce-b5c0-a9be5934d6ee", "metadata": {}, "source": [ "## Merging \n", - "* Your manager asks you to aggregate the dataframe by Caltrans District to find:\n", + "* **Goal**: Your manager asks you to aggregate the dataframe by the Caltrans District grain to find\n", " * Median overall score\n", " * Max overall score \n", " * Min overall score\n", @@ -300,10 +303,29 @@ "* Welcome to DDS! This will happen to you all the time starting now. \n", "\n", "### Relevant Resources\n", - "* If needed, read about merges before diving in. \n", + "* Read about and practice merges before diving in. \n", " * [Resource #1 is a great tutorial for beginners](https://www.practicalpythonfordatascience.com/03_cleaning_data.html?highlight=merge#merging-dataframes-together).\n", " * [Resource #2 is written by our own Tiffany Ku, but it contains some geospatial references so it's a bit more to digest](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#merge-tabular-and-geospatial-data-for-data-analysis).\n", - "### Food for thought \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2d356494-a12a-4f67-beb3-b6ba92c8135f", + "metadata": {}, + "outputs": [], + "source": [ + "# Practice Here" + ] + }, + { + "cell_type": "markdown", + "id": "e60cf03f-6de0-4b30-b879-080c9ab7a22f", + "metadata": {}, + "source": [ + "### Now merge your two CSIS dataframes\n", + "**Food for Thought**\n", "* Which columns do the two dataframes have in common?\n", "* What type of merge will achieve my goal?\n", " * Inner, outer, left, or right\n", @@ -315,16 +337,6 @@ " * Which arguments are available to help me per the [docs](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html)?" ] }, - { - "cell_type": "code", - "execution_count": 10, - "id": "ad4962ca-ed83-48a3-b1e6-79e5d5b1042b", - "metadata": {}, - "outputs": [], - "source": [ - "m1 = pd.merge(projects_df, overall_scores_df, on=[\"project_name\"])" - ] - }, { "cell_type": "markdown", "id": "8ddf0077-061c-4d67-8881-36c9792d6e62", @@ -339,16 +351,26 @@ { "cell_type": "code", "execution_count": 11, + "id": "ad4962ca-ed83-48a3-b1e6-79e5d5b1042b", + "metadata": {}, + "outputs": [], + "source": [ + "m1 = pd.merge(projects_df, overall_scores_df, on=[\"project_name\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, "id": "e820d7af-17d4-4b2a-8007-5d958a3f7d9e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(41, 18)" + "(41, 19)" ] }, - "execution_count": 11, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -359,7 +381,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "3642de14-3bf4-47c0-bd80-3502819ea14d", "metadata": {}, "outputs": [ @@ -369,7 +391,7 @@ "41" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -380,7 +402,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "4b5be67a-f579-4f22-97cb-b6b31d7b8433", "metadata": {}, "outputs": [ @@ -390,7 +412,7 @@ "44" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -413,7 +435,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "98e92c3f-ccd4-45f8-b6a6-523ddcb4a7ac", "metadata": {}, "outputs": [], @@ -425,7 +447,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "f134cddf-5220-44f9-9e15-1c5171cbedfd", "metadata": {}, "outputs": [ @@ -438,7 +460,7 @@ "Name: _merge, dtype: int64" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -455,12 +477,12 @@ "### Filtering\n", "* Filter out for only the `left_only` and `right_only` values.\n", " * `!=` means does not equal to. \n", - " " + " * `==` means equal to." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "4dd07bab-4d1b-41a0-954e-4c2d59584e57", "metadata": {}, "outputs": [ @@ -534,7 +556,7 @@ "46 Main Street Muffin Top Revitalization right_only" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -553,7 +575,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "c47ef38d-6db5-4bf1-bd87-62b7d84943b6", "metadata": {}, "outputs": [ @@ -627,7 +649,7 @@ "46 Main Street Muffin Top Revitalization right_only" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -636,26 +658,58 @@ "m2.loc[m2._merge.isin([\"left_only\",\"right_only\"])][[\"project_name\", \"_merge\"]]" ] }, + { + "cell_type": "markdown", + "id": "1c2b7437-f767-497c-a53a-26aeef9a3b0f", + "metadata": {}, + "source": [ + "* If you want to filter out multiple elements use `~df.column.isin([list of elements you don't want to keep])`" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "09ff3055-29ee-4ea1-a164-5d4796aa1807", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(41, 20)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m2.loc[~m2._merge.isin([\"left_only\",\"right_only\"])].shape" + ] + }, { "cell_type": "markdown", "id": "e0a6bd58-734e-4f96-b150-9a53bef7d1aa", "metadata": {}, "source": [ "### Dictionaries\n", - "* String data is often entered in many different ways. BART can be entered in as bart, Bay Area Rapid Transit, BaRT, and more. \n", + "* String data is often entered in many different ways. \n", + " * BART can be entered in as bart, Bay Area Rapid Transit, BaRT, and more. \n", "* Often, strings are the reason why your dataframe is not merging properly.\n", "* In Excel, it's easy to go in and manually tweak everything. However, that is not reproducible and time consuming. \n", - "* Since there are essentially only a couple of names to replace, we can do it using a dictionary.\n", + "* Luckily with Python we can automate this. \n", + "* Since there are a couple of names to replace, we can do it using a dictionary.\n", "\n", "#### What is a dictionary?\n", "* Per Practical Python for Data Science, a dictionary is Dictionaries are used to store data values in key:value pairs. Similar to the list, a dictionary is a collection of objects. It is also mutable, meaning that you can add, remove, change values inside of it...With the list, we access elements using the index. With the dictionary, we access elements using keys..\n", - " * Read more [here](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#dictionary) and experiment with the example in the docs in this notebook.\n", + "* Dictionaries are very important. \n", + "* Read more [here](https://www.practicalpythonfordatascience.com/00_python_crash_course_datatypes.html?highlight=dictionary#dictionary) and **follow its example in the cells below.**\n", " " ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "id": "df6fa95e-cc25-4142-8c2b-ee254863e609", "metadata": {}, "outputs": [], @@ -669,8 +723,8 @@ "metadata": {}, "source": [ "#### Replacing Values\n", - "* [Relevanting Reading](https://www.practicalpythonfordatascience.com/03_cleaning_data#recoding-column-values).\n", - "* Step 1: Filter out for the rows that didn't merge. Find the unique values of the `project_name` column using `.unique()`\n", + "* [Resource](https://www.practicalpythonfordatascience.com/03_cleaning_data#recoding-column-values)\n", + "* **Step 1**: Filter out for the rows that didn't merge. Find the unique values of the `project_name` column using `.unique()`\n", "* Take a look at elements using \n", " * Trailing white spaces\n", " * Capitalization\n", @@ -680,7 +734,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "id": "5601fd36-d221-41da-ab76-b88c616e5e62", "metadata": {}, "outputs": [ @@ -693,7 +747,7 @@ " dtype=object)" ] }, - "execution_count": 19, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -707,13 +761,13 @@ "id": "21f38614-3b49-45fd-97f6-7161a59ab367", "metadata": {}, "source": [ - "* Step 2: Decide whether you want to rename the values in the left dataframe or the right one. \n", - "* Step 3: The keys, are the values you want to replace. The values, are what you want to replace these values with. " + "* **Step 2:** Decide whether you want to rename the values in the left dataframe or the right one. \n", + "* **Step 3:** The keys, are the values you want to replace. The values, are what you want to replace these values with. " ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "id": "9dad92fe-87a6-434d-a62f-d269f3ad1054", "metadata": {}, "outputs": [], @@ -730,12 +784,12 @@ "id": "abe24864-66bd-4ce4-bb46-38a13c8bb64a", "metadata": {}, "source": [ - "* Step 4: Use your dictionary in `.replace()` to recode the values." + "* **Step 4**: Use your dictionary in `.replace()` to recode the values." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "id": "d8532992-771e-446a-b419-55ad757ff45f", "metadata": {}, "outputs": [], @@ -748,12 +802,12 @@ "id": "68562b10-b9bd-4892-8780-a66cad1a06d4", "metadata": {}, "source": [ - "#### Merge your dataframes again. This time it should work.\n" + "#### Merge your dataframes again. This time the number of unique project names should match the rows of the merged dataframe perfectly." ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "id": "db09aa04-7a94-4b94-9ade-10b1a987e006", "metadata": {}, "outputs": [], @@ -761,30 +815,38 @@ "final_m = pd.merge(projects_df, overall_scores_df, how=\"inner\", on=\"project_name\")" ] }, + { + "cell_type": "markdown", + "id": "144aa8a8-df59-418a-a0c7-4dbc3537c68f", + "metadata": {}, + "source": [ + "* You can check if two values are equal using `==`." + ] + }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "id": "04f4f6d8-55b6-460c-8a52-8626dcfd1cb9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(44, 18)" + "True" ] }, - "execution_count": 23, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "final_m.shape" + "len(final_m) == final_m.project_name.nunique()" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "id": "39d74f54-a72b-4acc-91b0-b3dcb4539a92", "metadata": {}, "outputs": [ @@ -813,6 +875,7 @@ " project_name\n", " scope_of_work\n", " project_cost\n", + " lead_agency\n", " accessibility_score\n", " dac_accessibility_score\n", " dac_traffic_impacts_score\n", @@ -832,24 +895,25 @@ " \n", " \n", " 0\n", - " 2\n", + " 1\n", " Meadow Magic Multi-Use Path\n", " A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.\n", - " 6265525\n", - " 1\n", + " 5245734\n", + " Meadow Bunny Public Transportation (MBPT)\n", + " 2\n", " 8\n", - " 9\n", - " 3\n", - " 10\n", - " 3\n", " 8\n", + " 10\n", " 2\n", + " 3\n", + " 5\n", + " 3\n", " 2\n", + " 7\n", + " 6\n", + " 6\n", " 10\n", - " 4\n", - " 2\n", - " 4\n", - " 66\n", + " 72\n", " \n", " \n", "\n", @@ -857,28 +921,31 @@ ], "text/plain": [ " ct_district project_name \\\n", - "0 2 Meadow Magic Multi-Use Path \n", + "0 1 Meadow Magic Multi-Use Path \n", "\n", " scope_of_work \\\n", "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", "\n", - " project_cost accessibility_score dac_accessibility_score \\\n", - "0 6265525 1 8 \n", + " project_cost lead_agency \\\n", + "0 5245734 Meadow Bunny Public Transportation (MBPT) \n", "\n", - " dac_traffic_impacts_score freight_efficiency_score \\\n", - "0 9 3 \n", + " accessibility_score dac_accessibility_score dac_traffic_impacts_score \\\n", + "0 2 8 8 \n", "\n", - " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", - "0 10 3 8 \n", + " freight_efficiency_score freight_sustainability_score mode_shift_score \\\n", + "0 10 2 3 \n", "\n", - " safety_score vmt_score zev_score public_engagement_score \\\n", - "0 2 2 10 4 \n", + " lu_natural_resources_score safety_score vmt_score zev_score \\\n", + "0 5 3 2 7 \n", "\n", - " climate_resilience_score program_fit_score overall_score \n", - "0 2 4 66 " + " public_engagement_score climate_resilience_score program_fit_score \\\n", + "0 6 6 10 \n", + "\n", + " overall_score \n", + "0 72 " ] }, - "execution_count": 24, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -892,12 +959,13 @@ "id": "3965dc2d-9603-4a95-a1fd-ef0b7a80eaaa", "metadata": {}, "source": [ - "* Save this dataframe as a parquet to GCS under a new name" + "#### Save this dataframe as a parquet to GCS under a new name\n", + "* Use a `f-string`" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "id": "70410a43-62c9-467c-b777-3415f22abe01", "metadata": {}, "outputs": [], @@ -908,27 +976,44 @@ }, { "cell_type": "markdown", - "id": "8bf3c941-3f75-4a09-af3b-ded004a65cab", + "id": "8231c525-ec3a-4e91-b378-1ca51a5f4de8", "metadata": {}, "source": [ "## Groupby\n", "* You're done merging...Oh wait, that wasn't even part of your manager's request. You still need to aggregate. \n", - "* The refresh your memory: by Caltrans District to find\n", + "* The refresh your memory by Caltrans District to find\n", " * Median overall score\n", " * Max overall score \n", " * Min overall score\n", " * Number of unique projects\n", "* There are many options Some are `groupby / agg`, `pivot_table`, `groupby / transform`\n", - "* Resources: [DDS Docs](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#aggregating)\n", - " * Use the space below and explore these tutorials. \n", - " * Then, apply your new knowledge to the prompt above.\n", + "* Resource: Use the space below to explore this example.\n", + " * [DDS Docs](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#aggregating)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "02f34bdf-3c17-4674-bdf0-f9982e7fac0a", + "metadata": {}, + "outputs": [], + "source": [ + "# Practice tutorial here" + ] + }, + { + "cell_type": "markdown", + "id": "849f8fc8-b356-4169-9398-dafd72956afe", + "metadata": {}, + "source": [ + "### Apply your new knowledge to the prompt above.\n", "* Hint: After aggregating, your column name will no longer be relevant. For example, if you use `scope_of_work` to count the number of projects, this column no longer represents `scope_of_work`. It should be renamed something like `n_projects`.\n", " * Rename your columns using this `df.rename(columns={\"old_column_name\":\"new_column_name\"})`" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 29, "id": "7328fcf2-ea52-46b8-8624-a7f3f39428df", "metadata": {}, "outputs": [], @@ -938,7 +1023,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 30, "id": "8dc4063c-1150-4b67-a125-16f245f4b9c4", "metadata": {}, "outputs": [], @@ -948,7 +1033,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 31, "id": "0892a805-7d7f-47cf-b086-f5e320c5361c", "metadata": {}, "outputs": [], @@ -969,7 +1054,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 32, "id": "94c178b1-ff70-4d63-8820-aef101928c75", "metadata": {}, "outputs": [], @@ -981,7 +1066,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 33, "id": "70178e81-0d11-4d19-9001-96e466d6dced", "metadata": {}, "outputs": [ @@ -1017,98 +1102,98 @@ " \n", " 0\n", " 1\n", - " 69.50\n", - " 69\n", - " 70\n", - " 2\n", + " 72.00\n", + " 72\n", + " 72\n", + " 1\n", " \n", " \n", " 1\n", " 2\n", - " 72.50\n", - " 64\n", - " 74\n", - " 6\n", + " 61.50\n", + " 60\n", + " 63\n", + " 2\n", " \n", " \n", " 2\n", " 3\n", - " 71.00\n", - " 62\n", - " 77\n", - " 7\n", + " 80.50\n", + " 54\n", + " 97\n", + " 6\n", " \n", " \n", " 3\n", " 4\n", - " 66.00\n", - " 65\n", - " 67\n", - " 2\n", + " 70.50\n", + " 60\n", + " 97\n", + " 6\n", " \n", " \n", " 4\n", " 5\n", - " 81.00\n", - " 81\n", - " 81\n", - " 1\n", + " 77.00\n", + " 58\n", + " 98\n", + " 4\n", " \n", " \n", " 5\n", " 6\n", - " 66.50\n", - " 57\n", - " 85\n", - " 6\n", + " 72.00\n", + " 63\n", + " 77\n", + " 3\n", " \n", " \n", " 6\n", " 7\n", - " 76.00\n", - " 53\n", - " 86\n", - " 5\n", + " 82.00\n", + " 79\n", + " 94\n", + " 3\n", " \n", " \n", " 7\n", " 8\n", - " 78.50\n", - " 63\n", - " 94\n", - " 2\n", + " 73.00\n", + " 66\n", + " 85\n", + " 5\n", " \n", " \n", " 8\n", " 9\n", - " 81.00\n", - " 48\n", - " 90\n", + " 75.00\n", + " 67\n", + " 87\n", " 3\n", " \n", " \n", " 9\n", " 10\n", - " 80.00\n", - " 80\n", - " 80\n", - " 1\n", + " 72.50\n", + " 59\n", + " 86\n", + " 2\n", " \n", " \n", " 10\n", " 11\n", - " 71.00\n", - " 68\n", - " 87\n", - " 6\n", + " 75.00\n", + " 55\n", + " 89\n", + " 5\n", " \n", " \n", " 11\n", " 12\n", - " 70.00\n", - " 65\n", - " 88\n", - " 3\n", + " 72.50\n", + " 60\n", + " 97\n", + " 4\n", " \n", " \n", "\n", @@ -1116,21 +1201,21 @@ ], "text/plain": [ " ct_district median_score min_score max_score n_projects\n", - "0 1 69.50 69 70 2\n", - "1 2 72.50 64 74 6\n", - "2 3 71.00 62 77 7\n", - "3 4 66.00 65 67 2\n", - "4 5 81.00 81 81 1\n", - "5 6 66.50 57 85 6\n", - "6 7 76.00 53 86 5\n", - "7 8 78.50 63 94 2\n", - "8 9 81.00 48 90 3\n", - "9 10 80.00 80 80 1\n", - "10 11 71.00 68 87 6\n", - "11 12 70.00 65 88 3" + "0 1 72.00 72 72 1\n", + "1 2 61.50 60 63 2\n", + "2 3 80.50 54 97 6\n", + "3 4 70.50 60 97 6\n", + "4 5 77.00 58 98 4\n", + "5 6 72.00 63 77 3\n", + "6 7 82.00 79 94 3\n", + "7 8 73.00 66 85 5\n", + "8 9 75.00 67 87 3\n", + "9 10 72.50 59 86 2\n", + "10 11 75.00 55 89 5\n", + "11 12 72.50 60 97 4" ] }, - "execution_count": 30, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1146,7 +1231,6 @@ "source": [ "## Visualizing \n", "* You're done aggregating, but the dataframe looks objectively plain.\n", - "* Unfortunately in the world of data, looks do matter. \n", "* Let's explore a couple of ways to present your data." ] }, @@ -1166,14 +1250,22 @@ " * Change the alignment of the values" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0d8b97b-0f34-495a-8dfb-61642c44879a", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "id": "c251617a-1936-4df1-b461-cc63f4be5e37", "metadata": {}, "source": [ "### Altair\n", - "* While a table is great, sometimes the stakeholder prefers a chart. \n", - "* Our preferred visualization library is `Altair`, although there are other options.\n", + "* While a table is great, sometimes a chart is a better way to display an insight.\n", + "* Our preferred visualization library is `Altair`.\n", " * Their docs page is [here](https://altair-viz.github.io/).\n", "* The code to create a simple bar chart goes something like this. \n", " * `alt.Chart(source).mark_bar().encode(x='a',y='b')`\n", @@ -1185,7 +1277,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 34, "id": "fdcece32-d053-4b32-9e76-0f5ffed9ff52", "metadata": {}, "outputs": [ @@ -1194,28 +1286,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, - "execution_count": 31, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -1287,7 +1379,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 35, "id": "88e1dff9-0188-49c9-b6cc-599610aca9a7", "metadata": {}, "outputs": [ @@ -1296,28 +1388,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, - "execution_count": 32, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -1381,13 +1473,13 @@ "id": "03fa6313-cbf7-4c3a-af76-8012b0a927ef", "metadata": {}, "source": [ - "### Different Charts\n", + "#### Different Charts\n", "* If you want something that isn't a bar chart, simply swap out `.mark_bar()` for `.mark_line` or `mark_circle`.\n" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 36, "id": "d43cae4f-1faf-48fb-8c21-559feb5243b1", "metadata": {}, "outputs": [ @@ -1396,28 +1488,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, - "execution_count": 33, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1476,6 +1568,97 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": 37, + "id": "9b94c3f2-af01-43d4-9f17-98cd863511a3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alt.Chart(agg1, title=\"your_title_here\").mark_line().encode(\n", + " x=\"ct_district\", y=\"n_projects\"\n", + ")" + ] + }, { "cell_type": "markdown", "id": "1d7073ac-6528-4999-9c9c-94c8147c0ac6", @@ -1487,7 +1670,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 38, "id": "cb8df2a3-bf37-4fe4-833e-1259a6ad7f15", "metadata": {}, "outputs": [], @@ -1507,7 +1690,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 39, "id": "aa21d088-3360-4d3e-811c-8cc5bdb2d3a8", "metadata": { "scrolled": true, @@ -1571,9 +1754,18 @@ "calitp_color_palette??" ] }, + { + "cell_type": "markdown", + "id": "f3971ba8-1c8f-4003-8e34-c3fd31f3f585", + "metadata": {}, + "source": [ + "* Place your color palette in the `scale` argument `scale=alt.Scale(range=your_color_palette)`.\n", + "* If I'm using a palette from `calitp_color_palette`, I would write `scale=alt.Scale(range=calitp_color_palette.CALITP_DIVERGING_COLORS)`." + ] + }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 43, "id": "c629f242-9b1b-49d1-b4b0-1bb956782d69", "metadata": {}, "outputs": [ @@ -1582,28 +1774,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, - "execution_count": 36, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -1683,89 +1875,10 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "id": "9832f9fc-53a3-4c5e-ba87-4b346d6f6985", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "alt.Chart(agg1, title=\"your_title_here\").mark_bar().encode(\n", " x=alt.X(\"ct_district\", scale=alt.Scale(domain=[1, 12])),\n", @@ -1786,12 +1899,12 @@ "### Finishing Touches \n", "* `.properties(width=400, height=250)` adjusts the size of your chart. \n", "* `tooltip=[columns you want]` gives you additional details on the columns you specify when you hover over each bar/circle/etc.\n", - "* `.mark_bar(size=30)` adjusts the size of the bar/circle/etc." + "* `.mark_bar(size=10)` adjusts the size of the bar/circle/etc." ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 45, "id": "8b85dd29-88cb-4b4b-b3b7-20ee1851335e", "metadata": {}, "outputs": [ @@ -1800,28 +1913,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, - "execution_count": 38, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -1894,11 +2007,12 @@ "source": [ "### We have only visualized one column of data. \n", "* We have only visualized one column of data, but we have a couple of columns above. \n", - "* Try to customize your grid. If you can dream it, you can probably do it with Altair. \n", - "* You can turn off the grid lines, rotate the axis labels by various degrees, label the bars, add a dropdown menu to change the axis, and more. \n", + "* Try to customize your graph. If you can dream it, you can probably do it with Altair. \n", + " * You can turn off the grid lines, rotate the axis labels by various degrees, label the bars, add a dropdown menu to change the axis, and more. \n", "* Make a few other charts in different styles.\n", - "* Altair's [gallery](https://altair-viz.github.io/gallery/index.html) is a great resource for inspiration.\n", - "* DDS's [portfolio](https://analysis.calitp.org/) also contains a plethora of examples.\n" + "* Inspiration\n", + " * Altair's [gallery](https://altair-viz.github.io/gallery/index.html)\n", + " * DDS's [portfolio](https://analysis.calitp.org/)\n" ] } ], diff --git a/starter_kit/2024_basics_03.ipynb b/starter_kit/2024_basics_03.ipynb index 89c3127f1..85796cd3d 100644 --- a/starter_kit/2024_basics_03.ipynb +++ b/starter_kit/2024_basics_03.ipynb @@ -39,7 +39,7 @@ "id": "8eec9257-7578-422c-b6d1-afe496e8ca70", "metadata": {}, "source": [ - "* Using a f-strings, load in your merged dataframe from Exercise 3." + "* Using a `f-string`, load in your merged dataframe from Exercise 3." ] }, { @@ -103,6 +103,7 @@ " project_name\n", " scope_of_work\n", " project_cost\n", + " lead_agency\n", " accessibility_score\n", " dac_accessibility_score\n", " dac_traffic_impacts_score\n", @@ -122,24 +123,25 @@ " \n", " \n", " 0\n", - " 2\n", + " 1\n", " Meadow Magic Multi-Use Path\n", " A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.\n", - " 6265525\n", - " 1\n", + " 5245734\n", + " Meadow Bunny Public Transportation (MBPT)\n", + " 2\n", " 8\n", - " 9\n", - " 3\n", - " 10\n", - " 3\n", " 8\n", + " 10\n", " 2\n", + " 3\n", + " 5\n", + " 3\n", " 2\n", + " 7\n", + " 6\n", + " 6\n", " 10\n", - " 4\n", - " 2\n", - " 4\n", - " 66\n", + " 72\n", " \n", " \n", "\n", @@ -147,25 +149,28 @@ ], "text/plain": [ " ct_district project_name \\\n", - "0 2 Meadow Magic Multi-Use Path \n", + "0 1 Meadow Magic Multi-Use Path \n", "\n", " scope_of_work \\\n", "0 A 2-mile Class I bike lane and multi-use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", "\n", - " project_cost accessibility_score dac_accessibility_score \\\n", - "0 6265525 1 8 \n", + " project_cost lead_agency \\\n", + "0 5245734 Meadow Bunny Public Transportation (MBPT) \n", + "\n", + " accessibility_score dac_accessibility_score dac_traffic_impacts_score \\\n", + "0 2 8 8 \n", "\n", - " dac_traffic_impacts_score freight_efficiency_score \\\n", - "0 9 3 \n", + " freight_efficiency_score freight_sustainability_score mode_shift_score \\\n", + "0 10 2 3 \n", "\n", - " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", - "0 10 3 8 \n", + " lu_natural_resources_score safety_score vmt_score zev_score \\\n", + "0 5 3 2 7 \n", "\n", - " safety_score vmt_score zev_score public_engagement_score \\\n", - "0 2 2 10 4 \n", + " public_engagement_score climate_resilience_score program_fit_score \\\n", + "0 6 6 10 \n", "\n", - " climate_resilience_score program_fit_score overall_score \n", - "0 2 4 66 " + " overall_score \n", + "0 72 " ] }, "execution_count": 6, @@ -183,8 +188,8 @@ "metadata": {}, "source": [ "## Categorizing\n", - "* There are 30 projects. They all vary in themes, some are transit oriented while others are focused on Active Transportation (ATP).\n", - "* Categorizing data is an important part of data cleaning and analyzing so we can present the data in a more succint and insightful way. \n", + "* There are 40+ projects. They all vary in themes, some are transit oriented while others are focused on Active Transportation (ATP).\n", + "* Categorizing data is an important part of data cleaning and analyzing so we can present the data on a more succinct, broader level. \n", "* Let's organize projects into three categories.\n", " * ATP\n", " * Transit\n", @@ -211,7 +216,7 @@ "source": [ "transit = [\"transit\", \"passenger rail\", \"bus\", \"ferry\"]\n", "atp = [\"bike\", \"pedestrian\", \"bicycle\", \"sidewalk\", \"path\"]\n", - "general_lanes = [\"general\", \"auxiliary\"]" + "general_lanes = [\"general\", \"auxiliary\", \"highway\"]" ] }, { @@ -221,9 +226,9 @@ "source": [ "#### Step 1: Cleaning\n", "* Remember in Exercise 2 some of the project names didn't merge between the two dataframes?\n", - "* In the real world, a lot of string data can be spelled in different ways, different cases, abbreviated, and the like.\n", - "* The easiest way to clean this up is by lowercasing, stripping the white spaces, and replacing characters.\n", - "* Also, by simplifying a string column, we can search through it easier. " + "* In the real world, you won't have the bandwidth and time to replace each individual string value with a dictionary.\n", + "* An easy way to clean most of the values up is by lowercasing, stripping the white spaces, and replacing characters.\n", + "* In our goal of categorizing values, we can search through it easier when we clean up the string values." ] }, { @@ -236,7 +241,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_493/3600759827.py:2: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.\n", + "/tmp/ipykernel_2254/3600759827.py:2: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.\n", " df.scope_of_work.str.lower()\n" ] } @@ -258,24 +263,16 @@ "source": [ "* `str.contains()` allows you to search through the column. \n", "* Let's search for projects that have \"transit\" in their descriptions. \n", - "* Tip\n", - " * The data we work with tends to be pretty wide. Scrolling horizontally gets tiresome.\n", - " * Placing all the columns you want to temporarily work within a `list` like `preview_subset` below is a good idea. " + "* There are many modifications you can make to `str.contains()`. Try them out and see what happens.\n", + " * `df.loc[df.scope_of_work.str.contains(\"transit\", case=False)]` \n", + " * Will search through your column without matching the case. It'll return rows with both \"Transit\" and \"transit\".\n", + " * `df.scope_of_work.str.contains(\"transit\", case=False, regex=False) `\n", + " * Will return any matches that include `transit` rather than an exact match. It'll return rows with values like \"transit\" and \"Transitory\"." ] }, { "cell_type": "code", "execution_count": 9, - "id": "315228d8-a72e-4f18-a0e7-2a254c87cc23", - "metadata": {}, - "outputs": [], - "source": [ - "preview_subset = [\"project_name\", \"scope_of_work\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 10, "id": "be843d6a-b751-4e9f-8820-b521089914d3", "metadata": {}, "outputs": [], @@ -289,12 +286,15 @@ "metadata": {}, "source": [ "* Let's see how many transit projects are in this dataset.\n", - "* Let's read through the Scope of Work to make sure it's what we expect." + "* Let's read through the Scope of Work to make sure it's what we expect.\n", + "* Tip\n", + " * The data we work with tends to be pretty wide. Scrolling horizontally gets tiresome.\n", + " * Placing all the columns you want to temporarily work within a `list` like `preview_subset` below is a good idea. " ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "0d9a6259-8748-41fe-a549-01bdf0e9c273", "metadata": {}, "outputs": [ @@ -304,7 +304,7 @@ "7" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -313,6 +313,16 @@ "len(transit_only_projects)" ] }, + { + "cell_type": "code", + "execution_count": 11, + "id": "315228d8-a72e-4f18-a0e7-2a254c87cc23", + "metadata": {}, + "outputs": [], + "source": [ + "preview_subset = [\"project_name\", \"scope_of_work\"]" + ] + }, { "cell_type": "code", "execution_count": 12, @@ -420,11 +430,11 @@ "source": [ "#### Step 2: Filtering\n", "* We've found all the projects that says \"transit\" somewhere in its description. \n", - "* Now there are just many more elements to go. We forgot about bikes, bus, rail..\n", - "* However, the method we used above leaves us with multiple dataframes. We actually just want our one original dataframe tagged with categories. \n", - "* A faster way: join all the keywords you want.\n", - "* | designates \"or\".\n", - "* You can read this as \"I want projects that contain the word bus, transit, or rail...\"" + "* Now there are just many more elements to go. We forgot about bikes, bus, rail, so on and so forth.\n", + "* The method above leaves us with multiple dataframes. We actually just want our one original dataframe tagged with categories. \n", + "* A faster way: join all the keywords you want into one large string.\n", + " * | designates \"or\".\n", + " * You can read `transit_keywords` as \"I want projects that contain the word transit or passenger rai or bus or ferry\"" ] }, { @@ -464,8 +474,7 @@ "id": "937913db-407e-415c-aabb-31d3f511ef0b", "metadata": {}, "source": [ - "* Filter again - notice the .loc after df and how there are brackets around `df`?\n", - "* How many more projects appear when we filter for 3 additional transit related keywords, compared to only transit?" + "* Filter again - notice the .loc after df and how there are brackets around `df`?\n" ] }, { @@ -478,7 +487,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_493/1070197006.py:1: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + "/tmp/ipykernel_2254/1070197006.py:1: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", " df.loc[df.scope_of_work.str.contains(transit_keywords)][preview_subset]\n" ] }, @@ -590,6 +599,14 @@ "df.loc[df.scope_of_work.str.contains(transit_keywords)][preview_subset]" ] }, + { + "cell_type": "markdown", + "id": "c82ef0b7-d2c9-48d1-a53f-625fb083e196", + "metadata": {}, + "source": [ + "* Notice how many more projects appear when we filter for 3 additional transit related keywords, compared to only transit?" + ] + }, { "cell_type": "code", "execution_count": 16, @@ -608,7 +625,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_493/2770509021.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + "/tmp/ipykernel_2254/2770509021.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", " print(len(df.loc[df.scope_of_work.str.contains(transit_keywords)]))\n" ] } @@ -625,7 +642,8 @@ "source": [ "\n", "* Let's put this all together. \n", - "* I want any project that contains a transit component to be tagged as \"Y\" in a column called \"Transit\". If a project doesn't have a transit component, it gets tagged as a \"N\"." + "* I want any project that contains a transit component to be tagged as \"Y\" in a column called \"Transit\". \n", + "* If a project doesn't have a transit component, it gets tagged as a \"N\"." ] }, { @@ -638,7 +656,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_493/653877654.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + "/tmp/ipykernel_2254/653877654.py:2: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", " (df.scope_of_work.str.contains(transit_keywords)),\n" ] } @@ -656,7 +674,7 @@ "id": "dfe862f0-f77e-4bf5-8710-888d3a8d7a4c", "metadata": {}, "source": [ - "* Using `value_counts()` we can see the breakdown of transit related projects." + "* Using `value_counts()` we can see the total of transit related vs non-transit related projects." ] }, { @@ -701,7 +719,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 19, "id": "8c62fef2-8215-4983-a4e6-c671177b822f", "metadata": {}, "outputs": [ @@ -711,7 +729,7 @@ "44" ] }, - "execution_count": 44, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -730,7 +748,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 20, "id": "0659a036-76ad-4251-80a1-323a0a04c912", "metadata": {}, "outputs": [ @@ -740,7 +758,7 @@ "pandas.core.frame.DataFrame" ] }, - "execution_count": 45, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -751,7 +769,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 21, "id": "2985ec16-35e1-4eae-b2c5-facb354ce4e5", "metadata": {}, "outputs": [ @@ -761,7 +779,7 @@ "str" ] }, - "execution_count": 49, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -772,7 +790,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 22, "id": "65c6b0c7-a314-434f-8304-10afd6c84514", "metadata": {}, "outputs": [ @@ -782,7 +800,7 @@ "list" ] }, - "execution_count": 48, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -799,14 +817,14 @@ }, "source": [ "### Practice with outside resources\n", - "* Functions are incredibly important.**Please spend more time than usual on this section and practice the tutorials linked.**\n", - "* [Please read this great tutorial.](https://www.practicalpythonfordatascience.com/00_python_crash_course_functions)\n", - "* [And refer to this page on our docs.](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)" + "* Functions are incredibly important as such, **please spend more time than usual on this section and practice the tutorials linked.**\n", + "* [Tutorial #1 Practical Python for Data Science.](https://www.practicalpythonfordatascience.com/00_python_crash_course_functions)\n", + "* [DDS Functions.](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 23, "id": "00ead246-8879-4075-a632-d0ded58df558", "metadata": {}, "outputs": [], @@ -822,13 +840,13 @@ }, "source": [ "#### Let's build a function together.\n", - "* This will be repetitive after the tutorials, but you will use functions all the time at DDS and it's one of the most critical concepts to grasp.\n", + "* This will be repetitive after the tutorials, but you will use functions all the time at DDS and this is a concept we would like to drive home.\n", "* Start your function with `def():`` and the name you'd like." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 24, "id": "97e597a2-8625-4f2b-8646-760c0c011208", "metadata": {}, "outputs": [], @@ -845,12 +863,13 @@ "* We merely want to substitute `transit_keywords` with ATP or General Lane related keywords.\n", "* Instead of the `df[\"Transit]\"`, we want to create two new columns called something like `df[\"ATP]\"` and `df[\"General_Lanes]\"` to hold our yes/no results.\n", "* Add the two elements that need to be substituted into the argument of your function.\n", - " * It's good practice to specify what exactly the parameter should be: a string/list/dataframe. " + " * It's good practice to specify what exactly the parameter should be: a string/list/dataframe/etc. \n", + " * Including this detail make it easier for your coworkers to read and use your code." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 25, "id": "61973dc6-d99b-48f0-842f-a3c8fe74f064", "metadata": {}, "outputs": [], @@ -869,7 +888,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 26, "id": "a794693a-3bf2-48ba-b0a7-1ca3a41e03af", "metadata": {}, "outputs": [], @@ -891,7 +910,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 27, "id": "4721b564-726a-4e05-9d27-8035609b5fcf", "metadata": {}, "outputs": [], @@ -921,7 +940,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 28, "id": "23e31c98-17b3-41e2-883a-14dae9d6da7e", "metadata": {}, "outputs": [ @@ -929,8 +948,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_493/1188347530.py:5: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + "/tmp/ipykernel_2254/2245515441.py:7: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)),\n" ] } ], @@ -940,7 +959,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 29, "id": "d5ec64cf-432c-45e2-b14d-f4ea7ca3de2a", "metadata": {}, "outputs": [ @@ -952,7 +971,7 @@ "Name: ATP, dtype: int64" ] }, - "execution_count": 25, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -963,7 +982,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 30, "id": "882a02a6-ce39-4da2-b2be-7e91322624e4", "metadata": {}, "outputs": [ @@ -971,8 +990,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_493/1188347530.py:5: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + "/tmp/ipykernel_2254/2245515441.py:7: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)),\n" ] } ], @@ -982,7 +1001,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 31, "id": "ee56ee97-307c-44a4-a2d4-b02eff954f87", "metadata": {}, "outputs": [ @@ -990,8 +1009,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_493/1188347530.py:5: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", - " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)), # Why do you think \"Scope of Work\" has quotation marks around it?\n" + "/tmp/ipykernel_2254/2245515441.py:7: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n", + " df[new_column] = np.where((df.scope_of_work.str.contains(joined_keywords)),\n" ] } ], @@ -1001,19 +1020,19 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 32, "id": "96f2efba-4179-4a8c-b969-fd2990f8a129", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "N 40\n", - "Y 4\n", + "N 35\n", + "Y 9\n", "Name: General_Lanes, dtype: int64" ] }, - "execution_count": 28, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1027,6 +1046,7 @@ "id": "405aac8e-4488-47fa-bbb1-a12121ed8d15", "metadata": {}, "source": [ + "#### Check out your results\n", "* Use the `groupby` technique from Exercise 2 to get some descriptive statistics for these 3 new columns\n", "* Use `.reset_index()` after `aggregate()` to see what happens.\n", "* Try `.reset_index(drop = True)` as well. " @@ -1034,7 +1054,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 33, "id": "62115dcb-ea34-4bb1-9bd1-e678ec015b8c", "metadata": {}, "outputs": [ @@ -1072,7 +1092,7 @@ " N\n", " N\n", " N\n", - " 20\n", + " 15\n", " 73.00\n", " \n", " \n", @@ -1081,7 +1101,7 @@ " N\n", " Y\n", " 11\n", - " 70.00\n", + " 72.00\n", " \n", " \n", " 2\n", @@ -1089,7 +1109,7 @@ " Y\n", " N\n", " 8\n", - " 68.00\n", + " 75.00\n", " \n", " \n", " 3\n", @@ -1097,15 +1117,15 @@ " Y\n", " Y\n", " 1\n", - " 73.00\n", + " 75.00\n", " \n", " \n", " 4\n", " Y\n", " N\n", " N\n", - " 2\n", - " 75.50\n", + " 7\n", + " 73.00\n", " \n", " \n", " 5\n", @@ -1113,7 +1133,7 @@ " N\n", " Y\n", " 2\n", - " 83.00\n", + " 82.00\n", " \n", " \n", "\n", @@ -1121,15 +1141,15 @@ ], "text/plain": [ " General_Lanes Transit ATP project_name overall_score\n", - "0 N N N 20 73.00\n", - "1 N N Y 11 70.00\n", - "2 N Y N 8 68.00\n", - "3 N Y Y 1 73.00\n", - "4 Y N N 2 75.50\n", - "5 Y N Y 2 83.00" + "0 N N N 15 73.00\n", + "1 N N Y 11 72.00\n", + "2 N Y N 8 75.00\n", + "3 N Y Y 1 75.00\n", + "4 Y N N 7 73.00\n", + "5 Y N Y 2 82.00" ] }, - "execution_count": 29, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1142,27 +1162,45 @@ }, { "cell_type": "markdown", - "id": "54c05583-16c9-4a3a-9dc0-36b4a709faee", + "id": "e17c3e18-5f55-4a00-9919-b1f0c826b77f", "metadata": {}, "source": [ "## Function + If-Else\n", "* There are many cases in which we want to categorize our columns to create broader groups for summarizing and aggregating.\n", "* Using a function with an If-Else clause will help us accomplish this goal.\n", - "* Goal: \n", - " * We are going to write an If-Else function that categorizes projects by whether it scored low, medium, or high based on its `overall_score`.\n", - " * If a project scores below the 25% percentile, it is a \"low scoring project\".\n", - " * If a project scores above the 25% percentile but below the 75% percentile, it is a \"medium scoring project\".\n", - " * Anything above the 75% percentile is \"high scoring\".\n", - " * Use the values you find from .describe() as reference.\n", - " * You aren't limited to only the 25th, 50th, and 75th percentile. Try some other percentiles.\n", - " * You can do so by specifying within `describe` like `.describe(percentiles=[0.05, 0.1, 0.9, 0.95])`.\n", - " * You can save whatever percentile you like using `p75 = df.overall_score.quantile(0.75).astype(float)`.\n", - "* Resources for further reading:\n", + "* **Resources:**\n", " * [DDS Apply Docs](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#functions)\n", " * [DDS If-Else Tutorial](https://docs.calitp.org/data-infra/analytics_new_analysts/01-data-analysis-intro.html#if-else-statements)\n", + " \n", " " ] }, + { + "cell_type": "code", + "execution_count": 34, + "id": "6d824c18-4c2b-41c9-950b-866e567ab7f5", + "metadata": {}, + "outputs": [], + "source": [ + "# Practice here." + ] + }, + { + "cell_type": "markdown", + "id": "212570f5-e8ed-4151-be24-dd0994304334", + "metadata": {}, + "source": [ + "Goal: \n", + "* We are going to write an If-Else function that categorizes projects by whether it scored low, medium, or high based on its `overall_score` and percentiles.\n", + "* For example, if a project scores below the 25% percentile, it is a \"low scoring project\". If a project scores above the 25% percentile but below the 75% percentile, it is a \"medium scoring project\". Anything above the 75% percentile is \"high scoring\".\n", + "* Use the values you find from .describe() as reference.\n", + "* You aren't limited to only the 25th, 50th, and 75th percentile. You can categorize low,medium, and high based on other percentile ranges. \n", + " * You can do so by specifying within `describe` like `.describe(percentiles=[0.05, 0.1, 0.9, 0.95])`.\n", + "* In Data Science, we like to save our work into variables.\n", + " * If new projects are added, then what determines the different percentiles will likely switch.\n", + " * As such, you can save whatever percentile you like using `p75 = df.overall_score.quantile(0.75).astype(float)` which will change along with the dataset when you load in the new data." + ] + }, { "cell_type": "markdown", "id": "d91c41b1-76c4-4673-b16f-ef9990d66270", @@ -1182,7 +1220,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 35, "id": "d560dad0-de03-4469-99f8-5fadd9b198dc", "metadata": {}, "outputs": [], @@ -1206,7 +1244,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 36, "id": "f8b7d946-c724-43cb-9a93-d1003f7f024f", "metadata": {}, "outputs": [], @@ -1225,7 +1263,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 37, "id": "f18a7754-907c-46fa-ad77-4a09abb03206", "metadata": {}, "outputs": [ @@ -1254,6 +1292,7 @@ " project_name\n", " scope_of_work\n", " project_cost\n", + " lead_agency\n", " accessibility_score\n", " dac_accessibility_score\n", " dac_traffic_impacts_score\n", @@ -1277,24 +1316,25 @@ " \n", " \n", " 0\n", - " 2\n", + " 1\n", " Meadow Magic Multi-Use Path\n", " a 2 mile class i bike lane and multi use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife.\n", - " 6265525\n", - " 1\n", + " 5245734\n", + " Meadow Bunny Public Transportation (MBPT)\n", + " 2\n", " 8\n", - " 9\n", - " 3\n", - " 10\n", - " 3\n", " 8\n", + " 10\n", " 2\n", + " 3\n", + " 5\n", + " 3\n", " 2\n", + " 7\n", + " 6\n", + " 6\n", " 10\n", - " 4\n", - " 2\n", - " 4\n", - " 66\n", + " 72\n", " N\n", " Y\n", " N\n", @@ -1306,31 +1346,31 @@ ], "text/plain": [ " ct_district project_name \\\n", - "0 2 Meadow Magic Multi-Use Path \n", + "0 1 Meadow Magic Multi-Use Path \n", "\n", " scope_of_work \\\n", "0 a 2 mile class i bike lane and multi use path through a scenic meadow, featuring wildflower plantings, public art installations, and educational signage highlighting local wildlife. \n", "\n", - " project_cost accessibility_score dac_accessibility_score \\\n", - "0 6265525 1 8 \n", + " project_cost lead_agency \\\n", + "0 5245734 Meadow Bunny Public Transportation (MBPT) \n", "\n", - " dac_traffic_impacts_score freight_efficiency_score \\\n", - "0 9 3 \n", + " accessibility_score dac_accessibility_score dac_traffic_impacts_score \\\n", + "0 2 8 8 \n", "\n", - " freight_sustainability_score mode_shift_score lu_natural_resources_score \\\n", - "0 10 3 8 \n", + " freight_efficiency_score freight_sustainability_score mode_shift_score \\\n", + "0 10 2 3 \n", "\n", - " safety_score vmt_score zev_score public_engagement_score \\\n", - "0 2 2 10 4 \n", + " lu_natural_resources_score safety_score vmt_score zev_score \\\n", + "0 5 3 2 7 \n", "\n", - " climate_resilience_score program_fit_score overall_score Transit ATP \\\n", - "0 2 4 66 N Y \n", + " public_engagement_score climate_resilience_score program_fit_score \\\n", + "0 6 6 10 \n", "\n", - " General_Lanes category \n", - "0 N ATP " + " overall_score Transit ATP General_Lanes category \n", + "0 72 N Y N ATP " ] }, - "execution_count": 32, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1341,7 +1381,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 38, "id": "2245ce0c-97fb-4f08-9791-9fb6b28b49c7", "metadata": {}, "outputs": [], @@ -1362,7 +1402,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 39, "id": "48495a9f-e29c-41eb-b3e7-de6371fbd182", "metadata": {}, "outputs": [ @@ -1400,7 +1440,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 40, "id": "fca9e430-a906-4d0e-8046-36a0687b0636", "metadata": {}, "outputs": [ @@ -1415,12 +1455,12 @@ "data": { "text/plain": [ "count 44.00\n", - "mean 4.98\n", + "mean 6.00\n", "std 2.96\n", "min 1.00\n", - "25% 3.00\n", - "50% 4.00\n", - "75% 7.25\n", + "25% 3.75\n", + "50% 6.50\n", + "75% 8.00\n", "max 10.00\n", "Name: zev_score, dtype: float64" ] @@ -1439,12 +1479,12 @@ "data": { "text/plain": [ "count 44.00\n", - "mean 5.66\n", - "std 3.04\n", + "mean 4.52\n", + "std 2.73\n", "min 1.00\n", - "25% 2.75\n", - "50% 6.00\n", - "75% 8.00\n", + "25% 2.00\n", + "50% 4.00\n", + "75% 6.00\n", "max 10.00\n", "Name: vmt_score, dtype: float64" ] @@ -1463,12 +1503,12 @@ "data": { "text/plain": [ "count 44.00\n", - "mean 5.39\n", - "std 3.14\n", + "mean 5.14\n", + "std 2.66\n", "min 1.00\n", - "25% 2.75\n", + "25% 3.00\n", "50% 5.00\n", - "75% 8.00\n", + "75% 7.00\n", "max 10.00\n", "Name: accessibility_score, dtype: float64" ] @@ -1488,13 +1528,13 @@ "id": "ded54884-4bad-46ae-a82f-2a67936c57dd", "metadata": {}, "source": [ - "#### Using a For Loop\n", + "### Practice using a for loop\n", "* Below, I have already aggregated the dataframe for you." ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 41, "id": "5b414d3f-71a4-4078-9d98-b9082114e2c5", "metadata": {}, "outputs": [], @@ -1517,7 +1557,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 42, "id": "1698fe9c-6d1f-412b-a632-826aae1ffc65", "metadata": {}, "outputs": [ @@ -1552,43 +1592,43 @@ " \n", " 0\n", " ATP\n", - " 70.00\n", - " 6238994.00\n", + " 72.00\n", + " 4991255.00\n", " 11\n", " \n", " \n", " 1\n", " General Lanes\n", - " 75.50\n", - " 4172279.00\n", - " 2\n", + " 73.00\n", + " 7487963.00\n", + " 7\n", " \n", " \n", " 2\n", " General Lanes and ATP\n", - " 83.00\n", - " 8663951.00\n", + " 82.00\n", + " 5672550.50\n", " 2\n", " \n", " \n", " 3\n", " Other\n", " 73.00\n", - " 5232062.00\n", - " 20\n", + " 3708858.00\n", + " 15\n", " \n", " \n", " 4\n", " Transit\n", - " 68.00\n", - " 3510634.00\n", + " 75.00\n", + " 4399886.00\n", " 8\n", " \n", " \n", " 5\n", " Transit and ATP\n", - " 73.00\n", - " 7285919.00\n", + " 75.00\n", + " 2069143.00\n", " 1\n", " \n", " \n", @@ -1597,15 +1637,15 @@ ], "text/plain": [ " category median_score median_project_cost total_projects\n", - "0 ATP 70.00 6238994.00 11\n", - "1 General Lanes 75.50 4172279.00 2\n", - "2 General Lanes and ATP 83.00 8663951.00 2\n", - "3 Other 73.00 5232062.00 20\n", - "4 Transit 68.00 3510634.00 8\n", - "5 Transit and ATP 73.00 7285919.00 1" + "0 ATP 72.00 4991255.00 11\n", + "1 General Lanes 73.00 7487963.00 7\n", + "2 General Lanes and ATP 82.00 5672550.50 2\n", + "3 Other 73.00 3708858.00 15\n", + "4 Transit 75.00 4399886.00 8\n", + "5 Transit and ATP 75.00 2069143.00 1" ] }, - "execution_count": 38, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1624,7 +1664,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 43, "id": "320bd91e-b9ed-4423-80d4-c1a1aa5ba59f", "metadata": {}, "outputs": [], @@ -1660,7 +1700,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 44, "id": "a6103703-8131-4ed8-9482-314c7895c279", "metadata": {}, "outputs": [ @@ -1669,28 +1709,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, - "execution_count": 40, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1760,7 +1800,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 45, "id": "ca8659f1-0842-4bb5-a544-9a2a5fb93c02", "metadata": {}, "outputs": [ @@ -1769,28 +1809,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ @@ -1846,28 +1886,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ @@ -1923,28 +1963,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ @@ -2000,6 +2040,15 @@ "for column in [\"median_score\", \"median_project_cost\", \"total_projects\"]:\n", " display(create_chart(agg1, column))" ] + }, + { + "cell_type": "markdown", + "id": "0f77dcf4-7b19-4e58-b20b-ae59721deb9c", + "metadata": {}, + "source": [ + "### Try it out yourself\n", + "* Think of some other use cases for a for loop and try them out here." + ] } ], "metadata": { diff --git a/starter_kit/2024_basics_04.ipynb b/starter_kit/2024_basics_04.ipynb index e38d70769..c36cc6a54 100644 --- a/starter_kit/2024_basics_04.ipynb +++ b/starter_kit/2024_basics_04.ipynb @@ -47,9 +47,9 @@ "## Python Scripts\n", "* Up until now, we have been placing all of our code in the Jupyter Notebook.\n", "* While this is convenient, it's not the best practice. \n", - "* A notebook full of code isn't easy to digest. \n", - "* Jupyter notebooks are also very difficult for Git to version control. Everything gets jumbled. \n", - "* The best solution is to move the bulk of your code when you have reached a stopping point to a Python Script. \n", + "* A notebook full of code isn't easy for viewers - it gets chaotic, quickly! \n", + "* Jupyter notebooks are also very difficult for Git to version control. \n", + "* **The best solution is to move the bulk of your code when you have reached a stopping point to a Python Script.**\n", " * Read all about the benefits of scripts [here in our DDS docs](https://docs.calitp.org/data-infra/analytics_tools/scripts.html).\n", " * Summary points from the docs page above:\n", " * Python scripts (.py) are plain text files. Git tracks plain text changes easily.\n", @@ -58,8 +58,7 @@ " * All functions used in scripts should have docstrings. Type hints are encouraged!\n", "* Making Python scripts is an art and not straight forward.\n", "* I have already populated a `.py` file called `_starterkit_utils` with some sample functions.\n", - " * I have imported my Python Script just like how I imported my other dependencies (Pandas, Altair, Numpy).\n", - " * Read about dependencies [here](https://www.practicalpythonfordatascience.com/05_data_exploration)." + "* I imported my Python Script just like how I imported my other dependencies (Pandas, Altair, Numpy)." ] }, { @@ -79,15 +78,64 @@ "source": [ "### Breakdown of a Script.\n", "#### Function 1\n", + "* You can also preview what a function does by writing `script_name.function_name??`\n", + "\n", "* Following what the DDS docs says, I am creating a new function every time I am processing the data in another stage.\n", - "* I have one function that loads in my dataset.\n", - "* Take a look at the column names: they are no longer in `snakecase` because I applied a function that capitalizes it properly.\n", - "* To use a function in a Script, write `name_of_your_script.name_of_the_function(whatever arguments)`" + "* I have one function that loads in my dataset." ] }, { "cell_type": "code", "execution_count": 4, + "id": "3454fecc-0b6b-4f1f-b74d-17792165f990", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mSignature:\u001b[0m \u001b[0m_starterkit_utils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload_dataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mSource:\u001b[0m \n", + "\u001b[0;32mdef\u001b[0m \u001b[0mload_dataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m->\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", + "\u001b[0;34m Load the final dataframe.\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mGCS_FILE_PATH\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"gs://calitp-analytics-data/data-analyses/starter_kit/\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mFILE\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"starter_kit_example_categorized.parquet\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Read dataframe in\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_parquet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{GCS_FILE_PATH}{FILE}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Capitalize the Scope of Work column again since it is all lowercase\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscope_of_work\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscope_of_work\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcapitalize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Clean up the column names\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreverse_snakecase\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFile:\u001b[0m ~/data-analyses/starter_kit/_starterkit_utils.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "_starterkit_utils.load_dataset??" + ] + }, + { + "cell_type": "markdown", + "id": "a5effa3c-cdb4-4aa4-870f-75f78e8461ad", + "metadata": {}, + "source": [ + "\n", + "* To use a function in a Script, write `name_of_your_script.name_of_the_function(whatever arguments)`\n", + "* Take a look at the column names: they are no longer in `snakecase` because I applied a function that capitalizes it properly." + ] + }, + { + "cell_type": "code", + "execution_count": 5, "id": "44467ccf-599f-4662-8164-8a58fac85711", "metadata": {}, "outputs": [], @@ -102,12 +150,63 @@ "source": [ "#### Function 2:\n", "* After loading in the dataset from GCS, I am entering my second stage of processing the data.\n", - "* I am aggregating my dataframe by Category, basically the same function in Exercise 3. " + "* I am aggregating my dataframe by category. " ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, + "id": "0d82c825-d789-469e-8ae2-c69a94984511", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mSignature:\u001b[0m \u001b[0m_starterkit_utils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maggregate_by_category\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mSource:\u001b[0m \n", + "\u001b[0;32mdef\u001b[0m \u001b[0maggregate_by_category\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", + "\u001b[0;34m Find the median overall score and project cost \u001b[0m\n", + "\u001b[0;34m and total unique projects by category.\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0magg1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Category\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0maggregate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Overall Score\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"median\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Project Cost\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"median\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Project Name\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"nunique\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mreset_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mrename\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Overall Score\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"Median Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Project Cost\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"Median Project Cost\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Project Name\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"Total Projects\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Format the Cost column properly\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0magg1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Median Project Cost'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0magg1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Median Project Cost'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'${:,.0f}'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0magg1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFile:\u001b[0m ~/data-analyses/starter_kit/_starterkit_utils.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "_starterkit_utils.aggregate_by_category??" + ] + }, + { + "cell_type": "code", + "execution_count": 7, "id": "f9635fe8-a6c7-4813-9f25-7ba555ce9726", "metadata": {}, "outputs": [], @@ -117,7 +216,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "2bdcb3e6-2add-4af6-a20a-9072b7ba075c", "metadata": {}, "outputs": [ @@ -152,43 +251,43 @@ " \n", " 0\n", " ATP\n", - " 70.00\n", - " $6,238,994\n", + " 72.00\n", + " $4,991,255\n", " 11\n", " \n", " \n", " 1\n", " General Lanes\n", - " 75.50\n", - " $4,172,279\n", - " 2\n", + " 73.00\n", + " $7,487,963\n", + " 7\n", " \n", " \n", " 2\n", " General Lanes and ATP\n", - " 83.00\n", - " $8,663,951\n", + " 82.00\n", + " $5,672,550\n", " 2\n", " \n", " \n", " 3\n", " Other\n", " 73.00\n", - " $5,232,062\n", - " 20\n", + " $3,708,858\n", + " 15\n", " \n", " \n", " 4\n", " Transit\n", - " 68.00\n", - " $3,510,634\n", + " 75.00\n", + " $4,399,886\n", " 8\n", " \n", " \n", " 5\n", " Transit and ATP\n", - " 73.00\n", - " $7,285,919\n", + " 75.00\n", + " $2,069,143\n", " 1\n", " \n", " \n", @@ -197,15 +296,15 @@ ], "text/plain": [ " Category Median Score Median Project Cost Total Projects\n", - "0 ATP 70.00 $6,238,994 11\n", - "1 General Lanes 75.50 $4,172,279 2\n", - "2 General Lanes and ATP 83.00 $8,663,951 2\n", - "3 Other 73.00 $5,232,062 20\n", - "4 Transit 68.00 $3,510,634 8\n", - "5 Transit and ATP 73.00 $7,285,919 1" + "0 ATP 72.00 $4,991,255 11\n", + "1 General Lanes 73.00 $7,487,963 7\n", + "2 General Lanes and ATP 82.00 $5,672,550 2\n", + "3 Other 73.00 $3,708,858 15\n", + "4 Transit 75.00 $4,399,886 8\n", + "5 Transit and ATP 75.00 $2,069,143 1" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -227,7 +326,57 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, + "id": "2b0231f0-eb97-46d4-9541-aee43b138755", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mSignature:\u001b[0m \u001b[0m_starterkit_utils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwide_to_long\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mSource:\u001b[0m \n", + "\u001b[0;32mdef\u001b[0m \u001b[0mwide_to_long\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m->\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", + "\u001b[0;34m Change the dataframe from wide to long based on the project name and\u001b[0m\n", + "\u001b[0;34m Caltrans District.\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdf2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmelt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mid_vars\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"CalTrans District\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\"Project Name\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mvalue_vars\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Accessibility Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"DAC Accessibility Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"DAC Traffic Impacts Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Freight Efficiency Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Freight Sustainability Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Mode Shift Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Landuse Natural Resources Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Safety Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"VMT Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"ZEV Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Public Engagement Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Climate Resilience Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Program Fit Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdf2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrename\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcolumns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'variable'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m'Metric'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m'value'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m'Score'\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdf2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFile:\u001b[0m ~/data-analyses/starter_kit/_starterkit_utils.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "_starterkit_utils.wide_to_long??" + ] + }, + { + "cell_type": "code", + "execution_count": 10, "id": "82172952-3d59-436e-b08c-7096454b6e04", "metadata": {}, "outputs": [], @@ -237,7 +386,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "id": "1bcac91b-b0a1-4efd-8a73-f019c376d030", "metadata": {}, "outputs": [ @@ -271,17 +420,17 @@ " \n", " \n", " 0\n", - " 2\n", + " 1\n", " Meadow Magic Multi-Use Path\n", " Accessibility Score\n", - " 1\n", + " 2\n", " \n", " \n", " 1\n", - " 3\n", + " 4\n", " Bunny Hop Bike Boulevard\n", " Accessibility Score\n", - " 9\n", + " 3\n", " \n", " \n", "\n", @@ -289,11 +438,11 @@ ], "text/plain": [ " CalTrans District Project Name Metric Score\n", - "0 2 Meadow Magic Multi-Use Path Accessibility Score 1\n", - "1 3 Bunny Hop Bike Boulevard Accessibility Score 9" + "0 1 Meadow Magic Multi-Use Path Accessibility Score 2\n", + "1 4 Bunny Hop Bike Boulevard Accessibility Score 3" ] }, - "execution_count": 8, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -314,7 +463,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "id": "d69a4f91-4e37-4207-93e0-2eaa18f998ff", "metadata": {}, "outputs": [ @@ -322,62 +471,62 @@ "data": { "text/html": [ "\n", - "\n", + "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
CategoryMedian ScoreMedian Project CostTotal ProjectsCategoryMedian ScoreMedian Project CostTotal Projects
ATP70$6,238,99411ATP72$4,991,25511
General Lanes76$4,172,2792General Lanes73$7,487,9637
General Lanes and ATP83$8,663,9512General Lanes and ATP82$5,672,5502
Other73$5,232,06220Other73$3,708,85815
Transit68$3,510,6348Transit75$4,399,8868
Transit and ATP73$7,285,9191Transit and ATP75$2,069,1431
\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -399,17 +548,67 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "cb9bee7d-62df-4a0d-8ab2-483bb0d977f2", + "execution_count": 13, + "id": "1e2ec6b7-b494-4db5-a863-91882c77a7a8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mSignature:\u001b[0m \u001b[0m_starterkit_utils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcreate_metric_chart\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0maltair\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvegalite\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mv5\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mChart\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mSource:\u001b[0m \n", + "\u001b[0;32mdef\u001b[0m \u001b[0mcreate_metric_chart\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0malt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mChart\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", + "\u001b[0;34m Create a chart that displays metric scores\u001b[0m\n", + "\u001b[0;34m for each project.\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Create dropdown\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mmetrics_list\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Metric\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mmetrics_dropdown\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0malt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbinding_select\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmetrics_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"Metrics: \"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Column that controls the bar charts\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mxcol_param\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0malt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mselection_point\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mfields\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Metric\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmetrics_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmetrics_dropdown\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mchart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0malt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mChart\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtitle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"Metric by Categories\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mmark_circle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m200\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0malt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Score\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscale\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0malt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mScale\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0malt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mY\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Project Name\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mcolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0malt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mColor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"Score\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mscale\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0malt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mScale\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcalitp_color_palette\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCALITP_CATEGORY_BRIGHT_COLORS\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mtooltip\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mproperties\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m400\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m250\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mchart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mchart\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_params\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxcol_param\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform_filter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxcol_param\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mchart\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFile:\u001b[0m ~/data-analyses/starter_kit/_starterkit_utils.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "d2_wide_df = df2.loc[df2[\"CalTrans District\"] == 2].reset_index(drop=True)" + "_starterkit_utils.create_metric_chart??" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "id": "7f39ca4e-9fb9-497d-bee6-22be385a9d34", "metadata": {}, "outputs": [ @@ -418,28 +617,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ - "alt.Chart(...)" + "alt.Chart(...)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "_starterkit_utils.create_metric_chart(df2)" + ] + }, + { + "cell_type": "markdown", + "id": "e268d5f7-30f6-4b36-bfa3-1391dfa772f9", + "metadata": {}, + "source": [ + "## Grains\n", + "* This is a light introduction to the concept of grains.\n", + "* Grain means the level your dataset is presented at.\n", + "* You can think of it as: what does each row represent?\n", + "* The original dataset is presented on the project-level grain because each row represents a unique project. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "bb228391-f907-4d76-a2b5-45b7fd188d21", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Project NameOverall Score
0Meadow Magic Multi-Use Path72
1Bunny Hop Bike Boulevard68
2Strawberry Shortcake Sidewalks87
3River Ramble Rabbit Trail75
4Lilac Lane Dream Complete Street72
\n", + "
" + ], + "text/plain": [ + " Project Name Overall Score\n", + "0 Meadow Magic Multi-Use Path 72\n", + "1 Bunny Hop Bike Boulevard 68\n", + "2 Strawberry Shortcake Sidewalks 87\n", + "3 River Ramble Rabbit Trail 75\n", + "4 Lilac Lane Dream Complete Street 72" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[[\"Project Name\", \"Overall Score\"]].head()" + ] + }, + { + "cell_type": "markdown", + "id": "69b70b73-4dba-4280-a385-99d0c2d06018", + "metadata": {}, + "source": [ + "* If we aggregate the dataset using Caltrans District, then this dataset would be on the district gain." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "9a332009-4ac5-4eca-9632-6d45c03765a4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CalTrans DistrictTotal Projects
011
122
236
346
454
563
673
785
893
9102
10115
11124
\n", + "
" + ], + "text/plain": [ + " CalTrans District Total Projects\n", + "0 1 1\n", + "1 2 2\n", + "2 3 6\n", + "3 4 6\n", + "4 5 4\n", + "5 6 3\n", + "6 7 3\n", + "7 8 5\n", + "8 9 3\n", + "9 10 2\n", + "10 11 5\n", + "11 12 4" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.groupby([\"CalTrans District\"]).agg({\"Project Name\": \"nunique\"}).reset_index().rename(\n", + " columns={\"Project Name\": \"Total Projects\"}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "da0849c1-5f7e-417c-b321-e289fb46b262", + "metadata": {}, + "source": [ + "* If we aggregate the dataset by lead agency, then this dataset would be on the agency gain." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "c0f00432-60ca-4e8a-9c2a-45bba234dbd7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Lead AgencyTotal Projects
0Bunny's Meadow Hop Transportation (BMHT)3
1Cherry Metro Services (CMS)1
2Dewdrop Ride Transit2
3Elf's Efficient Transportation (EET)3
4Fairy Creek Public Transit (FCPT)5
5Gnome Valley Rail Link (GVRL)3
6Meadow Bunny Public Transportation (MBPT)4
7Morning Dewdrop Transit (MDT)4
8Mushroom Metro Transit Agency (MMTA)5
9Rainbow Mushroom Transportation Corporation (RMTC)5
10Shining Sparkle Transit Systems (SSTS)4
11Strawberry Rainbow Transit Systems (SRTS)4
12Unicorn Fairy Express Bus (UFX)1
\n", + "
" + ], + "text/plain": [ + " Lead Agency Total Projects\n", + "0 Bunny's Meadow Hop Transportation (BMHT) 3\n", + "1 Cherry Metro Services (CMS) 1\n", + "2 Dewdrop Ride Transit 2\n", + "3 Elf's Efficient Transportation (EET) 3\n", + "4 Fairy Creek Public Transit (FCPT) 5\n", + "5 Gnome Valley Rail Link (GVRL) 3\n", + "6 Meadow Bunny Public Transportation (MBPT) 4\n", + "7 Morning Dewdrop Transit (MDT) 4\n", + "8 Mushroom Metro Transit Agency (MMTA) 5\n", + "9 Rainbow Mushroom Transportation Corporation (RMTC) 5\n", + "10 Shining Sparkle Transit Systems (SSTS) 4\n", + "11 Strawberry Rainbow Transit Systems (SRTS) 4\n", + "12 Unicorn Fairy Express Bus (UFX) 1" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.groupby([\"Lead Agency\"]).agg({\"Project Name\": \"nunique\"}).reset_index().rename(\n", + " columns={\"Project Name\": \"Total Projects\"}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "55137a34-1624-4d8a-8ee8-33c773868cde", + "metadata": {}, + "source": [ + "* Grains can get very complicated. The one below is Lead Agency and Category Grain. " + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "7892454f-5f70-4237-9f04-560405cf1775", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Lead AgencyCategoryTotal Projects
0Bunny's Meadow Hop Transportation (BMHT)Other2
1Bunny's Meadow Hop Transportation (BMHT)Transit1
2Cherry Metro Services (CMS)Other1
3Dewdrop Ride TransitATP1
4Dewdrop Ride TransitOther1
5Elf's Efficient Transportation (EET)ATP1
6Elf's Efficient Transportation (EET)General Lanes1
7Elf's Efficient Transportation (EET)Transit1
8Fairy Creek Public Transit (FCPT)ATP1
9Fairy Creek Public Transit (FCPT)Other2
10Fairy Creek Public Transit (FCPT)Transit2
11Gnome Valley Rail Link (GVRL)ATP1
12Gnome Valley Rail Link (GVRL)Other1
13Gnome Valley Rail Link (GVRL)Transit and ATP1
14Meadow Bunny Public Transportation (MBPT)ATP1
15Meadow Bunny Public Transportation (MBPT)General Lanes and ATP1
16Meadow Bunny Public Transportation (MBPT)Other1
17Meadow Bunny Public Transportation (MBPT)Transit1
18Morning Dewdrop Transit (MDT)General Lanes2
19Morning Dewdrop Transit (MDT)Other1
20Morning Dewdrop Transit (MDT)Transit1
21Mushroom Metro Transit Agency (MMTA)General Lanes1
22Mushroom Metro Transit Agency (MMTA)Other3
23Mushroom Metro Transit Agency (MMTA)Transit1
24Rainbow Mushroom Transportation Corporation (RMTC)ATP2
25Rainbow Mushroom Transportation Corporation (RMTC)General Lanes1
26Rainbow Mushroom Transportation Corporation (RMTC)Other1
27Rainbow Mushroom Transportation Corporation (RMTC)Transit1
28Shining Sparkle Transit Systems (SSTS)ATP1
29Shining Sparkle Transit Systems (SSTS)General Lanes1
30Shining Sparkle Transit Systems (SSTS)General Lanes and ATP1
31Shining Sparkle Transit Systems (SSTS)Other1
32Strawberry Rainbow Transit Systems (SRTS)ATP2
33Strawberry Rainbow Transit Systems (SRTS)General Lanes1
34Strawberry Rainbow Transit Systems (SRTS)Other1
35Unicorn Fairy Express Bus (UFX)ATP1
\n", + "
" + ], + "text/plain": [ + " Lead Agency Category \\\n", + "0 Bunny's Meadow Hop Transportation (BMHT) Other \n", + "1 Bunny's Meadow Hop Transportation (BMHT) Transit \n", + "2 Cherry Metro Services (CMS) Other \n", + "3 Dewdrop Ride Transit ATP \n", + "4 Dewdrop Ride Transit Other \n", + "5 Elf's Efficient Transportation (EET) ATP \n", + "6 Elf's Efficient Transportation (EET) General Lanes \n", + "7 Elf's Efficient Transportation (EET) Transit \n", + "8 Fairy Creek Public Transit (FCPT) ATP \n", + "9 Fairy Creek Public Transit (FCPT) Other \n", + "10 Fairy Creek Public Transit (FCPT) Transit \n", + "11 Gnome Valley Rail Link (GVRL) ATP \n", + "12 Gnome Valley Rail Link (GVRL) Other \n", + "13 Gnome Valley Rail Link (GVRL) Transit and ATP \n", + "14 Meadow Bunny Public Transportation (MBPT) ATP \n", + "15 Meadow Bunny Public Transportation (MBPT) General Lanes and ATP \n", + "16 Meadow Bunny Public Transportation (MBPT) Other \n", + "17 Meadow Bunny Public Transportation (MBPT) Transit \n", + "18 Morning Dewdrop Transit (MDT) General Lanes \n", + "19 Morning Dewdrop Transit (MDT) Other \n", + "20 Morning Dewdrop Transit (MDT) Transit \n", + "21 Mushroom Metro Transit Agency (MMTA) General Lanes \n", + "22 Mushroom Metro Transit Agency (MMTA) Other \n", + "23 Mushroom Metro Transit Agency (MMTA) Transit \n", + "24 Rainbow Mushroom Transportation Corporation (RMTC) ATP \n", + "25 Rainbow Mushroom Transportation Corporation (RMTC) General Lanes \n", + "26 Rainbow Mushroom Transportation Corporation (RMTC) Other \n", + "27 Rainbow Mushroom Transportation Corporation (RMTC) Transit \n", + "28 Shining Sparkle Transit Systems (SSTS) ATP \n", + "29 Shining Sparkle Transit Systems (SSTS) General Lanes \n", + "30 Shining Sparkle Transit Systems (SSTS) General Lanes and ATP \n", + "31 Shining Sparkle Transit Systems (SSTS) Other \n", + "32 Strawberry Rainbow Transit Systems (SRTS) ATP \n", + "33 Strawberry Rainbow Transit Systems (SRTS) General Lanes \n", + "34 Strawberry Rainbow Transit Systems (SRTS) Other \n", + "35 Unicorn Fairy Express Bus (UFX) ATP \n", + "\n", + " Total Projects \n", + "0 2 \n", + "1 1 \n", + "2 1 \n", + "3 1 \n", + "4 1 \n", + "5 1 \n", + "6 1 \n", + "7 1 \n", + "8 1 \n", + "9 2 \n", + "10 2 \n", + "11 1 \n", + "12 1 \n", + "13 1 \n", + "14 1 \n", + "15 1 \n", + "16 1 \n", + "17 1 \n", + "18 2 \n", + "19 1 \n", + "20 1 \n", + "21 1 \n", + "22 3 \n", + "23 1 \n", + "24 2 \n", + "25 1 \n", + "26 1 \n", + "27 1 \n", + "28 1 \n", + "29 1 \n", + "30 1 \n", + "31 1 \n", + "32 2 \n", + "33 1 \n", + "34 1 \n", + "35 1 " ] }, - "execution_count": 11, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "_starterkit_utils.create_metric_chart(d2_wide_df)" - ] - }, - { - "cell_type": "markdown", - "id": "e268d5f7-30f6-4b36-bfa3-1391dfa772f9", - "metadata": {}, - "source": [ - "## Grains\n", - "* Create your own `.py` file with your own functions. \n", - "* Please note, you will be using these functions for Exercise 5. Make sure your functions make sense for the single district grain.\n", - " * Grain means the level your dataset is presented at. \n", - " * The original dataset is presented on the project-level grain because each row represents a unique project. \n", - " * If we aggregate the dataset without using Caltrans District, then this dataset would be represented on a state-wide grain because one row = represents the entire state." + "df.groupby([\"Lead Agency\", \"Category\"]).agg({\"Project Name\": \"nunique\"}).reset_index().rename(\n", + " columns={\"Project Name\": \"Total Projects\"}\n", + ")" ] }, { @@ -515,18 +1410,23 @@ "metadata": {}, "source": [ "## Create your own Script\n", - "* Make sure to separate out functions by theme:\n", + "* **Make sure your functions make sense for the district grain.**\n", + "* You will be using these functions for Exercise 5. \n", + "* Make sure to separate out functions by theme. \n", " * One function that loads the dataset and does some light cleaning.\n", " * One (or more) functions that transform your dataframe.\n", - " * `melt()`, `.T`, `.groupby()` are just some of the many options available through `pandas`.\n", + " * `melt()`, `.T`, `.groupby()` are just some of the many options available through `pandas`. \n", " * One (or more) functions that visualize your dataframe.\n", " * Could be a chart, a styled dataframe, a wordcloud. \n", "* Other things to consider\n", - " * [CalTrans Districts are currently integers, but they have actual names that can be mapped.](https://cwwp2.dot.ca.gov/documentation/district-map-county-chart.htm) \n", - " * Are the currency columns formatted with $ and commas?\n", - " * Are all the scores formatted with the same number of decimals?\n", - " * Are the string columns formatted with the right punctuation and capitalization?\n", - " * Are the column names formatted properly? While `snake_case` is very handy when we are analyzing the dataframe, it is not slightly when presenting the data. We typically reverse the `snake_case` back to something like `Project Name`." + " * Our [DDS Docs](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#narrative) has a great guide on what \"checkboxes\" need to be \"checked\" when presenting data. The first 3 sections are the most relevant.\n", + " * To summarize the docs, double check:\n", + " * Are the currency columns formatted with $ and commas?\n", + " * Are all the scores formatted with the same number of decimals?\n", + " * Are the string columns formatted with the right punctuation and capitalization?\n", + " * Are the column names formatted properly? While `snake_case` is very handy when we are analyzing the dataframe, it is not slightly when presenting the data. We typically reverse the `snake_case` back to something like `Project Name`.\n", + " * [CalTrans Districts are currently integers, but they have actual names that can be mapped.](https://cwwp2.dot.ca.gov/documentation/district-map-county-chart.htm) \n", + " " ] }, { @@ -537,7 +1437,7 @@ "## Markdown/Display\n", "* Although our code is now neatly stored in a Python script, a Jupyter Notebook on its own is a bit plain, even when we have beautiful charts. \n", "* There are many ways to jazz it up.\n", - "* AMANDA: Link some resources." + "* **Resource**: [Data Camp](https://www.datacamp.com/tutorial/markdown-in-jupyter-notebook)" ] }, { @@ -554,7 +1454,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 18, "id": "4ec41786-491f-46ad-963e-f380d8095ade", "metadata": {}, "outputs": [], @@ -564,7 +1464,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 19, "id": "8d0a6849-f178-46fc-919a-f45b5436c423", "metadata": {}, "outputs": [ @@ -595,9 +1495,9 @@ "source": [ "### Display\n", "* Of course, you can write your narratives in a Markdown cell like what I'm doing right now.\n", - "* However, what do you do if you want to incorporate values from your dataframe into the narrative?\n", - "* Writing out the values isn't necessarily the best idea.If the values change, you'll have to rewrite your narrative.\n", - "* The best way is to use `display` and `markdown` like below.\n", + "* However, what if you want to incorporate values from your dataframe into the narrative?\n", + "* Writing out the values manually in markdown locks you in. If the values change, you'll have to rewrite your narrative.\n", + "* The best way is to use `display` and `markdown` from `from IPython.display`\n", "* We are using District 3 as an example" ] }, @@ -612,87 +1512,75 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 20, "id": "caecab58-2d26-4604-a3f1-ab4a11400038", "metadata": {}, "outputs": [], "source": [ + "# Filter for D3\n", "d3_df = df.loc[df[\"CalTrans District\"] == 3].reset_index(drop=True)" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 21, "id": "995eb899-0397-4f60-b587-18fcf8a4cb0e", "metadata": {}, "outputs": [], "source": [ + "# Find the median overall score\n", "d3_median_score = d3_df[\"Overall Score\"].median()" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 22, "id": "bc73cc66-911a-44bf-9710-920328b40609", "metadata": {}, "outputs": [], "source": [ + "# Find total projects\n", "d3_total_projects = d3_df[\"Project Name\"].nunique()" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 23, "id": "8a5dafba-c901-412c-bf53-e418dc558787", "metadata": {}, "outputs": [], "source": [ + "# Find the most expensive project\n", "d3_max_project = d3_df[\"Project Cost\"].max()" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 24, "id": "e183e629-7f79-45e3-810b-294851ca9abf", "metadata": {}, "outputs": [], "source": [ + "# Format the cost so it's something like $1,000,000 instead of 1000000\n", "d3_max_project = f\"${d3_max_project:,.2f}\"" ] }, - { - "cell_type": "code", - "execution_count": 19, - "id": "eb8e4a80-2eec-4db0-b919-7c3d4486d8e0", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'$6,666,449.00'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d3_max_project" - ] - }, { "cell_type": "markdown", "id": "241607df-d133-4fb1-ac13-f1a32454b815", "metadata": {}, "source": [ - "\n", - "* The f string has multiple quotation marks. This allows you to write a f-string that goes over multiple lines." + "#### Long F-String + Headers\n", + "* The f-string has multiple quotation marks. This allows you to write a f-string that goes over multiple lines.\n", + "*

and

displays District 3 in a header. Headers vary in size, 1 being the largest. \n", + "* `` bolds the text. \n", + " * ` italicizes the text.\n", + "* Notice that you always have to **close** your HTML with `District 3

\n", - " The median score for projects in District 3 is 71.0
\n", - " The total number of projects is 7
\n", - " The most expensive project costs $6,666,449.00\n", + " The median score for projects in District 3 is 80.5
\n", + " The total number of projects is 6
\n", + " The most expensive project costs $9,448,022.00\n", " " ], "text/plain": [ @@ -731,12 +1619,12 @@ "metadata": {}, "source": [ "* You can code in this cell. I'm filtering out for district 3 values.\n", - "* Notice the header went from `

` to `

`. You can also swap it out for `

` and `

`" + "* Notice the header went from `

` to `

`. " ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 27, "id": "38d84ed3-9626-4f91-9aea-e2449aef4cf8", "metadata": {}, "outputs": [ @@ -758,28 +1646,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ @@ -838,8 +1726,7 @@ " \"\"\"\n", " )\n", ")\n", - "d3_wide_df = df2.loc[df2[\"CalTrans District\"] == 3].reset_index(drop=True)\n", - "display(_starterkit_utils.create_metric_chart(d2_wide_df))" + "display(_starterkit_utils.create_metric_chart(df2))" ] }, { @@ -850,221 +1737,98 @@ "### This can be a function too\n", "* What if I wanted to generate these narratives for every district?\n", "* I can simply turn this into a function.\n", - "* Remember to look at the code in `_starterkit_utils.py`\n", "* I only want to print out a couple of districts or else this notebook will become too large" ] }, { "cell_type": "code", - "execution_count": 22, - "id": "6d6f524a-d49b-4729-801f-ccc4bd800149", + "execution_count": 28, + "id": "8875a82f-2df3-4777-a115-87ba84ea96a3", "metadata": {}, "outputs": [ { "data": { - "text/markdown": [ - "The median score for projects in District 3 is 80.0
\n", - " The total number of projects is 1
\n", - " The most expensive project costs $7,009,576.00\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "

Metrics aggregated by Categories

\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
CategoryMedian ScoreMedian Project CostTotal Projects
Other80$7,009,5761
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "

Overview of Projects

\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Project NameOverall ScoreScope Of Work
Tranquil Truck Trot80A 5 mile truck only lane with scenic rest stops, featuring ev charging stations, healthy food options, and driver wellness programs to promote safe and sustainable trucking practices.
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "

Metric Scores by Project

\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "" - ], "text/plain": [ - "alt.Chart(...)" + "\u001b[0;31mSignature:\u001b[0m\n", + "\u001b[0m_starterkit_utils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcreate_district_summary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mcaltrans_district\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mSource:\u001b[0m \n", + "\u001b[0;32mdef\u001b[0m \u001b[0mcreate_district_summary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcaltrans_district\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", + "\u001b[0;34m Create a summary of CSIS metrics for one Caltrans District.\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mfiltered_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"CalTrans District\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mcaltrans_district\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreset_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdrop\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Finding the values referenced in the narrative\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mmedian_score\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfiltered_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Overall Score\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmedian\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mtotal_projects\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfiltered_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Project Name\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnunique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mmax_project\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfiltered_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Project Cost\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mmax_project\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34mf\"${max_project:,.2f}\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Aggregate the dataframe\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0maggregated_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maggregate_by_category\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiltered_df\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Change the dataframe from wide to long\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdf2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwide_to_long\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiltered_df\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;31m# Create narrative\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mMarkdown\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34mf\"\"\"The median score for projects in District {caltrans_district} is {median_score}
\u001b[0m\n", + "\u001b[0;34m The total number of projects is {total_projects}
\u001b[0m\n", + "\u001b[0;34m The most expensive project costs {max_project}\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mMarkdown\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34mf\"\"\"

Metrics aggregated by Categories

\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mstyle_df\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maggregated_df\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mMarkdown\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34mf\"\"\"

Overview of Projects

\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mstyle_df\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiltered_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Project Name\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Overall Score\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Scope Of Work\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mMarkdown\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34mf\"\"\"

Metric Scores by Project

\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcreate_metric_chart\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFile:\u001b[0m ~/data-analyses/starter_kit/_starterkit_utils.py\n", + "\u001b[0;31mType:\u001b[0m function" ] }, "metadata": {}, "output_type": "display_data" - }, + } + ], + "source": [ + "_starterkit_utils.create_district_summary??" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "6d6f524a-d49b-4729-801f-ccc4bd800149", + "metadata": {}, + "outputs": [ { "data": { "text/markdown": [ - "The median score for projects in District 3 is 71.0
\n", - " The total number of projects is 6
\n", - " The most expensive project costs $9,448,986.00\n", + "The median score for projects in District 10 is 72.5
\n", + " The total number of projects is 2
\n", + " The most expensive project costs $7,160,933.00\n", " " ], "text/plain": [ @@ -1091,56 +1855,38 @@ "data": { "text/html": [ "\n", - "\n", + "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
CategoryMedian ScoreMedian Project CostTotal ProjectsCategoryMedian ScoreMedian Project CostTotal Projects
ATP68$1,138,0461Other59$816,5691
General Lanes87$4,066,0891
General Lanes and ATP72$9,155,6541
Other69$9,448,9861
Transit74$3,541,0092Transit86$7,160,9331
\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1163,55 +1909,35 @@ "data": { "text/html": [ "\n", - "\n", + "
\n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", "
Project NameOverall ScoreScope Of WorkProject NameOverall ScoreScope Of Work
Coastal Commuter Carousel78A 30 mile passenger rail line connecting coastal towns, featuring modern train sets, enhanced station amenities, and scenic viewing cars.
Waterfront Waffle Walk and Bike68A scenic 2 mile multi use path along a waterfront, featuring public art installations, educational signage, and stunning views.Countryside Clover Rail Connector59A 20 mile rail improvement project for freight transportation, upgrading track infrastructure, and implementing advanced safety features to reduce derailment risk.
Meadowbrook Magic Makeover72Transform meadowbrook road into a serene meadowland drive, with repaved and restriped general lanes, bike lanes, and natural stone retaining walls adorned with elf inspired carvings.
Riverbend Pixie Ramp87Streamline traffic flow and reduce merge conflicts with the riverbend pixie ramp auxiliary lanes, incorporating rustic wooden railings and scenic river views.
Laurel Lane Enchanted Express69Maximize capacity and minimize delays on laurel lane through dynamic lane management, utilizing real time data and adaptive traffic signals guided by pixie precision.
Brookside Bus Blossom Lane70Prioritize public transportation and enhance air quality by dedicating lanes to buses and hovs on brookside boulevard, integrating smart traffic signals and real time transit information inspired by the ancient elves.Brookside Bus Blossom Lane86Prioritize public transportation and enhance air quality by dedicating lanes to buses and hovs on brookside boulevard, integrating smart traffic signals and real time transit information inspired by the ancient elves.
\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1235,28 +1961,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ @@ -1310,9 +2036,9 @@ { "data": { "text/markdown": [ - "The median score for projects in District 3 is 70.0
\n", - " The total number of projects is 3
\n", - " The most expensive project costs $9,135,733.00\n", + "The median score for projects in District 11 is 75.0
\n", + " The total number of projects is 5
\n", + " The most expensive project costs $8,956,026.00\n", " " ], "text/plain": [ @@ -1339,38 +2065,56 @@ "data": { "text/html": [ "\n", - "\n", + "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
CategoryMedian ScoreMedian Project CostTotal ProjectsCategoryMedian ScoreMedian Project CostTotal Projects
ATP79$8,677,0122ATP79$8,956,0261
General Lanes89$1,557,7511
Other65$2,785,1891Other75$5,796,4771
Transit55$5,425,7841
Transit and ATP75$2,069,1431
\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1393,40 +2137,50 @@ "data": { "text/html": [ "\n", - "\n", + "
\n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", "
Project NameOverall ScoreScope Of WorkProject NameOverall ScoreScope Of Work
Wildflower Wonders Highway Expansion65A 5 mile highway expansion project incorporating wildlife friendly features, such as wildlife bridges, habitat restoration, and reduced speed zones.Berry Best Bus Rapid Transit55Dedicated bus lanes with comfortable stops, featuring off board fare payment, priority traffic signals, and enhanced passenger amenities.
Trail of Treats and Transit Hub75A multi use path connecting to public transit, featuring public art installations, wayfinding signage, and amenities like bike storage and repair stations.
Fairy Glen Boulevard79Welcome travelers to our enchanted town with a refreshed fairy glen boulevard, featuring sparkling streetlights, lush wildflower medians, and meandering pedestrian paths
Mountain View Mansion Interchange70An improved interchange with stunning views, featuring public art installations, wayfinding signage, and enhanced pedestrian and cyclist connectivity.Parkside Pixie Carpool Lane75Encourage sustainable transportation and reduce traffic congestion by constructing high occupancy vehicle (hov) lanes along parkside drive, adorned with fairy inspired artwork.
Larkspur Loop On-Ramp to Fairytop88Charm travelers with the larkspur loop on ramp to fairytop, featuring a whimsical stone façade, meandering pedestrian path, and picturesque views of the surrounding meadow.Ridgewood Ride-Share Rainbow Lane89Support environmentally friendly commuting options by building hov lanes on ridgewood highway, featuring designated ride share pickup and drop off zones, and a touch of magic from the meadow.
\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1450,28 +2204,28 @@ "text/html": [ "\n", "\n", - "
\n", + "
\n", "" ], "text/plain": [ @@ -1524,7 +2278,7 @@ } ], "source": [ - "for district in range(10,13):\n", + "for district in range(10, 12):\n", " _starterkit_utils.create_district_summary(df, district)" ] }, diff --git a/starter_kit/_starterkit_utils.py b/starter_kit/_starterkit_utils.py index ecfdcee2e..11869fb63 100644 --- a/starter_kit/_starterkit_utils.py +++ b/starter_kit/_starterkit_utils.py @@ -165,7 +165,7 @@ def create_district_summary(df: pd.DataFrame, caltrans_district: int): # Create narrative display( Markdown( - f"""The median score for projects in District 3 is {median_score}
+ f"""The median score for projects in District {caltrans_district} is {median_score}
The total number of projects is {total_projects}
The most expensive project costs {max_project} """ From 04443d336e4c00261f7b11efa3f766aec43ca35a Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Wed, 30 Oct 2024 21:48:02 +0000 Subject: [PATCH 11/12] added makefile --- ha_portfolio/Makefile | 7 + ha_portfolio/ha_portfolio.ipynb | 179 ------------- .../00__ha_portfolio__district_1.ipynb | 4 +- .../00__ha_portfolio__district_10.ipynb | 4 +- .../00__ha_portfolio__district_11.ipynb | 4 +- .../00__ha_portfolio__district_12.ipynb | 4 +- .../00__ha_portfolio__district_2.ipynb | 4 +- .../00__ha_portfolio__district_3.ipynb | 4 +- .../00__ha_portfolio__district_4.ipynb | 4 +- .../00__ha_portfolio__district_5.ipynb | 4 +- .../00__ha_portfolio__district_6.ipynb | 4 +- .../00__ha_portfolio__district_7.ipynb | 4 +- .../00__ha_portfolio__district_8.ipynb | 4 +- .../00__ha_portfolio__district_9.ipynb | 4 +- starter_kit/2024_basics_05.ipynb | 242 ++++++++++++++++-- starter_kit/Makefile | 6 + 16 files changed, 261 insertions(+), 221 deletions(-) create mode 100644 ha_portfolio/Makefile create mode 100644 starter_kit/Makefile diff --git a/ha_portfolio/Makefile b/ha_portfolio/Makefile new file mode 100644 index 000000000..526351f3c --- /dev/null +++ b/ha_portfolio/Makefile @@ -0,0 +1,7 @@ +build_test_portfolio: + cd ../ && pip install -r requirements.txt + cd ../ && python portfolio/portfolio.py clean ha_starterkit_district + cd ../ && python portfolio/portfolio.py build ha_starterkit_district --deploy + cd ../ && python portfolio/portfolio.py build ha_starterkit_district --deploy + git add portfolio/ha_starterkit_district/district_*/ portfolio/ha_starterkit_district/*.yml portfolio/ha_starterkit_district/*.md + git add portfolio/sites/ha_starterkit_district.yml \ No newline at end of file diff --git a/ha_portfolio/ha_portfolio.ipynb b/ha_portfolio/ha_portfolio.ipynb index 9b0d353a8..b7cc25e14 100644 --- a/ha_portfolio/ha_portfolio.ipynb +++ b/ha_portfolio/ha_portfolio.ipynb @@ -1,99 +1,5 @@ { "cells": [ - { - "cell_type": "markdown", - "id": "36c5c03c-164a-4530-9fc6-43f5d1abbf7e", - "metadata": { - "tags": [] - }, - "source": [ - "**Portfolio**\n", - "* You might have seen DDS's [portfolio](https://analysis.calitp.org/).\n", - "* We often present our work on our portfolio because it retains the interactivity of the `Altair` charts and `Geopandas` maps we make.\n", - "* Additionally, it is very streamlined to update our work when it needs to be updated. \n", - "* Spend some time exploring our portfolio above. \n", - "**How does the portfolio work?**\n", - "* For the majority of the sites on the portfolio are using **one** notebook essentially as a template that is looped one or more variables. \n", - " * This [National Transit Dataset Monthly Ridership by Regional Transit Planning Authority (RTPA)](https://ntd-monthly-ridership--cal-itp-data-analyses.netlify.app/readme) takes [this notebook](https://github.com/cal-itp/data-analyses/blob/main/ntd/monthly_ridership_report.ipynb) and reruns it for every \n", - "RTPA in this [yml file](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/ntd_monthly_ridership.yml). \n", - " * This process of looping over a parameter is called parameterizing a notebook!\n", - "**Resources**\n", - " * You may wish to read these resources before making the portfolio.\n", - " * [Preparing notebooks for the portfolio](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html)\n", - " * [Publishing to the portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html)\n", - "\n", - "**Let's make a portfolio**\n", - "* Feel free to delete all the instructions off once you're done. \n", - "* Spoiler alert! Your end result will look something like [this](https://ha-starterkit-district--cal-itp-data-analyses.netlify.app/readme)." - ] - }, - { - "cell_type": "markdown", - "id": "4dc7d9d1-5722-467f-8e2f-d1e2b8d7e566", - "metadata": {}, - "source": [ - "**Step 1: Move this notebook**\n", - "* Create a new folder in the `data-analyses` repo called `lastname_portfolio`.\n", - "* Right click -> copy to move this notebook to the new folder.\n", - "* Right click -> rename this notebook as `lastname_portfolio.ipynb`\n", - "* Use `git mv` to move the Python file that holds your functions to the `lastname_portfolio`.\n", - "* Right click -> copy the `starterkit_district.yml` file to the folder `data-analyses/portfolio/sites`. Rename `starterkit_district.yml` to `lastname_starterkit_district`\n", - "* Close this original `2024_basics_05.ipynb` and begin working on your new `lastname_portfolio.ipynb`" - ] - }, - { - "cell_type": "markdown", - "id": "8cb15ca0-580e-4a0d-9dbc-accb761d77d1", - "metadata": {}, - "source": [ - "**Step 2: Netlify Setup**\n", - "* Follow the instructions [here](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#netlify-setup).\n", - "* You only need to do this step **once** for the entirety of your career at DDS. \n", - "* Once you have your key setup, you can publish limitless portfolios." - ] - }, - { - "cell_type": "markdown", - "id": "89858742-9a67-4f10-9f65-29770f955075", - "metadata": {}, - "source": [ - "**Step 3: Create a `README.md`**\n", - "* When you go to each site on our [portfolio](https://analysis.calitp.org/), you'll always go to the introduction.\n", - "* Every portfolio must have a `README.md` file or else it won't build. \n", - "* It also serves as our page to discuss our methodology, the datasets we used, and other details to give our viewers some context into what they are looking at. \n", - "* We have a template for you to populate [here](https://github.com/cal-itp/data-analyses/blob/main/portfolio/template_README.md). \n", - " * Make sure to rename `template_README.md` as `README.md` in your folder. \n", - " * You cannot deviate from `README.md` such as `README_intro.md` because the portfolio will not build.\n", - "* **Further Reading**: [DDS Docs](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#file-setup)" - ] - }, - { - "cell_type": "markdown", - "id": "2d62df5f-1608-4cf9-8e66-2686d4b9f5da", - "metadata": {}, - "source": [ - "**Step 4: Update `starterkit_district.yml`**\n", - "* You can think of this yml file as a \"Table of Contents.\"\n", - "* We are taking this notebook you're currently reading and re-running it for every element that is listed in the yml file. After re-running a new notebook is generated for that element and published.\n", - "* In the `starterkit_district.yml` please replace text in all all caps such as REPLACE_WITH_YOUR_FOLDER_NAME with the proper file/folder/notebook. \n", - "* **Further Reading**: [DDS Docs on YML](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#yml)" - ] - }, - { - "cell_type": "markdown", - "id": "2986f064-d922-491a-846b-1d4f5e4ea9e4", - "metadata": {}, - "source": [ - "**Step 6: Importing the right packages**\n", - "* Making a parameterized notebook is extremely finicky.\n", - "* For every notebook you make, **you must copy and paste this block of code below in this exact order.** Otherwise, your notebook won't work.\n", - "* What am I importing?\n", - " * `%%capture`: Captures the parameter/yml parts.\n", - " * `import warnings warnings.filterwarnings('ignore')`: Sometimes when you are analyzing data, warnings pop up. These warnings are quite unattractive and we don't want them to be displayed in a portfolio so we turn off these warnings. You don't want to turn off the warnings if you are still analyzing your data! \n", - " * `import calitp_data_analysis.magics`: the library that makes the parameterization magic happen.\n", - "* **Resource**: [DDS Getting Notebooks Ready for Parameterization](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#getting-ready-for-parameterization)" - ] - }, { "cell_type": "code", "execution_count": null, @@ -127,18 +33,6 @@ "pd.set_option(\"display.max_colwidth\", None)" ] }, - { - "cell_type": "markdown", - "id": "b07ecdbc-a3a9-4183-80dc-57e71cf61fe6", - "metadata": {}, - "source": [ - "**Step 7: Setting your parameters**\n", - "* While these steps have already been done for you, it would still benefit you to re-do these steps and refer to the resource below. \n", - "* **Resource**: [DDS Docs Capturing Parameters](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#capturing-parameters).\n", - "* **Parameter #1:** Set a cell that is commented out with your parameter. Turn on the parameter tag.\n", - " * To turn on the parameter tag: go to the code cell go to the upper right hand corner -> click on the gears -> go to “Cell Tags” -> Add Tag + -> add a tag called “parameters” -> click on the new “parameters” tag to ensure a checkmark shows up and it turns dark gray" - ] - }, { "cell_type": "code", "execution_count": null, @@ -153,15 +47,6 @@ "# district = 1" ] }, - { - "cell_type": "markdown", - "id": "2fca6082-1964-43d7-bcd8-8668c39afaac", - "metadata": {}, - "source": [ - "**Parameter #2:** This second cell replaces each district as the notebook loops over each parameter in the `starter_kit.yml` file.\n", - "* `%%capture_parameters` must be the first line of code in this block or else your notebook will fail to parameterize." - ] - }, { "cell_type": "code", "execution_count": null, @@ -173,16 +58,6 @@ "district" ] }, - { - "cell_type": "markdown", - "id": "f9285e93-924d-4681-b526-97b8e46643b1", - "metadata": {}, - "source": [ - "* **Parameter #3:** The first markdown cell must include parameters to inject. This line below generates the title District 1 Analysis when it is creating the notebook for District 1. Likewise, it'll say District 2 Analysis for District 2's page. \n", - "* Feel free to change this to anything you wish, but make sure this stays a markdown cell.\n", - "* This cell is extremely important and read why [here](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#header)." - ] - }, { "cell_type": "markdown", "id": "cb5a0cc4-3e7e-4aea-81f2-c5e858fb315b", @@ -191,16 +66,6 @@ "# District {district} Analysis " ] }, - { - "cell_type": "markdown", - "id": "64615b63-3848-45b7-af2e-19c7b7346997", - "metadata": {}, - "source": [ - "**Step 8: Input your functions**\n", - "* I am loading my dataset first.\n", - "* Then I am adding in my dataset and the district parameter into `_starterkit_utils.create_district_summary`." - ] - }, { "cell_type": "code", "execution_count": null, @@ -220,50 +85,6 @@ "source": [ "_starterkit_utils.create_district_summary(df, district)" ] - }, - { - "cell_type": "markdown", - "id": "76052780-3c27-405c-9379-13e82130eec7", - "metadata": {}, - "source": [ - "**Step 9: Download the right packages**\n", - "* Navigate back to the root of your repo which is `~/data-analyses`.\n", - "* Once there, install the portfolio requirements using `pip install -r portfolio/requirements.txt`. This will take a bit.\n", - "* **Resource**: [DDS Deploying Portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#building-and-deploying-your-report)" - ] - }, - { - "cell_type": "markdown", - "id": "c8fce487-015d-4e24-8444-d5c07ec17890", - "metadata": {}, - "source": [ - "**Step 10: Build your portfolio**\n", - "* Double check you are at the root of your repo.\n", - "* Replace `REPLACE_YML_NAME` with just the name of your `yml` file without the `.yml` extension into the command below.\n", - "* Run `python portfolio/portfolio.py build REPLACE_YML_NAME --deploy` to build your portfolio.\n", - " * Example: My yml is called `ha_starterkit_district.yml` so I would run `python portfolio/portfolio.py build ha_starterkit_district --deploy`." - ] - }, - { - "cell_type": "markdown", - "id": "fc0fde8b-7671-43cf-b1ac-66730e436d11", - "metadata": {}, - "source": [ - "**Step 11: Something not right?**\n", - "* Your portfolio should be up and running. You can view your portfolio using the draft URL. It'll look something like this: `https://ha-starterkit-district--cal-itp-data-analyses.netlify.app`.\n", - "* What if something is a little off? After updating your code, rerun this line of code to redo your portfolio. You must always `clean` your portfolio before regenerating new notebooks. \n", - "` python portfolio/portfolio.py clean REPLACE_YML_NAME && python portfolio/portfolio.py build REPLACE_YML_NAME --deploy`\n", - "* **Resource**: [DDS Other Specifications](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#other-specifications)" - ] - }, - { - "cell_type": "markdown", - "id": "9c8f91a0-e0b5-465d-8f95-be8e3fc036ea", - "metadata": {}, - "source": [ - "**Step 12: Commit commit commit!**\n", - "* WIP: explain Makefile" - ] } ], "metadata": { diff --git a/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb b/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb index ebeae7db3..d7194a92b 100644 --- a/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb +++ b/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0018471be67dc08f614c69e7f4d7815cb2da1b70d4a1ff936a643f5c35815c47 -size 33424 +oid sha256:4c38bb5913b6ac927ac12de2a7292915cb6d1dfaa8521fb247bd3b9f57a15c46 +size 18089 diff --git a/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb b/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb index 79d0bec32..2f04e3a73 100644 --- a/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb +++ b/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eb9b9872e177774875a6b0941857fc5ef156af2a9df607507be93f3c24ca9b2d -size 30642 +oid sha256:2d7a83a5782bf1541851fab8ce19ba549b18067d0c0628fdc6f5c7ab6da460be +size 20922 diff --git a/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb b/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb index 5d79ece35..46eaaa66d 100644 --- a/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb +++ b/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3fe8f764f64afb6215bdd302e9b5c69075825b621b32be8f5b0d071dd3aeb440 -size 43771 +oid sha256:5e8ad684dd255ea9a0a62909b8be85ecda561c64d7683bad46d9d0e1523c0a56 +size 29004 diff --git a/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb b/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb index 7caeacff6..70b24fa91 100644 --- a/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb +++ b/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21bafc2c305a21d9774db5192da95fd00ef5ff423e28e34992be2ba3cb8e1b1c -size 35966 +oid sha256:a511f23132f5e99925fa1bbc19bf2bf08e5dcd230cea0f8ed96525ad566c564d +size 25791 diff --git a/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb b/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb index c63601816..4170a5ba6 100644 --- a/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb +++ b/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89810da26ccdf9d56d58dab556cd2282e3899ca0402e59eb23e50a9acd6da428 -size 43147 +oid sha256:97913c008fa5d6e7c39dc3e6723169ce0e6f7cfdd7822e43ad58b327d1233786 +size 20939 diff --git a/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb b/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb index 5ccd49597..7f17b8db0 100644 --- a/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb +++ b/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c8981a5ae0f033b522e49a4204b6dc30c7b9fc0337da4003058d2728c2ea973d -size 45376 +oid sha256:4e0eb83c0ba4d61cc9ed2d78088b9731aab31de1be31171a963b4ce62fa9b34d +size 30297 diff --git a/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb b/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb index 8311191b3..b4e038f88 100644 --- a/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb +++ b/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f4166804cc1bf86becea14dc340b9dea4f4f06bc46f7868afb0ca01b22d1551 -size 33660 +oid sha256:e42e5070606592e282fded026959547cd38fb6fbec87255b88b7b86af4d3c534 +size 30891 diff --git a/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb b/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb index 5bb6c97cd..5d9cfabff 100644 --- a/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb +++ b/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c47e40c9eaa9df9630d34a3ad8704cbca7a356fc3279a7ebae609eedb7e74824 -size 30827 +oid sha256:5d56ae0ed14c13dd7a9b9cd5817d49ca0335600a8752e74fe55f024e3f329101 +size 26311 diff --git a/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb b/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb index ba5dbe284..a7d458c81 100644 --- a/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb +++ b/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fb826f08945597e319cc3046b5aa35ae18a2d2bffc808bcc44a9584722f3274a -size 43052 +oid sha256:21a982a4eca7b4deb73009fc1dab342966c868bada42da48efb81e263a7059d0 +size 23689 diff --git a/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb b/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb index d36d9e606..c71894e34 100644 --- a/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb +++ b/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01626e62de990c220a904e3e076c0f95960814db723d559537bbe0e9b487d706 -size 40278 +oid sha256:c9ae22a6fb162af81e38c8642005dbe39a7ca88c78c3db1c6e7a7e59a036f63f +size 23053 diff --git a/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb b/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb index 4acae490b..9c232ee58 100644 --- a/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb +++ b/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1503584a03a7e4738fdebd059a229b105ee832fe6552551787e0a8ae180982ef -size 33542 +oid sha256:044d900722bd04b384a665779e94c1b4e079d448af5a55cf78a80cc9c8ef430c +size 27411 diff --git a/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb b/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb index d81dde067..99f31ec28 100644 --- a/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb +++ b/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb915feb420a72619652a4cf311d3e4bb2810b2ec4f3a1cdb28a7f49b9812954 -size 35818 +oid sha256:1104341d292a81aeacc2832e625accba110a6cd0dee2c38123bd267450621157 +size 23224 diff --git a/starter_kit/2024_basics_05.ipynb b/starter_kit/2024_basics_05.ipynb index 723ef68cc..a3b1639ce 100644 --- a/starter_kit/2024_basics_05.ipynb +++ b/starter_kit/2024_basics_05.ipynb @@ -7,25 +7,24 @@ "tags": [] }, "source": [ - "# Portfolio\n", + "**Portfolio**\n", "* You might have seen DDS's [portfolio](https://analysis.calitp.org/).\n", "* We often present our work on our portfolio because it retains the interactivity of the `Altair` charts and `Geopandas` maps we make.\n", "* Additionally, it is very streamlined to update our work when it needs to be updated. \n", "* Spend some time exploring our portfolio above. \n", - "\n", "**How does the portfolio work?**\n", - "* For the majority of the sites on the portfolio are using **one** notebook essentially as a template that is looped over several parameters. \n", + "* For the majority of the sites on the portfolio are using **one** notebook essentially as a template that is looped one or more variables. \n", " * This [National Transit Dataset Monthly Ridership by Regional Transit Planning Authority (RTPA)](https://ntd-monthly-ridership--cal-itp-data-analyses.netlify.app/readme) takes [this notebook](https://github.com/cal-itp/data-analyses/blob/main/ntd/monthly_ridership_report.ipynb) and reruns it for every \n", "RTPA in this [yml file](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/ntd_monthly_ridership.yml). \n", + " * This process of looping over a parameter is called parameterizing a notebook!\n", + "**Resources**\n", + " * You may wish to read these resources before making the portfolio.\n", + " * [Preparing notebooks for the portfolio](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html)\n", + " * [Publishing to the portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html)\n", "\n", "**Let's make a portfolio**\n", - "* Please read the instructions very carefully.\n", - "* Delete any Markdown cells prefixed with delete once you have completed a step.\n", - "\n", - "**Resources**\n", - "* You may wish to read these resources before making the portfolio.\n", - "* [Preparing notebooks for the portfolio](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html)\n", - "* [Publishing to the portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html)" + "* Feel free to delete all the instructions off once you're done. \n", + "* Spoiler alert! Your end result will look something like [this](https://ha-starterkit-district--cal-itp-data-analyses.netlify.app/readme)." ] }, { @@ -33,12 +32,13 @@ "id": "4dc7d9d1-5722-467f-8e2f-d1e2b8d7e566", "metadata": {}, "source": [ - "## (Delete) Step 1: Move this notebook\n", + "**Step 1: Move this notebook**\n", "* Create a new folder in the `data-analyses` repo called `lastname_portfolio`.\n", - "* Right click -> copy to copy this notebook to the new folder.\n", - "* Rename this notebook using as `lastname_portfolio.ipynb`\n", - "* Use `git mv` to move the Python file that holds your functions to the new folder.\n", - "* Right click -> copy the `starterkit_district.yml` file to the new folder. \n", + "* Right click -> copy to move this notebook to the new folder.\n", + "* Right click -> rename this notebook as `lastname_portfolio.ipynb`\n", + "* Use `git mv` to move the Python file that holds your functions to the `lastname_portfolio`.\n", + "* Right click -> copy the `starterkit_district.yml` file to the folder `data-analyses/portfolio/sites`. Rename `starterkit_district.yml` to `lastname_starterkit_district`\n", + "* Right click -> copy the `Makefile` file to your new folder folder `lastname_portfolio`.\n", "* Close this original `2024_basics_05.ipynb` and begin working on your new `lastname_portfolio.ipynb`" ] }, @@ -47,19 +47,225 @@ "id": "8cb15ca0-580e-4a0d-9dbc-accb761d77d1", "metadata": {}, "source": [ - "## (Delete) Step 2: Netlify Setup \n", + "**Step 2: Netlify Setup**\n", "* Follow the instructions [here](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#netlify-setup).\n", "* You only need to do this step **once** for the entirety of your career at DDS. \n", "* Once you have your key setup, you can publish limitless portfolios." ] }, + { + "cell_type": "markdown", + "id": "89858742-9a67-4f10-9f65-29770f955075", + "metadata": {}, + "source": [ + "**Step 3: Create a `README.md`**\n", + "* When you go to each site on our [portfolio](https://analysis.calitp.org/), you'll always go to the introduction.\n", + "* Every portfolio must have a `README.md` file or else it won't build. \n", + "* It also serves as our page to discuss our methodology, the datasets we used, and other details to give our viewers some context into what they are looking at. \n", + "* We have a template for you to populate [here](https://github.com/cal-itp/data-analyses/blob/main/portfolio/template_README.md). \n", + " * Make sure to rename `template_README.md` as `README.md` in your folder. \n", + " * You cannot deviate from `README.md` such as `README_intro.md` because the portfolio will not build.\n", + "* **Further Reading**: [DDS Docs](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#file-setup)" + ] + }, + { + "cell_type": "markdown", + "id": "2d62df5f-1608-4cf9-8e66-2686d4b9f5da", + "metadata": {}, + "source": [ + "**Step 4: Update `starterkit_district.yml`**\n", + "* You can think of this yml file as a \"Table of Contents.\"\n", + "* We are taking this notebook you're currently reading and re-running it for every element that is listed in the yml file. After re-running a new notebook is generated for that element and published.\n", + "* In the `starterkit_district.yml` please replace text in all all caps such as REPLACE_WITH_YOUR_FOLDER_NAME with the proper file/folder/notebook. \n", + "* **Further Reading**: [DDS Docs on YML](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#yml)" + ] + }, + { + "cell_type": "markdown", + "id": "2986f064-d922-491a-846b-1d4f5e4ea9e4", + "metadata": {}, + "source": [ + "**Step 6: Importing the right packages**\n", + "* Making a parameterized notebook is extremely finicky.\n", + "* For every notebook you make, **you must copy and paste this block of code below in this exact order.** Otherwise, your notebook won't work.\n", + "* What am I importing?\n", + " * `%%capture`: Captures the parameter/yml parts.\n", + " * `import warnings warnings.filterwarnings('ignore')`: Sometimes when you are analyzing data, warnings pop up. These warnings are quite unattractive and we don't want them to be displayed in a portfolio so we turn off these warnings. You don't want to turn off the warnings if you are still analyzing your data! \n", + " * `import calitp_data_analysis.magics`: the library that makes the parameterization magic happen.\n", + "* **Resource**: [DDS Getting Notebooks Ready for Parameterization](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#getting-ready-for-parameterization)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "260ba8f3-dd02-4fdc-945d-450db01d188e", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "import calitp_data_analysis.magics\n", + "\n", + "# All your other packages go here\n", + "# Here I just want pandas and my own utils.\n", + "import pandas as pd\n", + "import _starterkit_utils " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a2996fd-29d0-4a19-ac48-a6957d9f8140", + "metadata": {}, + "outputs": [], + "source": [ + "pd.options.display.max_columns = 100\n", + "pd.options.display.float_format = \"{:.2f}\".format\n", + "pd.set_option(\"display.max_rows\", None)\n", + "pd.set_option(\"display.max_colwidth\", None)" + ] + }, + { + "cell_type": "markdown", + "id": "b07ecdbc-a3a9-4183-80dc-57e71cf61fe6", + "metadata": {}, + "source": [ + "**Step 7: Setting your parameters**\n", + "* While these steps have already been done for you, it would still benefit you to re-do these steps and refer to the resource below. \n", + "* **Resource**: [DDS Docs Capturing Parameters](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#capturing-parameters).\n", + "* **Parameter #1:** Set a cell that is commented out with your parameter. Turn on the parameter tag.\n", + " * To turn on the parameter tag: go to the code cell go to the upper right hand corner -> click on the gears -> go to “Cell Tags” -> Add Tag + -> add a tag called “parameters” -> click on the new “parameters” tag to ensure a checkmark shows up and it turns dark gray" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d82c9a8-6f8f-485b-ace5-957f1b80c2f3", + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# district = 1" + ] + }, + { + "cell_type": "markdown", + "id": "2fca6082-1964-43d7-bcd8-8668c39afaac", + "metadata": {}, + "source": [ + "**Parameter #2:** This second cell replaces each district as the notebook loops over each parameter in the `starter_kit.yml` file.\n", + "* `%%capture_parameters` must be the first line of code in this block or else your notebook will fail to parameterize." + ] + }, { "cell_type": "code", "execution_count": null, - "id": "0f6cc688-c077-4b6d-9b11-bc6d99cff82f", + "id": "43a07a8c-567d-471d-be10-a547cd0b3a13", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "%%capture_parameters\n", + "district" + ] + }, + { + "cell_type": "markdown", + "id": "f9285e93-924d-4681-b526-97b8e46643b1", + "metadata": {}, + "source": [ + "* **Parameter #3:** The first markdown cell must include parameters to inject. This line below generates the title District 1 Analysis when it is creating the notebook for District 1. Likewise, it'll say District 2 Analysis for District 2's page. \n", + "* Feel free to change this to anything you wish, but make sure this stays a markdown cell.\n", + "* This cell is extremely important and read why [here](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html#header)." + ] + }, + { + "cell_type": "markdown", + "id": "cb5a0cc4-3e7e-4aea-81f2-c5e858fb315b", + "metadata": {}, + "source": [ + "# District {district} Analysis " + ] + }, + { + "cell_type": "markdown", + "id": "64615b63-3848-45b7-af2e-19c7b7346997", + "metadata": {}, + "source": [ + "**Step 8: Input your functions**\n", + "* I am loading my dataset first.\n", + "* Then I am adding in my dataset and the district parameter into `_starterkit_utils.create_district_summary`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c91049e1-107d-47d9-9cda-63aa4fbf554b", + "metadata": {}, + "outputs": [], + "source": [ + "df = _starterkit_utils.load_dataset()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd1509c0-b435-456e-ad1c-b583a991f1e2", + "metadata": {}, + "outputs": [], + "source": [ + "_starterkit_utils.create_district_summary(df, district)" + ] + }, + { + "cell_type": "markdown", + "id": "76052780-3c27-405c-9379-13e82130eec7", + "metadata": {}, + "source": [ + "**Step 9: Download the right packages**\n", + "* Navigate back to the root of your repo which is `~/data-analyses`.\n", + "* Once there, install the portfolio requirements using `pip install -r portfolio/requirements.txt`. This will take a bit.\n", + "* **Resource**: [DDS Deploying Portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#building-and-deploying-your-report)" + ] + }, + { + "cell_type": "markdown", + "id": "c8fce487-015d-4e24-8444-d5c07ec17890", + "metadata": {}, + "source": [ + "**Step 10: Build your portfolio**\n", + "* Double check you are at the root of your repo.\n", + "* Replace `REPLACE_YML_NAME` with just the name of your `yml` file without the `.yml` extension into the command below.\n", + "* Run `python portfolio/portfolio.py build REPLACE_YML_NAME --deploy` to build your portfolio.\n", + " * Example: My yml is called `ha_starterkit_district.yml` so I would run `python portfolio/portfolio.py build ha_starterkit_district --deploy`." + ] + }, + { + "cell_type": "markdown", + "id": "fc0fde8b-7671-43cf-b1ac-66730e436d11", + "metadata": {}, + "source": [ + "**Step 11: Something not right?**\n", + "* Your portfolio should be up and running. \n", + "* You can view your portfolio using the draft URL. It'll look something like this: `https://ha-starterkit-district--cal-itp-data-analyses.netlify.app`.\n", + "* What if something is a little off? After updating your code, rerun this line of code to redo your portfolio. You must always `clean` your portfolio before regenerating new notebooks. \n", + "` python portfolio/portfolio.py clean REPLACE_YML_NAME && python portfolio/portfolio.py build REPLACE_YML_NAME --deploy`\n", + "* **Resource**: [DDS Other Specifications](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#other-specifications)" + ] + }, + { + "cell_type": "markdown", + "id": "9c8f91a0-e0b5-465d-8f95-be8e3fc036ea", + "metadata": {}, + "source": [ + "**Step 12: Commit your code**\n", + "* You" + ] } ], "metadata": { diff --git a/starter_kit/Makefile b/starter_kit/Makefile new file mode 100644 index 000000000..11d5ed6d4 --- /dev/null +++ b/starter_kit/Makefile @@ -0,0 +1,6 @@ +build_test_portfolio: + cd ../ && pip install -r portfolio/requirements.txt + python portfolio/portfolio.py clean REPLACE_YML_NAME + python portfolio/portfolio.py build REPLACE_YML_NAME --deploy + git add portfolio/REPLACE_YML_NAME/district_*/ portfolio/REPLACE_YML_NAME/*.yml portfolio/REPLACE_YML_NAME/*.md + git add portfolio/sites/REPLACE_YML_NAME.yml \ No newline at end of file From b0d18416789074fc5026f7e66a466ba0a5ea976a Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Thu, 31 Oct 2024 15:53:21 +0000 Subject: [PATCH 12/12] finshed makefile for starter_kit --- Makefile | 15 +++++- ha_portfolio/Makefile | 7 --- .../00__ha_portfolio__district_1.ipynb | 4 +- .../00__ha_portfolio__district_10.ipynb | 2 +- .../00__ha_portfolio__district_11.ipynb | 4 +- .../00__ha_portfolio__district_12.ipynb | 2 +- .../00__ha_portfolio__district_2.ipynb | 4 +- .../00__ha_portfolio__district_3.ipynb | 4 +- .../00__ha_portfolio__district_4.ipynb | 2 +- .../00__ha_portfolio__district_5.ipynb | 2 +- .../00__ha_portfolio__district_6.ipynb | 4 +- .../00__ha_portfolio__district_7.ipynb | 2 +- .../00__ha_portfolio__district_8.ipynb | 2 +- .../00__ha_portfolio__district_9.ipynb | 4 +- starter_kit/2024_basics_05.ipynb | 52 ++++++++++++++----- starter_kit/Makefile | 6 --- 16 files changed, 72 insertions(+), 44 deletions(-) delete mode 100644 ha_portfolio/Makefile delete mode 100644 starter_kit/Makefile diff --git a/Makefile b/Makefile index 04b3e5e5c..41b98acf8 100644 --- a/Makefile +++ b/Makefile @@ -59,12 +59,25 @@ build_district_digest: make build_portfolio_site git add portfolio/$(site)/district_*/*.ipynb +build_starterkit_ha: + $(eval export site = ha_starterkit_district) + pip install -r portfolio/requirements.txt + make build_portfolio_site + git add portfolio/$(site)/district_*/ portfolio/$(site)/*.yml portfolio/$(site)/*.md + python portfolio/portfolio.py index --deploy --prod + +build_starterkit_LASTNAME: + $(eval export site = YOUR_SITE_NAME) + pip install -r portfolio/requirements.txt + make build_portfolio_site + git add portfolio/$(site)/district_*/ portfolio/$(site)/*.yml portfolio/$(site)/*.md + python portfolio/portfolio.py index --deploy --prod + add_precommit: pip install pre-commit pre-commit install #pre-commit run --all-files - # Add to _.bash_profile outside of data-analyses #alias go='cd ~/data-analyses/portfolio && pip install -r requirements.txt && cd #../_shared_utils && make setup_env && cd ..' diff --git a/ha_portfolio/Makefile b/ha_portfolio/Makefile deleted file mode 100644 index 526351f3c..000000000 --- a/ha_portfolio/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -build_test_portfolio: - cd ../ && pip install -r requirements.txt - cd ../ && python portfolio/portfolio.py clean ha_starterkit_district - cd ../ && python portfolio/portfolio.py build ha_starterkit_district --deploy - cd ../ && python portfolio/portfolio.py build ha_starterkit_district --deploy - git add portfolio/ha_starterkit_district/district_*/ portfolio/ha_starterkit_district/*.yml portfolio/ha_starterkit_district/*.md - git add portfolio/sites/ha_starterkit_district.yml \ No newline at end of file diff --git a/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb b/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb index d7194a92b..4f7fb7932 100644 --- a/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb +++ b/portfolio/ha_starterkit_district/district_1/00__ha_portfolio__district_1.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c38bb5913b6ac927ac12de2a7292915cb6d1dfaa8521fb247bd3b9f57a15c46 -size 18089 +oid sha256:d628df9d431f7cad06accab072a4d319b0169bb9b99b511f8551a81a63f3a810 +size 18087 diff --git a/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb b/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb index 2f04e3a73..1fe836308 100644 --- a/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb +++ b/portfolio/ha_starterkit_district/district_10/00__ha_portfolio__district_10.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d7a83a5782bf1541851fab8ce19ba549b18067d0c0628fdc6f5c7ab6da460be +oid sha256:e4bf26deea732b1c78fa9da3703ba63f832c241f1396280642b2c0e6b8d16d1a size 20922 diff --git a/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb b/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb index 46eaaa66d..6094b0e20 100644 --- a/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb +++ b/portfolio/ha_starterkit_district/district_11/00__ha_portfolio__district_11.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5e8ad684dd255ea9a0a62909b8be85ecda561c64d7683bad46d9d0e1523c0a56 -size 29004 +oid sha256:df47ac5ae53e2a6f6e7c797db582fc828c5f1ff8928fd29e5a0edd77b704c738 +size 29005 diff --git a/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb b/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb index 70b24fa91..163365a1e 100644 --- a/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb +++ b/portfolio/ha_starterkit_district/district_12/00__ha_portfolio__district_12.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a511f23132f5e99925fa1bbc19bf2bf08e5dcd230cea0f8ed96525ad566c564d +oid sha256:b5b5ea17fe11171d4ced9c109bc53f70ef2b67ccec04288bcda856f3464c5e4f size 25791 diff --git a/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb b/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb index 4170a5ba6..9e8d86659 100644 --- a/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb +++ b/portfolio/ha_starterkit_district/district_2/00__ha_portfolio__district_2.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97913c008fa5d6e7c39dc3e6723169ce0e6f7cfdd7822e43ad58b327d1233786 -size 20939 +oid sha256:0bd66c6c71557ad082090fe960b7c1900bd3c4701ad6ed61e4aa1fefb0086618 +size 20941 diff --git a/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb b/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb index 7f17b8db0..334ded8a2 100644 --- a/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb +++ b/portfolio/ha_starterkit_district/district_3/00__ha_portfolio__district_3.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e0eb83c0ba4d61cc9ed2d78088b9731aab31de1be31171a963b4ce62fa9b34d -size 30297 +oid sha256:9136e8a5da205dbc13e53c3fda3733e32ffa7606c71f74076d485b8c2ec7fa3d +size 30296 diff --git a/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb b/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb index b4e038f88..80653b809 100644 --- a/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb +++ b/portfolio/ha_starterkit_district/district_4/00__ha_portfolio__district_4.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e42e5070606592e282fded026959547cd38fb6fbec87255b88b7b86af4d3c534 +oid sha256:d1d8630e50736c232bc3664db0a264bd1a20d378f04def5ffbb9848eef5dfa73 size 30891 diff --git a/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb b/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb index 5d9cfabff..104bf22f2 100644 --- a/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb +++ b/portfolio/ha_starterkit_district/district_5/00__ha_portfolio__district_5.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5d56ae0ed14c13dd7a9b9cd5817d49ca0335600a8752e74fe55f024e3f329101 +oid sha256:b387a497223ee90b0f281ea989fe9d65016f26434370bce798a30badb8b8a429 size 26311 diff --git a/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb b/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb index a7d458c81..0ad26e968 100644 --- a/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb +++ b/portfolio/ha_starterkit_district/district_6/00__ha_portfolio__district_6.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21a982a4eca7b4deb73009fc1dab342966c868bada42da48efb81e263a7059d0 -size 23689 +oid sha256:ff782ee23e9c5a27c332d8c00c6c3fa118bb022917e403a577183452c616a5b0 +size 23686 diff --git a/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb b/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb index c71894e34..fc28ea0fe 100644 --- a/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb +++ b/portfolio/ha_starterkit_district/district_7/00__ha_portfolio__district_7.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c9ae22a6fb162af81e38c8642005dbe39a7ca88c78c3db1c6e7a7e59a036f63f +oid sha256:f9b8c61b76270fbc128a0ab303ab6b518a8ecdc9ebf897a8ded23cb03491c63b size 23053 diff --git a/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb b/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb index 9c232ee58..ab7c46989 100644 --- a/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb +++ b/portfolio/ha_starterkit_district/district_8/00__ha_portfolio__district_8.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:044d900722bd04b384a665779e94c1b4e079d448af5a55cf78a80cc9c8ef430c +oid sha256:9adc67a6b90cf4e9697ce30f6339bf8fdf17559fe09f0b6dd26d85f684b77839 size 27411 diff --git a/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb b/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb index 99f31ec28..f0b3a913f 100644 --- a/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb +++ b/portfolio/ha_starterkit_district/district_9/00__ha_portfolio__district_9.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1104341d292a81aeacc2832e625accba110a6cd0dee2c38123bd267450621157 -size 23224 +oid sha256:2960ce8d6abb645e17252eb5425cb2b0a69736bc0a73a570b87ebabec3738189 +size 23228 diff --git a/starter_kit/2024_basics_05.ipynb b/starter_kit/2024_basics_05.ipynb index a3b1639ce..40e31e42d 100644 --- a/starter_kit/2024_basics_05.ipynb +++ b/starter_kit/2024_basics_05.ipynb @@ -12,13 +12,14 @@ "* We often present our work on our portfolio because it retains the interactivity of the `Altair` charts and `Geopandas` maps we make.\n", "* Additionally, it is very streamlined to update our work when it needs to be updated. \n", "* Spend some time exploring our portfolio above. \n", + "\n", "**How does the portfolio work?**\n", - "* For the majority of the sites on the portfolio are using **one** notebook essentially as a template that is looped one or more variables. \n", - " * This [National Transit Dataset Monthly Ridership by Regional Transit Planning Authority (RTPA)](https://ntd-monthly-ridership--cal-itp-data-analyses.netlify.app/readme) takes [this notebook](https://github.com/cal-itp/data-analyses/blob/main/ntd/monthly_ridership_report.ipynb) and reruns it for every \n", + "* For the majority of the sites on the portfolio are using a single notebook essentially as a template that is looped one or more variables. \n", + " * This [National Transit Dataset Monthly Ridership by Regional Transit Planning Authority (RTPA) portfolio](https://ntd-monthly-ridership--cal-itp-data-analyses.netlify.app/readme) takes [this notebook](https://github.com/cal-itp/data-analyses/blob/main/ntd/monthly_ridership_report.ipynb) and reruns it for every \n", "RTPA in this [yml file](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/ntd_monthly_ridership.yml). \n", - " * This process of looping over a parameter is called parameterizing a notebook!\n", + " * This process of looping over variables to generate new notebooks is called parameterizing a notebook.\n", + " \n", "**Resources**\n", - " * You may wish to read these resources before making the portfolio.\n", " * [Preparing notebooks for the portfolio](https://docs.calitp.org/data-infra/publishing/sections/4_notebooks_styling.html)\n", " * [Publishing to the portfolio](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html)\n", "\n", @@ -38,7 +39,6 @@ "* Right click -> rename this notebook as `lastname_portfolio.ipynb`\n", "* Use `git mv` to move the Python file that holds your functions to the `lastname_portfolio`.\n", "* Right click -> copy the `starterkit_district.yml` file to the folder `data-analyses/portfolio/sites`. Rename `starterkit_district.yml` to `lastname_starterkit_district`\n", - "* Right click -> copy the `Makefile` file to your new folder folder `lastname_portfolio`.\n", "* Close this original `2024_basics_05.ipynb` and begin working on your new `lastname_portfolio.ipynb`" ] }, @@ -50,7 +50,7 @@ "**Step 2: Netlify Setup**\n", "* Follow the instructions [here](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#netlify-setup).\n", "* You only need to do this step **once** for the entirety of your career at DDS. \n", - "* Once you have your key setup, you can publish limitless portfolios." + "* Once you have your key setup, you can publish countless portfolios." ] }, { @@ -247,15 +247,26 @@ }, { "cell_type": "markdown", - "id": "fc0fde8b-7671-43cf-b1ac-66730e436d11", + "id": "36567eba-a5d4-4a38-b67e-ffbf8fe74035", "metadata": {}, "source": [ - "**Step 11: Something not right?**\n", + "**Step 11: View**\n", "* Your portfolio should be up and running. \n", - "* You can view your portfolio using the draft URL. It'll look something like this: `https://ha-starterkit-district--cal-itp-data-analyses.netlify.app`.\n", + "* You can view your portfolio using the draft URL. It'll look something like this: `https://your-site-name--cal-itp-data-analyses.netlify.app`.\n", + "* If everything looks great, commit your work. \n", + " * Parameterizing a notebook creates a lot of new files. Make sure you've committed everything.\n", + " * This is tedious and will involve many directory changes." + ] + }, + { + "cell_type": "markdown", + "id": "41c923e8-4d79-424b-9e28-50ae4924cc24", + "metadata": {}, + "source": [ + "**Step 12: Something not right?**\n", "* What if something is a little off? After updating your code, rerun this line of code to redo your portfolio. You must always `clean` your portfolio before regenerating new notebooks. \n", "` python portfolio/portfolio.py clean REPLACE_YML_NAME && python portfolio/portfolio.py build REPLACE_YML_NAME --deploy`\n", - "* **Resource**: [DDS Other Specifications](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#other-specifications)" + "* There are many other specifications you can add to `python portfolio/portfolio.py build` and they are all detailed on [DDS Other Specifications](https://docs.calitp.org/data-infra/publishing/sections/5_analytics_portfolio_site.html#other-specifications). " ] }, { @@ -263,8 +274,25 @@ "id": "9c8f91a0-e0b5-465d-8f95-be8e3fc036ea", "metadata": {}, "source": [ - "**Step 12: Commit your code**\n", - "* You" + "**Step 13: Run a Makefile**\n", + "* You can generate all 12 of your notebooks in one swift line of code instead of running the same couple of lines over and over again using a `Makefile`. \n", + "* You can think of a `Makefile` as a coffee machine that does the same thing day in and day out. \n", + " * You always install the same packages.\n", + " * You always clean out the repo.\n", + " * You generally will rerun the notebook in its entirety.\n", + " * You always add the `md,yml,ipynb` and other files that the parameterization process creates.\n", + "* Makefiles are great for automating tasks and saving time. \n", + "\n", + "**Instructions** \n", + "* Make sure you are still at the root of our repo `~/data-analyses`.\n", + "* Under `data-analyses` you'll see a file called `Makefile`.\n", + "* Open up the `Makefile`. Scroll down to lines 68-72. \n", + "* Copy and paste the entire block of 68-72. \n", + "* Replace LASTNAME in `build_starterkit_LASTNAME:` with your name.\n", + "* Replace YOUR_SITE_NAME with the name of your .yml file in `/portfolio/sites` in `$(eval export site = YOUR_SITE_NAME)`\n", + " * My `yml` is named `ha_starterkit_district.yml` so my line is `$(eval export site = ha_starterkit_district)`\n", + "* Make sure you retain all the `\t` spaces! \n", + "* At the root of the repo run `Make build_starterkit_LASTNAME`.\n" ] } ], diff --git a/starter_kit/Makefile b/starter_kit/Makefile deleted file mode 100644 index 11d5ed6d4..000000000 --- a/starter_kit/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -build_test_portfolio: - cd ../ && pip install -r portfolio/requirements.txt - python portfolio/portfolio.py clean REPLACE_YML_NAME - python portfolio/portfolio.py build REPLACE_YML_NAME --deploy - git add portfolio/REPLACE_YML_NAME/district_*/ portfolio/REPLACE_YML_NAME/*.yml portfolio/REPLACE_YML_NAME/*.md - git add portfolio/sites/REPLACE_YML_NAME.yml \ No newline at end of file