From bb3e8b4b255823beb47432bf4bbb04ce1959f4b5 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Tue, 18 Jun 2024 22:10:03 +0000 Subject: [PATCH 01/13] separated out deploy vs creating the necessary files --- .../sections/10_deploy_to_portfolio.md | 66 ++++ .../sections/4_analytics_portfolio_site.md | 325 ++++++++++-------- .../sections/5_notebooks_styling.md | 79 ----- 3 files changed, 240 insertions(+), 230 deletions(-) create mode 100644 docs/publishing/sections/10_deploy_to_portfolio.md diff --git a/docs/publishing/sections/10_deploy_to_portfolio.md b/docs/publishing/sections/10_deploy_to_portfolio.md new file mode 100644 index 0000000000..d643feb09a --- /dev/null +++ b/docs/publishing/sections/10_deploy_to_portfolio.md @@ -0,0 +1,66 @@ +(deploy_to_portfolio)= + +# Building and Deploying your Report + +After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! + +## Build your Report + +**Note:** The build command must be run from the root of the repo at `~/data-analyses`! + +1. Navigate back to the repo data-analyses and install the portfolio requirements with + `pip install -r portfolio/requirements.txt` +2. Then run `python portfolio/portfolio.py build my_report` to build your report + - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` +3. Add the files using `git add` and commit your progress! + +## Deploy your Report + +1. Make sure you are in the root of the data-analyses repo: `~/data-analyses` + +2. Run `python portfolio/portfolio.py build my_report --deploy` + + - By running `--deploy`, you are deploying the changes to display in the Analytics Portfolio. + - **Note:** The `my_report` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + - If you have already deployed but want to make changes to the README, run: `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` + - Running this is helpful for larger outputs or if you are updating the README. + +3. Once this runs, you can check the preview link at the bottom of the output. It should look something like: + + - `–no-deploy`: `file:///home/jovyan/data-analyses/portfolio/my_report/_build/html/index.html` + - `–deploy`: `Website Draft URL: https://my-report--cal-itp-data-analyses.netlify.app` + +4. Add the files using `git add` and commit! + +5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) + +### Other Specifications + +- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: + - `--deploy / --no-deploy` + - deploy this component to netlify. + - `--prepare-only / --no-prepare-only` + - Pass-through flag to papermill; if true, papermill will not actually execute cells. + - `--execute-papermill / --no-execute-papermill` + - If false, will skip calls to papermill + - `--no-stderr / --no-no-stderr` + - If true, will clear stderr stream for cell outputs + - `--continue-on-error / --no-continue-on-error` + - Default: no-continue-on-error + +## Adding to the Makefile + +Another way to write to the Analytics Portfolio is to use the Makefile and run +`make build_my_report -f Makefile` in data-analyses + +Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): + +``` +build_my_reports: + pip install -r portfolio/requirements.txt + git rm portfolio/my_report/ -rf + python portfolio/portfolio.py build my_report --deploy + git add portfolio/my_report/district_*/ portfolio/my_report/*.yml portfolio/my_report/*.md + git add portfolio/sites/my_report.yml +``` diff --git a/docs/publishing/sections/4_analytics_portfolio_site.md b/docs/publishing/sections/4_analytics_portfolio_site.md index 8877f69b45..a0e1115db1 100644 --- a/docs/publishing/sections/4_analytics_portfolio_site.md +++ b/docs/publishing/sections/4_analytics_portfolio_site.md @@ -3,179 +3,202 @@ # The Cal-ITP Analytics Portfolio Depending on the complexity of your visualizations, you may want to produce -a full website composed of multiple notebooks and/or the same notebook run -across different sets of data (for example, one report per Caltrans district). +a full website composed of multiple notebooks and/or the same notebook that is rerun across different parameters. For these situations, the [Jupyter Book-based](https://jupyterbook.org/en/stable/intro.html) [publishing framework](https://github.com/cal-itp/data-analyses/tree/main/portfolio) -present in the data-analyses repo is your friend. - -You can find the Cal-ITP Analytics Portfolio at [analysis.calitp.org](https://analysis.calitp.org). - -## Setup - -Before executing the build, there are a few prior steps you need to do. - -1. Set up netlify key/make sure your Netlify token is up to date: - - - Install netlify: `npm install -g netlify-cli` - - Navigate to your main directory - - Edit your bash profile using Nano: - - In your terminal, enter `nano ~/.bash_profile` to edit. - - Navigate using arrows (down, right, etc) to create 2 new lines. Paste (`CTRL` + `V`) your netlify key in the lines in the following format, each line prefixed with "export" - - `export NETLIFY_AUTH_TOKEN= YOURTOKENHERE123` - - `export NETLIFY_SITE_ID=cal-itp-data-analyses` - - To exit, press `CTRL` + `X` - - Nano will ask if you want to save your changes. Type `Y` to save. - - Type `N` to discard your changes and exit - - For the changes to take effect, open a new terminal or run `source ~/.bash_profile` - - Back in your terminal, enter `env | grep NETLIFY` to see that your Netlify token is there - -2. Create a `README.md` file in the repo where your work lies. - - - Your file should always be titled as `README.md` and not other variants such as `README_gtfs.md` because the portfolio can only take a `README.md` file. - - If you do accidentally create a `README.md` file with extra strings, you can fix this by taking the following steps: - - `git rm portfolio/my_analysis/README_accidentally_named_something_else.md` - - `rm portfolio/my_analysis/_build/html/README_accidentally_named_something.html`. We use `rm` because \_build/html folder is not checked into GitHub - - `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` to rerun the portfolio to incorporate only the new changes to your `README.md` if the other pages are correct. - -3. Create a `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). Each `.yml` file is a site, so if you have separate research topics, they should each have their own `.yml` file. - - - This `.yml` file will include the directory to the notebook(s) you want to publish. - - Name your `.yml` file. For now we will use `my_report.yml` as an example. - - The structure of your `.yml` file depends on the type of your analysis: - - If you have one parameterized notebook with **one parameter**: - - - Example: [dla.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) - - ``` - title: My Analyses - directory: ./my-analyses/ - readme: ./my-analyses/README.md - notebook: ./my-analyses/my-notebook.ipynb - parts: - - caption: Introduction - - chapters: - - params: - district_parameter: 1 - district_title: District 1 - ``` - - - If you have a parameterized notebook with **multiple parameters**: - - - Example: [rt.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/rt.yml) - - ``` - title: My Analyses - directory: ./my-analyses/ - readme: ./my-analyses/README.md - notebook: ./my-analyses/my-notebook.ipynb - parts: - - chapters: - - caption: County Name - params: - parameter1_county_name - sections: - - city: parameter2_city_name - - city: parameter2_city_name - ``` - - - If you have an individual notebook with **no parameters**: - - - Example: [hqta.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/hqta.yml) - - ``` - title: My Analyses - directory: ./my-analyses/ - readme: ./my-analyses/README.md - parts: - - caption: Introduction - - chapters: - - notebook: ./my-analyses/notebook_1.ipynb - - notebook: ./my-analyses/notebook_2.ipynb - ``` +present in the data-analyses repo is your friend. You can find the Cal-ITP Analytics Portfolio at [analysis.calitp.org](https://analysis.calitp.org). - - If you have multiple parameterized notebooks with **the same parameters**: +## Netlify Setup - - Example: [rt_parallel.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/rt_parallel.yml) +Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a full website. You must set up netlify key and/or make sure your Netlify token is up to date: - ``` - title: My Analyses - directory: ./my-analyses/ - readme: ./my-analyses/README.md - parts: - - caption: District Name - - chapters: - - caption: Parameter 1 - params: - itp_id: parameter_1 - sections: §ions - - notebook: ./analysis_1/notebook_1.ipynb - - notebook: ./analysis_2/notebook_2.ipynb - - caption: Parameter 2 - params: - itp_id: parameter_2 - sections: *sections - ``` +- Install netlify: `npm install -g netlify-cli` +- Navigate to your main directory +- Edit your bash profile using Nano: + - In your terminal, enter `nano ~/.bash_profile` to edit. + - Navigate using arrows (down, right, etc) to create 2 new lines. Paste (`CTRL` + `V`) your netlify key in the lines in the following format, each line prefixed with "export" + - `export NETLIFY_AUTH_TOKEN= YOURTOKENHERE123` + - `export NETLIFY_SITE_ID=cal-itp-data-analyses` + - To exit, press `CTRL` + `X` + - Nano will ask if you want to save your changes. Type `Y` to save. + - Type `N` to discard your changes and exit +- For the changes to take effect, open a new terminal or run `source ~/.bash_profile` + - Back in your terminal, enter `env | grep NETLIFY` to see that your Netlify token is there + +## File Setup + +In order to publish to analysis.calitp.org, you need to create three different files. + +- A Jupyter Notebook (with a few particular elements to parameterize successfully). +- A README.md. +- A YML. + +### Jupyter Notebook + +Setting up your Jupyter Notebook to be parameterized and published to the analysis.calitp.org requires a few extra steps. Please refer to to the [next section](https://docs.calitp.org/data-infra/publishing/sections/5_notebooks_styling.html) on how to style your notebook in accordance to our StyleGuide. + +[See a sample parameterized notebook here.](https://github.com/cal-itp/data-analyses/blob/main/starter_kit/parameterized_notebook.ipynb) + +#### Packages to include + +Copy and paste this code block below in every notebook for the portfolio. Order matters, %%capture must go first. + +``` +# Include this in the cell where packages are imported + +%%capture + +import warnings +warnings.filterwarnings('ignore') + +import calitp_data_analysis.magics +``` -## Building and Deploying your Report +#### Capturing Parameters -### Build your Report +When parameterizing a notebook, there are 2 places in which the parameter must be injected. -**Note:** The build command must be run from the root of the repo! +- Header: + The first Markdown cell must include parameters to inject. -1. Navigate back to the repo data-analyses and install the portfolio requirements with - `pip install -r portfolio/requirements.txt` -2. Then run `python portfolio/portfolio.py build my_report` to build your report - - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` -3. Add the files using `git add` and commit your progress! + - Ex: If `district` is one of the parameters in your `sites/my_report.yml`, a header Markdown cell could be `# District {district} Analysis`. + - Note: The site URL is constructed from the original notebook name and the parameter in the JupyterBook build: `0_notebook_name__district_x_analysis.html` -### Deploy your Report +- Code Cell: -1. Make sure you are in the root of the data-analyses repo: `~/data-analyses` + - Create a code cell in which your parameter will be captured. Make sure the `parameter` tag for the cell is turned on. + - Capture parameters - this option won't display locally in your notebook (it will still show `{district_number}`), but will be injected with the value when the JupyterBook is built. -2. Run `python portfolio/portfolio.py build my_report --deploy` + In a code cell: - - By running `--deploy`, you are deploying the changes to display in the Analytics Portfolio. - - **Note:** The `my_report` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - - If you have already deployed but want to make changes to the README, run: `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` - - Running this is helpful for larger outputs or if you are updating the README. + ```` + ``` + %%capture_parameters -3. Once this runs, you can check the preview link at the bottom of the output. It should look something like: + district_number = f"{df.caltrans_district.iloc[0].split('-')[0].strip()}" + ``` + ```` - - `–no-deploy`: `file:///home/jovyan/data-analyses/portfolio/my_report/_build/html/index.html` - - `–deploy`: `Website Draft URL: https://my-report--cal-itp-data-analyses.netlify.app` + Amanda Note, IDK what this means -4. Add the files using `git add` and commit! +- If you're using a heading, you can either use HTML or capture the parameter and inject. -5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) +- HTML - this option works when you run your notebook locally. -### Other Specifications + ``` + from IPython.display import HTML -- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: - - `--deploy / --no-deploy` - - deploy this component to netlify. - - `--prepare-only / --no-prepare-only` - - Pass-through flag to papermill; if true, papermill will not actually execute cells. - - `--execute-papermill / --no-execute-papermill` - - If false, will skip calls to papermill - - `--no-stderr / --no-no-stderr` - - If true, will clear stderr stream for cell outputs - - `--continue-on-error / --no-continue-on-error` - - Default: no-continue-on-error + display(HTML(f"

Header with {variable}

")) + ``` -## Adding to the Makefile +##### Consecutive Headers -Another way to write to the Analytics Portfolio is to use the Makefile and run -`make build_my_report -f Makefile` in data-analyses +Headers must move consecutively in Markdown cells or the parameterized notebook will not generate. No skipping! -Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): +``` +# Notebook Title +## First Section +## Second Section +### Another subheading +``` + +To get around consecutive headers, you can use `display(HTML())`. ``` -build_my_reports: - pip install -r portfolio/requirements.txt - git rm portfolio/my_report/ -rf - python portfolio/portfolio.py build my_report --deploy - git add portfolio/my_report/district_*/ portfolio/my_report/*.yml portfolio/my_report/*.md - git add portfolio/sites/my_report.yml + display(HTML(

First Header

) display(HTML(

Next Header

)) ``` + +### README.md + +Create a `README.md` file in the repo where your work lies to detail the purpose of your website, methologies, relevant links, instructions, and more. + +- Your file should always be titled as `README.md`. No other variants such as `README_gtfs.md` or `read me.md` or ` README.md`. The portfolio can only take a `README.md` file when generating the landing page of your website. +- If you do accidentally create a `README.md` file with extra strings, you can fix this by taking the following steps: + - `git rm portfolio/my_analysis/README_accidentally_named_something_else.md` + - `rm portfolio/my_analysis/_build/html/README_accidentally_named_something.html`. We use `rm` because \_build/html folder is not checked into GitHub + - `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` to rerun the portfolio to incorporate only the new changes to your `README.md` if the other pages are correct. + +### YML + +A `.yml` specifies the parameter you want your notebook to iterate over. For example, the [DLA Grant Analysis's`.yml`](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) runs the same notebook for each of the 12 Caltrans districts and the districts are also listed on the \[left hand side\]((https://dla--cal-itp-data-analyses.netlify.app/readme) to form the "Table of Contents." + +Because each `.yml` file creates a new site on the [Portfolio's Index Page](https://analysis.calitp.org/), so every project needs its own file. DLA Grant Analysis, SB125 Route Illustrations, and Active Transportation Program all have their own `.yml` file. + +The `.yml` files live here at [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + +To create a `yml` file: + +- Include the directory to the notebook(s) you want to publish. +- Name your `.yml` file. For now we will use `my_report.yml` as an example. +- The structure of your `.yml` file depends on the type of your analysis: + - If you have one parameterized notebook with **one parameter**: + + - Example: [dla.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) + + ``` + title: My Analyses + directory: ./my-analyses/ + readme: ./my-analyses/README.md + notebook: ./my-analyses/my-notebook.ipynb + parts: + - caption: Introduction + - chapters: + - params: + district_parameter: 1 + district_title: District 1 + ``` + + - If you have a parameterized notebook with **multiple parameters**: + + - Example: [rt.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/rt.yml). You can automate making a `.yml` file using a script, [example here](https://github.com/cal-itp/data-analyses/blob/main/gtfs_digest/deploy_portfolio_yaml.py). + + ``` + title: My Analyses + directory: ./my-analyses/ + readme: ./my-analyses/README.md + notebook: ./my-analyses/my-notebook.ipynb + parts: + - chapters: + - caption: County Name + params: + parameter1_county_name + sections: + - city: parameter2_city_name + - city: parameter2_city_name + ``` + + - If you have an individual notebook with **no parameters**: + + ``` + title: My Analyses + directory: ./my-analyses/ + readme: ./my-analyses/README.md + parts: + - caption: Introduction + - chapters: + - notebook: ./my-analyses/notebook_1.ipynb + - notebook: ./my-analyses/notebook_2.ipynb + ``` + + - If you have multiple parameterized notebooks with **the same parameters**: + + - Example: [rt_parallel.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/rt_parallel.yml) + + ``` + title: My Analyses + directory: ./my-analyses/ + readme: ./my-analyses/README.md + parts: + - caption: District Name + - chapters: + - caption: Parameter 1 + params: + itp_id: parameter_1 + sections: §ions + - notebook: ./analysis_1/notebook_1.ipynb + - notebook: ./analysis_2/notebook_2.ipynb + - caption: Parameter 2 + params: + itp_id: parameter_2 + sections: *sections + ``` diff --git a/docs/publishing/sections/5_notebooks_styling.md b/docs/publishing/sections/5_notebooks_styling.md index 40e2009d65..6fc59df4d2 100644 --- a/docs/publishing/sections/5_notebooks_styling.md +++ b/docs/publishing/sections/5_notebooks_styling.md @@ -1,84 +1,5 @@ # Getting Notebooks Ready for the Portfolio -- [See a sample parameterized notebook here.](https://github.com/cal-itp/data-analyses/blob/main/starter_kit/parameterized_notebook.ipynb) - -## Packages to include - -- Order matters, %%capture must go first. -- `warnings.filterwarnings('ignore')` warnings from displaying in the portfolio site (`shared_utils`). - -``` -# Include this in the cell where packages are imported - -%%capture - -import warnings -warnings.filterwarnings('ignore') - -import calitp_data_analysis.magics -``` - -## Headers - -### Parameterized Titles - -- When parameterizing a notebook, the first Markdown cell must include parameters to inject. - - Ex: If `district` is one of the parameters in your `sites/my_report.yml`, a header Markdown cell could be `# District {district} Analysis`. - - Note: The site URL is constructed from the original notebook name and the parameter in the JupyterBook build: `0_notebook_name__district_x_analysis.html` - -### Consecutive Headers - -- Headers must move consecutively in Markdown cells or the parameterized notebook will not generate. No skipping! - -``` -# Notebook Title -## First Section -## Second Section -### Another subheading -``` - -- To get around consecutive headers, you can use `display(HTML())`. - - ``` - display(HTML(

First Header

) display(HTML(

Next Header

)) - ``` - -### Capturing Parameters - -- Create a code cell in which your parameter will be captured. Make sure the `parameter` tag for the cell is turned on. - -``` - district_number = "4" -``` - -- If you're using a heading, you can either use HTML or capture the parameter and inject. - -- HTML - this option works when you run your notebook locally. - - ``` - from IPython.display import HTML - - display(HTML(f"

Header with {variable}

")) - ``` - -- Capture parameters - this option won't display locally in your notebook (it will still show `{district_number}`), but will be injected with the value when the JupyterBook is built. - - In a code cell: - - ``` - %%capture_parameters - - district_number = f"{df.caltrans_district.iloc[0].split('-')[0].strip()}" - ``` - -
- - In a Markdown cell: - - ``` - ## District {district_number} - ``` - ## Narrative - Narrative content can be done in Markdown cells or code cells. From 3bec1abbff81173fc9c56e6910fa7941b948c2d7 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Tue, 18 Jun 2024 22:37:26 +0000 Subject: [PATCH 02/13] deleted outdated functions, added more clarity to deploy --- docs/publishing/sections/10_deploy_to_portfolio.md | 6 ++++-- docs/publishing/sections/5_notebooks_styling.md | 11 +---------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/docs/publishing/sections/10_deploy_to_portfolio.md b/docs/publishing/sections/10_deploy_to_portfolio.md index d643feb09a..51b90cc82d 100644 --- a/docs/publishing/sections/10_deploy_to_portfolio.md +++ b/docs/publishing/sections/10_deploy_to_portfolio.md @@ -8,7 +8,7 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' **Note:** The build command must be run from the root of the repo at `~/data-analyses`! -1. Navigate back to the repo data-analyses and install the portfolio requirements with +1. Navigate back to the `~/data-analyses` and install the portfolio requirements with `pip install -r portfolio/requirements.txt` 2. Then run `python portfolio/portfolio.py build my_report` to build your report - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). @@ -44,6 +44,8 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' - Pass-through flag to papermill; if true, papermill will not actually execute cells. - `--execute-papermill / --no-execute-papermill` - If false, will skip calls to papermill + - For example, if only the `README.md` is updated but the notebooks have remained the same, you would run + `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy`. - `--no-stderr / --no-no-stderr` - If true, will clear stderr stream for cell outputs - `--continue-on-error / --no-continue-on-error` @@ -51,7 +53,7 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' ## Adding to the Makefile -Another way to write to the Analytics Portfolio is to use the Makefile and run +Another and more efficient way to write to the Analytics Portfolio is to use the Makefile and run `make build_my_report -f Makefile` in data-analyses Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): diff --git a/docs/publishing/sections/5_notebooks_styling.md b/docs/publishing/sections/5_notebooks_styling.md index 6fc59df4d2..49ff162d91 100644 --- a/docs/publishing/sections/5_notebooks_styling.md +++ b/docs/publishing/sections/5_notebooks_styling.md @@ -65,7 +65,7 @@ These are a set of principles to adhere to when writing the narrative content in - A good rule of thumb is to start with 1 extra decimal place than what is present in the other columns when deriving statistics (averages, percentiles), and decide from there if you want to round up. - An average of `$100,000.0` can simply be rounded to `$100,000`. - An average of 5.2 mi might be left as is. - - National Institutes of Health [Rounding Rules](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/table/ARCHDISCHILD2014) (full [article](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/#:~:text=Ideally%20data%20should%20be%20rounded,might%20call%20it%20Goldilocks%20rounding.&text=The%20European%20Association%20of%20Science,2%E2%80%933%20effective%20digits%E2%80%9D.)) + - National Institutes of Health [Rounding Rules](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/#:~:text=Ideally%20data%20should%20be%20rounded,might%20call%20it%20Goldilocks%20rounding.&text=The%20European%20Association%20of%20Science,2%E2%80%933%20effective%20digits%E2%80%9D.) - Additional references: [American Psychological Association (APA) style](https://apastyle.apa.org/instructional-aids/numbers-statistics-guide.pdf), and [Purdue](https://owl.purdue.edu/owl/research_and_citation/apa_style/apa_formatting_and_style_guide/apa_numbers_statistics.html) @@ -89,13 +89,4 @@ These are a set of principles to adhere to when writing the narrative content in route_names, on = ["calitp_itp_id", "route_id"] ) - - - agency_names = portfolio_utils.add_agency_name() - - # Merge in the operator's name using calitp_itp_id - df = pd.merge(df, - agency_names, - on = "calitp_itp_id" - ) ``` From d02a4c8c2301e78b1ed3026e91818918671463d0 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Wed, 19 Jun 2024 22:35:58 +0000 Subject: [PATCH 03/13] swapped order, added images, more on styling --- .../sections/10_deploy_to_portfolio.md | 68 ------ .../sections/4_notebooks_styling.md | 200 ++++++++++++++++++ ..._site.md => 5_analytics_portfolio_site.md} | 147 ++++++------- .../sections/5_notebooks_styling.md | 92 -------- docs/publishing/sections/section4_image1.png | Bin 0 -> 69480 bytes docs/publishing/sections/section4_image2.png | Bin 0 -> 8867 bytes docs/publishing/sections/section4_image3.png | Bin 0 -> 29546 bytes docs/publishing/sections/section4_image4.png | Bin 0 -> 21147 bytes docs/publishing/sections/section4_image5.png | Bin 0 -> 3945 bytes 9 files changed, 270 insertions(+), 237 deletions(-) delete mode 100644 docs/publishing/sections/10_deploy_to_portfolio.md create mode 100644 docs/publishing/sections/4_notebooks_styling.md rename docs/publishing/sections/{4_analytics_portfolio_site.md => 5_analytics_portfolio_site.md} (62%) delete mode 100644 docs/publishing/sections/5_notebooks_styling.md create mode 100644 docs/publishing/sections/section4_image1.png create mode 100644 docs/publishing/sections/section4_image2.png create mode 100644 docs/publishing/sections/section4_image3.png create mode 100644 docs/publishing/sections/section4_image4.png create mode 100644 docs/publishing/sections/section4_image5.png diff --git a/docs/publishing/sections/10_deploy_to_portfolio.md b/docs/publishing/sections/10_deploy_to_portfolio.md deleted file mode 100644 index 51b90cc82d..0000000000 --- a/docs/publishing/sections/10_deploy_to_portfolio.md +++ /dev/null @@ -1,68 +0,0 @@ -(deploy_to_portfolio)= - -# Building and Deploying your Report - -After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! - -## Build your Report - -**Note:** The build command must be run from the root of the repo at `~/data-analyses`! - -1. Navigate back to the `~/data-analyses` and install the portfolio requirements with - `pip install -r portfolio/requirements.txt` -2. Then run `python portfolio/portfolio.py build my_report` to build your report - - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` -3. Add the files using `git add` and commit your progress! - -## Deploy your Report - -1. Make sure you are in the root of the data-analyses repo: `~/data-analyses` - -2. Run `python portfolio/portfolio.py build my_report --deploy` - - - By running `--deploy`, you are deploying the changes to display in the Analytics Portfolio. - - **Note:** The `my_report` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - - If you have already deployed but want to make changes to the README, run: `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` - - Running this is helpful for larger outputs or if you are updating the README. - -3. Once this runs, you can check the preview link at the bottom of the output. It should look something like: - - - `–no-deploy`: `file:///home/jovyan/data-analyses/portfolio/my_report/_build/html/index.html` - - `–deploy`: `Website Draft URL: https://my-report--cal-itp-data-analyses.netlify.app` - -4. Add the files using `git add` and commit! - -5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) - -### Other Specifications - -- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: - - `--deploy / --no-deploy` - - deploy this component to netlify. - - `--prepare-only / --no-prepare-only` - - Pass-through flag to papermill; if true, papermill will not actually execute cells. - - `--execute-papermill / --no-execute-papermill` - - If false, will skip calls to papermill - - For example, if only the `README.md` is updated but the notebooks have remained the same, you would run - `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy`. - - `--no-stderr / --no-no-stderr` - - If true, will clear stderr stream for cell outputs - - `--continue-on-error / --no-continue-on-error` - - Default: no-continue-on-error - -## Adding to the Makefile - -Another and more efficient way to write to the Analytics Portfolio is to use the Makefile and run -`make build_my_report -f Makefile` in data-analyses - -Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): - -``` -build_my_reports: - pip install -r portfolio/requirements.txt - git rm portfolio/my_report/ -rf - python portfolio/portfolio.py build my_report --deploy - git add portfolio/my_report/district_*/ portfolio/my_report/*.yml portfolio/my_report/*.md - git add portfolio/sites/my_report.yml -``` diff --git a/docs/publishing/sections/4_notebooks_styling.md b/docs/publishing/sections/4_notebooks_styling.md new file mode 100644 index 0000000000..685c9f8b38 --- /dev/null +++ b/docs/publishing/sections/4_notebooks_styling.md @@ -0,0 +1,200 @@ +# Getting Notebooks Ready for the Portfolio + +We want all the content on our [portfolio](https://analysis.calitp.org/) to be consistent and tidy. Below are some guidelines for you to follow when creating the Jupyter Notebooks. + +## Narrative + +- Narrative content can be done in Markdown cells or code cells. + - Markdown cells should be used when there are no variables to inject. + - Code cells should be used to write narrative whenever variables constructed from f-strings are used. +- Markdown cells can inject f-strings if it's plain Markdown (not a heading) using `display(Markdown())` in a code cell. + +``` +from IPython.display import Markdown + +display(Markdown(f"The value of {variable} is {value}.")) +``` + +- **Use f-strings to fill in variables and values instead of hard-coding them** + - Turn anything that runs in a loop or relies on a function into a variable. + - Use functions to grab those values for a specific entity (operator, district), rather than hard-coding the values into the narrative. + +``` +n_routes = (df[df.organization_name == operator] + .route_id.nunique() + ) + + +n_parallel = (df[ + (df.organization_name == operator) & + (df.parallel==1)] + .route_id.nunique() + ) + +display( + Markdown( + f"**Bus routes in service: {n_routes}**" + "
**Parallel routes** to State Highway Network (SHN): " + f"**{n_parallel} routes**" + ) +) +``` + +- Stay away from loops if you need to use headers. + - You will need to create Markdown cells for headers or else JupyterBook will not build correctly. For parameterized notebooks, this is an acceptable trade-off. + - For unparameterized notebooks, you may want use `display(HTML())`. + - Caveat: Using `display(HTML())` means you'll lose the table of contents navigation in the top right corner in the JupyterBook build. + +## Writing Guide + +These are a set of principles to adhere to when writing the narrative content in a Jupyter Notebook. Use your best judgment to decide when there are exceptions to these principles. + +- Decimals less than 1, always prefix with a 0, for readability. + + - 0.05, not .05 + +- Integers when referencing dates, times, etc + + - 2020 for year, not 2020.0 (coerce to int64 or Int64 in `pandas`; Int64 are nullable integers, which allow for NaNs to appear alongside integers) + - 1 hr 20 min, not 1.33 hr (use best judgment to decide what's easier for readers to interpret) + +- Round at the end of the analysis. Use best judgment to decide on significant digits. National Institutes of Health has a guide on [Rounding Rules](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/#:~:text=Ideally%20data%20should%20be%20rounded,might%20call%20it%20Goldilocks%20rounding.&text=The%20European%20Association%20of%20Science,2%E2%80%933%20effective%20digits%E2%80%9D.). + + - Too many decimal places give an air of precision that may not be present. + - Too few decimal places may not give enough detail to distinguish between categories or ranges. + - A good rule of thumb is to start with 1 extra decimal place than what is present in the other columns when deriving statistics (averages, percentiles), and decide from there if you want to round up. + - An average of `$100,000.0` can simply be rounded to `$100,000`. + - An average of 5.2 mi might be left as is. + +- Additional references: [American Psychological Association (APA) style](https://apastyle.apa.org/instructional-aids/numbers-statistics-guide.pdf) and [Purdue](https://owl.purdue.edu/owl/research_and_citation/apa_style/apa_formatting_and_style_guide/apa_numbers_statistics.html). + +## Standard Names + +- GTFS data in our warehouse stores information on operators, routes, and stops. +- Analysts should reference the operator name, route name, and Caltrans district the same way across analyses. + - Caltrans District: 7 should be referred to as `07 - Los Angeles` + - Between `route_short_name`, `route_long_name`, `route_desc`, which one should be used to describe `route_id`? Use `shared_utils.portfolio_utils`, which relies on regular expressions, to select the most human-readable route name. +- Use [`shared_utils.portfolio_utils`](https://github.com/cal-itp/data-analyses/blob/main/_shared_utils/shared_utils/portfolio_utils.py) to help you grab the right names to use. Sample code below. + ``` + from shared_utils import portfolio_utils + + route_names = portfolio_utils.add_route_name() + + # Merge in the selected route name using route_id + df = pd.merge(df, + route_names, + on = ["calitp_itp_id", "route_id"] + ) + ``` + +## Accessibility + +It's important to make our content as user-friendly as possible. Here are a few options to consider. + +- Use a color palette that is color-blind friendly. There is no standard palette for now, so use your best judgement. There are many resources online such as [this one from the University of California, Santa Barbara](https://www.nceas.ucsb.edu/sites/default/files/2022-06/Colorblind%20Safe%20Color%20Schemes.pdf). +- Add tooltips to your visualizations so users can find more detail. +- Add `.interactive()` behind `Altair` charts which allow viewers to zoom in and out. + +## Headers + +### Consecutive Order + +Headers must move consecutively in Markdown cells or the parameterized notebook will not generate. No skipping! + +``` +# Notebook Title +## First Section +## Second Section +### Another subheading +``` + +To get around consecutive headers, you can use `display(HTML())`. + +``` +display(HTML(

First Header

) display(HTML(

Next Header

)) +``` + +### Page Titles + +Markdown cells of the H1 type creates the titles of our website, not the `.yml` file. Let's use [SB125 Route Illustrations](https://sb125-route-illustrations--cal-itp-data-analyses.netlify.app/readme) to demostrate this. + +- We can see that the [yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/sb125_route_illustrations.yml) file lists the abbreviated county names as the parameter. + + +- However, the titles and headers in the notebook are the fully spelled out conunty names. + + +- This is due to the fact that the parameter is mapped to another variable in the [notebook](https://github.com/cal-itp/data-analyses/blob/main/sb125_analyses/path_examples_tttf4/path_examples.ipynb). + + +## Getting Ready for Parameterization + +Now that your notebook is styled appropriately, setting up your Jupyter Notebook to be parameterized and published to the portflio requires a few extra steps. + +The instructions below are also detailed in this [sample parameterized notebook here.](https://github.com/cal-itp/data-analyses/blob/main/starter_kit/parameterized_notebook.ipynb) + +### Step 1: Packages to include + +Copy and paste this code block below as shown for every notebook for the portfolio. Order matters, %%capture must go first. + +``` +# Include this in the cell where packages are imported + +%%capture + +import warnings +warnings.filterwarnings('ignore') + +import calitp_data_analysis.magics + +``` + +### Capturing Parameters + +When parameterizing a notebook, there are 2 places in which the parameter must be injected. Let's say you want to run your notebook twelve times for each of the twelve Caltrans districts. `district` is the parameter. + +#### Header: + +The first Markdown cell must include parameters to inject.You could set your header Markdown cell as: +`# District {district} Analysis`. + +Please note: + +- The site URL is constructed from the original notebook name and the parameter in the JupyterBook build: `0_notebook_name__district_x_analysis.html` +- This Markdown cell also creates the navigation on the lefthand side. Without this, the notebooks will be parameterized but then there'd be no table contents to list out the pages for people to see. + - Any styling (italicizing, bolding, changing the colors) you use in the markdown cell below will reflect in the Table of Contents. + - Below, you can see District 1: Eureka is displayed as the first header and is also the page's name in the Table of Content. Observe that the because the `# District` is bolded, the names on the left bar are also bolded. + - + +#### Code Cell: + +You will need to create two separate code cells that take on the parameter. Let's use `district` as an example parameter once again. + +- Code Cell #1: + + - Add in your parameter and set it equal to any valid value. + - Comment out the cell. + - This is how your code cell should look: + ``` + # district = "4" + ``` + - 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. + - + +- Code Cell #2: + + - Input the same parameter without any assigned value with `%%capture_parameters` at the top. + - This is how your code cell should look: + ``` + %%capture_parameters + district + ``` + +#### If you're using a heading, you can either use HTML or capture the parameter and inject. + +- HTML - this option works when you run your notebook locally. + ``` + from IPython.display import HTML + + display(HTML(f"

Header with {variable}

")) + ``` diff --git a/docs/publishing/sections/4_analytics_portfolio_site.md b/docs/publishing/sections/5_analytics_portfolio_site.md similarity index 62% rename from docs/publishing/sections/4_analytics_portfolio_site.md rename to docs/publishing/sections/5_analytics_portfolio_site.md index a0e1115db1..2d09b5a7e9 100644 --- a/docs/publishing/sections/4_analytics_portfolio_site.md +++ b/docs/publishing/sections/5_analytics_portfolio_site.md @@ -27,87 +27,11 @@ Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a fu ## File Setup -In order to publish to analysis.calitp.org, you need to create three different files. +In order to publish to analysis.calitp.org, you need to create two different files. -- A Jupyter Notebook (with a few particular elements to parameterize successfully). - A README.md. - A YML. -### Jupyter Notebook - -Setting up your Jupyter Notebook to be parameterized and published to the analysis.calitp.org requires a few extra steps. Please refer to to the [next section](https://docs.calitp.org/data-infra/publishing/sections/5_notebooks_styling.html) on how to style your notebook in accordance to our StyleGuide. - -[See a sample parameterized notebook here.](https://github.com/cal-itp/data-analyses/blob/main/starter_kit/parameterized_notebook.ipynb) - -#### Packages to include - -Copy and paste this code block below in every notebook for the portfolio. Order matters, %%capture must go first. - -``` -# Include this in the cell where packages are imported - -%%capture - -import warnings -warnings.filterwarnings('ignore') - -import calitp_data_analysis.magics -``` - -#### Capturing Parameters - -When parameterizing a notebook, there are 2 places in which the parameter must be injected. - -- Header: - The first Markdown cell must include parameters to inject. - - - Ex: If `district` is one of the parameters in your `sites/my_report.yml`, a header Markdown cell could be `# District {district} Analysis`. - - Note: The site URL is constructed from the original notebook name and the parameter in the JupyterBook build: `0_notebook_name__district_x_analysis.html` - -- Code Cell: - - - Create a code cell in which your parameter will be captured. Make sure the `parameter` tag for the cell is turned on. - - Capture parameters - this option won't display locally in your notebook (it will still show `{district_number}`), but will be injected with the value when the JupyterBook is built. - - In a code cell: - - ```` - ``` - %%capture_parameters - - district_number = f"{df.caltrans_district.iloc[0].split('-')[0].strip()}" - ``` - ```` - - Amanda Note, IDK what this means - -- If you're using a heading, you can either use HTML or capture the parameter and inject. - -- HTML - this option works when you run your notebook locally. - - ``` - from IPython.display import HTML - - display(HTML(f"

Header with {variable}

")) - ``` - -##### Consecutive Headers - -Headers must move consecutively in Markdown cells or the parameterized notebook will not generate. No skipping! - -``` -# Notebook Title -## First Section -## Second Section -### Another subheading -``` - -To get around consecutive headers, you can use `display(HTML())`. - -``` - display(HTML(

First Header

) display(HTML(

Next Header

)) -``` - ### README.md Create a `README.md` file in the repo where your work lies to detail the purpose of your website, methologies, relevant links, instructions, and more. @@ -169,6 +93,8 @@ To create a `yml` file: - If you have an individual notebook with **no parameters**: + - Example: [quarterly_performance_metrics.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/quarterly_performance_metrics.yml). + ``` title: My Analyses directory: ./my-analyses/ @@ -202,3 +128,70 @@ To create a `yml` file: itp_id: parameter_2 sections: *sections ``` + +## Building and Deploying your Report + +After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! + +### Build your Report + +**Note:** The build command must be run from the root of the repo at `~/data-analyses`! + +1. Navigate back to the `~/data-analyses` and install the portfolio requirements with + `pip install -r portfolio/requirements.txt` +2. Then run `python portfolio/portfolio.py build my_report` to build your report + - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` +3. Add the files using `git add` and commit your progress! + +### Deploy your Report + +1. Make sure you are in the root of the data-analyses repo: `~/data-analyses` + +2. Run `python portfolio/portfolio.py build my_report --deploy` + + - By running `--deploy`, you are deploying the changes to display in the Analytics Portfolio. + - **Note:** The `my_report` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + - If you have already deployed but want to make changes to the README, run: `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` + - Running this is helpful for larger outputs or if you are updating the README. + +3. Once this runs, you can check the preview link at the bottom of the output. It should look something like: + + - `–no-deploy`: `file:///home/jovyan/data-analyses/portfolio/my_report/_build/html/index.html` + - `–deploy`: `Website Draft URL: https://my-report--cal-itp-data-analyses.netlify.app` + +4. Add the files using `git add` and commit! + +5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) + +### Other Specifications + +- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: + - `--deploy / --no-deploy` + - deploy this component to netlify. + - `--prepare-only / --no-prepare-only` + - Pass-through flag to papermill; if true, papermill will not actually execute cells. + - `--execute-papermill / --no-execute-papermill` + - If false, will skip calls to papermill + - For example, if only the `README.md` is updated but the notebooks have remained the same, you would run + `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy`. + - `--no-stderr / --no-no-stderr` + - If true, will clear stderr stream for cell outputs + - `--continue-on-error / --no-continue-on-error` + - Default: no-continue-on-error + +### Adding to the Makefile + +Another and more efficient way to write to the Analytics Portfolio is to use the Makefile and run +`make build_my_report -f Makefile` in data-analyses + +Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): + +``` +build_my_reports: + pip install -r portfolio/requirements.txt + git rm portfolio/my_report/ -rf + python portfolio/portfolio.py build my_report --deploy + git add portfolio/my_report/district_*/ portfolio/my_report/*.yml portfolio/my_report/*.md + git add portfolio/sites/my_report.yml +``` diff --git a/docs/publishing/sections/5_notebooks_styling.md b/docs/publishing/sections/5_notebooks_styling.md deleted file mode 100644 index 49ff162d91..0000000000 --- a/docs/publishing/sections/5_notebooks_styling.md +++ /dev/null @@ -1,92 +0,0 @@ -# Getting Notebooks Ready for the Portfolio - -## Narrative - -- Narrative content can be done in Markdown cells or code cells. - - Markdown cells should be used when there are no variables to inject. - - Code cells should be used to write narrative whenever variables constructed from f-strings are used. -- For `papermill`, add a [parameters tag to the code cell](https://papermill.readthedocs.io/en/latest/usage-parameterize.html) - Note: Our portfolio uses a custom `papermill` engine and we can skip this step. -- Markdown cells can inject f-strings if it's plain Markdown (not a heading) using `display(Markdown())` in a code cell. - -``` -from IPython.display import Markdown - -display(Markdown(f"The value of {variable} is {value}.")) -``` - -- **Use f-strings to fill in variables and values instead of hard-coding them** - - Turn anything that runs in a loop or relies on a function into a variable. - - Use functions to grab those values for a specific entity (operator, district), rather than hard-coding the values into the narrative. - -``` -n_routes = (df[df.calitp_itp_id == itp_id] - .route_id.nunique() - ) - - -n_parallel = (df[ - (df.calitp_itp_id == itp_id) & - (df.parallel==1)] - .route_id.nunique() - ) - -display( - Markdown( - f"**Bus routes in service: {n_routes}**" - "
**Parallel routes** to State Highway Network (SHN): " - f"**{n_parallel} routes**" - ) -) -``` - -- Stay away from loops if you need to use headers. - - You will need to create Markdown cells for headers or else JupyterBook will not build correctly. For parameterized notebooks, this is an acceptable trade-off. - - For unparameterized notebooks, you may want use `display(HTML())`. - - Caveat: Using `display(HTML())` means you'll lose the table of contents navigation in the top right corner in the JupyterBook build. - -## Writing Guide - -These are a set of principles to adhere to when writing the narrative content in a Jupyter Notebook. Use your best judgment to decide when there are exceptions to these principles. - -- Decimals less than 1, always prefix with a 0, for readability. - - - 0.05, not .05 - -- Integers when referencing dates, times, etc - - - 2020 for year, not 2020.0 (coerce to int64 or Int64 in `pandas`; Int64 are nullable integers, which allow for NaNs to appear alongside integers) - - 1 hr 20 min, not 1.33 hr (use best judgment to decide what's easier for readers to interpret) - -- Round at the end of the analysis. Use best judgment to decide on significant digits. - - - Too many decimal places give an air of precision that may not be present. - - Too few decimal places may not give enough detail to distinguish between categories or ranges. - - A good rule of thumb is to start with 1 extra decimal place than what is present in the other columns when deriving statistics (averages, percentiles), and decide from there if you want to round up. - - An average of `$100,000.0` can simply be rounded to `$100,000`. - - An average of 5.2 mi might be left as is. - - National Institutes of Health [Rounding Rules](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/#:~:text=Ideally%20data%20should%20be%20rounded,might%20call%20it%20Goldilocks%20rounding.&text=The%20European%20Association%20of%20Science,2%E2%80%933%20effective%20digits%E2%80%9D.) - -- Additional references: [American Psychological Association (APA) style](https://apastyle.apa.org/instructional-aids/numbers-statistics-guide.pdf), and [Purdue](https://owl.purdue.edu/owl/research_and_citation/apa_style/apa_formatting_and_style_guide/apa_numbers_statistics.html) - -## Standard Names - -- GTFS data in our warehouse stores information on operators, routes, and stops. -- Analysts should reference the operator name, route name, and Caltrans district the same way across analyses. - - ITP ID: 182 is `Metro` (not LA Metro, Los Angeles County Metropolitan Transportation Authority, though those are all correct names for the operator) - - Caltrans District: 7 is `07 - Los Angeles` - - Between `route_short_name`, `route_long_name`, `route_desc`, which one should be used to describe `route_id`? Use `shared_utils.portfolio_utils`, which relies on regular expressions, to select the most human-readable route name. -- Before deploying your portfolio, make sure the operator name you're using is what's used in other analyses in the portfolio. - - Use `shared_utils.portfolio_utils` to help you grab the right names to use. - - ``` - from shared_utils import portfolio_utils - - route_names = portfolio_utils.add_route_name() - - # Merge in the selected route name using route_id - df = pd.merge(df, - route_names, - on = ["calitp_itp_id", "route_id"] - ) - ``` diff --git a/docs/publishing/sections/section4_image1.png b/docs/publishing/sections/section4_image1.png new file mode 100644 index 0000000000000000000000000000000000000000..eec387bd9d3adc92752b40d05466d5f5f4eb3686 GIT binary patch literal 69480 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 z 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 a4Wg{*vwH*u{_nrTb0o#&L@R`K{r?Y?I97N7 literal 0 HcmV?d00001 diff --git a/docs/publishing/sections/section4_image2.png b/docs/publishing/sections/section4_image2.png new file mode 100644 index 0000000000000000000000000000000000000000..f798d37a33889eecad4ff82017bb591b95ca0ea1 GIT binary patch literal 8867 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 R2>7rB2Le`;E0Q(y`+v)<+I0W` literal 0 HcmV?d00001 diff --git a/docs/publishing/sections/section4_image3.png b/docs/publishing/sections/section4_image3.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d904a5cc8a5c26a30fadf1ffd632dab350e769 GIT binary patch literal 29546 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 literal 0 HcmV?d00001 diff --git a/docs/publishing/sections/section4_image4.png b/docs/publishing/sections/section4_image4.png new file mode 100644 index 0000000000000000000000000000000000000000..0e14fed635e010095ac3dfa5c82cda965fca80f5 GIT binary patch literal 21147 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 literal 0 HcmV?d00001 diff --git a/docs/publishing/sections/section4_image5.png b/docs/publishing/sections/section4_image5.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd10b16c76bcc09b5bf54ea421a44612ca8dc47 GIT binary patch literal 3945 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 literal 0 HcmV?d00001 From 91e206ea779fd1b5831f938e0bac812e7ec3bc73 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Wed, 19 Jun 2024 23:17:23 +0000 Subject: [PATCH 04/13] added index page lang, more districts in dla.yml example --- .../sections/5_analytics_portfolio_site.md | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/docs/publishing/sections/5_analytics_portfolio_site.md b/docs/publishing/sections/5_analytics_portfolio_site.md index 2d09b5a7e9..924f1c2311 100644 --- a/docs/publishing/sections/5_analytics_portfolio_site.md +++ b/docs/publishing/sections/5_analytics_portfolio_site.md @@ -10,7 +10,9 @@ present in the data-analyses repo is your friend. You can find the Cal-ITP Analy ## Netlify Setup -Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a full website. You must set up netlify key and/or make sure your Netlify token is up to date: +Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a full website. + +To setup your netlify key: - Install netlify: `npm install -g netlify-cli` - Navigate to your main directory @@ -25,6 +27,10 @@ Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a fu - For the changes to take effect, open a new terminal or run `source ~/.bash_profile` - Back in your terminal, enter `env | grep NETLIFY` to see that your Netlify token is there +To make sure your Netlify token is up to date: + +- COMING SOON + ## File Setup In order to publish to analysis.calitp.org, you need to create two different files. @@ -34,9 +40,9 @@ In order to publish to analysis.calitp.org, you need to create two different fil ### README.md -Create a `README.md` file in the repo where your work lies to detail the purpose of your website, methologies, relevant links, instructions, and more. +Create a `README.md` file in the repo where your work lies. This serves to detail purpose of your website, methologies, relevant links, instructions, and more. However, this also forms the landing page of your website. -- Your file should always be titled as `README.md`. No other variants such as `README_gtfs.md` or `read me.md` or ` README.md`. The portfolio can only take a `README.md` file when generating the landing page of your website. +- Your file should always be titled as `README.md`. No other variants such as `README_gtfs.md` or `read me.md` or ` README.md` are allowed. The portfolio can only take a `README.md` when generating the landing page of your website. - If you do accidentally create a `README.md` file with extra strings, you can fix this by taking the following steps: - `git rm portfolio/my_analysis/README_accidentally_named_something_else.md` - `rm portfolio/my_analysis/_build/html/README_accidentally_named_something.html`. We use `rm` because \_build/html folder is not checked into GitHub @@ -44,17 +50,18 @@ Create a `README.md` file in the repo where your work lies to detail the purpose ### YML -A `.yml` specifies the parameter you want your notebook to iterate over. For example, the [DLA Grant Analysis's`.yml`](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) runs the same notebook for each of the 12 Caltrans districts and the districts are also listed on the \[left hand side\]((https://dla--cal-itp-data-analyses.netlify.app/readme) to form the "Table of Contents." +Each `.yml` file creates a new site on the [Portfolio's Index Page](https://analysis.calitp.org/), so every project needs its own file. DLA Grant Analysis, SB125 Route Illustrations, and Active Transportation Program all have their own `.yml` file. -Because each `.yml` file creates a new site on the [Portfolio's Index Page](https://analysis.calitp.org/), so every project needs its own file. DLA Grant Analysis, SB125 Route Illustrations, and Active Transportation Program all have their own `.yml` file. +All the `.yml` files live here at [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). -The `.yml` files live here at [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - -To create a `yml` file: +Here's how to create a `yml` file: - Include the directory to the notebook(s) you want to publish. + - Name your `.yml` file. For now we will use `my_report.yml` as an example. + - The structure of your `.yml` file depends on the type of your analysis: + - If you have one parameterized notebook with **one parameter**: - Example: [dla.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) @@ -70,11 +77,18 @@ To create a `yml` file: - params: district_parameter: 1 district_title: District 1 + - params: + district_parameter: 2 + district_title: District 2 + and so on... + - params: + district_parameter: 12 + district_title: District 12 ``` - If you have a parameterized notebook with **multiple parameters**: - - Example: [rt.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/rt.yml). You can automate making a `.yml` file using a script, [example here](https://github.com/cal-itp/data-analyses/blob/main/gtfs_digest/deploy_portfolio_yaml.py). + - Example: [rt.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/rt.yml). You can also automate making a `.yml` file using a script, [example here](https://github.com/cal-itp/data-analyses/blob/main/gtfs_digest/deploy_portfolio_yaml.py). ``` title: My Analyses @@ -131,7 +145,7 @@ To create a `yml` file: ## Building and Deploying your Report -After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! +After your Jupyter Notebook (refer to the previous section), `README.md`, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! ### Build your Report @@ -139,7 +153,7 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' 1. Navigate back to the `~/data-analyses` and install the portfolio requirements with `pip install -r portfolio/requirements.txt` -2. Then run `python portfolio/portfolio.py build my_report` to build your report +2. Run `python portfolio/portfolio.py build my_report` to build your report - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` 3. Add the files using `git add` and commit your progress! @@ -164,9 +178,11 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' 5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) + - If your work isn't showing up on the Index page above, run `python portfolio/portfolio.py index --deploy --prod` to add it. + ### Other Specifications -- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: +- You also have the option to specify after the initial `python portfolio/portfolio.py build my_report [specification goes here]`: run `python portfolio/portfolio.py build --help` to see the following options: - `--deploy / --no-deploy` - deploy this component to netlify. - `--prepare-only / --no-prepare-only` From 69b25071240c5a8b58d449cf7c0ab13067d5e1e6 Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Tue, 18 Jun 2024 22:10:03 +0000 Subject: [PATCH 05/13] separated out deploy vs creating the necessary files --- .../sections/10_deploy_to_portfolio.md | 66 ++++ .../sections/4_analytics_portfolio_site.md | 325 ++++++++++-------- .../sections/5_notebooks_styling.md | 79 ----- 3 files changed, 240 insertions(+), 230 deletions(-) create mode 100644 docs/publishing/sections/10_deploy_to_portfolio.md diff --git a/docs/publishing/sections/10_deploy_to_portfolio.md b/docs/publishing/sections/10_deploy_to_portfolio.md new file mode 100644 index 0000000000..d643feb09a --- /dev/null +++ b/docs/publishing/sections/10_deploy_to_portfolio.md @@ -0,0 +1,66 @@ +(deploy_to_portfolio)= + +# Building and Deploying your Report + +After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! + +## Build your Report + +**Note:** The build command must be run from the root of the repo at `~/data-analyses`! + +1. Navigate back to the repo data-analyses and install the portfolio requirements with + `pip install -r portfolio/requirements.txt` +2. Then run `python portfolio/portfolio.py build my_report` to build your report + - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` +3. Add the files using `git add` and commit your progress! + +## Deploy your Report + +1. Make sure you are in the root of the data-analyses repo: `~/data-analyses` + +2. Run `python portfolio/portfolio.py build my_report --deploy` + + - By running `--deploy`, you are deploying the changes to display in the Analytics Portfolio. + - **Note:** The `my_report` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + - If you have already deployed but want to make changes to the README, run: `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` + - Running this is helpful for larger outputs or if you are updating the README. + +3. Once this runs, you can check the preview link at the bottom of the output. It should look something like: + + - `–no-deploy`: `file:///home/jovyan/data-analyses/portfolio/my_report/_build/html/index.html` + - `–deploy`: `Website Draft URL: https://my-report--cal-itp-data-analyses.netlify.app` + +4. Add the files using `git add` and commit! + +5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) + +### Other Specifications + +- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: + - `--deploy / --no-deploy` + - deploy this component to netlify. + - `--prepare-only / --no-prepare-only` + - Pass-through flag to papermill; if true, papermill will not actually execute cells. + - `--execute-papermill / --no-execute-papermill` + - If false, will skip calls to papermill + - `--no-stderr / --no-no-stderr` + - If true, will clear stderr stream for cell outputs + - `--continue-on-error / --no-continue-on-error` + - Default: no-continue-on-error + +## Adding to the Makefile + +Another way to write to the Analytics Portfolio is to use the Makefile and run +`make build_my_report -f Makefile` in data-analyses + +Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): + +``` +build_my_reports: + pip install -r portfolio/requirements.txt + git rm portfolio/my_report/ -rf + python portfolio/portfolio.py build my_report --deploy + git add portfolio/my_report/district_*/ portfolio/my_report/*.yml portfolio/my_report/*.md + git add portfolio/sites/my_report.yml +``` diff --git a/docs/publishing/sections/4_analytics_portfolio_site.md b/docs/publishing/sections/4_analytics_portfolio_site.md index 8877f69b45..a0e1115db1 100644 --- a/docs/publishing/sections/4_analytics_portfolio_site.md +++ b/docs/publishing/sections/4_analytics_portfolio_site.md @@ -3,179 +3,202 @@ # The Cal-ITP Analytics Portfolio Depending on the complexity of your visualizations, you may want to produce -a full website composed of multiple notebooks and/or the same notebook run -across different sets of data (for example, one report per Caltrans district). +a full website composed of multiple notebooks and/or the same notebook that is rerun across different parameters. For these situations, the [Jupyter Book-based](https://jupyterbook.org/en/stable/intro.html) [publishing framework](https://github.com/cal-itp/data-analyses/tree/main/portfolio) -present in the data-analyses repo is your friend. - -You can find the Cal-ITP Analytics Portfolio at [analysis.calitp.org](https://analysis.calitp.org). - -## Setup - -Before executing the build, there are a few prior steps you need to do. - -1. Set up netlify key/make sure your Netlify token is up to date: - - - Install netlify: `npm install -g netlify-cli` - - Navigate to your main directory - - Edit your bash profile using Nano: - - In your terminal, enter `nano ~/.bash_profile` to edit. - - Navigate using arrows (down, right, etc) to create 2 new lines. Paste (`CTRL` + `V`) your netlify key in the lines in the following format, each line prefixed with "export" - - `export NETLIFY_AUTH_TOKEN= YOURTOKENHERE123` - - `export NETLIFY_SITE_ID=cal-itp-data-analyses` - - To exit, press `CTRL` + `X` - - Nano will ask if you want to save your changes. Type `Y` to save. - - Type `N` to discard your changes and exit - - For the changes to take effect, open a new terminal or run `source ~/.bash_profile` - - Back in your terminal, enter `env | grep NETLIFY` to see that your Netlify token is there - -2. Create a `README.md` file in the repo where your work lies. - - - Your file should always be titled as `README.md` and not other variants such as `README_gtfs.md` because the portfolio can only take a `README.md` file. - - If you do accidentally create a `README.md` file with extra strings, you can fix this by taking the following steps: - - `git rm portfolio/my_analysis/README_accidentally_named_something_else.md` - - `rm portfolio/my_analysis/_build/html/README_accidentally_named_something.html`. We use `rm` because \_build/html folder is not checked into GitHub - - `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` to rerun the portfolio to incorporate only the new changes to your `README.md` if the other pages are correct. - -3. Create a `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). Each `.yml` file is a site, so if you have separate research topics, they should each have their own `.yml` file. - - - This `.yml` file will include the directory to the notebook(s) you want to publish. - - Name your `.yml` file. For now we will use `my_report.yml` as an example. - - The structure of your `.yml` file depends on the type of your analysis: - - If you have one parameterized notebook with **one parameter**: - - - Example: [dla.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) - - ``` - title: My Analyses - directory: ./my-analyses/ - readme: ./my-analyses/README.md - notebook: ./my-analyses/my-notebook.ipynb - parts: - - caption: Introduction - - chapters: - - params: - district_parameter: 1 - district_title: District 1 - ``` - - - If you have a parameterized notebook with **multiple parameters**: - - - Example: [rt.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/rt.yml) - - ``` - title: My Analyses - directory: ./my-analyses/ - readme: ./my-analyses/README.md - notebook: ./my-analyses/my-notebook.ipynb - parts: - - chapters: - - caption: County Name - params: - parameter1_county_name - sections: - - city: parameter2_city_name - - city: parameter2_city_name - ``` - - - If you have an individual notebook with **no parameters**: - - - Example: [hqta.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/hqta.yml) - - ``` - title: My Analyses - directory: ./my-analyses/ - readme: ./my-analyses/README.md - parts: - - caption: Introduction - - chapters: - - notebook: ./my-analyses/notebook_1.ipynb - - notebook: ./my-analyses/notebook_2.ipynb - ``` +present in the data-analyses repo is your friend. You can find the Cal-ITP Analytics Portfolio at [analysis.calitp.org](https://analysis.calitp.org). - - If you have multiple parameterized notebooks with **the same parameters**: +## Netlify Setup - - Example: [rt_parallel.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/rt_parallel.yml) +Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a full website. You must set up netlify key and/or make sure your Netlify token is up to date: - ``` - title: My Analyses - directory: ./my-analyses/ - readme: ./my-analyses/README.md - parts: - - caption: District Name - - chapters: - - caption: Parameter 1 - params: - itp_id: parameter_1 - sections: §ions - - notebook: ./analysis_1/notebook_1.ipynb - - notebook: ./analysis_2/notebook_2.ipynb - - caption: Parameter 2 - params: - itp_id: parameter_2 - sections: *sections - ``` +- Install netlify: `npm install -g netlify-cli` +- Navigate to your main directory +- Edit your bash profile using Nano: + - In your terminal, enter `nano ~/.bash_profile` to edit. + - Navigate using arrows (down, right, etc) to create 2 new lines. Paste (`CTRL` + `V`) your netlify key in the lines in the following format, each line prefixed with "export" + - `export NETLIFY_AUTH_TOKEN= YOURTOKENHERE123` + - `export NETLIFY_SITE_ID=cal-itp-data-analyses` + - To exit, press `CTRL` + `X` + - Nano will ask if you want to save your changes. Type `Y` to save. + - Type `N` to discard your changes and exit +- For the changes to take effect, open a new terminal or run `source ~/.bash_profile` + - Back in your terminal, enter `env | grep NETLIFY` to see that your Netlify token is there + +## File Setup + +In order to publish to analysis.calitp.org, you need to create three different files. + +- A Jupyter Notebook (with a few particular elements to parameterize successfully). +- A README.md. +- A YML. + +### Jupyter Notebook + +Setting up your Jupyter Notebook to be parameterized and published to the analysis.calitp.org requires a few extra steps. Please refer to to the [next section](https://docs.calitp.org/data-infra/publishing/sections/5_notebooks_styling.html) on how to style your notebook in accordance to our StyleGuide. + +[See a sample parameterized notebook here.](https://github.com/cal-itp/data-analyses/blob/main/starter_kit/parameterized_notebook.ipynb) + +#### Packages to include + +Copy and paste this code block below in every notebook for the portfolio. Order matters, %%capture must go first. + +``` +# Include this in the cell where packages are imported + +%%capture + +import warnings +warnings.filterwarnings('ignore') + +import calitp_data_analysis.magics +``` -## Building and Deploying your Report +#### Capturing Parameters -### Build your Report +When parameterizing a notebook, there are 2 places in which the parameter must be injected. -**Note:** The build command must be run from the root of the repo! +- Header: + The first Markdown cell must include parameters to inject. -1. Navigate back to the repo data-analyses and install the portfolio requirements with - `pip install -r portfolio/requirements.txt` -2. Then run `python portfolio/portfolio.py build my_report` to build your report - - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` -3. Add the files using `git add` and commit your progress! + - Ex: If `district` is one of the parameters in your `sites/my_report.yml`, a header Markdown cell could be `# District {district} Analysis`. + - Note: The site URL is constructed from the original notebook name and the parameter in the JupyterBook build: `0_notebook_name__district_x_analysis.html` -### Deploy your Report +- Code Cell: -1. Make sure you are in the root of the data-analyses repo: `~/data-analyses` + - Create a code cell in which your parameter will be captured. Make sure the `parameter` tag for the cell is turned on. + - Capture parameters - this option won't display locally in your notebook (it will still show `{district_number}`), but will be injected with the value when the JupyterBook is built. -2. Run `python portfolio/portfolio.py build my_report --deploy` + In a code cell: - - By running `--deploy`, you are deploying the changes to display in the Analytics Portfolio. - - **Note:** The `my_report` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - - If you have already deployed but want to make changes to the README, run: `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` - - Running this is helpful for larger outputs or if you are updating the README. + ```` + ``` + %%capture_parameters -3. Once this runs, you can check the preview link at the bottom of the output. It should look something like: + district_number = f"{df.caltrans_district.iloc[0].split('-')[0].strip()}" + ``` + ```` - - `–no-deploy`: `file:///home/jovyan/data-analyses/portfolio/my_report/_build/html/index.html` - - `–deploy`: `Website Draft URL: https://my-report--cal-itp-data-analyses.netlify.app` + Amanda Note, IDK what this means -4. Add the files using `git add` and commit! +- If you're using a heading, you can either use HTML or capture the parameter and inject. -5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) +- HTML - this option works when you run your notebook locally. -### Other Specifications + ``` + from IPython.display import HTML -- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: - - `--deploy / --no-deploy` - - deploy this component to netlify. - - `--prepare-only / --no-prepare-only` - - Pass-through flag to papermill; if true, papermill will not actually execute cells. - - `--execute-papermill / --no-execute-papermill` - - If false, will skip calls to papermill - - `--no-stderr / --no-no-stderr` - - If true, will clear stderr stream for cell outputs - - `--continue-on-error / --no-continue-on-error` - - Default: no-continue-on-error + display(HTML(f"

Header with {variable}

")) + ``` -## Adding to the Makefile +##### Consecutive Headers -Another way to write to the Analytics Portfolio is to use the Makefile and run -`make build_my_report -f Makefile` in data-analyses +Headers must move consecutively in Markdown cells or the parameterized notebook will not generate. No skipping! -Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): +``` +# Notebook Title +## First Section +## Second Section +### Another subheading +``` + +To get around consecutive headers, you can use `display(HTML())`. ``` -build_my_reports: - pip install -r portfolio/requirements.txt - git rm portfolio/my_report/ -rf - python portfolio/portfolio.py build my_report --deploy - git add portfolio/my_report/district_*/ portfolio/my_report/*.yml portfolio/my_report/*.md - git add portfolio/sites/my_report.yml + display(HTML(

First Header

) display(HTML(

Next Header

)) ``` + +### README.md + +Create a `README.md` file in the repo where your work lies to detail the purpose of your website, methologies, relevant links, instructions, and more. + +- Your file should always be titled as `README.md`. No other variants such as `README_gtfs.md` or `read me.md` or ` README.md`. The portfolio can only take a `README.md` file when generating the landing page of your website. +- If you do accidentally create a `README.md` file with extra strings, you can fix this by taking the following steps: + - `git rm portfolio/my_analysis/README_accidentally_named_something_else.md` + - `rm portfolio/my_analysis/_build/html/README_accidentally_named_something.html`. We use `rm` because \_build/html folder is not checked into GitHub + - `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` to rerun the portfolio to incorporate only the new changes to your `README.md` if the other pages are correct. + +### YML + +A `.yml` specifies the parameter you want your notebook to iterate over. For example, the [DLA Grant Analysis's`.yml`](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) runs the same notebook for each of the 12 Caltrans districts and the districts are also listed on the \[left hand side\]((https://dla--cal-itp-data-analyses.netlify.app/readme) to form the "Table of Contents." + +Because each `.yml` file creates a new site on the [Portfolio's Index Page](https://analysis.calitp.org/), so every project needs its own file. DLA Grant Analysis, SB125 Route Illustrations, and Active Transportation Program all have their own `.yml` file. + +The `.yml` files live here at [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + +To create a `yml` file: + +- Include the directory to the notebook(s) you want to publish. +- Name your `.yml` file. For now we will use `my_report.yml` as an example. +- The structure of your `.yml` file depends on the type of your analysis: + - If you have one parameterized notebook with **one parameter**: + + - Example: [dla.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) + + ``` + title: My Analyses + directory: ./my-analyses/ + readme: ./my-analyses/README.md + notebook: ./my-analyses/my-notebook.ipynb + parts: + - caption: Introduction + - chapters: + - params: + district_parameter: 1 + district_title: District 1 + ``` + + - If you have a parameterized notebook with **multiple parameters**: + + - Example: [rt.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/rt.yml). You can automate making a `.yml` file using a script, [example here](https://github.com/cal-itp/data-analyses/blob/main/gtfs_digest/deploy_portfolio_yaml.py). + + ``` + title: My Analyses + directory: ./my-analyses/ + readme: ./my-analyses/README.md + notebook: ./my-analyses/my-notebook.ipynb + parts: + - chapters: + - caption: County Name + params: + parameter1_county_name + sections: + - city: parameter2_city_name + - city: parameter2_city_name + ``` + + - If you have an individual notebook with **no parameters**: + + ``` + title: My Analyses + directory: ./my-analyses/ + readme: ./my-analyses/README.md + parts: + - caption: Introduction + - chapters: + - notebook: ./my-analyses/notebook_1.ipynb + - notebook: ./my-analyses/notebook_2.ipynb + ``` + + - If you have multiple parameterized notebooks with **the same parameters**: + + - Example: [rt_parallel.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/rt_parallel.yml) + + ``` + title: My Analyses + directory: ./my-analyses/ + readme: ./my-analyses/README.md + parts: + - caption: District Name + - chapters: + - caption: Parameter 1 + params: + itp_id: parameter_1 + sections: §ions + - notebook: ./analysis_1/notebook_1.ipynb + - notebook: ./analysis_2/notebook_2.ipynb + - caption: Parameter 2 + params: + itp_id: parameter_2 + sections: *sections + ``` diff --git a/docs/publishing/sections/5_notebooks_styling.md b/docs/publishing/sections/5_notebooks_styling.md index 40e2009d65..6fc59df4d2 100644 --- a/docs/publishing/sections/5_notebooks_styling.md +++ b/docs/publishing/sections/5_notebooks_styling.md @@ -1,84 +1,5 @@ # Getting Notebooks Ready for the Portfolio -- [See a sample parameterized notebook here.](https://github.com/cal-itp/data-analyses/blob/main/starter_kit/parameterized_notebook.ipynb) - -## Packages to include - -- Order matters, %%capture must go first. -- `warnings.filterwarnings('ignore')` warnings from displaying in the portfolio site (`shared_utils`). - -``` -# Include this in the cell where packages are imported - -%%capture - -import warnings -warnings.filterwarnings('ignore') - -import calitp_data_analysis.magics -``` - -## Headers - -### Parameterized Titles - -- When parameterizing a notebook, the first Markdown cell must include parameters to inject. - - Ex: If `district` is one of the parameters in your `sites/my_report.yml`, a header Markdown cell could be `# District {district} Analysis`. - - Note: The site URL is constructed from the original notebook name and the parameter in the JupyterBook build: `0_notebook_name__district_x_analysis.html` - -### Consecutive Headers - -- Headers must move consecutively in Markdown cells or the parameterized notebook will not generate. No skipping! - -``` -# Notebook Title -## First Section -## Second Section -### Another subheading -``` - -- To get around consecutive headers, you can use `display(HTML())`. - - ``` - display(HTML(

First Header

) display(HTML(

Next Header

)) - ``` - -### Capturing Parameters - -- Create a code cell in which your parameter will be captured. Make sure the `parameter` tag for the cell is turned on. - -``` - district_number = "4" -``` - -- If you're using a heading, you can either use HTML or capture the parameter and inject. - -- HTML - this option works when you run your notebook locally. - - ``` - from IPython.display import HTML - - display(HTML(f"

Header with {variable}

")) - ``` - -- Capture parameters - this option won't display locally in your notebook (it will still show `{district_number}`), but will be injected with the value when the JupyterBook is built. - - In a code cell: - - ``` - %%capture_parameters - - district_number = f"{df.caltrans_district.iloc[0].split('-')[0].strip()}" - ``` - -
- - In a Markdown cell: - - ``` - ## District {district_number} - ``` - ## Narrative - Narrative content can be done in Markdown cells or code cells. From 41aac05c1207900a9b40d37c7b9453410575e35a Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Tue, 18 Jun 2024 22:37:26 +0000 Subject: [PATCH 06/13] deleted outdated functions, added more clarity to deploy --- docs/publishing/sections/10_deploy_to_portfolio.md | 6 ++++-- docs/publishing/sections/5_notebooks_styling.md | 11 +---------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/docs/publishing/sections/10_deploy_to_portfolio.md b/docs/publishing/sections/10_deploy_to_portfolio.md index d643feb09a..51b90cc82d 100644 --- a/docs/publishing/sections/10_deploy_to_portfolio.md +++ b/docs/publishing/sections/10_deploy_to_portfolio.md @@ -8,7 +8,7 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' **Note:** The build command must be run from the root of the repo at `~/data-analyses`! -1. Navigate back to the repo data-analyses and install the portfolio requirements with +1. Navigate back to the `~/data-analyses` and install the portfolio requirements with `pip install -r portfolio/requirements.txt` 2. Then run `python portfolio/portfolio.py build my_report` to build your report - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). @@ -44,6 +44,8 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' - Pass-through flag to papermill; if true, papermill will not actually execute cells. - `--execute-papermill / --no-execute-papermill` - If false, will skip calls to papermill + - For example, if only the `README.md` is updated but the notebooks have remained the same, you would run + `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy`. - `--no-stderr / --no-no-stderr` - If true, will clear stderr stream for cell outputs - `--continue-on-error / --no-continue-on-error` @@ -51,7 +53,7 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' ## Adding to the Makefile -Another way to write to the Analytics Portfolio is to use the Makefile and run +Another and more efficient way to write to the Analytics Portfolio is to use the Makefile and run `make build_my_report -f Makefile` in data-analyses Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): diff --git a/docs/publishing/sections/5_notebooks_styling.md b/docs/publishing/sections/5_notebooks_styling.md index 6fc59df4d2..49ff162d91 100644 --- a/docs/publishing/sections/5_notebooks_styling.md +++ b/docs/publishing/sections/5_notebooks_styling.md @@ -65,7 +65,7 @@ These are a set of principles to adhere to when writing the narrative content in - A good rule of thumb is to start with 1 extra decimal place than what is present in the other columns when deriving statistics (averages, percentiles), and decide from there if you want to round up. - An average of `$100,000.0` can simply be rounded to `$100,000`. - An average of 5.2 mi might be left as is. - - National Institutes of Health [Rounding Rules](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/table/ARCHDISCHILD2014) (full [article](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/#:~:text=Ideally%20data%20should%20be%20rounded,might%20call%20it%20Goldilocks%20rounding.&text=The%20European%20Association%20of%20Science,2%E2%80%933%20effective%20digits%E2%80%9D.)) + - National Institutes of Health [Rounding Rules](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/#:~:text=Ideally%20data%20should%20be%20rounded,might%20call%20it%20Goldilocks%20rounding.&text=The%20European%20Association%20of%20Science,2%E2%80%933%20effective%20digits%E2%80%9D.) - Additional references: [American Psychological Association (APA) style](https://apastyle.apa.org/instructional-aids/numbers-statistics-guide.pdf), and [Purdue](https://owl.purdue.edu/owl/research_and_citation/apa_style/apa_formatting_and_style_guide/apa_numbers_statistics.html) @@ -89,13 +89,4 @@ These are a set of principles to adhere to when writing the narrative content in route_names, on = ["calitp_itp_id", "route_id"] ) - - - agency_names = portfolio_utils.add_agency_name() - - # Merge in the operator's name using calitp_itp_id - df = pd.merge(df, - agency_names, - on = "calitp_itp_id" - ) ``` From 6238d95b2081d1c388a35c00d2ca0c06e418211e Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Wed, 19 Jun 2024 22:35:58 +0000 Subject: [PATCH 07/13] swapped order, added images, more on styling --- .../sections/10_deploy_to_portfolio.md | 68 ------ .../sections/4_notebooks_styling.md | 200 ++++++++++++++++++ ..._site.md => 5_analytics_portfolio_site.md} | 147 ++++++------- .../sections/5_notebooks_styling.md | 92 -------- docs/publishing/sections/section4_image1.png | Bin 0 -> 69480 bytes docs/publishing/sections/section4_image2.png | Bin 0 -> 8867 bytes docs/publishing/sections/section4_image3.png | Bin 0 -> 29546 bytes docs/publishing/sections/section4_image4.png | Bin 0 -> 21147 bytes docs/publishing/sections/section4_image5.png | Bin 0 -> 3945 bytes 9 files changed, 270 insertions(+), 237 deletions(-) delete mode 100644 docs/publishing/sections/10_deploy_to_portfolio.md create mode 100644 docs/publishing/sections/4_notebooks_styling.md rename docs/publishing/sections/{4_analytics_portfolio_site.md => 5_analytics_portfolio_site.md} (62%) delete mode 100644 docs/publishing/sections/5_notebooks_styling.md create mode 100644 docs/publishing/sections/section4_image1.png create mode 100644 docs/publishing/sections/section4_image2.png create mode 100644 docs/publishing/sections/section4_image3.png create mode 100644 docs/publishing/sections/section4_image4.png create mode 100644 docs/publishing/sections/section4_image5.png diff --git a/docs/publishing/sections/10_deploy_to_portfolio.md b/docs/publishing/sections/10_deploy_to_portfolio.md deleted file mode 100644 index 51b90cc82d..0000000000 --- a/docs/publishing/sections/10_deploy_to_portfolio.md +++ /dev/null @@ -1,68 +0,0 @@ -(deploy_to_portfolio)= - -# Building and Deploying your Report - -After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! - -## Build your Report - -**Note:** The build command must be run from the root of the repo at `~/data-analyses`! - -1. Navigate back to the `~/data-analyses` and install the portfolio requirements with - `pip install -r portfolio/requirements.txt` -2. Then run `python portfolio/portfolio.py build my_report` to build your report - - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` -3. Add the files using `git add` and commit your progress! - -## Deploy your Report - -1. Make sure you are in the root of the data-analyses repo: `~/data-analyses` - -2. Run `python portfolio/portfolio.py build my_report --deploy` - - - By running `--deploy`, you are deploying the changes to display in the Analytics Portfolio. - - **Note:** The `my_report` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - - If you have already deployed but want to make changes to the README, run: `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` - - Running this is helpful for larger outputs or if you are updating the README. - -3. Once this runs, you can check the preview link at the bottom of the output. It should look something like: - - - `–no-deploy`: `file:///home/jovyan/data-analyses/portfolio/my_report/_build/html/index.html` - - `–deploy`: `Website Draft URL: https://my-report--cal-itp-data-analyses.netlify.app` - -4. Add the files using `git add` and commit! - -5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) - -### Other Specifications - -- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: - - `--deploy / --no-deploy` - - deploy this component to netlify. - - `--prepare-only / --no-prepare-only` - - Pass-through flag to papermill; if true, papermill will not actually execute cells. - - `--execute-papermill / --no-execute-papermill` - - If false, will skip calls to papermill - - For example, if only the `README.md` is updated but the notebooks have remained the same, you would run - `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy`. - - `--no-stderr / --no-no-stderr` - - If true, will clear stderr stream for cell outputs - - `--continue-on-error / --no-continue-on-error` - - Default: no-continue-on-error - -## Adding to the Makefile - -Another and more efficient way to write to the Analytics Portfolio is to use the Makefile and run -`make build_my_report -f Makefile` in data-analyses - -Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): - -``` -build_my_reports: - pip install -r portfolio/requirements.txt - git rm portfolio/my_report/ -rf - python portfolio/portfolio.py build my_report --deploy - git add portfolio/my_report/district_*/ portfolio/my_report/*.yml portfolio/my_report/*.md - git add portfolio/sites/my_report.yml -``` diff --git a/docs/publishing/sections/4_notebooks_styling.md b/docs/publishing/sections/4_notebooks_styling.md new file mode 100644 index 0000000000..685c9f8b38 --- /dev/null +++ b/docs/publishing/sections/4_notebooks_styling.md @@ -0,0 +1,200 @@ +# Getting Notebooks Ready for the Portfolio + +We want all the content on our [portfolio](https://analysis.calitp.org/) to be consistent and tidy. Below are some guidelines for you to follow when creating the Jupyter Notebooks. + +## Narrative + +- Narrative content can be done in Markdown cells or code cells. + - Markdown cells should be used when there are no variables to inject. + - Code cells should be used to write narrative whenever variables constructed from f-strings are used. +- Markdown cells can inject f-strings if it's plain Markdown (not a heading) using `display(Markdown())` in a code cell. + +``` +from IPython.display import Markdown + +display(Markdown(f"The value of {variable} is {value}.")) +``` + +- **Use f-strings to fill in variables and values instead of hard-coding them** + - Turn anything that runs in a loop or relies on a function into a variable. + - Use functions to grab those values for a specific entity (operator, district), rather than hard-coding the values into the narrative. + +``` +n_routes = (df[df.organization_name == operator] + .route_id.nunique() + ) + + +n_parallel = (df[ + (df.organization_name == operator) & + (df.parallel==1)] + .route_id.nunique() + ) + +display( + Markdown( + f"**Bus routes in service: {n_routes}**" + "
**Parallel routes** to State Highway Network (SHN): " + f"**{n_parallel} routes**" + ) +) +``` + +- Stay away from loops if you need to use headers. + - You will need to create Markdown cells for headers or else JupyterBook will not build correctly. For parameterized notebooks, this is an acceptable trade-off. + - For unparameterized notebooks, you may want use `display(HTML())`. + - Caveat: Using `display(HTML())` means you'll lose the table of contents navigation in the top right corner in the JupyterBook build. + +## Writing Guide + +These are a set of principles to adhere to when writing the narrative content in a Jupyter Notebook. Use your best judgment to decide when there are exceptions to these principles. + +- Decimals less than 1, always prefix with a 0, for readability. + + - 0.05, not .05 + +- Integers when referencing dates, times, etc + + - 2020 for year, not 2020.0 (coerce to int64 or Int64 in `pandas`; Int64 are nullable integers, which allow for NaNs to appear alongside integers) + - 1 hr 20 min, not 1.33 hr (use best judgment to decide what's easier for readers to interpret) + +- Round at the end of the analysis. Use best judgment to decide on significant digits. National Institutes of Health has a guide on [Rounding Rules](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/#:~:text=Ideally%20data%20should%20be%20rounded,might%20call%20it%20Goldilocks%20rounding.&text=The%20European%20Association%20of%20Science,2%E2%80%933%20effective%20digits%E2%80%9D.). + + - Too many decimal places give an air of precision that may not be present. + - Too few decimal places may not give enough detail to distinguish between categories or ranges. + - A good rule of thumb is to start with 1 extra decimal place than what is present in the other columns when deriving statistics (averages, percentiles), and decide from there if you want to round up. + - An average of `$100,000.0` can simply be rounded to `$100,000`. + - An average of 5.2 mi might be left as is. + +- Additional references: [American Psychological Association (APA) style](https://apastyle.apa.org/instructional-aids/numbers-statistics-guide.pdf) and [Purdue](https://owl.purdue.edu/owl/research_and_citation/apa_style/apa_formatting_and_style_guide/apa_numbers_statistics.html). + +## Standard Names + +- GTFS data in our warehouse stores information on operators, routes, and stops. +- Analysts should reference the operator name, route name, and Caltrans district the same way across analyses. + - Caltrans District: 7 should be referred to as `07 - Los Angeles` + - Between `route_short_name`, `route_long_name`, `route_desc`, which one should be used to describe `route_id`? Use `shared_utils.portfolio_utils`, which relies on regular expressions, to select the most human-readable route name. +- Use [`shared_utils.portfolio_utils`](https://github.com/cal-itp/data-analyses/blob/main/_shared_utils/shared_utils/portfolio_utils.py) to help you grab the right names to use. Sample code below. + ``` + from shared_utils import portfolio_utils + + route_names = portfolio_utils.add_route_name() + + # Merge in the selected route name using route_id + df = pd.merge(df, + route_names, + on = ["calitp_itp_id", "route_id"] + ) + ``` + +## Accessibility + +It's important to make our content as user-friendly as possible. Here are a few options to consider. + +- Use a color palette that is color-blind friendly. There is no standard palette for now, so use your best judgement. There are many resources online such as [this one from the University of California, Santa Barbara](https://www.nceas.ucsb.edu/sites/default/files/2022-06/Colorblind%20Safe%20Color%20Schemes.pdf). +- Add tooltips to your visualizations so users can find more detail. +- Add `.interactive()` behind `Altair` charts which allow viewers to zoom in and out. + +## Headers + +### Consecutive Order + +Headers must move consecutively in Markdown cells or the parameterized notebook will not generate. No skipping! + +``` +# Notebook Title +## First Section +## Second Section +### Another subheading +``` + +To get around consecutive headers, you can use `display(HTML())`. + +``` +display(HTML(

First Header

) display(HTML(

Next Header

)) +``` + +### Page Titles + +Markdown cells of the H1 type creates the titles of our website, not the `.yml` file. Let's use [SB125 Route Illustrations](https://sb125-route-illustrations--cal-itp-data-analyses.netlify.app/readme) to demostrate this. + +- We can see that the [yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/sb125_route_illustrations.yml) file lists the abbreviated county names as the parameter. + + +- However, the titles and headers in the notebook are the fully spelled out conunty names. + + +- This is due to the fact that the parameter is mapped to another variable in the [notebook](https://github.com/cal-itp/data-analyses/blob/main/sb125_analyses/path_examples_tttf4/path_examples.ipynb). + + +## Getting Ready for Parameterization + +Now that your notebook is styled appropriately, setting up your Jupyter Notebook to be parameterized and published to the portflio requires a few extra steps. + +The instructions below are also detailed in this [sample parameterized notebook here.](https://github.com/cal-itp/data-analyses/blob/main/starter_kit/parameterized_notebook.ipynb) + +### Step 1: Packages to include + +Copy and paste this code block below as shown for every notebook for the portfolio. Order matters, %%capture must go first. + +``` +# Include this in the cell where packages are imported + +%%capture + +import warnings +warnings.filterwarnings('ignore') + +import calitp_data_analysis.magics + +``` + +### Capturing Parameters + +When parameterizing a notebook, there are 2 places in which the parameter must be injected. Let's say you want to run your notebook twelve times for each of the twelve Caltrans districts. `district` is the parameter. + +#### Header: + +The first Markdown cell must include parameters to inject.You could set your header Markdown cell as: +`# District {district} Analysis`. + +Please note: + +- The site URL is constructed from the original notebook name and the parameter in the JupyterBook build: `0_notebook_name__district_x_analysis.html` +- This Markdown cell also creates the navigation on the lefthand side. Without this, the notebooks will be parameterized but then there'd be no table contents to list out the pages for people to see. + - Any styling (italicizing, bolding, changing the colors) you use in the markdown cell below will reflect in the Table of Contents. + - Below, you can see District 1: Eureka is displayed as the first header and is also the page's name in the Table of Content. Observe that the because the `# District` is bolded, the names on the left bar are also bolded. + - + +#### Code Cell: + +You will need to create two separate code cells that take on the parameter. Let's use `district` as an example parameter once again. + +- Code Cell #1: + + - Add in your parameter and set it equal to any valid value. + - Comment out the cell. + - This is how your code cell should look: + ``` + # district = "4" + ``` + - 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. + - + +- Code Cell #2: + + - Input the same parameter without any assigned value with `%%capture_parameters` at the top. + - This is how your code cell should look: + ``` + %%capture_parameters + district + ``` + +#### If you're using a heading, you can either use HTML or capture the parameter and inject. + +- HTML - this option works when you run your notebook locally. + ``` + from IPython.display import HTML + + display(HTML(f"

Header with {variable}

")) + ``` diff --git a/docs/publishing/sections/4_analytics_portfolio_site.md b/docs/publishing/sections/5_analytics_portfolio_site.md similarity index 62% rename from docs/publishing/sections/4_analytics_portfolio_site.md rename to docs/publishing/sections/5_analytics_portfolio_site.md index a0e1115db1..2d09b5a7e9 100644 --- a/docs/publishing/sections/4_analytics_portfolio_site.md +++ b/docs/publishing/sections/5_analytics_portfolio_site.md @@ -27,87 +27,11 @@ Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a fu ## File Setup -In order to publish to analysis.calitp.org, you need to create three different files. +In order to publish to analysis.calitp.org, you need to create two different files. -- A Jupyter Notebook (with a few particular elements to parameterize successfully). - A README.md. - A YML. -### Jupyter Notebook - -Setting up your Jupyter Notebook to be parameterized and published to the analysis.calitp.org requires a few extra steps. Please refer to to the [next section](https://docs.calitp.org/data-infra/publishing/sections/5_notebooks_styling.html) on how to style your notebook in accordance to our StyleGuide. - -[See a sample parameterized notebook here.](https://github.com/cal-itp/data-analyses/blob/main/starter_kit/parameterized_notebook.ipynb) - -#### Packages to include - -Copy and paste this code block below in every notebook for the portfolio. Order matters, %%capture must go first. - -``` -# Include this in the cell where packages are imported - -%%capture - -import warnings -warnings.filterwarnings('ignore') - -import calitp_data_analysis.magics -``` - -#### Capturing Parameters - -When parameterizing a notebook, there are 2 places in which the parameter must be injected. - -- Header: - The first Markdown cell must include parameters to inject. - - - Ex: If `district` is one of the parameters in your `sites/my_report.yml`, a header Markdown cell could be `# District {district} Analysis`. - - Note: The site URL is constructed from the original notebook name and the parameter in the JupyterBook build: `0_notebook_name__district_x_analysis.html` - -- Code Cell: - - - Create a code cell in which your parameter will be captured. Make sure the `parameter` tag for the cell is turned on. - - Capture parameters - this option won't display locally in your notebook (it will still show `{district_number}`), but will be injected with the value when the JupyterBook is built. - - In a code cell: - - ```` - ``` - %%capture_parameters - - district_number = f"{df.caltrans_district.iloc[0].split('-')[0].strip()}" - ``` - ```` - - Amanda Note, IDK what this means - -- If you're using a heading, you can either use HTML or capture the parameter and inject. - -- HTML - this option works when you run your notebook locally. - - ``` - from IPython.display import HTML - - display(HTML(f"

Header with {variable}

")) - ``` - -##### Consecutive Headers - -Headers must move consecutively in Markdown cells or the parameterized notebook will not generate. No skipping! - -``` -# Notebook Title -## First Section -## Second Section -### Another subheading -``` - -To get around consecutive headers, you can use `display(HTML())`. - -``` - display(HTML(

First Header

) display(HTML(

Next Header

)) -``` - ### README.md Create a `README.md` file in the repo where your work lies to detail the purpose of your website, methologies, relevant links, instructions, and more. @@ -169,6 +93,8 @@ To create a `yml` file: - If you have an individual notebook with **no parameters**: + - Example: [quarterly_performance_metrics.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/quarterly_performance_metrics.yml). + ``` title: My Analyses directory: ./my-analyses/ @@ -202,3 +128,70 @@ To create a `yml` file: itp_id: parameter_2 sections: *sections ``` + +## Building and Deploying your Report + +After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! + +### Build your Report + +**Note:** The build command must be run from the root of the repo at `~/data-analyses`! + +1. Navigate back to the `~/data-analyses` and install the portfolio requirements with + `pip install -r portfolio/requirements.txt` +2. Then run `python portfolio/portfolio.py build my_report` to build your report + - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` +3. Add the files using `git add` and commit your progress! + +### Deploy your Report + +1. Make sure you are in the root of the data-analyses repo: `~/data-analyses` + +2. Run `python portfolio/portfolio.py build my_report --deploy` + + - By running `--deploy`, you are deploying the changes to display in the Analytics Portfolio. + - **Note:** The `my_report` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). + - If you have already deployed but want to make changes to the README, run: `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy` + - Running this is helpful for larger outputs or if you are updating the README. + +3. Once this runs, you can check the preview link at the bottom of the output. It should look something like: + + - `–no-deploy`: `file:///home/jovyan/data-analyses/portfolio/my_report/_build/html/index.html` + - `–deploy`: `Website Draft URL: https://my-report--cal-itp-data-analyses.netlify.app` + +4. Add the files using `git add` and commit! + +5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) + +### Other Specifications + +- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: + - `--deploy / --no-deploy` + - deploy this component to netlify. + - `--prepare-only / --no-prepare-only` + - Pass-through flag to papermill; if true, papermill will not actually execute cells. + - `--execute-papermill / --no-execute-papermill` + - If false, will skip calls to papermill + - For example, if only the `README.md` is updated but the notebooks have remained the same, you would run + `python portfolio/portfolio.py build my_report --no-execute-papermill --deploy`. + - `--no-stderr / --no-no-stderr` + - If true, will clear stderr stream for cell outputs + - `--continue-on-error / --no-continue-on-error` + - Default: no-continue-on-error + +### Adding to the Makefile + +Another and more efficient way to write to the Analytics Portfolio is to use the Makefile and run +`make build_my_report -f Makefile` in data-analyses + +Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): + +``` +build_my_reports: + pip install -r portfolio/requirements.txt + git rm portfolio/my_report/ -rf + python portfolio/portfolio.py build my_report --deploy + git add portfolio/my_report/district_*/ portfolio/my_report/*.yml portfolio/my_report/*.md + git add portfolio/sites/my_report.yml +``` diff --git a/docs/publishing/sections/5_notebooks_styling.md b/docs/publishing/sections/5_notebooks_styling.md deleted file mode 100644 index 49ff162d91..0000000000 --- a/docs/publishing/sections/5_notebooks_styling.md +++ /dev/null @@ -1,92 +0,0 @@ -# Getting Notebooks Ready for the Portfolio - -## Narrative - -- Narrative content can be done in Markdown cells or code cells. - - Markdown cells should be used when there are no variables to inject. - - Code cells should be used to write narrative whenever variables constructed from f-strings are used. -- For `papermill`, add a [parameters tag to the code cell](https://papermill.readthedocs.io/en/latest/usage-parameterize.html) - Note: Our portfolio uses a custom `papermill` engine and we can skip this step. -- Markdown cells can inject f-strings if it's plain Markdown (not a heading) using `display(Markdown())` in a code cell. - -``` -from IPython.display import Markdown - -display(Markdown(f"The value of {variable} is {value}.")) -``` - -- **Use f-strings to fill in variables and values instead of hard-coding them** - - Turn anything that runs in a loop or relies on a function into a variable. - - Use functions to grab those values for a specific entity (operator, district), rather than hard-coding the values into the narrative. - -``` -n_routes = (df[df.calitp_itp_id == itp_id] - .route_id.nunique() - ) - - -n_parallel = (df[ - (df.calitp_itp_id == itp_id) & - (df.parallel==1)] - .route_id.nunique() - ) - -display( - Markdown( - f"**Bus routes in service: {n_routes}**" - "
**Parallel routes** to State Highway Network (SHN): " - f"**{n_parallel} routes**" - ) -) -``` - -- Stay away from loops if you need to use headers. - - You will need to create Markdown cells for headers or else JupyterBook will not build correctly. For parameterized notebooks, this is an acceptable trade-off. - - For unparameterized notebooks, you may want use `display(HTML())`. - - Caveat: Using `display(HTML())` means you'll lose the table of contents navigation in the top right corner in the JupyterBook build. - -## Writing Guide - -These are a set of principles to adhere to when writing the narrative content in a Jupyter Notebook. Use your best judgment to decide when there are exceptions to these principles. - -- Decimals less than 1, always prefix with a 0, for readability. - - - 0.05, not .05 - -- Integers when referencing dates, times, etc - - - 2020 for year, not 2020.0 (coerce to int64 or Int64 in `pandas`; Int64 are nullable integers, which allow for NaNs to appear alongside integers) - - 1 hr 20 min, not 1.33 hr (use best judgment to decide what's easier for readers to interpret) - -- Round at the end of the analysis. Use best judgment to decide on significant digits. - - - Too many decimal places give an air of precision that may not be present. - - Too few decimal places may not give enough detail to distinguish between categories or ranges. - - A good rule of thumb is to start with 1 extra decimal place than what is present in the other columns when deriving statistics (averages, percentiles), and decide from there if you want to round up. - - An average of `$100,000.0` can simply be rounded to `$100,000`. - - An average of 5.2 mi might be left as is. - - National Institutes of Health [Rounding Rules](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/#:~:text=Ideally%20data%20should%20be%20rounded,might%20call%20it%20Goldilocks%20rounding.&text=The%20European%20Association%20of%20Science,2%E2%80%933%20effective%20digits%E2%80%9D.) - -- Additional references: [American Psychological Association (APA) style](https://apastyle.apa.org/instructional-aids/numbers-statistics-guide.pdf), and [Purdue](https://owl.purdue.edu/owl/research_and_citation/apa_style/apa_formatting_and_style_guide/apa_numbers_statistics.html) - -## Standard Names - -- GTFS data in our warehouse stores information on operators, routes, and stops. -- Analysts should reference the operator name, route name, and Caltrans district the same way across analyses. - - ITP ID: 182 is `Metro` (not LA Metro, Los Angeles County Metropolitan Transportation Authority, though those are all correct names for the operator) - - Caltrans District: 7 is `07 - Los Angeles` - - Between `route_short_name`, `route_long_name`, `route_desc`, which one should be used to describe `route_id`? Use `shared_utils.portfolio_utils`, which relies on regular expressions, to select the most human-readable route name. -- Before deploying your portfolio, make sure the operator name you're using is what's used in other analyses in the portfolio. - - Use `shared_utils.portfolio_utils` to help you grab the right names to use. - - ``` - from shared_utils import portfolio_utils - - route_names = portfolio_utils.add_route_name() - - # Merge in the selected route name using route_id - df = pd.merge(df, - route_names, - on = ["calitp_itp_id", "route_id"] - ) - ``` diff --git a/docs/publishing/sections/section4_image1.png b/docs/publishing/sections/section4_image1.png new file mode 100644 index 0000000000000000000000000000000000000000..eec387bd9d3adc92752b40d05466d5f5f4eb3686 GIT binary patch literal 69480 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 z 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 a4Wg{*vwH*u{_nrTb0o#&L@R`K{r?Y?I97N7 literal 0 HcmV?d00001 diff --git a/docs/publishing/sections/section4_image2.png b/docs/publishing/sections/section4_image2.png new file mode 100644 index 0000000000000000000000000000000000000000..f798d37a33889eecad4ff82017bb591b95ca0ea1 GIT binary patch literal 8867 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 R2>7rB2Le`;E0Q(y`+v)<+I0W` literal 0 HcmV?d00001 diff --git a/docs/publishing/sections/section4_image3.png b/docs/publishing/sections/section4_image3.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d904a5cc8a5c26a30fadf1ffd632dab350e769 GIT binary patch literal 29546 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 literal 0 HcmV?d00001 diff --git a/docs/publishing/sections/section4_image4.png b/docs/publishing/sections/section4_image4.png new file mode 100644 index 0000000000000000000000000000000000000000..0e14fed635e010095ac3dfa5c82cda965fca80f5 GIT binary patch literal 21147 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 literal 0 HcmV?d00001 diff --git a/docs/publishing/sections/section4_image5.png b/docs/publishing/sections/section4_image5.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd10b16c76bcc09b5bf54ea421a44612ca8dc47 GIT binary patch literal 3945 zcmb`KX;4$yx`q=lftmQHBmE5M+=kOaYRRVXqUbk5%4t``o&9>;Bk#uT|^E-ru*M_kGv8 ze&n#@5~MB?27@g*u;0!N27}`i5}me z+ewjV6f~m-D@g#b$XW`lx)&SoJB4~}BG&NNk*SobLCPHn0Ot$5tVw4ao)3k(v^h6Brh`rYqJZ;H#KCPfU3Q zJ`ab>WWrOE^~E8g-E5OM9T-M}f~tVdCO~vOL)9yI#$dKSo<8wv1PbQAuM>Sp>Mh-r^}e-g!3Ex)6&JF52 z-I{gbbo>78=O_65!b3Mb?@TN?VF{E;S^AmaHX%wz)vgWq)%3O7L+pLEGV`eAEThiO zu)Gt0_m@*yPAyk%cLr}KM?MpM?a%Ov-J#Pd%b3T<;H1n@HM?@rS*UTN!Bct5QDW1m z){8A;hkL39Po|m-Gang+sLESiGC$+daLxtOu!<}ZLDuoE0%8ce^;cXvIB zCmfZ;PdinY-;Hn%i!d!-3#BlvkN2STYzP%98bIOkI&&3 zO|Dk1mXIRcYbE)ot0(i%y7v3@^qku=%nD#x71e%YmbQE5XNV`f?=W{<8zE^Ices*^ zf!~8rndl2RPFNm>0XyMWO;-FF-h&8dG+2S^hjvZ$F_Gz{e6cO9@PTHS1AP^*`CgLU zE?Uwd$C}jeCRvENW>WDJ52VQGp`%9}0t~+F*4+`bJ7kZcqBk!OL3Y+wWoK5+XaD+?N6{`p2^*(T&OFrFY{m%7kCGhE8=zR#b?Kd>g5u7689rFB zCf!uRCoY(k6E_G)187TWj!EMPNP`W`s~*z~uH;bGWIn%o%H+Z&nOv+JoS;k35tVKE za!NI_!Y8*fv>t8AXzsms+Xk|oQv35 z`%1=HA3onZHd^9h!H@8$4ZFe34vTra#4hcsz&z;687E7x{(M=H0Glf5zEQhdYDh(l31`4v>+cNitJ~jtiQ* zHir#kSc>(em-%VH)=)r!9aH`x^H@mvHSP6(w!I&6=a+*SGDidUAV2_dHY-eBVSx9# zr}6EhNpskjV0T%Oqv!$FknL(OVc+hIqwDA=M9lkB!WjoV?KV)?5__eCBwZh>eoWV= zc3qN1-27D7B*};hH?@g;L%~o2GU`1?7On9>L@zts|GZMgsb1ASG!R6M+4woTe_fN4zR5R_Z7dEWyKdMOa)I} z4^-l&FXP~U*iqhO1GNy zcwo+PrIC8Uk2nKNBRkb+>Ad zT0YMVcJ8?j<|(BBQ`5Hh6+cO2ABHW58YOMrh&u0 z`{zzv8^rRfsWT0&RrLZTkSGNHs^~u6-uss9n6>+9Xa$0T%eS`1X)Z1vK7Et+ z%=_T%yYd`>6t%szJ)>Omepb#YFt~Axe16tQH5u4H=Dh>unkPMc9rnwsYPMMd6hf^=OsL9yP%)YY59Ka-H@AT%e2O=PA`qjojCk>fA* zrDgYgg&U|rj_)p#%WD`{Q2zIODYX4_ow8b`|ADZ-Z8j`&RW1-YIZ5cb6VEO`+~bHm z%$mRRGjmGTF8F=1T~e7A3Z8P)RRT=3N5jV(G$OLg-i?yw_|&n*IgR^?)oSl+&GJ;B z`r%G(Kp{(?4uuOE`}TTWZJ?jb)tYM3o3j~89`&WOSv%aipUCR=@Vi>#VdxXTN-6b} z>0P)vXLa-YP&J!RQcp_F0ZXISS0ZN_*OXE+U8NZ9i^tEKkR#ccE`U4B`gOee+cJR2 z*!d>F^1D_^M}(l z3}InskUwqj{v(wdR`NqD{SWp6*c8eDsbDy`58`3AtSE7ciHNWsP}L)+87EU7RjrL) zkYSMZ!Q{boMa9F2C1|S7q=;G|gvHIZa-H zz~b_^D)>`V@Td6~f7{wX2BW`~!4>DdZS92K+Mc{2OTG-hYZ?bC9$hae%FwSt7W7eE zM=Jy@;|2F{8B5(*=a_Z%(Zt(PkK*>3Pp%&`jn^(4q0qH_^0-$Ib}Ph_v#;GGNLN7Ke38^EI5J%F&iQlasrDg zyRQ!R>VH&LFu}h8u&lVxq`mWjVc8`%fw-qG$O{9hG5It0b0)YUyzb+3p5y@i$aANx z;+JlJCueo=?pno9QN>dx!_fTS_zBXNpfc-9l|vJ=n}C=q)zdVeklf{HvDllDf7?r|W)R z*CdlyENbX>TJxmh;W**S&vglMp5+~PQL>GxkAvD+LQ^g`A(1qJJ{BZ_2(HWR4`9q< zwC&!4f;Pe+#Y@$cVS+9qcl#lxOFs|zI^=x_hf6whz-gx_$JlrCOwXGi?-s4ys0tYu z!Gxv%g?mj#MGZrY(YW0(YA8$GwNNfvb+N4GVpfAaoB3Flk$CD@yI(Ju8Ura#ZPh83 zo!&lbs&{}r=7$`99CN;0hSTlcUc69GA q>dwHnI@WAu;QyZrN(5tE0563_eGawmN>Ch+VF&CF+dZ-IPxvR5EGkX_ literal 0 HcmV?d00001 From bbfe51fabff3af63668a06347d2e1b42cc3217ea Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Wed, 19 Jun 2024 23:17:23 +0000 Subject: [PATCH 08/13] added index page lang, more districts in dla.yml example --- .../sections/5_analytics_portfolio_site.md | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/docs/publishing/sections/5_analytics_portfolio_site.md b/docs/publishing/sections/5_analytics_portfolio_site.md index 2d09b5a7e9..924f1c2311 100644 --- a/docs/publishing/sections/5_analytics_portfolio_site.md +++ b/docs/publishing/sections/5_analytics_portfolio_site.md @@ -10,7 +10,9 @@ present in the data-analyses repo is your friend. You can find the Cal-ITP Analy ## Netlify Setup -Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a full website. You must set up netlify key and/or make sure your Netlify token is up to date: +Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a full website. + +To setup your netlify key: - Install netlify: `npm install -g netlify-cli` - Navigate to your main directory @@ -25,6 +27,10 @@ Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a fu - For the changes to take effect, open a new terminal or run `source ~/.bash_profile` - Back in your terminal, enter `env | grep NETLIFY` to see that your Netlify token is there +To make sure your Netlify token is up to date: + +- COMING SOON + ## File Setup In order to publish to analysis.calitp.org, you need to create two different files. @@ -34,9 +40,9 @@ In order to publish to analysis.calitp.org, you need to create two different fil ### README.md -Create a `README.md` file in the repo where your work lies to detail the purpose of your website, methologies, relevant links, instructions, and more. +Create a `README.md` file in the repo where your work lies. This serves to detail purpose of your website, methologies, relevant links, instructions, and more. However, this also forms the landing page of your website. -- Your file should always be titled as `README.md`. No other variants such as `README_gtfs.md` or `read me.md` or ` README.md`. The portfolio can only take a `README.md` file when generating the landing page of your website. +- Your file should always be titled as `README.md`. No other variants such as `README_gtfs.md` or `read me.md` or ` README.md` are allowed. The portfolio can only take a `README.md` when generating the landing page of your website. - If you do accidentally create a `README.md` file with extra strings, you can fix this by taking the following steps: - `git rm portfolio/my_analysis/README_accidentally_named_something_else.md` - `rm portfolio/my_analysis/_build/html/README_accidentally_named_something.html`. We use `rm` because \_build/html folder is not checked into GitHub @@ -44,17 +50,18 @@ Create a `README.md` file in the repo where your work lies to detail the purpose ### YML -A `.yml` specifies the parameter you want your notebook to iterate over. For example, the [DLA Grant Analysis's`.yml`](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) runs the same notebook for each of the 12 Caltrans districts and the districts are also listed on the \[left hand side\]((https://dla--cal-itp-data-analyses.netlify.app/readme) to form the "Table of Contents." +Each `.yml` file creates a new site on the [Portfolio's Index Page](https://analysis.calitp.org/), so every project needs its own file. DLA Grant Analysis, SB125 Route Illustrations, and Active Transportation Program all have their own `.yml` file. -Because each `.yml` file creates a new site on the [Portfolio's Index Page](https://analysis.calitp.org/), so every project needs its own file. DLA Grant Analysis, SB125 Route Illustrations, and Active Transportation Program all have their own `.yml` file. +All the `.yml` files live here at [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). -The `.yml` files live here at [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - -To create a `yml` file: +Here's how to create a `yml` file: - Include the directory to the notebook(s) you want to publish. + - Name your `.yml` file. For now we will use `my_report.yml` as an example. + - The structure of your `.yml` file depends on the type of your analysis: + - If you have one parameterized notebook with **one parameter**: - Example: [dla.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/dla.yml) @@ -70,11 +77,18 @@ To create a `yml` file: - params: district_parameter: 1 district_title: District 1 + - params: + district_parameter: 2 + district_title: District 2 + and so on... + - params: + district_parameter: 12 + district_title: District 12 ``` - If you have a parameterized notebook with **multiple parameters**: - - Example: [rt.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/rt.yml). You can automate making a `.yml` file using a script, [example here](https://github.com/cal-itp/data-analyses/blob/main/gtfs_digest/deploy_portfolio_yaml.py). + - Example: [rt.yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/rt.yml). You can also automate making a `.yml` file using a script, [example here](https://github.com/cal-itp/data-analyses/blob/main/gtfs_digest/deploy_portfolio_yaml.py). ``` title: My Analyses @@ -131,7 +145,7 @@ To create a `yml` file: ## Building and Deploying your Report -After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! +After your Jupyter Notebook (refer to the previous section), `README.md`, and `.yml` files are setup properly, it's time to deploy your work to the Portfolio! ### Build your Report @@ -139,7 +153,7 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' 1. Navigate back to the `~/data-analyses` and install the portfolio requirements with `pip install -r portfolio/requirements.txt` -2. Then run `python portfolio/portfolio.py build my_report` to build your report +2. Run `python portfolio/portfolio.py build my_report` to build your report - **Note:** `my_report.yml` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). - Your build will be located in: `data-analyses/portfolio/my_report/_build/html/index.html` 3. Add the files using `git add` and commit your progress! @@ -164,9 +178,11 @@ After your Jupyter Notebook, README.md, and `.yml` files are setup properly, it' 5. Your notebook should now be displayed in the [Cal-ITP Analytics Portfolio](https://analysis.calitp.org/) + - If your work isn't showing up on the Index page above, run `python portfolio/portfolio.py index --deploy --prod` to add it. + ### Other Specifications -- You also have the option to specify: run `python portfolio/portfolio.py build --help` to see the following options: +- You also have the option to specify after the initial `python portfolio/portfolio.py build my_report [specification goes here]`: run `python portfolio/portfolio.py build --help` to see the following options: - `--deploy / --no-deploy` - deploy this component to netlify. - `--prepare-only / --no-prepare-only` From d457166521bad0f82278c3f634d5fb6856202a49 Mon Sep 17 00:00:00 2001 From: Eric Dasmalchi Date: Tue, 25 Jun 2024 10:59:36 -0700 Subject: [PATCH 09/13] fix typo --- docs/publishing/sections/4_notebooks_styling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/publishing/sections/4_notebooks_styling.md b/docs/publishing/sections/4_notebooks_styling.md index 685c9f8b38..7bbbd3d766 100644 --- a/docs/publishing/sections/4_notebooks_styling.md +++ b/docs/publishing/sections/4_notebooks_styling.md @@ -116,7 +116,7 @@ display(HTML(

First Header

) display(HTML(

Next Header

)) ### Page Titles -Markdown cells of the H1 type creates the titles of our website, not the `.yml` file. Let's use [SB125 Route Illustrations](https://sb125-route-illustrations--cal-itp-data-analyses.netlify.app/readme) to demostrate this. +Markdown cells of the H1 type creates the titles of our website, not the `.yml` file. Let's use [SB125 Route Illustrations](https://sb125-route-illustrations--cal-itp-data-analyses.netlify.app/readme) to demonstrate this. - We can see that the [yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/sb125_route_illustrations.yml) file lists the abbreviated county names as the parameter. From a6791855d705c7a74ab1619027a18aa464feac74 Mon Sep 17 00:00:00 2001 From: Eric Dasmalchi Date: Tue, 25 Jun 2024 15:13:51 -0700 Subject: [PATCH 10/13] add numpy<2 to requirements.txt --- docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index 55d970032a..4c49d99ccb 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,3 +2,4 @@ sqlalchemy-bigquery==1.10.0 calitp-data-analysis==2024.3.27 jupyter-book==1.0.0 sphinxcontrib-mermaid==0.8.1 +numpy<2 From a07296938ea33d88640f84437ed1ee95dd606181 Mon Sep 17 00:00:00 2001 From: Eric Dasmalchi Date: Tue, 25 Jun 2024 23:10:37 +0000 Subject: [PATCH 11/13] move photos to assets --- docs/publishing/sections/4_notebooks_styling.md | 10 +++++----- .../sections/{ => assets}/section4_image1.png | Bin .../sections/{ => assets}/section4_image2.png | Bin .../sections/{ => assets}/section4_image3.png | Bin .../sections/{ => assets}/section4_image4.png | Bin .../sections/{ => assets}/section4_image5.png | Bin 6 files changed, 5 insertions(+), 5 deletions(-) rename docs/publishing/sections/{ => assets}/section4_image1.png (100%) rename docs/publishing/sections/{ => assets}/section4_image2.png (100%) rename docs/publishing/sections/{ => assets}/section4_image3.png (100%) rename docs/publishing/sections/{ => assets}/section4_image4.png (100%) rename docs/publishing/sections/{ => assets}/section4_image5.png (100%) diff --git a/docs/publishing/sections/4_notebooks_styling.md b/docs/publishing/sections/4_notebooks_styling.md index 7bbbd3d766..6e5d3c4621 100644 --- a/docs/publishing/sections/4_notebooks_styling.md +++ b/docs/publishing/sections/4_notebooks_styling.md @@ -119,13 +119,13 @@ display(HTML(

First Header

) display(HTML(

Next Header

)) Markdown cells of the H1 type creates the titles of our website, not the `.yml` file. Let's use [SB125 Route Illustrations](https://sb125-route-illustrations--cal-itp-data-analyses.netlify.app/readme) to demonstrate this. - We can see that the [yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/sb125_route_illustrations.yml) file lists the abbreviated county names as the parameter. - + - However, the titles and headers in the notebook are the fully spelled out conunty names. - + - This is due to the fact that the parameter is mapped to another variable in the [notebook](https://github.com/cal-itp/data-analyses/blob/main/sb125_analyses/path_examples_tttf4/path_examples.ipynb). - + ## Getting Ready for Parameterization @@ -164,7 +164,7 @@ Please note: - This Markdown cell also creates the navigation on the lefthand side. Without this, the notebooks will be parameterized but then there'd be no table contents to list out the pages for people to see. - Any styling (italicizing, bolding, changing the colors) you use in the markdown cell below will reflect in the Table of Contents. - Below, you can see District 1: Eureka is displayed as the first header and is also the page's name in the Table of Content. Observe that the because the `# District` is bolded, the names on the left bar are also bolded. - - + - #### Code Cell: @@ -179,7 +179,7 @@ You will need to create two separate code cells that take on the parameter. Let' # district = "4" ``` - 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. - - + - - Code Cell #2: diff --git a/docs/publishing/sections/section4_image1.png b/docs/publishing/sections/assets/section4_image1.png similarity index 100% rename from docs/publishing/sections/section4_image1.png rename to docs/publishing/sections/assets/section4_image1.png diff --git a/docs/publishing/sections/section4_image2.png b/docs/publishing/sections/assets/section4_image2.png similarity index 100% rename from docs/publishing/sections/section4_image2.png rename to docs/publishing/sections/assets/section4_image2.png diff --git a/docs/publishing/sections/section4_image3.png b/docs/publishing/sections/assets/section4_image3.png similarity index 100% rename from docs/publishing/sections/section4_image3.png rename to docs/publishing/sections/assets/section4_image3.png diff --git a/docs/publishing/sections/section4_image4.png b/docs/publishing/sections/assets/section4_image4.png similarity index 100% rename from docs/publishing/sections/section4_image4.png rename to docs/publishing/sections/assets/section4_image4.png diff --git a/docs/publishing/sections/section4_image5.png b/docs/publishing/sections/assets/section4_image5.png similarity index 100% rename from docs/publishing/sections/section4_image5.png rename to docs/publishing/sections/assets/section4_image5.png From e434c1922e9dac030ac28f167e564ce18587700d Mon Sep 17 00:00:00 2001 From: Eric Dasmalchi Date: Tue, 25 Jun 2024 16:29:00 -0700 Subject: [PATCH 12/13] move images, use markdown syntax --- .../{sections => }/assets/section4_image1.png | Bin .../{sections => }/assets/section4_image2.png | Bin .../{sections => }/assets/section4_image3.png | Bin .../{sections => }/assets/section4_image4.png | Bin .../{sections => }/assets/section4_image5.png | Bin docs/publishing/sections/4_notebooks_styling.md | 10 +++++----- 6 files changed, 5 insertions(+), 5 deletions(-) rename docs/publishing/{sections => }/assets/section4_image1.png (100%) rename docs/publishing/{sections => }/assets/section4_image2.png (100%) rename docs/publishing/{sections => }/assets/section4_image3.png (100%) rename docs/publishing/{sections => }/assets/section4_image4.png (100%) rename docs/publishing/{sections => }/assets/section4_image5.png (100%) diff --git a/docs/publishing/sections/assets/section4_image1.png b/docs/publishing/assets/section4_image1.png similarity index 100% rename from docs/publishing/sections/assets/section4_image1.png rename to docs/publishing/assets/section4_image1.png diff --git a/docs/publishing/sections/assets/section4_image2.png b/docs/publishing/assets/section4_image2.png similarity index 100% rename from docs/publishing/sections/assets/section4_image2.png rename to docs/publishing/assets/section4_image2.png diff --git a/docs/publishing/sections/assets/section4_image3.png b/docs/publishing/assets/section4_image3.png similarity index 100% rename from docs/publishing/sections/assets/section4_image3.png rename to docs/publishing/assets/section4_image3.png diff --git a/docs/publishing/sections/assets/section4_image4.png b/docs/publishing/assets/section4_image4.png similarity index 100% rename from docs/publishing/sections/assets/section4_image4.png rename to docs/publishing/assets/section4_image4.png diff --git a/docs/publishing/sections/assets/section4_image5.png b/docs/publishing/assets/section4_image5.png similarity index 100% rename from docs/publishing/sections/assets/section4_image5.png rename to docs/publishing/assets/section4_image5.png diff --git a/docs/publishing/sections/4_notebooks_styling.md b/docs/publishing/sections/4_notebooks_styling.md index 6e5d3c4621..68377f3fd2 100644 --- a/docs/publishing/sections/4_notebooks_styling.md +++ b/docs/publishing/sections/4_notebooks_styling.md @@ -119,13 +119,13 @@ display(HTML(

First Header

) display(HTML(

Next Header

)) Markdown cells of the H1 type creates the titles of our website, not the `.yml` file. Let's use [SB125 Route Illustrations](https://sb125-route-illustrations--cal-itp-data-analyses.netlify.app/readme) to demonstrate this. - We can see that the [yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/sb125_route_illustrations.yml) file lists the abbreviated county names as the parameter. - + ![example yml file](../assets/section4_image5.png) - However, the titles and headers in the notebook are the fully spelled out conunty names. - + ![rendered notebook](../assets/section4_image3.png) - This is due to the fact that the parameter is mapped to another variable in the [notebook](https://github.com/cal-itp/data-analyses/blob/main/sb125_analyses/path_examples_tttf4/path_examples.ipynb). - + ![notebook heading](../assets/section4_image4.png) ## Getting Ready for Parameterization @@ -164,7 +164,7 @@ Please note: - This Markdown cell also creates the navigation on the lefthand side. Without this, the notebooks will be parameterized but then there'd be no table contents to list out the pages for people to see. - Any styling (italicizing, bolding, changing the colors) you use in the markdown cell below will reflect in the Table of Contents. - Below, you can see District 1: Eureka is displayed as the first header and is also the page's name in the Table of Content. Observe that the because the `# District` is bolded, the names on the left bar are also bolded. - - + ![header format](../assets/section4_image1.png) #### Code Cell: @@ -179,7 +179,7 @@ You will need to create two separate code cells that take on the parameter. Let' # district = "4" ``` - 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. - - + ![parameters tag](../assets/section4_image2.png) - Code Cell #2: From 3e5be7bcff20fa8e43190caa9f92769775f2622b Mon Sep 17 00:00:00 2001 From: amandaha8 Date: Wed, 26 Jun 2024 16:33:31 +0000 Subject: [PATCH 13/13] fixed typos and added last checks section --- .../sections/4_notebooks_styling.md | 37 ++++++++++++++----- .../sections/5_analytics_portfolio_site.md | 20 ++++------ 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/docs/publishing/sections/4_notebooks_styling.md b/docs/publishing/sections/4_notebooks_styling.md index 5f44db3e8a..02a60e6067 100644 --- a/docs/publishing/sections/4_notebooks_styling.md +++ b/docs/publishing/sections/4_notebooks_styling.md @@ -1,6 +1,13 @@ # Getting Notebooks Ready for the Portfolio -We want all the content on our [portfolio](https://analysis.calitp.org/) to be consistent and tidy. Below are some guidelines for you to follow when creating the Jupyter Notebooks. +Depending on the complexity of your visualizations, you may want to produce +a full website composed of multiple notebooks and/or the same notebook that is rerun across different parameters. + +For these situations, the [Jupyter Book-based](https://jupyterbook.org/en/stable/intro.html) +[publishing framework](https://github.com/cal-itp/data-analyses/tree/main/portfolio) +present in the data-analyses repo is your friend. You can find the Cal-ITP Analytics Portfolio at [analysis.calitp.org](https://analysis.calitp.org). + +We want all the content on our portfolio to be consistent. Below are guidelines for you to follow when creating the Jupyter Notebooks. ## Narrative @@ -55,8 +62,8 @@ These are a set of principles to adhere to when writing the narrative content in - Integers when referencing dates, times, etc - - 2020 for year, not 2020.0 (coerce to int64 or Int64 in `pandas`; Int64 are nullable integers, which allow for NaNs to appear alongside integers) - - 1 hr 20 min, not 1.33 hr (use best judgment to decide what's easier for readers to interpret) + - 2020 for year, not 2020.0. Ccoerce to int64 or Int64 in `pandas`; Int64 are nullable integers, which allow for NaNs to appear alongside integers. + - 1 hr 20 min, not 1.33 hr. Use your best judgment to decide what's easier for readers to interpret. - Round at the end of the analysis. Use best judgment to decide on significant digits. National Institutes of Health has a guide on [Rounding Rules](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4483789/#:~:text=Ideally%20data%20should%20be%20rounded,might%20call%20it%20Goldilocks%20rounding.&text=The%20European%20Association%20of%20Science,2%E2%80%933%20effective%20digits%E2%80%9D.). @@ -64,9 +71,9 @@ These are a set of principles to adhere to when writing the narrative content in - Too few decimal places may not give enough detail to distinguish between categories or ranges. - A good rule of thumb is to start with 1 extra decimal place than what is present in the other columns when deriving statistics (averages, percentiles), and decide from there if you want to round up. - An average of `$100,000.0` can simply be rounded to `$100,000`. - - An average of 5.2 mi might be left as is. + - An average of 5.2 miles might be left as is. -- Additional references: [American Psychological Association (APA) style](https://apastyle.apa.org/instructional-aids/numbers-statistics-guide.pdf) and [Purdue](https://owl.purdue.edu/owl/research_and_citation/apa_style/apa_formatting_and_style_guide/apa_numbers_statistics.html). +- Additional references we recommend are from the [American Psychological Association (APA)](https://apastyle.apa.org/instructional-aids/numbers-statistics-guide.pdf) and [Purdue University](https://owl.purdue.edu/owl/research_and_citation/apa_style/apa_formatting_and_style_guide/apa_numbers_statistics.html). ## Standard Names @@ -89,7 +96,7 @@ These are a set of principles to adhere to when writing the narrative content in ## Accessibility -It's important to make our content as user-friendly as possible. Here are a few options to consider. +It's important to make our content as user-friendly as possible. Here are a few things to consider. - Use a color palette that is color-blind friendly. There is no standard palette for now, so use your best judgement. There are many resources online such as [this one from the University of California, Santa Barbara](https://www.nceas.ucsb.edu/sites/default/files/2022-06/Colorblind%20Safe%20Color%20Schemes.pdf). - Add tooltips to your visualizations so users can find more detail. @@ -121,17 +128,26 @@ Markdown cells of the H1 type creates the titles of our website, not the - We can see that the [yml](https://github.com/cal-itp/data-analyses/blob/main/portfolio/sites/sb125_route_illustrations.yml) file lists the abbreviated county names as the parameter. ![example yml file](../assets/section4_image5.png) -- However, the titles and headers in the notebook are the fully spelled out conunty names. +- However, the titles and headers in the notebook are the fully spelled out county names. ![rendered notebook](../assets/section4_image3.png) - This is due to the fact that the parameter is mapped to another variable in the [notebook](https://github.com/cal-itp/data-analyses/blob/main/sb125_analyses/path_examples_tttf4/path_examples.ipynb). ![notebook heading](../assets/section4_image4.png) -## Getting Ready for Parameterization +## Last Checks -Now that your notebook is styled appropriately, setting up your Jupyter Notebook to be parameterized and published to the portflio requires a few extra steps. +Your notebook is all ready to be published. However, it never hurts to double check your work once more. Here are some things to look over once more. + +- All your values are formatted properly. Currencies should have $ and percentages should have %. +- The titles of your visualizations make sense and have the correct capitalizations. +- The legends of your visualizations are not cutoff horizontally or vertically. If you have many values in your legend, Altair will truncate them. +- The values in your visualizations are sorted properly. For example, if you use the string column of `month` with values January, February, etc in the x-axis of an Altair chart, Altair will sort these months alphabetically. +- If you are displaying a Pandas dataframe, consider styling it. You can look through the [Pandas' website](https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html) for inspiration. We also have a [function](https://github.com/cal-itp/data-analyses/blob/main/_shared_utils/shared_utils/portfolio_utils.py#L96) in our `portfolio_utils` that styles and formats a dataframe. +- Look at your notebook(s) on your laptop versus a monitor. + +## Getting Ready for Parameterization -The instructions below are also detailed in this [sample parameterized notebook here.](https://github.com/cal-itp/data-analyses/blob/main/starter_kit/parameterized_notebook.ipynb) +If you plan to rerun the same Jupyter Notebook over a set of different parameters, you need to setup your Jupyter Notebook in a particular way. ### Step 1: Packages to include @@ -147,6 +163,7 @@ warnings.filterwarnings('ignore') import calitp_data_analysis.magics +all your other packages go here ``` ### Capturing Parameters diff --git a/docs/publishing/sections/5_analytics_portfolio_site.md b/docs/publishing/sections/5_analytics_portfolio_site.md index 924f1c2311..c95455bae3 100644 --- a/docs/publishing/sections/5_analytics_portfolio_site.md +++ b/docs/publishing/sections/5_analytics_portfolio_site.md @@ -2,18 +2,13 @@ # The Cal-ITP Analytics Portfolio -Depending on the complexity of your visualizations, you may want to produce -a full website composed of multiple notebooks and/or the same notebook that is rerun across different parameters. -For these situations, the [Jupyter Book-based](https://jupyterbook.org/en/stable/intro.html) -[publishing framework](https://github.com/cal-itp/data-analyses/tree/main/portfolio) -present in the data-analyses repo is your friend. You can find the Cal-ITP Analytics Portfolio at [analysis.calitp.org](https://analysis.calitp.org). - ## Netlify Setup Netlify is the platform turns our Jupyter Notebooks uploaded to GitHub into a full website. To setup your netlify key: +- Ask in Slack/Teams for a Netlify key if you don't have one yet. - Install netlify: `npm install -g netlify-cli` - Navigate to your main directory - Edit your bash profile using Nano: @@ -40,9 +35,10 @@ In order to publish to analysis.calitp.org, you need to create two different fil ### README.md -Create a `README.md` file in the repo where your work lies. This serves to detail purpose of your website, methologies, relevant links, instructions, and more. However, this also forms the landing page of your website. +Create a `README.md` file in the repo where your work lies. This also forms the landing page of your website. - Your file should always be titled as `README.md`. No other variants such as `README_gtfs.md` or `read me.md` or ` README.md` are allowed. The portfolio can only take a `README.md` when generating the landing page of your website. +- The `README.md` is the first thing the audience will see when they visit your website. Therefore, this page should contain content such as the goal of your work, the methodology you used, relevant links, and more. [Here](https://github.com/cal-itp/data-analyses/blob/main/portfolio/template_README.md) is a template for you to populate. - If you do accidentally create a `README.md` file with extra strings, you can fix this by taking the following steps: - `git rm portfolio/my_analysis/README_accidentally_named_something_else.md` - `rm portfolio/my_analysis/_build/html/README_accidentally_named_something.html`. We use `rm` because \_build/html folder is not checked into GitHub @@ -160,9 +156,9 @@ After your Jupyter Notebook (refer to the previous section), `README.md`, and `. ### Deploy your Report -1. Make sure you are in the root of the data-analyses repo: `~/data-analyses` +1. Make sure you are in the root of the data-analyses repo: `~/data-analyses`. -2. Run `python portfolio/portfolio.py build my_report --deploy` +2. Run `python portfolio/portfolio.py build my_report --deploy`. - By running `--deploy`, you are deploying the changes to display in the Analytics Portfolio. - **Note:** The `my_report` will be replaced by the name of your `.yml` file in [data-analyses/portfolio/sites](https://github.com/cal-itp/data-analyses/tree/main/portfolio/sites). @@ -182,7 +178,7 @@ After your Jupyter Notebook (refer to the previous section), `README.md`, and `. ### Other Specifications -- You also have the option to specify after the initial `python portfolio/portfolio.py build my_report [specification goes here]`: run `python portfolio/portfolio.py build --help` to see the following options: +- You also have the option to specify after the initial `python portfolio/portfolio.py build my_report [specification goes here]` command: run `python portfolio/portfolio.py build --help` to see the following options: - `--deploy / --no-deploy` - deploy this component to netlify. - `--prepare-only / --no-prepare-only` @@ -199,9 +195,9 @@ After your Jupyter Notebook (refer to the previous section), `README.md`, and `. ### Adding to the Makefile Another and more efficient way to write to the Analytics Portfolio is to use the Makefile and run -`make build_my_report -f Makefile` in data-analyses +`make build_my_report -f Makefile` in the `data-analyses` repo. -Example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): +Here's an example makefile in [`cal-itp/data-analyses`](https://github.com/cal-itp/data-analyses/blob/main/Makefile): ``` build_my_reports: