├── .binder
├── conda-lock.yml
├── environment-python_and_r.yml
└── environment.yml
├── .github
├── ISSUE_TEMPLATE
│ └── NEW_NOTEBOOK.yml
├── PULL_REQUEST_TEMPLATE
│ └── PULL_REQUEST_TEMPLATE.md
├── dependabot.yml
└── workflows
│ ├── deploy-docs.yml
│ ├── docs-linkchecker.yml
│ ├── relock.yml
│ ├── test-env.yml
│ ├── test-install-instructions.yml
│ ├── test_data_access_notebooks.yml
│ ├── test_data_analysis_and_visualization_notebooks.yml
│ └── test_data_management_notebooks.yml
├── .gitignore
├── .pre-commit-config.yaml
├── CITATION.cff
├── CONTRIBUTING.md
├── LICENSE.txt
├── README.md
├── jupyterbook
├── _config.yml
├── _toc.yml
├── content
│ ├── Video_Demo_Markdown
│ │ ├── glos.md
│ │ ├── ioos.md
│ │ ├── nanoos.md
│ │ ├── ooi.md
│ │ └── python_dem.md
│ ├── add_colab_install_missing_deps.py
│ ├── code_gallery
│ │ ├── data
│ │ │ ├── MadeUpDataForBiologicalDataTraining.csv
│ │ │ ├── oceans.dbf
│ │ │ ├── oceans.prj
│ │ │ ├── oceans.qpj
│ │ │ ├── oceans.shp
│ │ │ ├── oceans.shx
│ │ │ ├── timeseriesProfile.csv
│ │ │ └── water_level_example.csv
│ │ ├── data_access.md
│ │ ├── data_access_notebooks
│ │ │ ├── 2016-10-12-fetching_data.ipynb
│ │ │ ├── 2016-11-15-glider_data_example.ipynb
│ │ │ ├── 2016-12-19-exploring_csw.archived.ipynb
│ │ │ ├── 2016-12-20-searching_glider_deployments.ipynb
│ │ │ ├── 2016-12-22-boston_light_swim.archived.ipynb
│ │ │ ├── 2017-01-18-siphon-explore-thredds-iframe.png
│ │ │ ├── 2017-01-18-siphon-explore-thredds.archived.ipynb
│ │ │ ├── 2017-03-21-ERDDAP_IOOS_Sensor_Map.ipynb
│ │ │ ├── 2017-06-12-NCEI_RA_archive_history.ipynb
│ │ │ ├── 2017-07-25-HFRadar_currents.archived.ipynb
│ │ │ ├── 2017-08-01-xtractoR.ipynb
│ │ │ ├── 2017-09-09-hurricane_irma.ipynb
│ │ │ ├── 2017-11-30-rerddap.ipynb
│ │ │ ├── 2017-12-15-finding_HFRadar_currents.archived.ipynb
│ │ │ ├── 2018-02-20-obis.ipynb
│ │ │ ├── 2018-03-01-erddapy-iframe-0.png
│ │ │ ├── 2018-03-01-erddapy.ipynb
│ │ │ ├── 2019-02-26-hurricane_gis_part01.archived.ipynb
│ │ │ ├── 2019-03-08-grids-temperature.ipynb
│ │ │ ├── 2019-05-27-hurricane_gis_part02.ipynb
│ │ │ ├── 2020-10-10-GTS.ipynb
│ │ │ ├── 2021-10-19-multiple-erddap-search.ipynb
│ │ │ ├── 2022-11-23_pyobis_example.ipynb
│ │ │ ├── 2022-11-25-plan_surf_trip_EDS.ipynb
│ │ │ ├── 2024-09-17-CKAN_API_Query.ipynb
│ │ │ └── combined_high_res.zip
│ │ ├── data_analysis_and_visualization.md
│ │ ├── data_analysis_and_visualization_notebooks
│ │ │ ├── 2016-11-16-CF-UGRID-SGRID-conventions.ipynb
│ │ │ ├── 2017-01-23-R-notebook.ipynb
│ │ │ ├── 2017-03-30-octave_notebook_example.ipynb
│ │ │ ├── 2018-03-15-ssh-skillscore.archived.ipynb
│ │ │ ├── 2018-03-30-wave_height_assessment.archived.ipynb
│ │ │ ├── 2018-12-04-grids.ipynb
│ │ │ ├── 2020-02-14-QARTOD_ioos_qc_Water-Level-Example.ipynb
│ │ │ ├── 2021-10-25-ERDDAP-interpolate.ipynb
│ │ │ ├── 2024-05-16-white_shark_water_temp.ipynb
│ │ │ ├── 2024-08-27-plotting-interface-gliderpy.ipynb
│ │ │ ├── 2024-09-13-OBIS_EOVs.ipynb
│ │ │ └── sd1045_hurricane_2021.csv
│ │ ├── data_management.md
│ │ ├── data_management_notebooks
│ │ │ ├── 2017-05-14-running_compliance_checker.ipynb
│ │ │ ├── 2017-11-01-Creating-Archives-Using-Bagit.ipynb
│ │ │ ├── 2018-02-27-pocean-timeSeries-demo.ipynb
│ │ │ ├── 2020-12-08-DataToDwC.ipynb
│ │ │ └── 2023-03-20-Reading_and_writing_zarr.ipynb
│ │ └── gallery.md
│ ├── images
│ │ ├── 2016-10-12-fetching_data.png
│ │ ├── 2016-11-15-glider_data_example.png
│ │ ├── 2016-11-16-CF-UGRID-SGRID-conventions.png
│ │ ├── 2016-12-19-exploring_csw.archived.png
│ │ ├── 2016-12-20-searching_glider_deployments.png
│ │ ├── 2016-12-22-boston_light_swim.archived.png
│ │ ├── 2017-01-18-siphon-explore-thredds.archived.png
│ │ ├── 2017-01-23-R-notebook.png
│ │ ├── 2017-03-21-ERDDAP_IOOS_Sensor_Map.png
│ │ ├── 2017-03-30-octave_notebook_example.png
│ │ ├── 2017-06-12-NCEI_RA_archive_history.png
│ │ ├── 2017-07-25-HFRadar_currents.archived.png
│ │ ├── 2017-08-01-xtractoR.png
│ │ ├── 2017-09-09-hurricane_irma.png
│ │ ├── 2017-11-30-rerddap.png
│ │ ├── 2017-12-15-finding_HFRadar_currents.archived.png
│ │ ├── 2018-02-20-obis.png
│ │ ├── 2018-02-27-pocean-timeSeries-demo.png
│ │ ├── 2018-03-01-erddapy.png
│ │ ├── 2018-03-30-wave_height_assessment.archived.png
│ │ ├── 2018-12-04-grids.png
│ │ ├── 2019-03-08-grids-temperature.png
│ │ ├── 2020-02-14-QARTOD_ioos_qc_Water-Level-Example.png
│ │ ├── 2020-10-10-GTS.png
│ │ ├── 2021-10-25-ERDDAP-interpolate.png
│ │ ├── 2022-11-23_pyobis_example.png
│ │ ├── 2022-11-25-plan_surf_trip_EDS.png
│ │ ├── 2023-03-20-Reading_and_writing_zarr.png
│ │ ├── 2024-05-16-white_shark_water_temp.png
│ │ ├── 2024-09-17-CKAN_API_Query.png
│ │ └── placeholder.png
│ ├── intro.md
│ ├── ioos_installation_conda.md
│ ├── kernel_error.png
│ ├── make_gallery.py
│ ├── miniforge_select_box.png
│ └── prompt.png
└── images
│ ├── Data_Demo_Center_middlepic_size770.png
│ ├── GLOS.png
│ ├── IOOS_logo.png
│ ├── NANOOS.png
│ ├── OOI_Logo.png
│ ├── ioos_CodeLab_image_multi_hex.png
│ ├── placeholder.png
│ └── python.png
├── pytest.ini
└── ruff.toml
/.binder/environment-python_and_r.yml:
--------------------------------------------------------------------------------
1 | name: IOOS
2 | channels:
3 | - conda-forge
4 | dependencies:
5 | - python=3.13
6 | - bokeh
7 | - cartopy
8 | - cf-units
9 | - cf-xarray
10 | - ckanapi
11 | - compliance-checker
12 | - erddapy
13 | - folium
14 | - gdal
15 | - geopandas
16 | - geoplot
17 | - gliderpy>=0.3.1
18 | - gridgeo
19 | - humanize
20 | - ioos-metrics
21 | - ioos-qc
22 | - ipyleaflet
23 | - ipywidgets
24 | - jupyter
25 | - lxml
26 | - matplotlib-base
27 | - nbclassic
28 | - netcdf4
29 | - numpy
30 | - oceans
31 | - odvc
32 | - owslib
33 | - palettable
34 | - pandas
35 | - pocean-core
36 | - pyobis
37 | - pysgrid
38 | - pyugrid
39 | - pyworms
40 | - requests
41 | - retrying
42 | - seawater
43 | - shapely
44 | - stamina
45 | - tqdm
46 | - xarray
47 | - zarr
48 | # R packages.
49 | - r-base=4
50 | - r-irkernel
51 | - r-dplyr
52 | - r-htmlwidgets
53 | - r-maps
54 | - r-readr
55 | - r-robis # hoding osx-arm64
56 | platforms:
57 | - linux-64
58 | - osx-64
59 | # - osx-arm64
60 | - win-64
61 |
--------------------------------------------------------------------------------
/.binder/environment.yml:
--------------------------------------------------------------------------------
1 | name: IOOS
2 | channels:
3 | - conda-forge
4 | dependencies:
5 | - python=3.13
6 | - bokeh
7 | - cartopy
8 | - cf-units
9 | - cf-xarray
10 | - ckanapi
11 | - compliance-checker
12 | - erddapy
13 | - folium
14 | - gdal
15 | - geopandas
16 | - geoplot
17 | - gliderpy>=0.3.1
18 | - gridgeo
19 | - humanize
20 | - ioos-metrics
21 | - ioos-qc
22 | - ipyleaflet
23 | - ipywidgets
24 | - jupyter
25 | - lxml
26 | - matplotlib-base
27 | - nbclassic
28 | - netcdf4
29 | - numpy
30 | - oceans
31 | - odvc
32 | - owslib
33 | - palettable
34 | - pandas
35 | - pocean-core
36 | - pyobis
37 | - pysgrid
38 | - pyugrid
39 | - pyworms
40 | - requests
41 | - retrying
42 | - seawater
43 | - shapely
44 | - stamina
45 | - tqdm
46 | - xarray
47 | - zarr
48 | platforms:
49 | - linux-64
50 | - osx-64
51 | - osx-arm64
52 | - win-64
53 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/NEW_NOTEBOOK.yml:
--------------------------------------------------------------------------------
1 | name: New Notebook
2 | description: Request to add a new notebook
3 | title: "[New Notebook]: "
4 | labels: ["Notebook idea"]
5 | assignees:
6 | - mathewbiddle
7 | - ocefpaf
8 | body:
9 | - type: markdown
10 | attributes:
11 | value: If you want to suggest a notebook for the [IOOS CodeLab](https://ioos.github.io/ioos_code_lab/content/intro.html) please answer these questions
12 | - type: input
13 | id: language
14 | attributes:
15 | label: Programming Language
16 | description: What programming language(s) will be used in the example?
17 | placeholder: Python
18 | - type: input
19 | id: tool
20 | attributes:
21 | label: Module/Software/IOOS data service?
22 | description: Is it focused on a particular module/software or an IOOS data service?
23 | placeholder: ERDDAP
24 | - type: input
25 | id: example
26 | attributes:
27 | label: Module/Software/IOOS data service?
28 | description: Can you provide a minimum example of the expected code and results in a notebook?
29 | placeholder: Yes, see this gist.
30 | - type: input
31 | id: description
32 | attributes:
33 | label: Provide a description.
34 | description: Please provide a detailed description of the suggested example below.
35 | placeholder: The notebook should detail how to bring source data in, and create an interactive graphical timeseries of the data.
36 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | Thank you for send a Pull Request to our code gallery! When adding or updating a notebook please check if:
2 |
3 | - \[ \] The notebook has all the dependencies required to run in the IOOS env, if not please update the environment file.
4 | - \[ \] You added a title, description, and a line with `Created: YYYY-MM-DD` in the first cell.
5 | - \[ \] If you are updating a notebook add a line with `Updated: YYYY-MM-DD` below the created date.
6 | - \[ \] Update the gallery entry to show your notebook thumbnail and description.
7 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # See https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/keeping-your-actions-up-to-date-with-dependabot
2 |
3 | version: 2
4 | updates:
5 |
6 | - package-ecosystem: "github-actions"
7 | directory: "/"
8 | schedule:
9 | interval: "daily"
10 | labels:
11 | - "Bot"
12 | groups:
13 | github-actions:
14 | patterns:
15 | - '*'
16 |
--------------------------------------------------------------------------------
/.github/workflows/deploy-docs.yml:
--------------------------------------------------------------------------------
1 | name: Build and Deploy docs
2 |
3 | on:
4 | pull_request:
5 | push:
6 | branches: [main]
7 |
8 | jobs:
9 | build-docs:
10 | runs-on: ubuntu-latest
11 |
12 | steps:
13 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
14 |
15 | - name: Set up Python
16 | uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
17 | with:
18 | python-version: "3.x"
19 |
20 |
21 | - name: Build documentation
22 | run: >
23 | set -e
24 | && pip install jupyter-book
25 | && jupyter-book build jupyterbook
26 |
27 | - name: GitHub Pages action
28 | if: github.ref == 'refs/heads/main'
29 | uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
30 | with:
31 | github_token: ${{ secrets.GITHUB_TOKEN }}
32 | publish_dir: jupyterbook/_build/html
33 |
--------------------------------------------------------------------------------
/.github/workflows/docs-linkchecker.yml:
--------------------------------------------------------------------------------
1 | name: Check linkrot
2 |
3 | on:
4 | pull_request:
5 | push:
6 | branches: [main]
7 |
8 | jobs:
9 | build-docs:
10 | runs-on: ubuntu-latest
11 |
12 | steps:
13 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
14 |
15 | - name: Set up Python
16 | uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
17 | with:
18 | python-version: "3.x"
19 |
20 |
21 | - name: Linkcheck
22 | run: >
23 | set -e
24 | && pip install jupyter-book
25 | && jupyter-book build jupyterbook --builder linkcheck
26 |
27 | - name: GitHub Pages action
28 | if: github.ref == 'refs/heads/main'
29 | uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
30 | with:
31 | github_token: ${{ secrets.GITHUB_TOKEN }}
32 | publish_dir: jupyterbook/_build/html
33 |
--------------------------------------------------------------------------------
/.github/workflows/relock.yml:
--------------------------------------------------------------------------------
1 | name: relock
2 |
3 | on:
4 | schedule:
5 | - cron: '0 0 1 * *'
6 | workflow_dispatch:
7 |
8 | jobs:
9 | relock:
10 | runs-on: ubuntu-latest
11 | permissions:
12 | contents: write
13 | pull-requests: write
14 |
15 | steps:
16 | - name: Checkout
17 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
18 | with:
19 | fetch-depth: 0
20 | persist-credentials: false
21 |
22 | - name: Setup Micromamba
23 | uses: mamba-org/setup-micromamba@b09ef9b599704322748535812ca03efb2625677b # v2.0.5
24 | with:
25 | environment-name: RELOCK
26 | init-shell: bash
27 | create-args: >-
28 | python=3
29 | conda conda-lock
30 |
31 | - name: re-lock
32 | run: >
33 | cd .binder/
34 | && conda-lock --conda=micromamba -f environment-python_and_r.yml
35 |
36 | - name: Check for changes
37 | id: check_changes
38 | run: >
39 | git diff --quiet origin/main -- ".binder/conda-lock.yml" || echo "changed=true" >> $GITHUB_OUTPUT
40 |
41 | - name: Create PR if file changed
42 | if: steps.check_changes.outputs.changed == 'true'
43 | uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e #v7.0.8
44 | with:
45 | token: ${{ secrets.GITHUB_TOKEN }}
46 | commit-message: "Update lockfile"
47 | branch: "update-lockfile-$(date +%s)"
48 | title: "Update lockfile"
49 | body: "Updating the lockfile."
50 | delete-branch: true
51 | labels: Bot
52 |
--------------------------------------------------------------------------------
/.github/workflows/test-env.yml:
--------------------------------------------------------------------------------
1 | name: Test Environment
2 |
3 | on:
4 | pull_request:
5 |
6 | jobs:
7 | run:
8 | runs-on: ${{ matrix.os }}
9 | strategy:
10 | matrix:
11 | # macos-latest is osx-arm64 and the env is not building there yet b/c of robis.
12 | os: [ macos-13, ubuntu-latest, windows-latest ]
13 | fail-fast: false
14 | defaults:
15 | run:
16 | shell: bash -l {0}
17 |
18 | steps:
19 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
20 |
21 | - name: Setup Micromamba
22 | uses: mamba-org/setup-micromamba@b09ef9b599704322748535812ca03efb2625677b # v2.0.5
23 | with:
24 | environment-name: IOOS
25 | init-shell: bash
26 | create-args: >-
27 | --file .binder/conda-lock.yml
28 |
29 | - name: Test environment
30 | run: >
31 | python -c 'import osgeo.gdal; print(dir(osgeo.gdal))'
32 |
--------------------------------------------------------------------------------
/.github/workflows/test-install-instructions.yml:
--------------------------------------------------------------------------------
1 | name: Test Install instructions Section
2 |
3 | on:
4 | pull_request:
5 |
6 | jobs:
7 | run:
8 | runs-on: ${{ matrix.os }}
9 | strategy:
10 | matrix:
11 | os: [ubuntu-latest, macos-latest, windows-latest]
12 | include:
13 | - os: macos-latest
14 | INSTALLER: "Miniforge3-MacOSX-x86_64.sh"
15 | - os: ubuntu-latest
16 | INSTALLER: "Miniforge3-Linux-x86_64.sh"
17 | - os: windows-latest
18 | INSTALLER: "Miniforge3-Windows-x86_64.exe"
19 | fail-fast: false
20 | defaults:
21 | run:
22 | shell: bash -l {0}
23 |
24 | steps:
25 | - name: Download Miniforge3 and the Env File
26 | run: >
27 | curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/${{ matrix.INSTALLER }}
28 | && curl -L -O https://raw.githubusercontent.com/ioos/ioos_code_lab/main/.binder/environment.yml
29 |
30 | - name: Install Miniforge3 on *nix
31 | if: startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macOS')
32 | run: |
33 | sh ${{ matrix.INSTALLER }} -b
34 |
35 | - name: Install Miniforge3 on Windows
36 | shell: cmd
37 | if: startsWith(matrix.os, 'windows')
38 | run: |
39 | start /wait "" ${{ matrix.INSTALLER }} /InstallationType=JustMe /AddToPath=0 /RegisterPython=0 /S /D=C:\miniforge3
40 |
41 | - name: Create on *nix
42 | if: startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macOS')
43 | run: |
44 | ~/miniforge3/bin/conda env create --quiet --file environment.yml
45 |
46 | - name: Create on Windows
47 | shell: cmd
48 | if: startsWith(matrix.os, 'windows')
49 | run: |
50 | C:\miniforge3\Scripts\conda.exe update --yes --all
51 | C:\miniforge3\Scripts\conda.exe env create --quiet --file environment.yml
52 |
53 | - name: Test environment on *nix
54 | if: startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macOS')
55 | run: >
56 | source ~/miniforge3/bin/activate IOOS
57 | && python -c 'import osgeo.gdal; print(dir(osgeo.gdal))'
58 |
59 | - name: Test environment on Windows
60 | shell: cmd
61 | if: startsWith(matrix.os, 'windows')
62 | run: |
63 | C:\miniforge3\Scripts\activate.bat IOOS
64 | python -c "import osgeo.gdal; print(dir(osgeo.gdal))"
65 |
--------------------------------------------------------------------------------
/.github/workflows/test_data_access_notebooks.yml:
--------------------------------------------------------------------------------
1 | name: Test Data Access Notebook
2 |
3 | on:
4 | pull_request:
5 |
6 | jobs:
7 | run-tests:
8 | runs-on: ubuntu-latest
9 |
10 | steps:
11 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
12 |
13 | - name: Setup Micromamba
14 | uses: mamba-org/setup-micromamba@b09ef9b599704322748535812ca03efb2625677b # v2.0.5
15 | with:
16 | environment-name: IOOS
17 | init-shell: bash
18 | create-args: >-
19 | --file .binder/conda-lock.yml
20 |
21 | - name: Notebook tests
22 | shell: bash -l {0}
23 | run: >
24 | micromamba install nbval
25 | && python -m pytest --nbval --nbval-lax jupyterbook/content/code_gallery/data_access_notebooks/
26 |
--------------------------------------------------------------------------------
/.github/workflows/test_data_analysis_and_visualization_notebooks.yml:
--------------------------------------------------------------------------------
1 | name: Test Data Analysis And Visualization Notebooks
2 |
3 | on:
4 | pull_request:
5 |
6 | jobs:
7 | run-tests:
8 | runs-on: ubuntu-latest
9 |
10 | steps:
11 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
12 |
13 | - name: Setup Micromamba
14 | uses: mamba-org/setup-micromamba@b09ef9b599704322748535812ca03efb2625677b # v2.0.5
15 | with:
16 | environment-name: IOOS
17 | init-shell: bash
18 | create-args: >-
19 | --file .binder/conda-lock.yml
20 |
21 | - name: Notebook tests
22 | shell: bash -l {0}
23 | run: >
24 | micromamba install nbval
25 | && python -m pytest --nbval --nbval-lax jupyterbook/content/code_gallery/data_analysis_and_visualization_notebooks/
26 |
--------------------------------------------------------------------------------
/.github/workflows/test_data_management_notebooks.yml:
--------------------------------------------------------------------------------
1 | name: Test Data Management Notebooks
2 |
3 | on:
4 | pull_request:
5 |
6 | jobs:
7 | run-tests:
8 | runs-on: ubuntu-latest
9 |
10 | steps:
11 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
12 |
13 | - name: Setup Micromamba
14 | uses: mamba-org/setup-micromamba@b09ef9b599704322748535812ca03efb2625677b # v2.0.5
15 | with:
16 | environment-name: IOOS
17 | init-shell: bash
18 | create-args: >-
19 | --file .binder/conda-lock.yml
20 |
21 | - name: Notebook tests
22 | shell: bash -l {0}
23 | run: >
24 | micromamba install nbval
25 | && python -m pytest --nbval --nbval-lax jupyterbook/content/code_gallery/data_management_notebooks/
26 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.*~
2 | *.swp
3 | .ipynb_checkpoints/
4 | index.html
5 |
--------------------------------------------------------------------------------
/.pre-commit-config.yaml:
--------------------------------------------------------------------------------
1 | exclude: ".binder/conda-lock.yml"
2 |
3 | repos:
4 | - repo: https://github.com/pre-commit/pre-commit-hooks
5 | rev: v5.0.0
6 | hooks:
7 | - id: trailing-whitespace
8 | - id: check-ast
9 | - id: debug-statements
10 | - id: end-of-file-fixer
11 | - id: check-docstring-first
12 | - id: check-added-large-files
13 | exclude_types: [yaml]
14 | - id: check-docstring-first
15 | - id: check-json
16 | - id: check-yaml
17 |
18 | - repo: https://github.com/pre-commit/mirrors-prettier
19 | rev: v4.0.0-alpha.8
20 | hooks:
21 | - id: prettier
22 | types_or: [html]
23 | exclude: "_templates/layout.html"
24 |
25 | - repo: https://github.com/psf/black
26 | rev: 25.1.0
27 | hooks:
28 | - id: black
29 | language_version: python3
30 |
31 | - repo: https://github.com/asottile/add-trailing-comma
32 | rev: v3.2.0
33 | hooks:
34 | - id: add-trailing-comma
35 |
36 | - repo: https://github.com/astral-sh/ruff-pre-commit
37 | rev: v0.11.12
38 | hooks:
39 | - id: ruff
40 |
41 | - repo: https://github.com/nbQA-dev/nbQA
42 | rev: 1.9.1
43 | hooks:
44 | # mdformat works on the CLI but not as pre-commit yet.
45 | # Use `nbqa mdformat jupyterbook --nbqa-md` to run it locally.
46 | # - id: mdformat
47 | - id: nbqa-check-ast
48 | - id: nbqa-black
49 | - id: nbqa-ruff
50 | args: [--fix]
51 |
52 | - repo: https://github.com/bdice/nb-strip-paths
53 | rev: 'v0.1.0'
54 | hooks:
55 | - id: nb-strip-paths
56 |
57 | ci:
58 | autofix_commit_msg: |
59 | [pre-commit.ci] auto fixes from pre-commit.com hooks
60 | for more information, see https://pre-commit.ci
61 | autofix_prs: false
62 | autoupdate_commit_msg: "[pre-commit.ci] pre-commit autoupdate"
63 | autoupdate_schedule: monthly
64 | skip: []
65 | submodules: false
66 |
--------------------------------------------------------------------------------
/CITATION.cff:
--------------------------------------------------------------------------------
1 | cff-version: 1.0.0
2 | message: "If you need to cite this site please use the information below."
3 | authors:
4 | - family-names: Fernandes
5 | given-names: Filipe
6 | - family-names: Bosch Webster
7 | given-names: Jennifer
8 | - family-names: Signell
9 | given-names: Rich
10 | - family-names: Biddle
11 | given-names: Mathew
12 | - family-names: Wilcox
13 | given-names: Kyle
14 | - family-names: Wengren
15 | given-names: Micah
16 | title: IOOS Code Lab
17 | version: v2.0.0
18 | date-released: 2021-08-24
19 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contribution guidance
2 |
3 | This page documents the procedures for:
4 |
5 | 1. [Requesting new notebooks](#requesting-new-notebooks) to be added to the [IOOS CodeLab](https://ioos.github.io/ioos_code_lab);
6 | 1. [Building](#building-new-notebooks) new notebooks;
7 | 1. [Reviewing](#reviewing) submitted notebooks;
8 | 1. [Merging](#merging) approved notebooks for inclusion into the CodeLab;
9 | 1. [Announcing](#announcing) the new notebooks to the community; and
10 | 1. [Logging any bugs](#logging-bugs) that are found in the CodeLab.
11 | 1. Managing the IOOS CodeLab [Project Board](#managing-ioos-data-demo-center-project-board).
12 | 1. [Local management](#local-management-of-ioos_code_lab) of the ioos_code_lab repository.
13 |
14 | ## Requesting new notebooks
15 |
16 | - New notebooks should be requested by adding an issue to this GitHub repository using this [template](https://github.com/ioos/ioos_code_lab/issues/new?assignees=mathewbiddle%2Cocefpaf&labels=Notebook+idea&projects=&template=NEW_NOTEBOOK.yml&title=%5BNew+Notebook%5D%3A+). The ticket should contain the following information (also provided in the issue template):
17 |
18 | ```
19 | - [ ] What is language(s) for used in the example?
20 | - [ ] Is it focused on a particular module/software or an IOOS data service?
21 | - [ ] Can you provide a minimum example of the expected code and results in a notebook?
22 |
23 | Please provide a detailed description of the suggested example below:
24 | ```
25 |
26 | ### For the admin
27 |
28 | When the ticket gets created, make the following additions to the ticket:
29 |
30 | - Add the label [Notebook idea](https://github.com/ioos/ioos_code_lab/labels/Notebook%20idea).
31 | - Add the ticket to the [IOOS CodeLab](https://github.com/orgs/ioos/projects/1#card-49928448) project.
32 | - Put the card in the column [backlog](https://github.com/orgs/ioos/projects/1#column-5010196).
33 |
34 | ## Building new notebooks
35 |
36 | If you would like to work on a notebook that has been proposed, follow these steps:
37 |
38 | 1. [Create a fork](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) of the [ioos_code_lab](https://github.com/ioos/ioos_code_lab) repository.
39 | 1. On your fork, [create a branch](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-and-deleting-branches-within-your-repository) where you will start working on the new notebook.
40 | 1. Give the branch a name that conveys what the new notebook is. For example, a notebook on converting data into Darwin Core could have a branch name of `data2dwc`. This makes it easier to know which branch is dedicated to which new notebook.
41 | 1. On the new `branch` in your `fork`, start creating the new notebook.
42 | 1. Notebooks are kept in the [jupyterbook/content/code_gallery](https://github.com/ioos/ioos_code_lab/tree/main/jupyterbook/content/code_gallery) directory of this repository.
43 | 1. There are three directories where notebooks can be placed:
44 | 1. `data_access_notebooks` - Notebooks exemplifying how to access data from various services using various tools.
45 | 1. `data_analysis_and_visualization_notebooks` - Notebooks exemplifying doing some analysis and/or visualizations using tools common in the IOOS community.
46 | 1. `data_management_notebooks` - Notebooks on how to use various tools to ensure compliance with existing standards and conventions.
47 | 1. Typically, it's best to copy an existing (working) notebook to a new file. If you are creating a python notebook, copy one of the python notebooks. If you are creating an R notebook, copy one of the R notebooks, etc
48 | 1. Name the notebook following the convention `[date]-[short name].ipynb`. Where, `[date]` is the date (YYYY-MM-DD) you started the new notebook and `[short name]` is an abbreviation for what the notebook will cover. Look at the existing notebook filenames to get a sense of the short names used.
49 | 1. Edit the notebook following the [Jupyter Notebook documentation](https://jupyter-notebook.readthedocs.io/en/stable/notebook.html). The notebook should include the following information:
50 | 1. Descriptive title for what the notebook is doing.
51 | 1. A short summary providing context and expanding on the title.
52 | 1. The date you started (or updated) the notebook.
53 | 1. Once you feel comfortable with your notebook, [commit](https://github.com/git-guides/git-commit) your work to the branch on your fork on your local machine.
54 | 1. [Push](https://github.com/git-guides/git-push) your commit up to the branch on your fork in GitHub.
55 | 1. [Create a Pull Request (PR)](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork).
56 | 1. Link the PR to the ticket requesting the new notebook.
57 | 1. On the right hand side of the PR there is an option for `Linked issues`. Type the number for the issue there (or scroll through the tickets until you find the one of interest).
58 | 1. **Admin** Move the Project card from `Backlog` to `Working`.
59 | 1. When you are ready for it to be merged, in the PR click `Ready for review`.
60 | 1. **Admin** Move the Project card from `Working` to `Needs Review`.
61 |
62 | ## Reviewing
63 |
64 | See [pull request reviews](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews) for more information on reviewing PRs.
65 |
66 | **Each new notebook needs at least one reviewer.**
67 |
68 | 1. When the PR is `Ready for review`, the reviewer should:
69 | 1. Try running the entire notebook. Typically by selecting from the **Kernel** dropdown `Restart and Run All`.
70 | 1. Any errors here should be logged and fixed or reported back to the PR. **Admin** move the Project card from `Needs Review` to `Working`.
71 | 1. Review the notebook for understandability.
72 | 1. Does the notebook clearly describe the processes happening in each cell? Does it provide context?
73 | 1. Review the code to ensure it's doing what it's supposed to.
74 | 1. Check for spelling errors.
75 |
76 | ## Merging
77 |
78 | For Administrators:
79 |
80 | 1. If the notebook looks good, the reviewer will [merge the PR](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/merging-a-pull-request).
81 | 1. This kicks off a series of [GitHub Actions](https://github.com/features/actions).
82 | 1. You can see the workflows at https://github.com/ioos/ioos_code_lab/actions
83 | 1. Once the workflows are complete, check the [IOOS CodeLab](https://ioos.github.io/ioos_code_lab/) for the new notebook.
84 | 1. Review the notebook for any display issues when presented on the web. Check for the extra cell at the bottom of the notebook.
85 | 1. If there are issues, submit a new PR to resolve the issues.
86 | 1. In the notebook activate the cell tag:
87 | 
88 | 1. And then add a `remove-cell` tag. That will tell jupyterbook to ignore that cell when rendering.
89 |
90 | ## Announcing
91 |
92 | When new notebooks, or significant changes to the site, are merged and pushed out, follow this procedure:
93 |
94 | 1. **Admin** Move the appropriate Project card to [Announcement](https://github.com/orgs/ioos/projects/1#column-13186308).
95 | 1. Draft announcement text.
96 | 1. Include a brief summary of the new release.
97 | 1. Include any relevant links to the demo center.
98 | 1. Distribute text through the following channels.
99 | 1. IOOS bi-weekly
100 | 1. EOTO
101 | 1. ioos_tech mail list
102 | 1. dmac mail list
103 | 1. Twitter/FB.
104 | 1. Appropriate slack channels
105 |
106 | ## Logging bugs or changes
107 |
108 | 1. Bugs should be reported through tickets in this repository. Be sure to include the notebook where the problem is found. Include a clear description of the issue or change that is needed.
109 |
110 | ## Managing IOOS Data Demo Center Project Board
111 |
112 | The [project board](https://github.com/orgs/ioos/projects/1) captures the current progress on notebooks and adjustments to the IOOS Data Demo Center.
113 |
114 | | **Column name** | **Purpose** |
115 | | --------------- | ------------------------------------------------------------------- |
116 | | Icebox | Back burner tickets to keep in the fray. |
117 | | Backlog | Tickets to be worked on next. |
118 | | Working | Tickets actively being contributed to. |
119 | | Needs Review | Tickets where a PR has been requested to merge. |
120 | | Announcement | Tickets that have been merged and an announcement needs to be made. |
121 | | Done | All completed tickets. |
122 |
123 | ## Local management of ioos_code_lab
124 |
125 | This section walks through one way to manage the notebooks_demo git repository on your local machine.
126 |
127 | Clone your fork of the notebooks_demo repository to a known location on your machine:
128 |
129 | `$ git clone https://github.com/MathewBiddle/ioos_code_lab.git`
130 |
131 | Set the upstream branch to the ioos/ioos_code_lab repository:
132 |
133 | `$ git remote add upstream https://github.com/ioos/ioos_code_lab.git`
134 |
135 | Keep your local main up-to-date with the upstream main ([walkthough](https://stefanbauer.me/articles/how-to-keep-your-git-fork-up-to-date)):
136 |
137 | ```
138 | $ git fetch upstream
139 | $ git pull upstream/main main
140 | ```
141 |
142 | OR
143 |
144 | ```
145 | $ git merge upstream/main main
146 | ```
147 |
148 | Rebase (if needed):
149 |
150 | ```
151 | $ git rebase upstream/main
152 | ```
153 |
154 | Push your local repo up to your fork in GitHub.
155 |
156 | ```
157 | $ git push
158 | ```
159 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 US Integrated Ocean Observing System
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # IOOS CodeLab
2 |
3 | The [IOOS CodeLab](https://ioos.github.io/ioos_code_lab) is a collection of tutorials and examples of how to access and
4 | utilize the many IOOS technologies and data sources available. This site is geared towards scientists and environmental
5 | managers interested in “diving deep” into the numbers and creating original plots and data analysis. Most notebook
6 | examples are written in Python, however, we also have a growing number of notebooks written in Matlab, and R.
7 |
8 | See the rendered version at https://ioos.github.io/ioos_code_lab
9 |
10 | To suggest a notebook or ask questions please open an issue at: https://github.com/ioos/ioos_code_lab/issues
11 |
12 | ## Citation
13 |
14 | [](https://zenodo.org/badge/latestdoi/399546690)
15 |
16 | ______________________________________________________________________
17 |
18 | ## Build the JupyterBook locally
19 |
20 | ### Resources:
21 |
22 | - Jupyter-book command line interface: https://jupyterbook.org/basics/build.html
23 |
24 | ### Requirements:
25 |
26 | - Git: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
27 | - Jupyter\{Book}: https://jupyterbook.org/intro.html
28 | - Web Browser
29 |
30 | ### Installation
31 |
32 | Install jupyter-book:
33 |
34 | ```
35 | conda install jupyter-book
36 | ```
37 |
38 | Clone the [ioos_code_lab](https://github.com/ioos/ioos_code_lab) repository.
39 |
40 | ```
41 | git clone https://github.com/ioos/ioos_code_lab.git
42 | ```
43 |
44 | Once you have cloned the repository, you have all the required notebooks cloned onto your system
45 | (in the `/jupyterbook/content` directory).
46 |
47 | ### Build the JupyterBook
48 |
49 | Run the following command to build the JupyterBook.
50 |
51 | ```
52 | jupyter-book build jupyterbook/
53 | ```
54 |
55 | The command should be run relative to the `jupyterbook/` directory.
56 |
57 | If you are in the `jupyterbook/` directory, you can build the book using
58 |
59 | ```
60 | juyter-book build .
61 | ```
62 |
63 | ### View the built JupyterBook
64 |
65 | Your book's HTML pages are here:
66 |
67 | ```
68 | jupyterbook\_build\html\
69 | ```
70 |
71 | You can look at your book by opening this file in a browser:
72 |
73 | ```
74 | jupyterbook\_build\html\index.html
75 | ```
76 |
77 | Or, use the full link displayed in the terminal to view the website.
78 |
79 | ### Clean up the book's generated files
80 |
81 | To entirely remove the folders in the `_build/` directory:
82 |
83 | ```
84 | jupyter-book clean jupyterbook/ --all
85 | ```
86 |
--------------------------------------------------------------------------------
/jupyterbook/_config.yml:
--------------------------------------------------------------------------------
1 | # Book settings
2 | title: The U.S. Integrated Ocean Observing System (IOOS) # The title of the book. Will be placed in the left navbar.
3 | author: IOOS # The author of the book
4 | logo: images/IOOS_logo.png # A path to the book logo
5 |
6 | # Patterns to skip when building the book. Can be glob-style (e.g. "*skip.ipynb")
7 | exclude_patterns: [_build, Thumbs.db, .DS_Store, "**.ipynb_checkpoints", "**.archived.ipynb"]
8 | # Auto-exclude files not in the toc
9 | only_build_toc_files: true
10 |
11 | #######################################################################################
12 | # Execution settings
13 | execute:
14 | execute_notebooks: off # Whether to execute notebooks at build time. Must be one of ("auto", "force", "cache", "off")
15 | cache: "" # A path to the jupyter cache that will be used to store execution artifacts. Defaults to `_build/.jupyter_cache/`
16 | exclude_patterns: [] # A list of patterns to *skip* in execution (e.g. a notebook that takes a really long time)
17 | timeout: 30 # The maximum time (in seconds) each notebook cell is allowed to run.
18 | run_in_temp: false # If `True`, then a temporary directory will be created and used as the command working directory (cwd),otherwise the notebook's parent directory will be the cwd.
19 | allow_errors: false # If `False`, when a code cell raises an error the execution is stopped, otherwise all cells are always run.
20 | stderr_output: show # One of 'show', 'remove', 'remove-warn', 'warn', 'error', 'severe'
21 |
22 | #######################################################################################
23 | # Parse and render settings
24 | parse:
25 | myst_enable_extensions: # default extensions to enable in the myst parser. See https://myst-parser.readthedocs.io/en/latest/using/syntax-optional.html
26 | - amsmath
27 | - colon_fence
28 | - deflist
29 | - dollarmath
30 | - html_admonition
31 | - html_image
32 | - linkify
33 | - replacements
34 | - smartquotes
35 | - substitution
36 |
37 | myst_url_schemes: [mailto, http, https] # URI schemes that will be recognized as external URLs in Markdown links
38 | myst_dmath_double_inline: true # Allow display math ($$) within an inline context
39 |
40 | #######################################################################################
41 | # HTML-specific settings
42 | html:
43 | favicon: "images/IOOS_logo.png" # A path to a favicon image
44 | use_edit_page_button: false # Whether to add an "edit this page" button to pages. If `true`, repository information in repository: must be filled in
45 | use_repository_button: true # Whether to add a link to your repository button
46 | use_issues_button: true # Whether to add an "open an issue" button
47 | extra_navbar: IOOS # Will be displayed underneath the left navbar.
48 | extra_footer: ioos.noaa.gov  
49 | Facebook  
50 | Twitter  
51 | Contact Us
52 | U.S. Integrated Ocean Observing System Program
53 | 1315 East-West Highway
54 | SSMC3, 2nd Floor
55 | Silver Spring, MD 20910
56 | (240) 533-9444
57 | google_analytics_id: "G-546J258RCJ"
58 | home_page_in_navbar: false # Whether to include your home page in the left Navigation Bar
59 | baseurl: "https://ioos.github.io/ioos_code_lab/" # The base URL where your book will be hosted. Used for creating image previews and social links. e.g.: https://mypage.com/mybook/
60 | comments:
61 | hypothesis: false
62 | utterances: false
63 | #######################################################################################
64 | # LaTeX-specific settings
65 | latex:
66 | latex_engine: pdflatex # one of 'pdflatex', 'xelatex' (recommended for unicode), 'luatex', 'platex', 'uplatex'
67 | use_jupyterbook_latex: true # use jupyterbook-latex for pdf builds as default
68 |
69 | #######################################################################################
70 | # Launch button settings
71 | launch_buttons:
72 | notebook_interface: jupyterlab # The interface interactive links will activate ["classic", "jupyterlab"]
73 | binderhub_url: https://mybinder.org # The URL of the BinderHub (e.g., https://mybinder.org)
74 | jupyterhub_url: "" # The URL of the JupyterHub (e.g., https://datahub.berkeley.edu)
75 | thebe: false # Add a thebe button to pages (requires the repository to run on Binder)
76 | colab_url: "https://colab.research.google.com" # The URL of Google Colab (https://colab.research.google.com)
77 |
78 | repository:
79 | url: https://github.com/ioos/ioos_code_lab # The URL to your book's repository
80 | path_to_book: "jupyterbook" # A path to your book's folder, relative to the repository root.
81 | branch: main # Which branch of the repository should be used when creating links
82 |
83 | #######################################################################################
84 | # Advanced and power-user settings
85 | sphinx:
86 | config:
87 | linkcheck_ignore: [
88 | "./data_access_notebooks/.*",
89 | "./data_analysis_and_visualization_notebooks/.*",
90 | "./data_management_notebooks/.*",
91 | "./data_analysis_and_visualization_notebooks/.*",
92 | "https://www.ncei.noaa.gov/archive/accession/0282699", # slow
93 | "https://gcoos4.tamu.edu/erddap/info/fk_CREMP_yearly_revisited_DATA_v3_1996/index.html", # data is gone
94 | "https://gcoos4.tamu.edu/erddap/tabledap/fk_CREMP_yearly_revisited_DATA_v3_1996.html", # data is gone
95 | ]
96 | linkcheck_anchors_ignore: ["aboutPanel", "searchPanel", "!forum/ioos_tech"]
97 | html_show_copyright: false
98 | myst_heading_anchors: 3
99 | nb_mime_priority_overrides: [
100 | ["html", "application/vnd.jupyter.widget-view+json", 10],
101 | ["html", "application/javascript", 20],
102 | ["html", "text/html", 30],
103 | ["html", "image/svg+xml", 40],
104 | ["html", "image/png", 50],
105 | ["html", "image/gif", 60],
106 | ["html", "image/jpeg", 70],
107 | ["html", "text/markdown", 80],
108 | ["html", "text/latex", 90],
109 | ["html", "text/plain", 100]
110 | ]
111 |
--------------------------------------------------------------------------------
/jupyterbook/_toc.yml:
--------------------------------------------------------------------------------
1 | format: jb-book
2 | root: content/intro.md
3 | title: The IOOS Data Demo Center
4 | parts:
5 |
6 | - caption: Getting Started
7 | chapters:
8 | - file: content/ioos_installation_conda.md
9 | title: Installing the IOOS Conda Environment
10 |
11 | - caption: Code Gallery
12 | chapters:
13 | - file: content/code_gallery/gallery.md
14 | title: Notebooks gallery
15 | - file: content/code_gallery/data_access.md
16 | sections:
17 | - glob: content/code_gallery/data_access_notebooks/*
18 |
19 | - file: content/code_gallery/data_analysis_and_visualization.md
20 | sections:
21 | - glob: content/code_gallery/data_analysis_and_visualization_notebooks/*
22 |
23 | - file: content/code_gallery/data_management.md
24 | sections:
25 | - glob: content/code_gallery/data_management_notebooks/*
26 |
27 | - caption: Video Tutorials
28 | chapters:
29 | - glob: content/Video_Demo_Markdown/*
30 |
31 | - caption: Other Resources
32 | chapters:
33 | - url: https://help.aodn.org.au/aodn-data-tools/user-code-library/
34 | title: Opening netCDF files - hints from AODN
35 | - url: http://unidata.github.io/notebook-gallery/
36 | title: Unidata Jupyter Notebook Gallery
37 | - url: http://iobis.org/tutorial/
38 | title: Extracting and Enriching OBIS data with R
39 | - url: https://github.com/USGS-R
40 | title: USGS-R Examples
41 |
--------------------------------------------------------------------------------
/jupyterbook/content/Video_Demo_Markdown/glos.md:
--------------------------------------------------------------------------------
1 | # GLOS Links
2 |
3 | ```{image} ../../images/GLOS.png
4 | ---
5 | alt: IOOS
6 | width: 150px
7 | align: center
8 | ---
9 | ```
10 |
11 | - [How to use the GLOS data portal](https://www.youtube.com/playlist?list=PLEK-mxRrHSZ5LkSSUyYHEy4lEXnEdNJJc)
12 | - [How to use the GLOS boater’s tool](https://www.youtube.com/playlist?list=PLEK-mxRrHSZ6rH1qCpfpD6-rSljE8fbUC)
13 |
--------------------------------------------------------------------------------
/jupyterbook/content/Video_Demo_Markdown/ioos.md:
--------------------------------------------------------------------------------
1 | # IOOS
2 |
3 | ```{image} ../../images/placeholder.png
4 | ---
5 | alt: IOOS
6 | width: 150px
7 | align: center
8 | ---
9 | ```
10 |
11 | - [COMT Tutorial](https://www.youtube.com/watch?v=Dqc1C1HeemQ)
12 | - [MBON Portal Tutorial](https://www.youtube.com/watch?v=ZITqDRa6u9c)
13 |
--------------------------------------------------------------------------------
/jupyterbook/content/Video_Demo_Markdown/nanoos.md:
--------------------------------------------------------------------------------
1 | # NANOOS
2 |
3 | ```{image} ../../images/NANOOS.png
4 | ---
5 | alt: IOOS
6 | width: 150px
7 | align: center
8 | ---
9 | ```
10 |
11 | - [NANOOS Visualization System](https://www.youtube.com/watch?v=MEVz0jOsqmI)
12 | - [NANOOS Data Explorer](https://www.youtube.com/playlist?list=PLBvrtRArn5ffsBARjKsczvfxyYX1wGtFP)
13 |
--------------------------------------------------------------------------------
/jupyterbook/content/Video_Demo_Markdown/ooi.md:
--------------------------------------------------------------------------------
1 | # OOI Demonstration Videos
2 |
3 | ```{image} ../../images/OOI_Logo.png
4 | ---
5 | alt: IOOS
6 | width: 150px
7 | align: center
8 | ---
9 | ```
10 |
11 | - [Demo of OOI ERDDAP endpoint](https://www.youtube.com/watch?v=tj4M9hodTG0)
12 |
--------------------------------------------------------------------------------
/jupyterbook/content/Video_Demo_Markdown/python_dem.md:
--------------------------------------------------------------------------------
1 | # Python Demonstration Videos
2 |
3 | ```{image} ../../images/python.png
4 | ---
5 | alt: IOOS
6 | width: 150px
7 | align: center
8 | ---
9 | ```
10 |
11 | - [Catalog Driven Reproducible Workflows for Ocean-science](https://www.youtube.com/watch?v=05ax0lkQFrg)
12 | - [Extracting data from NOAA ERDDAP](https://www.youtube.com/watch?v=18xZoXu1USM)
13 |
--------------------------------------------------------------------------------
/jupyterbook/content/add_colab_install_missing_deps.py:
--------------------------------------------------------------------------------
1 | from pathlib import Path
2 |
3 | from depfinder import notebook_path_to_dependencies
4 |
5 | notebook_path = Path(".")
6 | notebooks = list(notebook_path.glob("**/*.ipynb"))
7 |
8 | ## Get modules that are absent on GoogleColab
9 | # required = []
10 |
11 | # for notebook in notebooks:
12 | # try:
13 | # ret = notebook_path_to_dependencies(notebook)
14 | # except Exception as err:
15 | # print(f"Could not parse {notebook=}. {err}")
16 | # required.extend(ret["required"])
17 |
18 | # modules = sorted(set(required))
19 |
20 | ## go to colab with this list and run to obtain the absent list
21 |
22 | # """
23 | # import importlib
24 | # for module in modules:
25 | # if importlib.util.find_spec(module) is None:
26 | # print(module)
27 | # """
28 |
29 | ## update notebooks
30 | import nbformat
31 |
32 | absent = [
33 | "bagit",
34 | "cartopy",
35 | "cf-units",
36 | "cf_xarray",
37 | "compliance-checker",
38 | "erddapy",
39 | "geoplot",
40 | "gridgeo",
41 | "ioos-tools",
42 | "ioos_qc",
43 | "ipyleaflet",
44 | "iris",
45 | "netcdf4",
46 | "oceans",
47 | "odvc",
48 | "owslib",
49 | "palettable",
50 | "pocean-core",
51 | "pyobis",
52 | "pyoos",
53 | "pysgrid",
54 | "pyugrid",
55 | "pyworms",
56 | "retrying",
57 | "seawater",
58 | "zarr",
59 | ]
60 |
61 |
62 | code = """\
63 | import subprocess
64 | import sys
65 | COLAB = "google.colab" in sys.modules
66 |
67 | def _install(package):
68 | if COLAB:
69 | ans = input(f"Install {{ package }}? [y/n]:")
70 | if ans.lower() in ["y", "yes"]:
71 | subprocess.check_call([sys.executable, "-m", "pip", "install", "--quiet", package])
72 | print(f"{{ package }} installed!")
73 |
74 | def _colab_install_missing_deps(deps):
75 | import importlib
76 | for dep in deps:
77 | if importlib.util.find_spec(dep) is None:
78 | if dep == "iris":
79 | dep = "scitools-iris"
80 | _install(dep)
81 |
82 | deps = {}
83 | _colab_install_missing_deps(deps)"""
84 |
85 |
86 | def update_notebook(notebook, code):
87 | nb = nbformat.read(notebook, as_version=4)
88 |
89 | new_cell = nbformat.v4.new_code_cell(code)
90 | new_cell.pop("id") # cannot save mod nb with this
91 | new_cell["metadata"] = {"tags": ["remove-cell"]} # won't render on jupyterbook
92 | # nb.cells.insert(0, new_cell)
93 | nb.cells[0] = new_cell
94 | nbformat.write(nb, notebook, version=4)
95 |
96 |
97 | for notebook in notebooks:
98 | if "archived" not in str(notebook):
99 | try:
100 | required = notebook_path_to_dependencies(notebook)["required"]
101 | missing_from_colab = [module for module in absent if module in required]
102 | update_notebook(notebook, code.format(missing_from_colab))
103 | except Exception as err:
104 | print(f"Could not parse {notebook=}. {err}")
105 | continue
106 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data/MadeUpDataForBiologicalDataTraining.csv:
--------------------------------------------------------------------------------
1 | date,lat,lon,region,station,transect,scientific name,percent cover,depth,bottom type,rugosity,temperature
2 | 7/16/2004,18.29788,-64.79451,St. John,250,1,Acropora cervicornis,0,25,shallow reef flat,0.295833,25.2
3 | 7/16/2004,18.29788,-64.79451,St. John,250,1,Madracis auretenra,5,25,shallow reef flat,0.295833,25.2
4 | 7/16/2004,18.29788,-64.79451,St. John,250,1,Mussa angulosa,15,25,shallow reef flat,0.295833,25.2
5 | 7/16/2004,18.29788,-64.79451,St. John,250,1,Siderastrea radians,0,25,shallow reef flat,0.295833,25.2
6 | 7/16/2004,18.29788,-64.79451,St. John,250,2,Acropora cervicornis,0,35,complex back reef,0.364583,24.8
7 | 7/16/2004,18.29788,-64.79451,St. John,250,2,Madracis auretenra,3,35,complex back reef,0.364583,24.8
8 | 7/16/2004,18.29788,-64.79451,St. John,250,2,Mussa angulosa,0,35,complex back reef,0.364583,24.8
9 | 7/16/2004,18.29788,-64.79451,St. John,250,2,Siderastrea radians,0,35,complex back reef,0.364583,24.8
10 | 7/16/2004,18.29788,-64.79451,St. John,250,3,Acropora cervicornis,22,85,deep reef,0.413461,23.1
11 | 7/16/2004,18.29788,-64.79451,St. John,250,3,Madracis auretenra,0,85,deep reef,0.413461,23.1
12 | 7/16/2004,18.29788,-64.79451,St. John,250,3,Mussa angulosa,16,85,deep reef,0.413461,23.1
13 | 7/16/2004,18.29788,-64.79451,St. John,250,3,Siderastrea radians,0,85,deep reef,0.413461,23.1
14 | 7/17/2004,18.27609,-64.7574,St. John,356,1,Acropora cervicornis,10,28,complex back reef,0.312587,23.6
15 | 7/17/2004,18.27609,-64.7574,St. John,356,1,Madracis auretenra,2,28,complex back reef,0.312587,23.6
16 | 7/17/2004,18.27609,-64.7574,St. John,356,1,Mussa angulosa,14,28,complex back reef,0.312587,23.6
17 | 7/17/2004,18.27609,-64.7574,St. John,356,1,Siderastrea radians,4,28,complex back reef,0.312587,23.6
18 | 7/17/2004,18.27609,-64.7574,St. John,356,2,Acropora cervicornis,25,16,shallow reef flat,0.158489,24.9
19 | 7/17/2004,18.27609,-64.7574,St. John,356,2,Madracis auretenra,10,16,shallow reef flat,0.158489,24.9
20 | 7/17/2004,18.27609,-64.7574,St. John,356,2,Mussa angulosa,0,16,shallow reef flat,0.158489,24.9
21 | 7/17/2004,18.27609,-64.7574,St. John,356,2,Siderastrea radians,16,16,shallow reef flat,0.158489,24.9
22 | 7/17/2004,18.27609,-64.7574,St. John,356,3,Acropora cervicornis,28,90,deep reef,0.489574,22.6
23 | 7/17/2004,18.27609,-64.7574,St. John,356,3,Madracis auretenra,0,90,deep reef,0.489574,22.6
24 | 7/17/2004,18.27609,-64.7574,St. John,356,3,Mussa angulosa,0,90,deep reef,0.489574,22.6
25 | 7/17/2004,18.27609,-64.7574,St. John,356,3,Siderastrea radians,13,90,deep reef,0.489574,22.6
26 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data/oceans.dbf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/code_gallery/data/oceans.dbf
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data/oceans.prj:
--------------------------------------------------------------------------------
1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
2 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data/oceans.qpj:
--------------------------------------------------------------------------------
1 | GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
2 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data/oceans.shp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/code_gallery/data/oceans.shp
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data/oceans.shx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/code_gallery/data/oceans.shx
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data/timeseriesProfile.csv:
--------------------------------------------------------------------------------
1 | time,lon,lat,depth,station,humidity,temperature
2 | 1990-01-01 00:00:00.000000,-76.5,37.5,0.0,Station1,89.70879364013672,15.69800853729248
3 | 1990-01-01 00:00:00.000000,-76.5,37.5,10.0,Station1,55.78947067260742,10.916656494140625
4 | 1990-01-01 00:00:00.000000,-76.5,37.5,20.0,Station1,50.17699432373047,15.66666316986084
5 | 1990-01-01 00:00:00.000000,-76.5,37.5,30.0,Station1,36.855045318603516,1.1587523221969604
6 | 1990-01-01 01:00:00.000000,-76.5,37.5,0.0,Station1,65.01693725585938,31.059646606445312
7 | 1990-01-01 01:00:00.000000,-76.5,37.5,10.0,Station1,35.675472259521484,5.680935859680176
8 | 1990-01-01 01:00:00.000000,-76.5,37.5,20.0,Station1,45.778560638427734,24.15635871887207
9 | 1990-01-01 01:00:00.000000,-76.5,37.5,30.0,Station1,35.1789665222168,25.93482208251953
10 | 1990-01-01 02:00:00.000006,-76.5,37.5,0.0,Station1,12.735875129699707,6.5184807777404785
11 | 1990-01-01 02:00:00.000006,-76.5,37.5,10.0,Station1,47.44697189331055,4.463566780090332
12 | 1990-01-01 02:00:00.000006,-76.5,37.5,20.0,Station1,20.43827247619629,29.448772430419922
13 | 1990-01-01 02:00:00.000006,-76.5,37.5,30.0,Station1,62.655357360839844,37.245635986328125
14 | 1990-01-01 03:00:00.000000,-76.5,37.5,0.0,Station1,31.870540618896484,21.589387893676758
15 | 1990-01-01 03:00:00.000000,-76.5,37.5,10.0,Station1,40.51297378540039,16.20927619934082
16 | 1990-01-01 03:00:00.000000,-76.5,37.5,20.0,Station1,87.46753692626953,25.401491165161133
17 | 1990-01-01 03:00:00.000000,-76.5,37.5,30.0,Station1,87.0776138305664,9.494962692260742
18 | 1990-01-01 04:00:00.000000,-76.5,37.5,0.0,Station1,60.95039367675781,30.331205368041992
19 | 1990-01-01 04:00:00.000000,-76.5,37.5,10.0,Station1,66.04959869384766,6.535857677459717
20 | 1990-01-01 04:00:00.000000,-76.5,37.5,20.0,Station1,56.76333236694336,18.2629451751709
21 | 1990-01-01 04:00:00.000000,-76.5,37.5,30.0,Station1,85.9020767211914,32.321495056152344
22 | 1990-01-01 05:00:00.000006,-76.5,37.5,0.0,Station1,20.77692985534668,32.699520111083984
23 | 1990-01-01 05:00:00.000006,-76.5,37.5,10.0,Station1,58.25774002075195,22.85316276550293
24 | 1990-01-01 05:00:00.000006,-76.5,37.5,20.0,Station1,48.681182861328125,39.47747039794922
25 | 1990-01-01 05:00:00.000006,-76.5,37.5,30.0,Station1,57.827754974365234,20.420137405395508
26 | 1990-01-01 06:00:00.000000,-76.5,37.5,0.0,Station1,55.229923248291016,21.663246154785156
27 | 1990-01-01 06:00:00.000000,-76.5,37.5,10.0,Station1,76.5572738647461,24.548137664794922
28 | 1990-01-01 06:00:00.000000,-76.5,37.5,20.0,Station1,58.55882263183594,12.357427597045898
29 | 1990-01-01 06:00:00.000000,-76.5,37.5,30.0,Station1,0.030826183035969734,9.94374942779541
30 | 1990-01-01 07:00:00.000000,-76.5,37.5,0.0,Station1,9.157548904418945,33.74034881591797
31 | 1990-01-01 07:00:00.000000,-76.5,37.5,10.0,Station1,46.424415588378906,33.00287628173828
32 | 1990-01-01 07:00:00.000000,-76.5,37.5,20.0,Station1,4.259896278381348,37.812137603759766
33 | 1990-01-01 07:00:00.000000,-76.5,37.5,30.0,Station1,78.60118103027344,36.06230163574219
34 | 1990-01-01 08:00:00.000006,-76.5,37.5,0.0,Station1,34.15111541748047,36.96831130981445
35 | 1990-01-01 08:00:00.000006,-76.5,37.5,10.0,Station1,32.45549011230469,28.41242790222168
36 | 1990-01-01 08:00:00.000006,-76.5,37.5,20.0,Station1,70.03600311279297,33.78640365600586
37 | 1990-01-01 08:00:00.000006,-76.5,37.5,30.0,Station1,13.741626739501953,28.34588050842285
38 | 1990-01-01 09:00:00.000000,-76.5,37.5,0.0,Station1,71.5324478149414,0.3765190541744232
39 | 1990-01-01 09:00:00.000000,-76.5,37.5,10.0,Station1,87.585205078125,38.20624923706055
40 | 1990-01-01 09:00:00.000000,-76.5,37.5,20.0,Station1,12.301053047180176,20.026947021484375
41 | 1990-01-01 09:00:00.000000,-76.5,37.5,30.0,Station1,71.2917709350586,1.4904128313064575
42 | 1990-01-01 10:00:00.000000,-76.5,37.5,0.0,Station1,10.443470001220703,9.74139404296875
43 | 1990-01-01 10:00:00.000000,-76.5,37.5,10.0,Station1,78.7679443359375,1.5879696607589722
44 | 1990-01-01 10:00:00.000000,-76.5,37.5,20.0,Station1,38.50002670288086,6.954488754272461
45 | 1990-01-01 10:00:00.000000,-76.5,37.5,30.0,Station1,87.55496978759766,39.6223258972168
46 | 1990-01-01 11:00:00.000006,-76.5,37.5,0.0,Station1,17.944841384887695,15.892428398132324
47 | 1990-01-01 11:00:00.000006,-76.5,37.5,10.0,Station1,88.8167495727539,20.466577529907227
48 | 1990-01-01 11:00:00.000006,-76.5,37.5,20.0,Station1,23.375642776489258,22.08020782470703
49 | 1990-01-01 11:00:00.000006,-76.5,37.5,30.0,Station1,16.224117279052734,33.3504753112793
50 | 1990-01-01 12:00:00.000000,-76.5,37.5,0.0,Station1,61.33014678955078,26.965787887573242
51 | 1990-01-01 12:00:00.000000,-76.5,37.5,10.0,Station1,55.603302001953125,0.9059339761734009
52 | 1990-01-01 12:00:00.000000,-76.5,37.5,20.0,Station1,83.93063354492188,10.206809043884277
53 | 1990-01-01 12:00:00.000000,-76.5,37.5,30.0,Station1,58.86057662963867,35.99491882324219
54 | 1990-01-01 13:00:00.000000,-76.5,37.5,0.0,Station1,86.61509704589844,4.628381252288818
55 | 1990-01-01 13:00:00.000000,-76.5,37.5,10.0,Station1,6.359508037567139,23.904449462890625
56 | 1990-01-01 13:00:00.000000,-76.5,37.5,20.0,Station1,33.750972747802734,31.081478118896484
57 | 1990-01-01 13:00:00.000000,-76.5,37.5,30.0,Station1,16.881776809692383,14.744327545166016
58 | 1990-01-01 14:00:00.000006,-76.5,37.5,0.0,Station1,56.84141540527344,28.564979553222656
59 | 1990-01-01 14:00:00.000006,-76.5,37.5,10.0,Station1,45.05248260498047,9.426464080810547
60 | 1990-01-01 14:00:00.000006,-76.5,37.5,20.0,Station1,73.55476379394531,18.658159255981445
61 | 1990-01-01 14:00:00.000006,-76.5,37.5,30.0,Station1,72.0267562866211,15.870184898376465
62 | 1990-01-01 15:00:00.000000,-76.5,37.5,0.0,Station1,69.44387817382812,31.290285110473633
63 | 1990-01-01 15:00:00.000000,-76.5,37.5,10.0,Station1,84.87596130371094,12.460060119628906
64 | 1990-01-01 15:00:00.000000,-76.5,37.5,20.0,Station1,3.8930792808532715,18.050933837890625
65 | 1990-01-01 15:00:00.000000,-76.5,37.5,30.0,Station1,73.57340240478516,38.410186767578125
66 | 1990-01-01 16:00:00.000000,-76.5,37.5,0.0,Station1,8.709932327270508,3.711121082305908
67 | 1990-01-01 16:00:00.000000,-76.5,37.5,10.0,Station1,10.752155303955078,21.278461456298828
68 | 1990-01-01 16:00:00.000000,-76.5,37.5,20.0,Station1,74.61957550048828,39.68755340576172
69 | 1990-01-01 16:00:00.000000,-76.5,37.5,30.0,Station1,79.33663177490234,11.342918395996094
70 | 1990-01-01 17:00:00.000006,-76.5,37.5,0.0,Station1,52.32307815551758,6.304975986480713
71 | 1990-01-01 17:00:00.000006,-76.5,37.5,10.0,Station1,44.12664794921875,26.361574172973633
72 | 1990-01-01 17:00:00.000006,-76.5,37.5,20.0,Station1,1.242331624031067,4.4290771484375
73 | 1990-01-01 17:00:00.000006,-76.5,37.5,30.0,Station1,80.95404052734375,26.035905838012695
74 | 1990-01-01 18:00:00.000000,-76.5,37.5,0.0,Station1,72.34293365478516,37.689598083496094
75 | 1990-01-01 18:00:00.000000,-76.5,37.5,10.0,Station1,81.81098937988281,27.171142578125
76 | 1990-01-01 18:00:00.000000,-76.5,37.5,20.0,Station1,45.04630661010742,21.6298770904541
77 | 1990-01-01 18:00:00.000000,-76.5,37.5,30.0,Station1,47.72421646118164,39.28799819946289
78 | 1990-01-01 19:00:00.000000,-76.5,37.5,0.0,Station1,4.983932971954346,7.020292282104492
79 | 1990-01-01 19:00:00.000000,-76.5,37.5,10.0,Station1,60.05952835083008,16.7475643157959
80 | 1990-01-01 19:00:00.000000,-76.5,37.5,20.0,Station1,83.54536437988281,17.806732177734375
81 | 1990-01-01 19:00:00.000000,-76.5,37.5,30.0,Station1,28.2926082611084,11.851286888122559
82 | 1990-01-01 20:00:00.000006,-76.5,37.5,0.0,Station1,6.139503479003906,32.92012023925781
83 | 1990-01-01 20:00:00.000006,-76.5,37.5,10.0,Station1,5.20644474029541,26.943864822387695
84 | 1990-01-01 20:00:00.000006,-76.5,37.5,20.0,Station1,4.535412788391113,25.89925193786621
85 | 1990-01-01 20:00:00.000006,-76.5,37.5,30.0,Station1,67.6456069946289,24.459779739379883
86 | 1990-01-01 21:00:00.000000,-76.5,37.5,0.0,Station1,24.090330123901367,17.94216537475586
87 | 1990-01-01 21:00:00.000000,-76.5,37.5,10.0,Station1,38.48518753051758,34.233158111572266
88 | 1990-01-01 21:00:00.000000,-76.5,37.5,20.0,Station1,74.69316864013672,1.170540452003479
89 | 1990-01-01 21:00:00.000000,-76.5,37.5,30.0,Station1,5.199595928192139,38.53916549682617
90 | 1990-01-01 22:00:00.000000,-76.5,37.5,0.0,Station1,73.77649688720703,1.5914623737335205
91 | 1990-01-01 22:00:00.000000,-76.5,37.5,10.0,Station1,43.086219787597656,31.90138816833496
92 | 1990-01-01 22:00:00.000000,-76.5,37.5,20.0,Station1,65.33563232421875,37.021820068359375
93 | 1990-01-01 22:00:00.000000,-76.5,37.5,30.0,Station1,12.440673828125,37.77959442138672
94 | 1990-01-01 23:00:00.000006,-76.5,37.5,0.0,Station1,60.21253967285156,4.220705509185791
95 | 1990-01-01 23:00:00.000006,-76.5,37.5,10.0,Station1,57.55864334106445,14.966207504272461
96 | 1990-01-01 23:00:00.000006,-76.5,37.5,20.0,Station1,51.18347930908203,24.397981643676758
97 | 1990-01-01 23:00:00.000006,-76.5,37.5,30.0,Station1,28.776180267333984,19.21656608581543
98 | 1990-01-02 00:00:00.000000,-76.5,37.5,0.0,Station1,40.51713180541992,27.02121925354004
99 | 1990-01-02 00:00:00.000000,-76.5,37.5,10.0,Station1,36.76139450073242,35.12483215332031
100 | 1990-01-02 00:00:00.000000,-76.5,37.5,20.0,Station1,10.003087043762207,6.932958602905273
101 | 1990-01-02 00:00:00.000000,-76.5,37.5,30.0,Station1,2.2682559490203857,20.459232330322266
102 | 1990-01-02 01:00:00.000000,-76.5,37.5,0.0,Station1,81.67524719238281,20.990859985351562
103 | 1990-01-02 01:00:00.000000,-76.5,37.5,10.0,Station1,80.40714263916016,0.5158512592315674
104 | 1990-01-02 01:00:00.000000,-76.5,37.5,20.0,Station1,12.625582695007324,7.1634087562561035
105 | 1990-01-02 01:00:00.000000,-76.5,37.5,30.0,Station1,73.13004302978516,18.46034049987793
106 | 1990-01-02 02:00:00.000006,-76.5,37.5,0.0,Station1,7.612334251403809,24.752727508544922
107 | 1990-01-02 02:00:00.000006,-76.5,37.5,10.0,Station1,23.400304794311523,6.806114196777344
108 | 1990-01-02 02:00:00.000006,-76.5,37.5,20.0,Station1,16.317317962646484,32.503326416015625
109 | 1990-01-02 02:00:00.000006,-76.5,37.5,30.0,Station1,27.829816818237305,6.476375102996826
110 | 1990-01-02 03:00:00.000000,-76.5,37.5,0.0,Station1,50.874732971191406,7.591794490814209
111 | 1990-01-02 03:00:00.000000,-76.5,37.5,10.0,Station1,83.42921447753906,21.40337371826172
112 | 1990-01-02 03:00:00.000000,-76.5,37.5,20.0,Station1,36.9656867980957,2.224815845489502
113 | 1990-01-02 03:00:00.000000,-76.5,37.5,30.0,Station1,77.54393005371094,25.454652786254883
114 | 1990-01-02 04:00:00.000000,-76.5,37.5,0.0,Station1,86.28702545166016,4.592724800109863
115 | 1990-01-02 04:00:00.000000,-76.5,37.5,10.0,Station1,64.04046630859375,19.701797485351562
116 | 1990-01-02 04:00:00.000000,-76.5,37.5,20.0,Station1,38.363582611083984,13.281681060791016
117 | 1990-01-02 04:00:00.000000,-76.5,37.5,30.0,Station1,5.8506975173950195,24.928720474243164
118 | 1990-01-02 05:00:00.000006,-76.5,37.5,0.0,Station1,80.88764190673828,36.02975082397461
119 | 1990-01-02 05:00:00.000006,-76.5,37.5,10.0,Station1,23.8375244140625,11.39212417602539
120 | 1990-01-02 05:00:00.000006,-76.5,37.5,20.0,Station1,7.446950435638428,22.20489501953125
121 | 1990-01-02 05:00:00.000006,-76.5,37.5,30.0,Station1,41.51862335205078,10.833194732666016
122 | 1990-01-02 06:00:00.000000,-76.5,37.5,0.0,Station1,74.1723403930664,15.39169692993164
123 | 1990-01-02 06:00:00.000000,-76.5,37.5,10.0,Station1,86.60445404052734,8.468427658081055
124 | 1990-01-02 06:00:00.000000,-76.5,37.5,20.0,Station1,12.338188171386719,32.57441329956055
125 | 1990-01-02 06:00:00.000000,-76.5,37.5,30.0,Station1,32.169891357421875,32.53012466430664
126 | 1990-01-02 07:00:00.000000,-76.5,37.5,0.0,Station1,76.16019439697266,10.667793273925781
127 | 1990-01-02 07:00:00.000000,-76.5,37.5,10.0,Station1,52.79842758178711,19.895559310913086
128 | 1990-01-02 07:00:00.000000,-76.5,37.5,20.0,Station1,5.125189304351807,37.45695114135742
129 | 1990-01-02 07:00:00.000000,-76.5,37.5,30.0,Station1,50.84577560424805,7.672726154327393
130 | 1990-01-02 08:00:00.000006,-76.5,37.5,0.0,Station1,42.261600494384766,37.21765899658203
131 | 1990-01-02 08:00:00.000006,-76.5,37.5,10.0,Station1,13.69758129119873,25.334617614746094
132 | 1990-01-02 08:00:00.000006,-76.5,37.5,20.0,Station1,67.2152328491211,3.1397249698638916
133 | 1990-01-02 08:00:00.000006,-76.5,37.5,30.0,Station1,71.67402648925781,28.948713302612305
134 | 1990-01-02 09:00:00.000000,-76.5,37.5,0.0,Station1,8.548830032348633,19.01214027404785
135 | 1990-01-02 09:00:00.000000,-76.5,37.5,10.0,Station1,21.94034767150879,31.2451114654541
136 | 1990-01-02 09:00:00.000000,-76.5,37.5,20.0,Station1,76.81204986572266,2.1312997341156006
137 | 1990-01-02 09:00:00.000000,-76.5,37.5,30.0,Station1,47.20128631591797,24.354106903076172
138 | 1990-01-02 10:00:00.000000,-76.5,37.5,0.0,Station1,83.76484680175781,39.65496063232422
139 | 1990-01-02 10:00:00.000000,-76.5,37.5,10.0,Station1,54.03838348388672,17.69043731689453
140 | 1990-01-02 10:00:00.000000,-76.5,37.5,20.0,Station1,55.613807678222656,18.97081756591797
141 | 1990-01-02 10:00:00.000000,-76.5,37.5,30.0,Station1,75.94775390625,28.698625564575195
142 | 1990-01-02 11:00:00.000006,-76.5,37.5,0.0,Station1,35.6710090637207,34.3065185546875
143 | 1990-01-02 11:00:00.000006,-76.5,37.5,10.0,Station1,36.19874572753906,39.37076187133789
144 | 1990-01-02 11:00:00.000006,-76.5,37.5,20.0,Station1,76.57172393798828,3.169917106628418
145 | 1990-01-02 11:00:00.000006,-76.5,37.5,30.0,Station1,38.460086822509766,23.364601135253906
146 | 1990-01-02 12:00:00.000000,-76.5,37.5,0.0,Station1,86.00223541259766,6.968810081481934
147 | 1990-01-02 12:00:00.000000,-76.5,37.5,10.0,Station1,44.063385009765625,33.06557083129883
148 | 1990-01-02 12:00:00.000000,-76.5,37.5,20.0,Station1,4.363564968109131,22.13653564453125
149 | 1990-01-02 12:00:00.000000,-76.5,37.5,30.0,Station1,85.17671966552734,19.3804931640625
150 | 1990-01-02 13:00:00.000000,-76.5,37.5,0.0,Station1,16.926557540893555,39.17808532714844
151 | 1990-01-02 13:00:00.000000,-76.5,37.5,10.0,Station1,44.94965744018555,22.554494857788086
152 | 1990-01-02 13:00:00.000000,-76.5,37.5,20.0,Station1,36.69158935546875,37.53092956542969
153 | 1990-01-02 13:00:00.000000,-76.5,37.5,30.0,Station1,51.025657653808594,13.513101577758789
154 | 1990-01-02 14:00:00.000006,-76.5,37.5,0.0,Station1,51.173465728759766,29.42548179626465
155 | 1990-01-02 14:00:00.000006,-76.5,37.5,10.0,Station1,1.3379215002059937,13.984280586242676
156 | 1990-01-02 14:00:00.000006,-76.5,37.5,20.0,Station1,6.321475028991699,36.2620849609375
157 | 1990-01-02 14:00:00.000006,-76.5,37.5,30.0,Station1,10.407035827636719,26.313112258911133
158 | 1990-01-02 15:00:00.000000,-76.5,37.5,0.0,Station1,34.066246032714844,27.728614807128906
159 | 1990-01-02 15:00:00.000000,-76.5,37.5,10.0,Station1,78.22833251953125,9.286563873291016
160 | 1990-01-02 15:00:00.000000,-76.5,37.5,20.0,Station1,0.21551449596881866,29.65281867980957
161 | 1990-01-02 15:00:00.000000,-76.5,37.5,30.0,Station1,29.361183166503906,34.03219223022461
162 | 1990-01-02 16:00:00.000000,-76.5,37.5,0.0,Station1,64.00840759277344,3.168347120285034
163 | 1990-01-02 16:00:00.000000,-76.5,37.5,10.0,Station1,48.7413444519043,22.751867294311523
164 | 1990-01-02 16:00:00.000000,-76.5,37.5,20.0,Station1,1.62065589427948,38.4250373840332
165 | 1990-01-02 16:00:00.000000,-76.5,37.5,30.0,Station1,19.14164161682129,1.5116603374481201
166 | 1990-01-02 17:00:00.000006,-76.5,37.5,0.0,Station1,84.97294616699219,34.81577682495117
167 | 1990-01-02 17:00:00.000006,-76.5,37.5,10.0,Station1,49.535587310791016,24.143306732177734
168 | 1990-01-02 17:00:00.000006,-76.5,37.5,20.0,Station1,34.6706657409668,21.198978424072266
169 | 1990-01-02 17:00:00.000006,-76.5,37.5,30.0,Station1,71.68486022949219,11.173385620117188
170 | 1990-01-02 18:00:00.000000,-76.5,37.5,0.0,Station1,30.93720245361328,6.331390857696533
171 | 1990-01-02 18:00:00.000000,-76.5,37.5,10.0,Station1,3.3849329948425293,26.555904388427734
172 | 1990-01-02 18:00:00.000000,-76.5,37.5,20.0,Station1,61.20073318481445,24.597232818603516
173 | 1990-01-02 18:00:00.000000,-76.5,37.5,30.0,Station1,86.81777954101562,18.53740882873535
174 | 1990-01-02 19:00:00.000000,-76.5,37.5,0.0,Station1,18.74846649169922,27.219905853271484
175 | 1990-01-02 19:00:00.000000,-76.5,37.5,10.0,Station1,12.37814998626709,24.227365493774414
176 | 1990-01-02 19:00:00.000000,-76.5,37.5,20.0,Station1,43.50602340698242,20.55813217163086
177 | 1990-01-02 19:00:00.000000,-76.5,37.5,30.0,Station1,65.34722900390625,27.357952117919922
178 | 1990-01-02 20:00:00.000006,-76.5,37.5,0.0,Station1,22.769447326660156,24.88327407836914
179 | 1990-01-02 20:00:00.000006,-76.5,37.5,10.0,Station1,61.53993225097656,33.56339645385742
180 | 1990-01-02 20:00:00.000006,-76.5,37.5,20.0,Station1,68.82820129394531,17.869251251220703
181 | 1990-01-02 20:00:00.000006,-76.5,37.5,30.0,Station1,10.915489196777344,10.636013984680176
182 | 1990-01-02 21:00:00.000000,-76.5,37.5,0.0,Station1,54.06333923339844,2.9338128566741943
183 | 1990-01-02 21:00:00.000000,-76.5,37.5,10.0,Station1,18.11390495300293,11.869336128234863
184 | 1990-01-02 21:00:00.000000,-76.5,37.5,20.0,Station1,30.184553146362305,5.263406276702881
185 | 1990-01-02 21:00:00.000000,-76.5,37.5,30.0,Station1,24.31853485107422,13.155133247375488
186 | 1990-01-02 22:00:00.000000,-76.5,37.5,0.0,Station1,29.819625854492188,10.527386665344238
187 | 1990-01-02 22:00:00.000000,-76.5,37.5,10.0,Station1,58.500457763671875,31.863100051879883
188 | 1990-01-02 22:00:00.000000,-76.5,37.5,20.0,Station1,64.59872436523438,39.15486526489258
189 | 1990-01-02 22:00:00.000000,-76.5,37.5,30.0,Station1,50.04403305053711,11.372797966003418
190 | 1990-01-02 23:00:00.000006,-76.5,37.5,0.0,Station1,55.23202896118164,39.509342193603516
191 | 1990-01-02 23:00:00.000006,-76.5,37.5,10.0,Station1,52.70785140991211,28.972158432006836
192 | 1990-01-02 23:00:00.000006,-76.5,37.5,20.0,Station1,68.48223114013672,28.319032669067383
193 | 1990-01-02 23:00:00.000006,-76.5,37.5,30.0,Station1,55.37544250488281,15.420138359069824
194 | 1990-01-03 00:00:00.000000,-76.5,37.5,0.0,Station1,62.42797088623047,2.277358055114746
195 | 1990-01-03 00:00:00.000000,-76.5,37.5,10.0,Station1,10.066322326660156,11.476813316345215
196 | 1990-01-03 00:00:00.000000,-76.5,37.5,20.0,Station1,56.49500274658203,5.96110200881958
197 | 1990-01-03 00:00:00.000000,-76.5,37.5,30.0,Station1,50.8731575012207,20.379745483398438
198 | 1990-01-03 01:00:00.000000,-76.5,37.5,0.0,Station1,69.02513122558594,28.029573440551758
199 | 1990-01-03 01:00:00.000000,-76.5,37.5,10.0,Station1,18.68592643737793,36.450557708740234
200 | 1990-01-03 01:00:00.000000,-76.5,37.5,20.0,Station1,74.67061614990234,23.228147506713867
201 | 1990-01-03 01:00:00.000000,-76.5,37.5,30.0,Station1,76.11897277832031,14.572341918945312
202 | 1990-01-03 02:00:00.000006,-76.5,37.5,0.0,Station1,69.52944946289062,10.339998245239258
203 | 1990-01-03 02:00:00.000006,-76.5,37.5,10.0,Station1,58.96660232543945,26.005802154541016
204 | 1990-01-03 02:00:00.000006,-76.5,37.5,20.0,Station1,22.033599853515625,30.896900177001953
205 | 1990-01-03 02:00:00.000006,-76.5,37.5,30.0,Station1,43.24375534057617,20.783552169799805
206 | 1990-01-03 03:00:00.000000,-76.5,37.5,0.0,Station1,42.653099060058594,1.5701974630355835
207 | 1990-01-03 03:00:00.000000,-76.5,37.5,10.0,Station1,37.379642486572266,11.480932235717773
208 | 1990-01-03 03:00:00.000000,-76.5,37.5,20.0,Station1,46.68122482299805,18.39967155456543
209 | 1990-01-03 03:00:00.000000,-76.5,37.5,30.0,Station1,19.98722267150879,28.445972442626953
210 | 1990-01-03 04:00:00.000000,-76.5,37.5,0.0,Station1,68.3586654663086,12.409177780151367
211 | 1990-01-03 04:00:00.000000,-76.5,37.5,10.0,Station1,33.512046813964844,10.549820899963379
212 | 1990-01-03 04:00:00.000000,-76.5,37.5,20.0,Station1,16.788389205932617,28.261829376220703
213 | 1990-01-03 04:00:00.000000,-76.5,37.5,30.0,Station1,26.30849838256836,33.983360290527344
214 | 1990-01-03 05:00:00.000006,-76.5,37.5,0.0,Station1,32.755088806152344,5.1663689613342285
215 | 1990-01-03 05:00:00.000006,-76.5,37.5,10.0,Station1,54.20351791381836,23.01740074157715
216 | 1990-01-03 05:00:00.000006,-76.5,37.5,20.0,Station1,61.37562942504883,17.757869720458984
217 | 1990-01-03 05:00:00.000006,-76.5,37.5,30.0,Station1,10.540030479431152,38.244354248046875
218 | 1990-01-03 06:00:00.000000,-76.5,37.5,0.0,Station1,1.8311954736709595,34.596622467041016
219 | 1990-01-03 06:00:00.000000,-76.5,37.5,10.0,Station1,39.22618865966797,0.9908480048179626
220 | 1990-01-03 06:00:00.000000,-76.5,37.5,20.0,Station1,27.910490036010742,30.969955444335938
221 | 1990-01-03 06:00:00.000000,-76.5,37.5,30.0,Station1,38.904815673828125,37.54373550415039
222 | 1990-01-03 07:00:00.000000,-76.5,37.5,0.0,Station1,0.03322264179587364,23.419458389282227
223 | 1990-01-03 07:00:00.000000,-76.5,37.5,10.0,Station1,28.4570369720459,10.5293607711792
224 | 1990-01-03 07:00:00.000000,-76.5,37.5,20.0,Station1,27.064653396606445,1.3585402965545654
225 | 1990-01-03 07:00:00.000000,-76.5,37.5,30.0,Station1,46.06852340698242,11.71170425415039
226 | 1990-01-03 08:00:00.000006,-76.5,37.5,0.0,Station1,78.84992218017578,15.026266098022461
227 | 1990-01-03 08:00:00.000006,-76.5,37.5,10.0,Station1,46.64148712158203,17.006370544433594
228 | 1990-01-03 08:00:00.000006,-76.5,37.5,20.0,Station1,29.956363677978516,34.2597541809082
229 | 1990-01-03 08:00:00.000006,-76.5,37.5,30.0,Station1,82.39664459228516,8.288787841796875
230 | 1990-01-03 09:00:00.000000,-76.5,37.5,0.0,Station1,69.85939025878906,25.542879104614258
231 | 1990-01-03 09:00:00.000000,-76.5,37.5,10.0,Station1,85.83577728271484,19.303438186645508
232 | 1990-01-03 09:00:00.000000,-76.5,37.5,20.0,Station1,46.871219635009766,12.560347557067871
233 | 1990-01-03 09:00:00.000000,-76.5,37.5,30.0,Station1,48.45285415649414,3.631796360015869
234 | 1990-01-03 10:00:00.000000,-76.5,37.5,0.0,Station1,32.00928497314453,17.609180450439453
235 | 1990-01-03 10:00:00.000000,-76.5,37.5,10.0,Station1,26.311925888061523,13.081612586975098
236 | 1990-01-03 10:00:00.000000,-76.5,37.5,20.0,Station1,74.80437469482422,18.22319221496582
237 | 1990-01-03 10:00:00.000000,-76.5,37.5,30.0,Station1,79.85517120361328,31.7646484375
238 | 1990-01-03 11:00:00.000006,-76.5,37.5,0.0,Station1,81.63489532470703,37.80084991455078
239 | 1990-01-03 11:00:00.000006,-76.5,37.5,10.0,Station1,72.2690658569336,20.39961051940918
240 | 1990-01-03 11:00:00.000006,-76.5,37.5,20.0,Station1,39.20390701293945,23.025272369384766
241 | 1990-01-03 11:00:00.000006,-76.5,37.5,30.0,Station1,51.86124801635742,19.003459930419922
242 | 1990-01-03 12:00:00.000000,-76.5,37.5,0.0,Station1,1.6135121583938599,6.22425651550293
243 | 1990-01-03 12:00:00.000000,-76.5,37.5,10.0,Station1,29.71632194519043,24.94045066833496
244 | 1990-01-03 12:00:00.000000,-76.5,37.5,20.0,Station1,12.310216903686523,11.411457061767578
245 | 1990-01-03 12:00:00.000000,-76.5,37.5,30.0,Station1,45.815006256103516,19.131755828857422
246 | 1990-01-03 13:00:00.000000,-76.5,37.5,0.0,Station1,73.41693878173828,17.252593994140625
247 | 1990-01-03 13:00:00.000000,-76.5,37.5,10.0,Station1,12.371626853942871,16.74717140197754
248 | 1990-01-03 13:00:00.000000,-76.5,37.5,20.0,Station1,57.70625686645508,6.235103130340576
249 | 1990-01-03 13:00:00.000000,-76.5,37.5,30.0,Station1,25.932113647460938,39.6199951171875
250 | 1990-01-03 14:00:00.000006,-76.5,37.5,0.0,Station1,88.45867919921875,38.45885467529297
251 | 1990-01-03 14:00:00.000006,-76.5,37.5,10.0,Station1,5.6687397956848145,6.473036766052246
252 | 1990-01-03 14:00:00.000006,-76.5,37.5,20.0,Station1,35.243499755859375,28.753314971923828
253 | 1990-01-03 14:00:00.000006,-76.5,37.5,30.0,Station1,65.36186218261719,37.03003692626953
254 | 1990-01-03 15:00:00.000000,-76.5,37.5,0.0,Station1,47.33708572387695,11.871329307556152
255 | 1990-01-03 15:00:00.000000,-76.5,37.5,10.0,Station1,42.90950012207031,1.6663603782653809
256 | 1990-01-03 15:00:00.000000,-76.5,37.5,20.0,Station1,72.73174285888672,22.77864646911621
257 | 1990-01-03 15:00:00.000000,-76.5,37.5,30.0,Station1,45.43378829956055,33.07921600341797
258 | 1990-01-03 16:00:00.000000,-76.5,37.5,0.0,Station1,18.7443790435791,38.1535530090332
259 | 1990-01-03 16:00:00.000000,-76.5,37.5,10.0,Station1,39.36359786987305,2.197946071624756
260 | 1990-01-03 16:00:00.000000,-76.5,37.5,20.0,Station1,7.426008224487305,22.37017822265625
261 | 1990-01-03 16:00:00.000000,-76.5,37.5,30.0,Station1,51.79632568359375,27.952796936035156
262 | 1990-01-03 17:00:00.000006,-76.5,37.5,0.0,Station1,19.03384017944336,15.31529426574707
263 | 1990-01-03 17:00:00.000006,-76.5,37.5,10.0,Station1,23.67914390563965,1.0888673067092896
264 | 1990-01-03 17:00:00.000006,-76.5,37.5,20.0,Station1,27.253665924072266,25.81829261779785
265 | 1990-01-03 17:00:00.000006,-76.5,37.5,30.0,Station1,66.58782196044922,19.718860626220703
266 | 1990-01-03 18:00:00.000000,-76.5,37.5,0.0,Station1,37.37879180908203,20.1881103515625
267 | 1990-01-03 18:00:00.000000,-76.5,37.5,10.0,Station1,56.093833923339844,37.2854118347168
268 | 1990-01-03 18:00:00.000000,-76.5,37.5,20.0,Station1,38.68505096435547,39.473690032958984
269 | 1990-01-03 18:00:00.000000,-76.5,37.5,30.0,Station1,57.814823150634766,30.091279983520508
270 | 1990-01-03 19:00:00.000000,-76.5,37.5,0.0,Station1,48.54921340942383,28.350587844848633
271 | 1990-01-03 19:00:00.000000,-76.5,37.5,10.0,Station1,48.903526306152344,20.69158363342285
272 | 1990-01-03 19:00:00.000000,-76.5,37.5,20.0,Station1,82.60746765136719,8.400899887084961
273 | 1990-01-03 19:00:00.000000,-76.5,37.5,30.0,Station1,28.7857666015625,30.650497436523438
274 | 1990-01-03 20:00:00.000006,-76.5,37.5,0.0,Station1,86.8187255859375,17.721965789794922
275 | 1990-01-03 20:00:00.000006,-76.5,37.5,10.0,Station1,59.16819381713867,11.541993141174316
276 | 1990-01-03 20:00:00.000006,-76.5,37.5,20.0,Station1,27.62545394897461,17.657669067382812
277 | 1990-01-03 20:00:00.000006,-76.5,37.5,30.0,Station1,18.618165969848633,24.646787643432617
278 | 1990-01-03 21:00:00.000000,-76.5,37.5,0.0,Station1,27.85427474975586,14.98964786529541
279 | 1990-01-03 21:00:00.000000,-76.5,37.5,10.0,Station1,2.7230072021484375,28.146087646484375
280 | 1990-01-03 21:00:00.000000,-76.5,37.5,20.0,Station1,88.69136047363281,12.966811180114746
281 | 1990-01-03 21:00:00.000000,-76.5,37.5,30.0,Station1,73.0270767211914,2.9634015560150146
282 | 1990-01-03 22:00:00.000000,-76.5,37.5,0.0,Station1,24.247011184692383,27.23522186279297
283 | 1990-01-03 22:00:00.000000,-76.5,37.5,10.0,Station1,14.826058387756348,30.467641830444336
284 | 1990-01-03 22:00:00.000000,-76.5,37.5,20.0,Station1,66.91819763183594,14.959220886230469
285 | 1990-01-03 22:00:00.000000,-76.5,37.5,30.0,Station1,42.81993865966797,16.98870277404785
286 | 1990-01-03 23:00:00.000006,-76.5,37.5,0.0,Station1,17.23919105529785,23.808103561401367
287 | 1990-01-03 23:00:00.000006,-76.5,37.5,10.0,Station1,12.414342880249023,36.48383712768555
288 | 1990-01-03 23:00:00.000006,-76.5,37.5,20.0,Station1,64.16846466064453,19.113325119018555
289 | 1990-01-03 23:00:00.000006,-76.5,37.5,30.0,Station1,81.68563079833984,29.97011375427246
290 | 1990-01-04 00:00:00.000000,-76.5,37.5,0.0,Station1,40.15835189819336,6.849361419677734
291 | 1990-01-04 00:00:00.000000,-76.5,37.5,10.0,Station1,45.36162567138672,13.775735855102539
292 | 1990-01-04 00:00:00.000000,-76.5,37.5,20.0,Station1,56.70486068725586,20.25759506225586
293 | 1990-01-04 00:00:00.000000,-76.5,37.5,30.0,Station1,0.46464160084724426,39.444053649902344
294 | 1990-01-04 01:00:00.000000,-76.5,37.5,0.0,Station1,41.22502899169922,0.6592352986335754
295 | 1990-01-04 01:00:00.000000,-76.5,37.5,10.0,Station1,34.074249267578125,4.33485746383667
296 | 1990-01-04 01:00:00.000000,-76.5,37.5,20.0,Station1,68.03898620605469,20.585487365722656
297 | 1990-01-04 01:00:00.000000,-76.5,37.5,30.0,Station1,28.590431213378906,12.791516304016113
298 | 1990-01-04 02:00:00.000006,-76.5,37.5,0.0,Station1,60.41136169433594,5.113763809204102
299 | 1990-01-04 02:00:00.000006,-76.5,37.5,10.0,Station1,77.800048828125,33.380897521972656
300 | 1990-01-04 02:00:00.000006,-76.5,37.5,20.0,Station1,43.41371154785156,26.629053115844727
301 | 1990-01-04 02:00:00.000006,-76.5,37.5,30.0,Station1,36.22380065917969,2.2603352069854736
302 | 1990-01-04 03:00:00.000000,-76.5,37.5,0.0,Station1,12.793010711669922,6.334409236907959
303 | 1990-01-04 03:00:00.000000,-76.5,37.5,10.0,Station1,22.107131958007812,35.9809684753418
304 | 1990-01-04 03:00:00.000000,-76.5,37.5,20.0,Station1,66.77812194824219,14.337752342224121
305 | 1990-01-04 03:00:00.000000,-76.5,37.5,30.0,Station1,11.857619285583496,30.05885887145996
306 | 1990-01-04 04:00:00.000000,-76.5,37.5,0.0,Station1,55.12480545043945,35.60659408569336
307 | 1990-01-04 04:00:00.000000,-76.5,37.5,10.0,Station1,40.2501220703125,28.902841567993164
308 | 1990-01-04 04:00:00.000000,-76.5,37.5,20.0,Station1,15.351229667663574,38.90714645385742
309 | 1990-01-04 04:00:00.000000,-76.5,37.5,30.0,Station1,67.44207763671875,32.599815368652344
310 | 1990-01-04 05:00:00.000006,-76.5,37.5,0.0,Station1,23.883819580078125,16.733722686767578
311 | 1990-01-04 05:00:00.000006,-76.5,37.5,10.0,Station1,73.40615844726562,21.178354263305664
312 | 1990-01-04 05:00:00.000006,-76.5,37.5,20.0,Station1,89.41414642333984,3.3186936378479004
313 | 1990-01-04 05:00:00.000006,-76.5,37.5,30.0,Station1,30.36724090576172,38.302101135253906
314 | 1990-01-04 06:00:00.000000,-76.5,37.5,0.0,Station1,80.00723266601562,0.17372983694076538
315 | 1990-01-04 06:00:00.000000,-76.5,37.5,10.0,Station1,36.882423400878906,17.163789749145508
316 | 1990-01-04 06:00:00.000000,-76.5,37.5,20.0,Station1,81.40714263916016,5.170389175415039
317 | 1990-01-04 06:00:00.000000,-76.5,37.5,30.0,Station1,1.3770973682403564,34.352027893066406
318 | 1990-01-04 07:00:00.000000,-76.5,37.5,0.0,Station1,15.277694702148438,8.13900089263916
319 | 1990-01-04 07:00:00.000000,-76.5,37.5,10.0,Station1,49.797950744628906,16.716102600097656
320 | 1990-01-04 07:00:00.000000,-76.5,37.5,20.0,Station1,85.31804656982422,0.5288424491882324
321 | 1990-01-04 07:00:00.000000,-76.5,37.5,30.0,Station1,78.5687484741211,34.09885787963867
322 | 1990-01-04 08:00:00.000006,-76.5,37.5,0.0,Station1,45.668785095214844,2.672102212905884
323 | 1990-01-04 08:00:00.000006,-76.5,37.5,10.0,Station1,63.91499710083008,3.219104766845703
324 | 1990-01-04 08:00:00.000006,-76.5,37.5,20.0,Station1,73.091552734375,37.378257751464844
325 | 1990-01-04 08:00:00.000006,-76.5,37.5,30.0,Station1,36.39630126953125,14.47177505493164
326 | 1990-01-04 09:00:00.000000,-76.5,37.5,0.0,Station1,28.08131217956543,13.795466423034668
327 | 1990-01-04 09:00:00.000000,-76.5,37.5,10.0,Station1,0.05567790940403938,34.256778717041016
328 | 1990-01-04 09:00:00.000000,-76.5,37.5,20.0,Station1,89.41925048828125,9.085867881774902
329 | 1990-01-04 09:00:00.000000,-76.5,37.5,30.0,Station1,38.810157775878906,32.913978576660156
330 | 1990-01-04 10:00:00.000000,-76.5,37.5,0.0,Station1,88.26287841796875,26.60127830505371
331 | 1990-01-04 10:00:00.000000,-76.5,37.5,10.0,Station1,67.5056381225586,22.08243179321289
332 | 1990-01-04 10:00:00.000000,-76.5,37.5,20.0,Station1,48.792816162109375,23.094825744628906
333 | 1990-01-04 10:00:00.000000,-76.5,37.5,30.0,Station1,62.34968566894531,38.92275619506836
334 | 1990-01-04 11:00:00.000006,-76.5,37.5,0.0,Station1,4.809182643890381,33.12162399291992
335 | 1990-01-04 11:00:00.000006,-76.5,37.5,10.0,Station1,66.18036651611328,23.478315353393555
336 | 1990-01-04 11:00:00.000006,-76.5,37.5,20.0,Station1,33.82928466796875,29.781831741333008
337 | 1990-01-04 11:00:00.000006,-76.5,37.5,30.0,Station1,55.079505920410156,23.26438331604004
338 | 1990-01-04 12:00:00.000000,-76.5,37.5,0.0,Station1,54.43915557861328,25.707080841064453
339 | 1990-01-04 12:00:00.000000,-76.5,37.5,10.0,Station1,63.41484832763672,27.27547264099121
340 | 1990-01-04 12:00:00.000000,-76.5,37.5,20.0,Station1,80.9261474609375,25.940004348754883
341 | 1990-01-04 12:00:00.000000,-76.5,37.5,30.0,Station1,10.179781913757324,19.691627502441406
342 | 1990-01-04 13:00:00.000000,-76.5,37.5,0.0,Station1,44.79893493652344,0.8039079904556274
343 | 1990-01-04 13:00:00.000000,-76.5,37.5,10.0,Station1,89.9924087524414,13.365922927856445
344 | 1990-01-04 13:00:00.000000,-76.5,37.5,20.0,Station1,3.869960308074951,7.425185203552246
345 | 1990-01-04 13:00:00.000000,-76.5,37.5,30.0,Station1,75.04290771484375,21.37425994873047
346 | 1990-01-04 14:00:00.000006,-76.5,37.5,0.0,Station1,5.913206577301025,5.437511920928955
347 | 1990-01-04 14:00:00.000006,-76.5,37.5,10.0,Station1,73.37606811523438,34.198001861572266
348 | 1990-01-04 14:00:00.000006,-76.5,37.5,20.0,Station1,40.155338287353516,28.46311378479004
349 | 1990-01-04 14:00:00.000006,-76.5,37.5,30.0,Station1,51.160614013671875,39.75754165649414
350 | 1990-01-04 15:00:00.000000,-76.5,37.5,0.0,Station1,70.37445068359375,20.157054901123047
351 | 1990-01-04 15:00:00.000000,-76.5,37.5,10.0,Station1,62.3992805480957,37.56830978393555
352 | 1990-01-04 15:00:00.000000,-76.5,37.5,20.0,Station1,72.54293060302734,33.45124435424805
353 | 1990-01-04 15:00:00.000000,-76.5,37.5,30.0,Station1,12.3316068649292,14.206316947937012
354 | 1990-01-04 16:00:00.000000,-76.5,37.5,0.0,Station1,26.093318939208984,35.13079071044922
355 | 1990-01-04 16:00:00.000000,-76.5,37.5,10.0,Station1,23.227033615112305,35.41326904296875
356 | 1990-01-04 16:00:00.000000,-76.5,37.5,20.0,Station1,57.928157806396484,9.414533615112305
357 | 1990-01-04 16:00:00.000000,-76.5,37.5,30.0,Station1,41.56217956542969,18.6476993560791
358 | 1990-01-04 17:00:00.000006,-76.5,37.5,0.0,Station1,8.204924583435059,12.88387393951416
359 | 1990-01-04 17:00:00.000006,-76.5,37.5,10.0,Station1,56.67234802246094,31.359651565551758
360 | 1990-01-04 17:00:00.000006,-76.5,37.5,20.0,Station1,66.30349731445312,35.620941162109375
361 | 1990-01-04 17:00:00.000006,-76.5,37.5,30.0,Station1,44.05905532836914,38.746253967285156
362 | 1990-01-04 18:00:00.000000,-76.5,37.5,0.0,Station1,12.507214546203613,15.836965560913086
363 | 1990-01-04 18:00:00.000000,-76.5,37.5,10.0,Station1,87.91561126708984,35.20988845825195
364 | 1990-01-04 18:00:00.000000,-76.5,37.5,20.0,Station1,48.72533416748047,34.982666015625
365 | 1990-01-04 18:00:00.000000,-76.5,37.5,30.0,Station1,88.07270050048828,10.1680326461792
366 | 1990-01-04 19:00:00.000000,-76.5,37.5,0.0,Station1,50.45478057861328,16.591249465942383
367 | 1990-01-04 19:00:00.000000,-76.5,37.5,10.0,Station1,7.631511211395264,30.313196182250977
368 | 1990-01-04 19:00:00.000000,-76.5,37.5,20.0,Station1,36.65318298339844,1.2892050743103027
369 | 1990-01-04 19:00:00.000000,-76.5,37.5,30.0,Station1,83.71990203857422,38.641456604003906
370 | 1990-01-04 20:00:00.000006,-76.5,37.5,0.0,Station1,42.92171096801758,2.9849514961242676
371 | 1990-01-04 20:00:00.000006,-76.5,37.5,10.0,Station1,34.581539154052734,27.48197364807129
372 | 1990-01-04 20:00:00.000006,-76.5,37.5,20.0,Station1,41.81064224243164,5.799067974090576
373 | 1990-01-04 20:00:00.000006,-76.5,37.5,30.0,Station1,49.43313980102539,36.181434631347656
374 | 1990-01-04 21:00:00.000000,-76.5,37.5,0.0,Station1,45.193416595458984,31.450361251831055
375 | 1990-01-04 21:00:00.000000,-76.5,37.5,10.0,Station1,16.980947494506836,24.941757202148438
376 | 1990-01-04 21:00:00.000000,-76.5,37.5,20.0,Station1,6.456486701965332,39.81837844848633
377 | 1990-01-04 21:00:00.000000,-76.5,37.5,30.0,Station1,20.095050811767578,34.10704040527344
378 | 1990-01-04 22:00:00.000000,-76.5,37.5,0.0,Station1,16.587509155273438,15.371258735656738
379 | 1990-01-04 22:00:00.000000,-76.5,37.5,10.0,Station1,32.05564880371094,29.8929443359375
380 | 1990-01-04 22:00:00.000000,-76.5,37.5,20.0,Station1,56.38959503173828,33.08102035522461
381 | 1990-01-04 22:00:00.000000,-76.5,37.5,30.0,Station1,75.43870544433594,14.078401565551758
382 | 1990-01-04 23:00:00.000006,-76.5,37.5,0.0,Station1,67.46200561523438,16.635486602783203
383 | 1990-01-04 23:00:00.000006,-76.5,37.5,10.0,Station1,45.92966842651367,39.561973571777344
384 | 1990-01-04 23:00:00.000006,-76.5,37.5,20.0,Station1,24.61168670654297,13.895219802856445
385 | 1990-01-04 23:00:00.000006,-76.5,37.5,30.0,Station1,78.3450927734375,22.30900764465332
386 | 1990-01-05 00:00:00.000000,-76.5,37.5,0.0,Station1,15.195961952209473,5.402545928955078
387 | 1990-01-05 00:00:00.000000,-76.5,37.5,10.0,Station1,52.06884002685547,32.66088104248047
388 | 1990-01-05 00:00:00.000000,-76.5,37.5,20.0,Station1,30.153518676757812,24.314992904663086
389 | 1990-01-05 00:00:00.000000,-76.5,37.5,30.0,Station1,51.27717590332031,1.8619325160980225
390 | 1990-01-05 01:00:00.000000,-76.5,37.5,0.0,Station1,40.1324462890625,5.89939022064209
391 | 1990-01-05 01:00:00.000000,-76.5,37.5,10.0,Station1,83.60608673095703,12.37799072265625
392 | 1990-01-05 01:00:00.000000,-76.5,37.5,20.0,Station1,39.62245559692383,13.553915977478027
393 | 1990-01-05 01:00:00.000000,-76.5,37.5,30.0,Station1,64.97891235351562,35.518890380859375
394 | 1990-01-05 02:00:00.000006,-76.5,37.5,0.0,Station1,76.70635223388672,32.80964660644531
395 | 1990-01-05 02:00:00.000006,-76.5,37.5,10.0,Station1,66.49693298339844,12.80410099029541
396 | 1990-01-05 02:00:00.000006,-76.5,37.5,20.0,Station1,51.34526824951172,24.956350326538086
397 | 1990-01-05 02:00:00.000006,-76.5,37.5,30.0,Station1,8.161941528320312,11.294278144836426
398 | 1990-01-05 03:00:00.000000,-76.5,37.5,0.0,Station1,70.41864013671875,1.7499504089355469
399 | 1990-01-05 03:00:00.000000,-76.5,37.5,10.0,Station1,87.83660888671875,26.358129501342773
400 | 1990-01-05 03:00:00.000000,-76.5,37.5,20.0,Station1,55.42125701904297,33.84919357299805
401 | 1990-01-05 03:00:00.000000,-76.5,37.5,30.0,Station1,39.01736068725586,20.882753372192383
402 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data_access.md:
--------------------------------------------------------------------------------
1 | # Data Access
2 |
3 | IOOS data comes from a variety of technologies or data collection systems. While types of data available through any
4 | one of our 11 regional associations may vary depending on the local area, the national IOOS data products include data
5 | collected from buoys, high frequency radar systems and gliders. Modeling teams across regional associations also create
6 | data products including physical and environmental models of coastal systems.
7 |
8 | IOOS data can be accessed through a variety of access services and tools through IOOS interactive maps, Data Assembly
9 | Centers (DACs), and individual Regional Association portals. This chapter provides examples of the various data access
10 | services (SOS, THREDDS, ERDDAP, etc) and tools for scientists and managers looking to access data using various programing languages (Python,
11 | Matlab, R, etc).
12 |
13 | For more information on accessing IOOS data, see .
14 |
15 | ______________________________________________________________________
16 |
17 | ## Chapter table of contents
18 |
19 | ```{tableofcontents}
20 |
21 | ```
22 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data_access_notebooks/2017-01-18-siphon-explore-thredds-iframe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/code_gallery/data_access_notebooks/2017-01-18-siphon-explore-thredds-iframe.png
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data_access_notebooks/2018-03-01-erddapy-iframe-0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/code_gallery/data_access_notebooks/2018-03-01-erddapy-iframe-0.png
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data_access_notebooks/combined_high_res.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/code_gallery/data_access_notebooks/combined_high_res.zip
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data_analysis_and_visualization.md:
--------------------------------------------------------------------------------
1 | # Data Analysis And Visualization
2 |
3 | This chapter will consist of notebooks pertaining to data analysis.
4 |
5 | ______________________________________________________________________
6 |
7 | ## Chapter table of contents
8 |
9 | ```{tableofcontents}
10 |
11 | ```
12 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data_management.md:
--------------------------------------------------------------------------------
1 | # Data Management
2 |
3 | Data management is an increasingly important aspect of IOOS activities. In this chapter you will find examples of how
4 | to use various tools to ensure compliance with existing standards and conventions. For more details on IOOS
5 | recommendations on data standards, see .
6 |
7 | ______________________________________________________________________
8 |
9 | ## Chapter table of contents
10 |
11 | ```{tableofcontents}
12 |
13 | ```
14 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data_management_notebooks/2017-05-14-running_compliance_checker.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {
7 | "tags": [
8 | "remove-cell"
9 | ]
10 | },
11 | "outputs": [],
12 | "source": [
13 | "import subprocess\n",
14 | "import sys\n",
15 | "\n",
16 | "COLAB = \"google.colab\" in sys.modules\n",
17 | "\n",
18 | "\n",
19 | "def _install(package):\n",
20 | " if COLAB:\n",
21 | " ans = input(f\"Install { package }? [y/n]:\")\n",
22 | " if ans.lower() in [\"y\", \"yes\"]:\n",
23 | " subprocess.check_call(\n",
24 | " [sys.executable, \"-m\", \"pip\", \"install\", \"--quiet\", package]\n",
25 | " )\n",
26 | " print(f\"{ package } installed!\")\n",
27 | "\n",
28 | "\n",
29 | "def _colab_install_missing_deps(deps):\n",
30 | " import importlib\n",
31 | "\n",
32 | " for dep in deps:\n",
33 | " if importlib.util.find_spec(dep) is None:\n",
34 | " if dep == \"iris\":\n",
35 | " dep = \"scitools-iris\"\n",
36 | " _install(dep)\n",
37 | "\n",
38 | "\n",
39 | "deps = [\"compliance-checker\"]\n",
40 | "_colab_install_missing_deps(deps)"
41 | ]
42 | },
43 | {
44 | "cell_type": "markdown",
45 | "metadata": {},
46 | "source": [
47 | "# Shore Station Compliance Checker Script\n",
48 | "\n",
49 | "Created: 2017-05-14\n",
50 | "\n",
51 | "The IOOS Compliance Checker is a Python-based tool that helps users check the meta data compliance of a netCDF file. This software can be run in a web interface here: [https://compliance.ioos.us/index.html](https://compliance.ioos.us/index.html) The checker can also be run as a Python tool either on the command line or in a Python script. This notebook demonstrates the python usage of the Compliance Checker.\n",
52 | "\n",
53 | "## Purpose:\n",
54 | "\n",
55 | "Run the compliance checker python tool on a Scipps Pier shore station dataset to check for the metadata compliance.\n",
56 | "\n",
57 | "The Scripps Pier automated shore station operated by Southern California Coastal Ocean Observing System (SCCOOS) at Scripps Institution of Oceanography (SIO) is mounted at a nominal depth of 5 meters MLLW. The instrument package includes a Seabird SBE 16plus SEACAT Conductivity, Temperature, and Pressure recorder, and a Seapoint Chlorophyll Fluorometer with a 0-50 ug/L gain setting.\n",
58 | "\n",
59 | "## Dependencies:\n",
60 | "\n",
61 | "This script must be run in the \"IOOS\" environment for the compliance checker to work properly.\n",
62 | "\n",
63 | "Written by: J.Bosch Feb. 10, 2017"
64 | ]
65 | },
66 | {
67 | "cell_type": "code",
68 | "execution_count": 1,
69 | "metadata": {},
70 | "outputs": [
71 | {
72 | "name": "stdout",
73 | "output_type": "stream",
74 | "text": [
75 | "5.1.0\n"
76 | ]
77 | }
78 | ],
79 | "source": [
80 | "import compliance_checker\n",
81 | "\n",
82 | "print(compliance_checker.__version__)"
83 | ]
84 | },
85 | {
86 | "cell_type": "code",
87 | "execution_count": 2,
88 | "metadata": {},
89 | "outputs": [],
90 | "source": [
91 | "# First import the compliance checker and test that it is installed properly.\n",
92 | "from compliance_checker.runner import CheckSuite, ComplianceChecker\n",
93 | "\n",
94 | "# Load all available checker classes.\n",
95 | "check_suite = CheckSuite()\n",
96 | "check_suite.load_all_available_checkers()"
97 | ]
98 | },
99 | {
100 | "cell_type": "code",
101 | "execution_count": 3,
102 | "metadata": {},
103 | "outputs": [],
104 | "source": [
105 | "# Path to the Scripps Pier Data.\n",
106 | "\n",
107 | "url = \"https://gliders.ioos.us/thredds/fileServer/deployments/rutgers/ru29-20150623T1046/ru29-20150623T1046.nc3.nc\""
108 | ]
109 | },
110 | {
111 | "cell_type": "markdown",
112 | "metadata": {},
113 | "source": [
114 | "### Running Compliance Checker on the Scripps Pier shore station data\n",
115 | "\n",
116 | "This code is written with all the arguments spelled out, following the usage instructions on the README section of compliance checker github page: https://github.com/ioos/compliance-checker"
117 | ]
118 | },
119 | {
120 | "cell_type": "code",
121 | "execution_count": 4,
122 | "metadata": {
123 | "scrolled": false
124 | },
125 | "outputs": [],
126 | "source": [
127 | "output_file = \"buoy_testCC.txt\"\n",
128 | "\n",
129 | "return_value, errors = ComplianceChecker.run_checker(\n",
130 | " ds_loc=url,\n",
131 | " checker_names=[\"cf:1.9\", \"acdd\"],\n",
132 | " verbose=True,\n",
133 | " criteria=\"normal\",\n",
134 | " skip_checks=None,\n",
135 | " output_filename=output_file,\n",
136 | " output_format=\"text\",\n",
137 | ")"
138 | ]
139 | },
140 | {
141 | "cell_type": "code",
142 | "execution_count": 5,
143 | "metadata": {
144 | "scrolled": false
145 | },
146 | "outputs": [
147 | {
148 | "name": "stdout",
149 | "output_type": "stream",
150 | "text": [
151 | "\n",
152 | "\n",
153 | "--------------------------------------------------------------------------------\n",
154 | " IOOS Compliance Checker Report \n",
155 | " Version 5.1.0 \n",
156 | " Report generated 2023-09-13T13:58:44Z \n",
157 | " acdd:1.3 \n",
158 | "http://wiki.esipfed.org/index.php?title=Category:Attribute_Conventions_Dataset_Discovery\n",
159 | "--------------------------------------------------------------------------------\n",
160 | " Corrective Actions \n",
161 | "ru29-20150623T1046.nc3.nc has 11 potential issues\n",
162 | "\n",
163 | "\n",
164 | " Highly Recommended \n",
165 | "--------------------------------------------------------------------------------\n",
166 | "Global Attributes\n",
167 | "* Conventions does not contain 'ACDD-1.3'\n",
168 | "\n",
169 | "variable \"conductivity\" missing the following attributes:\n",
170 | "* coverage_content_type\n",
171 | "\n",
172 | "variable \"density\" missing the following attributes:\n",
173 | "* coverage_content_type\n",
174 | "\n",
175 | "variable \"platform_meta\" missing the following attributes:\n",
176 | "* coverage_content_type\n",
177 | "* standard_name\n",
178 | "\n",
179 | "variable \"pressure\" missing the following attributes:\n",
180 | "* coverage_content_type\n",
181 | "\n",
182 | "variable \"salinity\" missing the following attributes:\n",
183 | "* coverage_content_type\n",
184 | "\n",
185 | "variable \"temperature\" missing the following attributes:\n",
186 | "* coverage_content_type\n",
187 | "\n",
188 | "variable \"u\" missing the following attributes:\n",
189 | "* coverage_content_type\n",
190 | "\n",
191 | "variable \"v\" missing the following attributes:\n",
192 | "* coverage_content_type\n",
193 | "\n",
194 | "\n",
195 | " Recommended \n",
196 | "--------------------------------------------------------------------------------\n",
197 | "Global Attributes\n",
198 | "* geospatial_bounds not present\n",
199 | "* geospatial_bounds_crs not present\n",
200 | "* geospatial_bounds_vertical_crs not present\n",
201 | "* time_coverage_duration not present\n",
202 | "* time_coverage_resolution not present\n",
203 | "\n",
204 | "time_coverage_extents_match\n",
205 | "* Failed to retrieve and convert times for variables time.\n",
206 | "\n"
207 | ]
208 | }
209 | ],
210 | "source": [
211 | "with open(output_file) as f:\n",
212 | " print(f.read())"
213 | ]
214 | },
215 | {
216 | "cell_type": "markdown",
217 | "metadata": {
218 | "collapsed": true
219 | },
220 | "source": [
221 | "This Compliance Checker Report can be used to identify where file meta data can be improved. A strong meta data record allows for greater utility of the data for a broader audience of data analysts."
222 | ]
223 | }
224 | ],
225 | "metadata": {
226 | "_draft": {
227 | "nbviewer_url": "https://gist.github.com/68144718926fb68097cfebcf8aab012a"
228 | },
229 | "anaconda-cloud": {},
230 | "gist": {
231 | "data": {
232 | "description": "code_gallery/data_management_notebooks/2017-05-14-running_compliance_checker.ipynb",
233 | "public": true
234 | },
235 | "id": "68144718926fb68097cfebcf8aab012a"
236 | },
237 | "kernelspec": {
238 | "display_name": "Python 3 (ipykernel)",
239 | "language": "python",
240 | "name": "python3"
241 | },
242 | "language_info": {
243 | "codemirror_mode": {
244 | "name": "ipython",
245 | "version": 3
246 | },
247 | "file_extension": ".py",
248 | "mimetype": "text/x-python",
249 | "name": "python",
250 | "nbconvert_exporter": "python",
251 | "pygments_lexer": "ipython3",
252 | "version": "3.11.5"
253 | }
254 | },
255 | "nbformat": 4,
256 | "nbformat_minor": 1
257 | }
258 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data_management_notebooks/2017-11-01-Creating-Archives-Using-Bagit.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {
7 | "tags": [
8 | "remove-cell"
9 | ]
10 | },
11 | "outputs": [],
12 | "source": [
13 | "import subprocess\n",
14 | "import sys\n",
15 | "\n",
16 | "COLAB = \"google.colab\" in sys.modules\n",
17 | "\n",
18 | "\n",
19 | "def _install(package):\n",
20 | " if COLAB:\n",
21 | " ans = input(f\"Install { package }? [y/n]:\")\n",
22 | " if ans.lower() in [\"y\", \"yes\"]:\n",
23 | " subprocess.check_call(\n",
24 | " [sys.executable, \"-m\", \"pip\", \"install\", \"--quiet\", package]\n",
25 | " )\n",
26 | " print(f\"{ package } installed!\")\n",
27 | "\n",
28 | "\n",
29 | "def _colab_install_missing_deps(deps):\n",
30 | " import importlib\n",
31 | "\n",
32 | " for dep in deps:\n",
33 | " if importlib.util.find_spec(dep) is None:\n",
34 | " if dep == \"iris\":\n",
35 | " dep = \"scitools-iris\"\n",
36 | " _install(dep)\n",
37 | "\n",
38 | "\n",
39 | "deps = [\"bagit\", \"pocean-core\"]\n",
40 | "_colab_install_missing_deps(deps)"
41 | ]
42 | },
43 | {
44 | "cell_type": "markdown",
45 | "metadata": {},
46 | "source": [
47 | "# Using BagIt to tag oceanographic data\n",
48 | "\n",
49 | "Created: 2017-11-01\n",
50 | "\n",
51 | "[`BagIt`](https://en.wikipedia.org/wiki/BagIt) is a packaging format that supports storage of arbitrary digital content. The \"bag\" consists of arbitrary content and \"tags,\" the metadata files. `BagIt` packages can be used to facilitate data sharing with federal archive centers - thus ensuring digital preservation of oceanographic datasets within IOOS and its regional associations. NOAA NCEI supports reading from a Web Accessible Folder (WAF) containing bagit archives. For an example please see: http://ncei.axiomdatascience.com/cencoos/\n",
52 | "\n",
53 | "On this notebook we will use the [python interface](http://libraryofcongress.github.io/bagit-python) for `BagIt` to create a \"bag\" of a time-series profile data. First let us load our data from a comma separated values file (`CSV`)."
54 | ]
55 | },
56 | {
57 | "cell_type": "code",
58 | "execution_count": 1,
59 | "metadata": {},
60 | "outputs": [
61 | {
62 | "data": {
63 | "text/html": [
64 | "
\n",
65 | "\n",
78 | "
\n",
79 | " \n",
80 | " \n",
81 | " | \n",
82 | " time | \n",
83 | " lon | \n",
84 | " lat | \n",
85 | " depth | \n",
86 | " station | \n",
87 | " humidity | \n",
88 | " temperature | \n",
89 | "
\n",
90 | " \n",
91 | " \n",
92 | " \n",
93 | " 0 | \n",
94 | " 1990-01-01 00:00:00 | \n",
95 | " -76.5 | \n",
96 | " 37.5 | \n",
97 | " 0.0 | \n",
98 | " Station1 | \n",
99 | " 89.708794 | \n",
100 | " 15.698009 | \n",
101 | "
\n",
102 | " \n",
103 | " 1 | \n",
104 | " 1990-01-01 00:00:00 | \n",
105 | " -76.5 | \n",
106 | " 37.5 | \n",
107 | " 10.0 | \n",
108 | " Station1 | \n",
109 | " 55.789471 | \n",
110 | " 10.916656 | \n",
111 | "
\n",
112 | " \n",
113 | " 2 | \n",
114 | " 1990-01-01 00:00:00 | \n",
115 | " -76.5 | \n",
116 | " 37.5 | \n",
117 | " 20.0 | \n",
118 | " Station1 | \n",
119 | " 50.176994 | \n",
120 | " 15.666663 | \n",
121 | "
\n",
122 | " \n",
123 | " 3 | \n",
124 | " 1990-01-01 00:00:00 | \n",
125 | " -76.5 | \n",
126 | " 37.5 | \n",
127 | " 30.0 | \n",
128 | " Station1 | \n",
129 | " 36.855045 | \n",
130 | " 1.158752 | \n",
131 | "
\n",
132 | " \n",
133 | " 4 | \n",
134 | " 1990-01-01 01:00:00 | \n",
135 | " -76.5 | \n",
136 | " 37.5 | \n",
137 | " 0.0 | \n",
138 | " Station1 | \n",
139 | " 65.016937 | \n",
140 | " 31.059647 | \n",
141 | "
\n",
142 | " \n",
143 | "
\n",
144 | "
"
145 | ],
146 | "text/plain": [
147 | " time lon lat depth station humidity temperature\n",
148 | "0 1990-01-01 00:00:00 -76.5 37.5 0.0 Station1 89.708794 15.698009\n",
149 | "1 1990-01-01 00:00:00 -76.5 37.5 10.0 Station1 55.789471 10.916656\n",
150 | "2 1990-01-01 00:00:00 -76.5 37.5 20.0 Station1 50.176994 15.666663\n",
151 | "3 1990-01-01 00:00:00 -76.5 37.5 30.0 Station1 36.855045 1.158752\n",
152 | "4 1990-01-01 01:00:00 -76.5 37.5 0.0 Station1 65.016937 31.059647"
153 | ]
154 | },
155 | "execution_count": 1,
156 | "metadata": {},
157 | "output_type": "execute_result"
158 | }
159 | ],
160 | "source": [
161 | "import os\n",
162 | "\n",
163 | "import pandas as pd\n",
164 | "\n",
165 | "fname = os.path.join(\"..\", \"data\", \"timeseriesProfile.csv\")\n",
166 | "\n",
167 | "df = pd.read_csv(fname, parse_dates=[\"time\"])\n",
168 | "df.head()"
169 | ]
170 | },
171 | {
172 | "cell_type": "markdown",
173 | "metadata": {},
174 | "source": [
175 | "Instead of \"bagging\" the `CSV` file we will use this create a metadata rich netCDF file.\n",
176 | "\n",
177 | "We can convert the table to a `DSG`, Discrete Sampling Geometry, using `pocean.dsg`. The first thing we need to do is to create a mapping from the data column names to the netCDF `axes`."
178 | ]
179 | },
180 | {
181 | "cell_type": "code",
182 | "execution_count": 2,
183 | "metadata": {},
184 | "outputs": [],
185 | "source": [
186 | "axes = {\"t\": \"time\", \"x\": \"lon\", \"y\": \"lat\", \"z\": \"depth\"}"
187 | ]
188 | },
189 | {
190 | "cell_type": "markdown",
191 | "metadata": {},
192 | "source": [
193 | "Now we can create a [Orthogonal Multidimensional Timeseries Profile](http://cfconventions.org/cf-conventions/v1.6.0/cf-conventions.html#_orthogonal_multidimensional_array_representation_of_time_series) object..."
194 | ]
195 | },
196 | {
197 | "cell_type": "code",
198 | "execution_count": 3,
199 | "metadata": {},
200 | "outputs": [],
201 | "source": [
202 | "import os\n",
203 | "import tempfile\n",
204 | "\n",
205 | "from pocean.dsg import OrthogonalMultidimensionalTimeseriesProfile as omtsp\n",
206 | "\n",
207 | "output_fp, output = tempfile.mkstemp()\n",
208 | "os.close(output_fp)\n",
209 | "\n",
210 | "ncd = omtsp.from_dataframe(df.reset_index(), output=output, axes=axes, mode=\"a\")"
211 | ]
212 | },
213 | {
214 | "cell_type": "markdown",
215 | "metadata": {},
216 | "source": [
217 | "... And add some extra metadata before we close the file."
218 | ]
219 | },
220 | {
221 | "cell_type": "code",
222 | "execution_count": 4,
223 | "metadata": {},
224 | "outputs": [
225 | {
226 | "name": "stdout",
227 | "output_type": "stream",
228 | "text": [
229 | "\n",
230 | "root group (NETCDF4 data model, file format HDF5):\n",
231 | " Conventions: CF-1.6\n",
232 | " date_created: 2021-08-24T23:45:00Z\n",
233 | " featureType: timeSeriesProfile\n",
234 | " cdm_data_type: TimeseriesProfile\n",
235 | " naming_authority: ioos\n",
236 | " id: Station1\n",
237 | " dimensions(sizes): station(1), time(100), depth(4)\n",
238 | " variables(dimensions): station(station), float64 lat(station), float64 lon(station), int32 crs(), float64 time(time), float64 depth(depth), int32 index(time, depth, station), float64 humidity(time, depth, station), float64 temperature(time, depth, station)\n",
239 | " groups: \n"
240 | ]
241 | }
242 | ],
243 | "source": [
244 | "naming_authority = \"ioos\"\n",
245 | "st_id = \"Station1\"\n",
246 | "\n",
247 | "ncd.naming_authority = naming_authority\n",
248 | "ncd.id = st_id\n",
249 | "print(ncd)\n",
250 | "ncd.close()"
251 | ]
252 | },
253 | {
254 | "cell_type": "markdown",
255 | "metadata": {},
256 | "source": [
257 | "Time to create the archive for the file with `BagIt`. We have to create a folder for the bag."
258 | ]
259 | },
260 | {
261 | "cell_type": "code",
262 | "execution_count": 5,
263 | "metadata": {},
264 | "outputs": [],
265 | "source": [
266 | "temp_bagit_folder = tempfile.mkdtemp()\n",
267 | "temp_data_folder = os.path.join(temp_bagit_folder, \"data\")"
268 | ]
269 | },
270 | {
271 | "cell_type": "markdown",
272 | "metadata": {},
273 | "source": [
274 | "Now we can create the bag and copy the netCDF file to a `data` sub-folder."
275 | ]
276 | },
277 | {
278 | "cell_type": "code",
279 | "execution_count": 6,
280 | "metadata": {},
281 | "outputs": [
282 | {
283 | "data": {
284 | "text/plain": [
285 | "'/tmp/tmp30n1un_k/data/parameter1.nc'"
286 | ]
287 | },
288 | "execution_count": 6,
289 | "metadata": {},
290 | "output_type": "execute_result"
291 | }
292 | ],
293 | "source": [
294 | "import shutil\n",
295 | "\n",
296 | "import bagit\n",
297 | "\n",
298 | "bag = bagit.make_bag(temp_bagit_folder, checksum=[\"sha256\"])\n",
299 | "\n",
300 | "shutil.copy2(output, temp_data_folder + \"/parameter1.nc\")"
301 | ]
302 | },
303 | {
304 | "cell_type": "markdown",
305 | "metadata": {},
306 | "source": [
307 | "Last, but not least, we have to set bag metadata and update the existing bag with it."
308 | ]
309 | },
310 | {
311 | "cell_type": "code",
312 | "execution_count": 7,
313 | "metadata": {},
314 | "outputs": [],
315 | "source": [
316 | "urn = f\"urn:ioos:station:{naming_authority}:{st_id}\"\n",
317 | "\n",
318 | "bag_meta = {\n",
319 | " \"Bag-Count\": \"1 of 1\",\n",
320 | " \"Bag-Group-Identifier\": \"ioos_bagit_testing\",\n",
321 | " \"Contact-Name\": \"Kyle Wilcox\",\n",
322 | " \"Contact-Phone\": \"907-230-0304\",\n",
323 | " \"Contact-Email\": \"axiom+ncei@axiomdatascience.com\",\n",
324 | " \"External-Identifier\": urn,\n",
325 | " \"External-Description\": f\"Sensor data from station {urn}\",\n",
326 | " \"Internal-Sender-Identifier\": urn,\n",
327 | " \"Internal-Sender-Description\": f\"Station - URN:{urn}\",\n",
328 | " \"Organization-address\": \"1016 W 6th Ave, Ste. 105, Anchorage, AK 99501, USA\",\n",
329 | " \"Source-Organization\": \"Axiom Data Science\",\n",
330 | "}\n",
331 | "\n",
332 | "\n",
333 | "bag.info.update(bag_meta)\n",
334 | "bag.save(manifests=True, processes=4)"
335 | ]
336 | },
337 | {
338 | "cell_type": "markdown",
339 | "metadata": {},
340 | "source": [
341 | "That is it! Simple and efficient!!\n",
342 | "\n",
343 | "The cell below illustrates the bag directory tree.\n",
344 | "\n",
345 | "(Note that the commands below will not work on Windows and some \\*nix systems may require the installation of the command `tree`, however, they are only need for this demonstration.)"
346 | ]
347 | },
348 | {
349 | "cell_type": "code",
350 | "execution_count": 8,
351 | "metadata": {},
352 | "outputs": [
353 | {
354 | "name": "stdout",
355 | "output_type": "stream",
356 | "text": [
357 | "\u001b[01;34m/tmp/tmp30n1un_k\u001b[00m\n",
358 | "├── bag-info.txt\n",
359 | "├── bagit.txt\n",
360 | "├── \u001b[01;34mdata\u001b[00m\n",
361 | "│ └── parameter1.nc\n",
362 | "├── manifest-sha256.txt\n",
363 | "└── tagmanifest-sha256.txt\n",
364 | "\n",
365 | "1 directory, 5 files\n",
366 | "966f9dda7df28cf50304d5cc67e08084020446e13521b40ee94cce35e5c75ec8 data/parameter1.nc\n"
367 | ]
368 | }
369 | ],
370 | "source": [
371 | "!tree $temp_bagit_folder\n",
372 | "!cat $temp_bagit_folder/manifest-sha256.txt"
373 | ]
374 | },
375 | {
376 | "cell_type": "markdown",
377 | "metadata": {},
378 | "source": [
379 | "We can add more files to the bag as needed."
380 | ]
381 | },
382 | {
383 | "cell_type": "code",
384 | "execution_count": 9,
385 | "metadata": {},
386 | "outputs": [],
387 | "source": [
388 | "shutil.copy2(output, temp_data_folder + \"/parameter2.nc\")\n",
389 | "shutil.copy2(output, temp_data_folder + \"/parameter3.nc\")\n",
390 | "shutil.copy2(output, temp_data_folder + \"/parameter4.nc\")\n",
391 | "\n",
392 | "bag.save(manifests=True, processes=4)"
393 | ]
394 | },
395 | {
396 | "cell_type": "code",
397 | "execution_count": 10,
398 | "metadata": {},
399 | "outputs": [
400 | {
401 | "name": "stdout",
402 | "output_type": "stream",
403 | "text": [
404 | "\u001b[01;34m/tmp/tmp30n1un_k\u001b[00m\n",
405 | "├── bag-info.txt\n",
406 | "├── bagit.txt\n",
407 | "├── \u001b[01;34mdata\u001b[00m\n",
408 | "│ ├── parameter1.nc\n",
409 | "│ ├── parameter2.nc\n",
410 | "│ ├── parameter3.nc\n",
411 | "│ └── parameter4.nc\n",
412 | "├── manifest-sha256.txt\n",
413 | "└── tagmanifest-sha256.txt\n",
414 | "\n",
415 | "1 directory, 8 files\n",
416 | "966f9dda7df28cf50304d5cc67e08084020446e13521b40ee94cce35e5c75ec8 data/parameter1.nc\n",
417 | "966f9dda7df28cf50304d5cc67e08084020446e13521b40ee94cce35e5c75ec8 data/parameter2.nc\n",
418 | "966f9dda7df28cf50304d5cc67e08084020446e13521b40ee94cce35e5c75ec8 data/parameter3.nc\n",
419 | "966f9dda7df28cf50304d5cc67e08084020446e13521b40ee94cce35e5c75ec8 data/parameter4.nc\n"
420 | ]
421 | }
422 | ],
423 | "source": [
424 | "!tree $temp_bagit_folder\n",
425 | "!cat $temp_bagit_folder/manifest-sha256.txt"
426 | ]
427 | }
428 | ],
429 | "metadata": {
430 | "kernelspec": {
431 | "display_name": "Python 3 (ipykernel)",
432 | "language": "python",
433 | "name": "python3"
434 | },
435 | "language_info": {
436 | "codemirror_mode": {
437 | "name": "ipython",
438 | "version": 3
439 | },
440 | "file_extension": ".py",
441 | "mimetype": "text/x-python",
442 | "name": "python",
443 | "nbconvert_exporter": "python",
444 | "pygments_lexer": "ipython3",
445 | "version": "3.9.7"
446 | }
447 | },
448 | "nbformat": 4,
449 | "nbformat_minor": 2
450 | }
451 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/data_management_notebooks/2018-02-27-pocean-timeSeries-demo.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {
7 | "tags": [
8 | "remove-cell"
9 | ]
10 | },
11 | "outputs": [],
12 | "source": [
13 | "import subprocess\n",
14 | "import sys\n",
15 | "\n",
16 | "COLAB = \"google.colab\" in sys.modules\n",
17 | "\n",
18 | "\n",
19 | "def _install(package):\n",
20 | " if COLAB:\n",
21 | " ans = input(f\"Install { package }? [y/n]:\")\n",
22 | " if ans.lower() in [\"y\", \"yes\"]:\n",
23 | " subprocess.check_call(\n",
24 | " [sys.executable, \"-m\", \"pip\", \"install\", \"--quiet\", package]\n",
25 | " )\n",
26 | " print(f\"{ package } installed!\")\n",
27 | "\n",
28 | "\n",
29 | "def _colab_install_missing_deps(deps):\n",
30 | " import importlib\n",
31 | "\n",
32 | " for dep in deps:\n",
33 | " if importlib.util.find_spec(dep) is None:\n",
34 | " if dep == \"iris\":\n",
35 | " dep = \"scitools-iris\"\n",
36 | " _install(dep)\n",
37 | "\n",
38 | "\n",
39 | "deps = [\"oceans\", \"pocean-core\"]\n",
40 | "_colab_install_missing_deps(deps)"
41 | ]
42 | },
43 | {
44 | "cell_type": "markdown",
45 | "metadata": {},
46 | "source": [
47 | "# Creating a CF-1.6 timeSeries using pocean\n",
48 | "\n",
49 | "Created: 2018-02-27\n",
50 | "\n",
51 | "IOOS recommends to data providers that their netCDF files follow the CF-1.6 standard. In this notebook we will create a [CF-1.6 compliant](https://cfconventions.org/latest.html) file that follows file that follows the [Discrete Sampling Geometries](https://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/build/ch09.html) (DSG) of a `timeSeries` from a pandas DataFrame.\n",
52 | "\n",
53 | "The `pocean` module can handle all the DSGs described in the CF-1.6 document: `point`, `timeSeries`, `trajectory`, `profile`, `timeSeriesProfile`, and `trajectoryProfile`. These DSGs array may be represented in the netCDF file as:\n",
54 | "\n",
55 | "- **orthogonal multidimensional**: when the coordinates along the element axis of the features are identical;\n",
56 | "- **incomplete multidimensional**: when the features within a collection do not all have the same number but space is not an issue and using longest feature to all features is convenient;\n",
57 | "- **contiguous ragged**: can be used if the size of each feature is known;\n",
58 | "- **indexed ragged**: stores the features interleaved along the sample dimension in the data variable.\n",
59 | "\n",
60 | "Here we will use the orthogonal multidimensional array to represent time-series data from am hypothetical current meter. We'll use fake data for this example for convenience.\n",
61 | "\n",
62 | "Our fake data represents a current meter located at 10 meters depth collected last week."
63 | ]
64 | },
65 | {
66 | "cell_type": "code",
67 | "execution_count": 1,
68 | "metadata": {},
69 | "outputs": [
70 | {
71 | "data": {
72 | "text/html": [
73 | "\n",
74 | "\n",
87 | "
\n",
88 | " \n",
89 | " \n",
90 | " | \n",
91 | " time | \n",
92 | " longitude | \n",
93 | " latitude | \n",
94 | " depth | \n",
95 | " u | \n",
96 | " v | \n",
97 | " station | \n",
98 | "
\n",
99 | " \n",
100 | " \n",
101 | " \n",
102 | " 95 | \n",
103 | " 2022-05-10 15:18:50.687502 | \n",
104 | " -48.6256 | \n",
105 | " -27.5717 | \n",
106 | " 10 | \n",
107 | " 0.440129 | \n",
108 | " -0.897934 | \n",
109 | " fake buoy | \n",
110 | "
\n",
111 | " \n",
112 | " 96 | \n",
113 | " 2022-05-11 15:18:50.687502 | \n",
114 | " -48.6256 | \n",
115 | " -27.5717 | \n",
116 | " 10 | \n",
117 | " 0.348287 | \n",
118 | " -0.937388 | \n",
119 | " fake buoy | \n",
120 | "
\n",
121 | " \n",
122 | " 97 | \n",
123 | " 2022-05-12 15:18:50.687502 | \n",
124 | " -48.6256 | \n",
125 | " -27.5717 | \n",
126 | " 10 | \n",
127 | " 0.252964 | \n",
128 | " -0.967476 | \n",
129 | " fake buoy | \n",
130 | "
\n",
131 | " \n",
132 | " 98 | \n",
133 | " 2022-05-13 15:18:50.687502 | \n",
134 | " -48.6256 | \n",
135 | " -27.5717 | \n",
136 | " 10 | \n",
137 | " 0.155114 | \n",
138 | " -0.987897 | \n",
139 | " fake buoy | \n",
140 | "
\n",
141 | " \n",
142 | " 99 | \n",
143 | " 2022-05-14 15:18:50.687502 | \n",
144 | " -48.6256 | \n",
145 | " -27.5717 | \n",
146 | " 10 | \n",
147 | " 0.055714 | \n",
148 | " -0.998447 | \n",
149 | " fake buoy | \n",
150 | "
\n",
151 | " \n",
152 | "
\n",
153 | "
"
154 | ],
155 | "text/plain": [
156 | " time longitude latitude depth u v \\\n",
157 | "95 2022-05-10 15:18:50.687502 -48.6256 -27.5717 10 0.440129 -0.897934 \n",
158 | "96 2022-05-11 15:18:50.687502 -48.6256 -27.5717 10 0.348287 -0.937388 \n",
159 | "97 2022-05-12 15:18:50.687502 -48.6256 -27.5717 10 0.252964 -0.967476 \n",
160 | "98 2022-05-13 15:18:50.687502 -48.6256 -27.5717 10 0.155114 -0.987897 \n",
161 | "99 2022-05-14 15:18:50.687502 -48.6256 -27.5717 10 0.055714 -0.998447 \n",
162 | "\n",
163 | " station \n",
164 | "95 fake buoy \n",
165 | "96 fake buoy \n",
166 | "97 fake buoy \n",
167 | "98 fake buoy \n",
168 | "99 fake buoy "
169 | ]
170 | },
171 | "execution_count": 1,
172 | "metadata": {},
173 | "output_type": "execute_result"
174 | }
175 | ],
176 | "source": [
177 | "from datetime import datetime, timedelta\n",
178 | "\n",
179 | "import numpy as np\n",
180 | "import pandas as pd\n",
181 | "\n",
182 | "x = np.arange(100, 110, 0.1)\n",
183 | "start = datetime.now() - timedelta(days=7)\n",
184 | "\n",
185 | "df = pd.DataFrame(\n",
186 | " {\n",
187 | " \"time\": [start + timedelta(days=n) for n in range(len(x))],\n",
188 | " \"longitude\": -48.6256,\n",
189 | " \"latitude\": -27.5717,\n",
190 | " \"depth\": 10,\n",
191 | " \"u\": np.sin(x),\n",
192 | " \"v\": np.cos(x),\n",
193 | " \"station\": \"fake buoy\",\n",
194 | " }\n",
195 | ")\n",
196 | "\n",
197 | "\n",
198 | "df.tail()"
199 | ]
200 | },
201 | {
202 | "cell_type": "markdown",
203 | "metadata": {},
204 | "source": [
205 | "Let's take a look at our fake data."
206 | ]
207 | },
208 | {
209 | "cell_type": "code",
210 | "execution_count": 2,
211 | "metadata": {
212 | "scrolled": false
213 | },
214 | "outputs": [
215 | {
216 | "data": {
217 | "text/plain": [
218 | "(array([19024., 19038., 19052., 19066., 19083., 19097., 19113., 19127.]),\n",
219 | " [Text(0, 0, ''),\n",
220 | " Text(0, 0, ''),\n",
221 | " Text(0, 0, ''),\n",
222 | " Text(0, 0, ''),\n",
223 | " Text(0, 0, ''),\n",
224 | " Text(0, 0, ''),\n",
225 | " Text(0, 0, ''),\n",
226 | " Text(0, 0, '')])"
227 | ]
228 | },
229 | "execution_count": 2,
230 | "metadata": {},
231 | "output_type": "execute_result"
232 | },
233 | {
234 | "data": {
235 | "image/png": "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\n",
236 | "text/plain": [
237 | ""
238 | ]
239 | },
240 | "metadata": {
241 | "needs_background": "light"
242 | },
243 | "output_type": "display_data"
244 | }
245 | ],
246 | "source": [
247 | "%matplotlib inline\n",
248 | "\n",
249 | "\n",
250 | "import matplotlib.pyplot as plt\n",
251 | "from oceans.plotting import stick_plot\n",
252 | "\n",
253 | "q = stick_plot([t.to_pydatetime() for t in df[\"time\"]], df[\"u\"], df[\"v\"])\n",
254 | "\n",
255 | "ref = 1\n",
256 | "qk = plt.quiverkey(\n",
257 | " q, 0.1, 0.85, ref, f\"{ref} m s$^{-1}$\", labelpos=\"N\", coordinates=\"axes\"\n",
258 | ")\n",
259 | "\n",
260 | "plt.xticks(rotation=70)"
261 | ]
262 | },
263 | {
264 | "cell_type": "markdown",
265 | "metadata": {},
266 | "source": [
267 | "`pocean.dsg` is relatively simple to use. The user must provide a DataFrame, like the one above, and a dictionary of attributes that maps to the data and adhere to the DSG conventions desired.\n",
268 | "\n",
269 | "Because we want the file to work seamlessly with ERDDAP we also added some ERDDAP specific attributes like `cdm_timeseries_variables`, and `subsetVariables`."
270 | ]
271 | },
272 | {
273 | "cell_type": "code",
274 | "execution_count": 3,
275 | "metadata": {},
276 | "outputs": [],
277 | "source": [
278 | "attributes = {\n",
279 | " \"global\": {\n",
280 | " \"title\": \"Fake mooring\",\n",
281 | " \"summary\": \"Vector current meter ADCP @ 10 m\",\n",
282 | " \"institution\": \"Restaurant at the end of the universe\",\n",
283 | " \"cdm_timeseries_variables\": \"station\",\n",
284 | " \"subsetVariables\": \"depth\",\n",
285 | " # These are only the required attributions from\n",
286 | " # https://ioos.github.io/ioos-metadata/ioos-metadata-profile-v1-2.html#attribution\n",
287 | " \"creator_country\": \"USA\",\n",
288 | " \"creator_email\": \"fake_email@somedomain.org\",\n",
289 | " \"creator_institution\": \"IOOS\",\n",
290 | " \"creator_sector\": \"academic\",\n",
291 | " \"creator_url\": \"https://ioos.github.io/ioos_code_lab/content/intro.html\",\n",
292 | " \"publisher_country\": \"USA\",\n",
293 | " \"publisher_email\": \"fake_email@somedomain.org\",\n",
294 | " \"publisher_institution\": \"IOOS\",\n",
295 | " \"publisher_url\": \"https://ioos.github.io/ioos_code_lab/content/intro.html\",\n",
296 | " },\n",
297 | " \"longitude\": {\n",
298 | " \"units\": \"degrees_east\",\n",
299 | " \"standard_name\": \"longitude\",\n",
300 | " },\n",
301 | " \"latitude\": {\n",
302 | " \"units\": \"degrees_north\",\n",
303 | " \"standard_name\": \"latitude\",\n",
304 | " },\n",
305 | " \"z\": {\n",
306 | " \"units\": \"m\",\n",
307 | " \"standard_name\": \"depth\",\n",
308 | " \"positive\": \"down\",\n",
309 | " },\n",
310 | " \"u\": {\n",
311 | " \"units\": \"m/s\",\n",
312 | " \"standard_name\": \"eastward_sea_water_velocity\",\n",
313 | " },\n",
314 | " \"v\": {\n",
315 | " \"units\": \"m/s\",\n",
316 | " \"standard_name\": \"northward_sea_water_velocity\",\n",
317 | " },\n",
318 | " \"station\": {\"cf_role\": \"timeseries_id\"},\n",
319 | "}"
320 | ]
321 | },
322 | {
323 | "cell_type": "markdown",
324 | "metadata": {},
325 | "source": [
326 | "We also need to map the our data axes to `pocean`'s defaults. This step is not needed if the data axes are already named like the default ones."
327 | ]
328 | },
329 | {
330 | "cell_type": "code",
331 | "execution_count": 4,
332 | "metadata": {},
333 | "outputs": [],
334 | "source": [
335 | "axes = {\"t\": \"time\", \"x\": \"longitude\", \"y\": \"latitude\", \"z\": \"depth\"}"
336 | ]
337 | },
338 | {
339 | "cell_type": "code",
340 | "execution_count": 5,
341 | "metadata": {
342 | "scrolled": false
343 | },
344 | "outputs": [],
345 | "source": [
346 | "from pocean.dsg.timeseries.om import OrthogonalMultidimensionalTimeseries\n",
347 | "from pocean.utils import downcast_dataframe\n",
348 | "\n",
349 | "df = downcast_dataframe(df) # safely cast depth np.int64 to np.int32\n",
350 | "dsg = OrthogonalMultidimensionalTimeseries.from_dataframe(\n",
351 | " df,\n",
352 | " output=\"fake_buoy.nc\",\n",
353 | " attributes=attributes,\n",
354 | " axes=axes,\n",
355 | ")"
356 | ]
357 | },
358 | {
359 | "cell_type": "markdown",
360 | "metadata": {},
361 | "source": [
362 | "The `OrthogonalMultidimensionalTimeseries` saves the DataFrame into a CF-1.6 TimeSeries DSG."
363 | ]
364 | },
365 | {
366 | "cell_type": "code",
367 | "execution_count": 6,
368 | "metadata": {},
369 | "outputs": [
370 | {
371 | "name": "stdout",
372 | "output_type": "stream",
373 | "text": [
374 | "netcdf fake_buoy {\r\n",
375 | "dimensions:\r\n",
376 | "\tstation = 1 ;\r\n",
377 | "\ttime = 100 ;\r\n",
378 | "variables:\r\n",
379 | "\tint crs ;\r\n",
380 | "\tdouble time(time) ;\r\n",
381 | "\t\ttime:units = \"seconds since 1990-01-01 00:00:00Z\" ;\r\n",
382 | "\t\ttime:standard_name = \"time\" ;\r\n",
383 | "\t\ttime:axis = \"T\" ;\r\n",
384 | "\tstring station(station) ;\r\n",
385 | "\t\tstation:cf_role = \"timeseries_id\" ;\r\n",
386 | "\t\tstation:long_name = \"station identifier\" ;\r\n",
387 | "\tdouble latitude(station) ;\r\n",
388 | "\t\tlatitude:axis = \"Y\" ;\r\n",
389 | "\t\tlatitude:units = \"degrees_north\" ;\r\n",
390 | "\t\tlatitude:standard_name = \"latitude\" ;\r\n",
391 | "\tdouble longitude(station) ;\r\n",
392 | "\t\tlongitude:axis = \"X\" ;\r\n",
393 | "\t\tlongitude:units = \"degrees_east\" ;\r\n",
394 | "\t\tlongitude:standard_name = \"longitude\" ;\r\n",
395 | "\tint depth(station) ;\r\n",
396 | "\t\tdepth:_FillValue = -9999 ;\r\n",
397 | "\t\tdepth:axis = \"Z\" ;\r\n",
398 | "\tdouble u(station, time) ;\r\n",
399 | "\t\tu:_FillValue = -9999.9 ;\r\n",
400 | "\t\tu:units = \"m/s\" ;\r\n",
401 | "\t\tu:standard_name = \"eastward_sea_water_velocity\" ;\r\n",
402 | "\t\tu:coordinates = \"time depth longitude latitude\" ;\r\n",
403 | "\tdouble v(station, time) ;\r\n",
404 | "\t\tv:_FillValue = -9999.9 ;\r\n",
405 | "\t\tv:units = \"m/s\" ;\r\n",
406 | "\t\tv:standard_name = \"northward_sea_water_velocity\" ;\r\n",
407 | "\t\tv:coordinates = \"time depth longitude latitude\" ;\r\n",
408 | "\r\n",
409 | "// global attributes:\r\n",
410 | "\t\t:Conventions = \"CF-1.6\" ;\r\n",
411 | "\t\t:date_created = \"2022-02-11T18:18:00Z\" ;\r\n",
412 | "\t\t:featureType = \"timeseries\" ;\r\n",
413 | "\t\t:cdm_data_type = \"Timeseries\" ;\r\n",
414 | "\t\t:title = \"Fake mooring\" ;\r\n",
415 | "\t\t:summary = \"Vector current meter ADCP @ 10 m\" ;\r\n",
416 | "\t\t:institution = \"Restaurant at the end of the universe\" ;\r\n",
417 | "\t\t:cdm_timeseries_variables = \"station\" ;\r\n",
418 | "\t\t:subsetVariables = \"depth\" ;\r\n",
419 | "\t\t:creator_country = \"USA\" ;\r\n",
420 | "\t\t:creator_email = \"fake_email@somedomain.org\" ;\r\n",
421 | "\t\t:creator_institution = \"IOOS\" ;\r\n",
422 | "\t\t:creator_sector = \"academic\" ;\r\n",
423 | "\t\t:creator_url = \"https://ioos.github.io/ioos_code_lab/content/intro.html\" ;\r\n",
424 | "\t\t:publisher_country = \"USA\" ;\r\n",
425 | "\t\t:publisher_email = \"fake_email@somedomain.org\" ;\r\n",
426 | "\t\t:publisher_institution = \"IOOS\" ;\r\n",
427 | "\t\t:publisher_url = \"https://ioos.github.io/ioos_code_lab/content/intro.html\" ;\r\n",
428 | "}\r\n"
429 | ]
430 | }
431 | ],
432 | "source": [
433 | "!ncdump -h fake_buoy.nc"
434 | ]
435 | },
436 | {
437 | "cell_type": "markdown",
438 | "metadata": {},
439 | "source": [
440 | "It also outputs the dsg object for inspection. Let us check a few things to see if our objects was created as expected. (Note that some of the metadata was \"free\" due t the built-in defaults in `pocean`."
441 | ]
442 | },
443 | {
444 | "cell_type": "code",
445 | "execution_count": 7,
446 | "metadata": {},
447 | "outputs": [
448 | {
449 | "data": {
450 | "text/plain": [
451 | "'timeseries'"
452 | ]
453 | },
454 | "execution_count": 7,
455 | "metadata": {},
456 | "output_type": "execute_result"
457 | }
458 | ],
459 | "source": [
460 | "dsg.getncattr(\"featureType\")"
461 | ]
462 | },
463 | {
464 | "cell_type": "code",
465 | "execution_count": 8,
466 | "metadata": {},
467 | "outputs": [
468 | {
469 | "data": {
470 | "text/plain": [
471 | "pocean.dsg.timeseries.om.OrthogonalMultidimensionalTimeseries"
472 | ]
473 | },
474 | "execution_count": 8,
475 | "metadata": {},
476 | "output_type": "execute_result"
477 | }
478 | ],
479 | "source": [
480 | "type(dsg)"
481 | ]
482 | },
483 | {
484 | "cell_type": "markdown",
485 | "metadata": {},
486 | "source": [
487 | "In addition to standard `netCDF4-python` object `.variables` method `pocean`'s DSGs provides an \"categorized\" version of the variables in the `data_vars`, `ancillary_vars`, and the DSG axes methods."
488 | ]
489 | },
490 | {
491 | "cell_type": "code",
492 | "execution_count": 9,
493 | "metadata": {},
494 | "outputs": [
495 | {
496 | "data": {
497 | "text/plain": [
498 | "['eastward_sea_water_velocity', 'northward_sea_water_velocity']"
499 | ]
500 | },
501 | "execution_count": 9,
502 | "metadata": {},
503 | "output_type": "execute_result"
504 | }
505 | ],
506 | "source": [
507 | "[(v.standard_name) for v in dsg.data_vars()]"
508 | ]
509 | },
510 | {
511 | "cell_type": "code",
512 | "execution_count": 10,
513 | "metadata": {},
514 | "outputs": [
515 | {
516 | "data": {
517 | "text/plain": [
518 | "[\n",
519 | " float64 time(time)\n",
520 | " units: seconds since 1990-01-01 00:00:00Z\n",
521 | " standard_name: time\n",
522 | " axis: T\n",
523 | " unlimited dimensions: \n",
524 | " current shape = (100,)\n",
525 | " filling on, default _FillValue of 9.969209968386869e+36 used]"
526 | ]
527 | },
528 | "execution_count": 10,
529 | "metadata": {},
530 | "output_type": "execute_result"
531 | }
532 | ],
533 | "source": [
534 | "dsg.axes(\"T\")"
535 | ]
536 | },
537 | {
538 | "cell_type": "code",
539 | "execution_count": 11,
540 | "metadata": {},
541 | "outputs": [
542 | {
543 | "data": {
544 | "text/plain": [
545 | "[\n",
546 | " int32 depth(station)\n",
547 | " _FillValue: -9999\n",
548 | " axis: Z\n",
549 | " unlimited dimensions: \n",
550 | " current shape = (1,)\n",
551 | " filling on]"
552 | ]
553 | },
554 | "execution_count": 11,
555 | "metadata": {},
556 | "output_type": "execute_result"
557 | }
558 | ],
559 | "source": [
560 | "dsg.axes(\"Z\")"
561 | ]
562 | },
563 | {
564 | "cell_type": "code",
565 | "execution_count": 12,
566 | "metadata": {},
567 | "outputs": [
568 | {
569 | "data": {
570 | "text/plain": [
571 | "{'cf_role': 'timeseries_id', 'long_name': 'station identifier'}"
572 | ]
573 | },
574 | "execution_count": 12,
575 | "metadata": {},
576 | "output_type": "execute_result"
577 | }
578 | ],
579 | "source": [
580 | "dsg.vatts(\"station\")"
581 | ]
582 | },
583 | {
584 | "cell_type": "code",
585 | "execution_count": 13,
586 | "metadata": {},
587 | "outputs": [
588 | {
589 | "data": {
590 | "text/plain": [
591 | "array(['fake buoy'], dtype=object)"
592 | ]
593 | },
594 | "execution_count": 13,
595 | "metadata": {},
596 | "output_type": "execute_result"
597 | }
598 | ],
599 | "source": [
600 | "dsg[\"station\"][:]"
601 | ]
602 | },
603 | {
604 | "cell_type": "code",
605 | "execution_count": 14,
606 | "metadata": {},
607 | "outputs": [
608 | {
609 | "data": {
610 | "text/plain": [
611 | "{'_FillValue': -9999.9,\n",
612 | " 'units': 'm/s',\n",
613 | " 'standard_name': 'eastward_sea_water_velocity',\n",
614 | " 'coordinates': 'time depth longitude latitude'}"
615 | ]
616 | },
617 | "execution_count": 14,
618 | "metadata": {},
619 | "output_type": "execute_result"
620 | }
621 | ],
622 | "source": [
623 | "dsg.vatts(\"u\")"
624 | ]
625 | },
626 | {
627 | "cell_type": "markdown",
628 | "metadata": {},
629 | "source": [
630 | "We can easily round-trip back to the pandas DataFrame object."
631 | ]
632 | },
633 | {
634 | "cell_type": "code",
635 | "execution_count": 15,
636 | "metadata": {},
637 | "outputs": [
638 | {
639 | "data": {
640 | "text/html": [
641 | "\n",
642 | "\n",
655 | "
\n",
656 | " \n",
657 | " \n",
658 | " | \n",
659 | " t | \n",
660 | " x | \n",
661 | " y | \n",
662 | " z | \n",
663 | " station | \n",
664 | " u | \n",
665 | " v | \n",
666 | "
\n",
667 | " \n",
668 | " \n",
669 | " \n",
670 | " 0 | \n",
671 | " 2022-02-04 15:18:50.687502 | \n",
672 | " -48.6256 | \n",
673 | " -27.5717 | \n",
674 | " 10 | \n",
675 | " fake buoy | \n",
676 | " -0.506366 | \n",
677 | " 0.862319 | \n",
678 | "
\n",
679 | " \n",
680 | " 1 | \n",
681 | " 2022-02-05 15:18:50.687502 | \n",
682 | " -48.6256 | \n",
683 | " -27.5717 | \n",
684 | " 10 | \n",
685 | " fake buoy | \n",
686 | " -0.417748 | \n",
687 | " 0.908563 | \n",
688 | "
\n",
689 | " \n",
690 | " 2 | \n",
691 | " 2022-02-06 15:18:50.687502 | \n",
692 | " -48.6256 | \n",
693 | " -27.5717 | \n",
694 | " 10 | \n",
695 | " fake buoy | \n",
696 | " -0.324956 | \n",
697 | " 0.945729 | \n",
698 | "
\n",
699 | " \n",
700 | " 3 | \n",
701 | " 2022-02-07 15:18:50.687502 | \n",
702 | " -48.6256 | \n",
703 | " -27.5717 | \n",
704 | " 10 | \n",
705 | " fake buoy | \n",
706 | " -0.228917 | \n",
707 | " 0.973446 | \n",
708 | "
\n",
709 | " \n",
710 | " 4 | \n",
711 | " 2022-02-08 15:18:50.687502 | \n",
712 | " -48.6256 | \n",
713 | " -27.5717 | \n",
714 | " 10 | \n",
715 | " fake buoy | \n",
716 | " -0.130591 | \n",
717 | " 0.991436 | \n",
718 | "
\n",
719 | " \n",
720 | "
\n",
721 | "
"
722 | ],
723 | "text/plain": [
724 | " t x y z station u \\\n",
725 | "0 2022-02-04 15:18:50.687502 -48.6256 -27.5717 10 fake buoy -0.506366 \n",
726 | "1 2022-02-05 15:18:50.687502 -48.6256 -27.5717 10 fake buoy -0.417748 \n",
727 | "2 2022-02-06 15:18:50.687502 -48.6256 -27.5717 10 fake buoy -0.324956 \n",
728 | "3 2022-02-07 15:18:50.687502 -48.6256 -27.5717 10 fake buoy -0.228917 \n",
729 | "4 2022-02-08 15:18:50.687502 -48.6256 -27.5717 10 fake buoy -0.130591 \n",
730 | "\n",
731 | " v \n",
732 | "0 0.862319 \n",
733 | "1 0.908563 \n",
734 | "2 0.945729 \n",
735 | "3 0.973446 \n",
736 | "4 0.991436 "
737 | ]
738 | },
739 | "execution_count": 15,
740 | "metadata": {},
741 | "output_type": "execute_result"
742 | }
743 | ],
744 | "source": [
745 | "dsg.to_dataframe().head()"
746 | ]
747 | },
748 | {
749 | "cell_type": "markdown",
750 | "metadata": {},
751 | "source": [
752 | "For more information on `pocean` please check the [docs](https://pyoceans.github.io/pocean-core/)."
753 | ]
754 | }
755 | ],
756 | "metadata": {
757 | "_draft": {
758 | "nbviewer_url": "https://gist.github.com/b2f37b7724981e80e48bd59311ac9a58"
759 | },
760 | "gist": {
761 | "data": {
762 | "description": "erddap/adcp.ipynb",
763 | "public": true
764 | },
765 | "id": "b2f37b7724981e80e48bd59311ac9a58"
766 | },
767 | "kernelspec": {
768 | "display_name": "Python 3 (ipykernel)",
769 | "language": "python",
770 | "name": "python3"
771 | },
772 | "language_info": {
773 | "codemirror_mode": {
774 | "name": "ipython",
775 | "version": 3
776 | },
777 | "file_extension": ".py",
778 | "mimetype": "text/x-python",
779 | "name": "python",
780 | "nbconvert_exporter": "python",
781 | "pygments_lexer": "ipython3",
782 | "version": "3.11.5"
783 | }
784 | },
785 | "nbformat": 4,
786 | "nbformat_minor": 2
787 | }
788 |
--------------------------------------------------------------------------------
/jupyterbook/content/code_gallery/gallery.md:
--------------------------------------------------------------------------------
1 | (nb-gallery)=
2 | # Gallery
3 |
4 | :::::{container}
5 | ::::{grid} 1 3 3 3
6 | :gutter: 2
7 |
8 | :::{grid-item-card} Fetching data from CO-OPS ERDDAP with Python tools
9 | :margin: 3 0 0 0
10 | :link: ./data_access_notebooks/2016-10-12-fetching_data.html
11 | :link-type: url
12 | :text-align: center
13 | :shadow: md
14 |
15 | {bdg-primary}`Data Access`
16 | {bdg-secondary}`ERDDAP`
17 | {bdg-info}`Python`
18 | ^^^
19 |
20 |
21 | :::
22 |
23 | :::{grid-item-card} Plotting Glider data with Python tools
24 | :margin: 3 0 0 0
25 | :link: ./data_access_notebooks/2016-11-15-glider_data_example.html
26 | :link-type: url
27 | :text-align: center
28 | :shadow: md
29 |
30 | {bdg-primary}`Data Access`
31 | {bdg-secondary}`THREDDS`
32 | {bdg-info}`Python`
33 | ^^^
34 |
35 |
36 | :::
37 |
38 | :::{grid-item-card} Accessing glider data via the Glider DAC API with Python
39 | :margin: 3 0 0 0
40 | :link: ./data_access_notebooks/2016-12-20-searching_glider_deployments.html
41 | :link-type: url
42 | :text-align: center
43 | :shadow: md
44 |
45 | {bdg-primary}`Data Access`
46 | {bdg-secondary}`GDAC API`
47 | {bdg-info}`Python`
48 | ^^^
49 |
50 |
51 | :::
52 |
53 | :::{grid-item-card} Read realtime data from IOOS Sensor Map via ERDDAP tabledap
54 | :margin: 3 0 0 0
55 | :link: ./data_access_notebooks/2017-03-21-ERDDAP_IOOS_Sensor_Map.html
56 | :link-type: url
57 | :text-align: center
58 | :shadow: md
59 |
60 | {bdg-primary}`Data Access`
61 | {bdg-secondary}`Sensor Map`
62 | {bdg-info}`Python`
63 | ^^^
64 |
65 |
66 | :::
67 |
68 | :::{grid-item-card} Using NCEI geoportal REST API to collect information about IOOS Regional Association archived data
69 | :margin: 3 0 0 0
70 | :link: ./data_access_notebooks/2017-06-12-NCEI_RA_archive_history.html
71 | :link-type: url
72 | :text-align: center
73 | :shadow: md
74 |
75 | {bdg-primary}`Data Access`
76 | {bdg-secondary}`NCEI REST API`
77 | {bdg-info}`Python`
78 | ^^^
79 |
80 |
81 | :::
82 |
83 | :::{grid-item-card} Using the `xtractomatic` R package to track Pacific Blue Marlin
84 | :margin: 3 0 0 0
85 | :link: ./data_access_notebooks/2017-08-01-xtractoR.html
86 | :link-type: url
87 | :text-align: center
88 | :shadow: md
89 |
90 | {bdg-primary}`Data Access`
91 | {bdg-secondary}`ERDDAP`
92 | {bdg-info}`R`
93 | ^^^
94 |
95 |
96 | :::
97 |
98 | :::{grid-item-card} Exploring the NHC Advisories and Sea Surface Height during Hurricane Irma
99 | :margin: 3 0 0 0
100 | :link: ./data_access_notebooks/2017-09-09-hurricane_irma.html
101 | :link-type: url
102 | :text-align: center
103 | :shadow: md
104 |
105 | {bdg-primary}`Data Access`
106 | {bdg-secondary}`NHC/OPeNDAP`
107 | {bdg-info}`Python`
108 | ^^^
109 |
110 |
111 | :::
112 |
113 | :::{grid-item-card} Calling R libraries from Python
114 | :margin: 3 0 0 0
115 | :link: ./data_access_notebooks/2017-11-30-rerddap.html
116 | :link-type: url
117 | :text-align: center
118 | :shadow: md
119 |
120 | {bdg-primary}`Data Access`
121 | {bdg-secondary}`ERDDAP`
122 | {bdg-info}`Python`
123 | ^^^
124 |
125 |
126 | :::
127 |
128 | :::{grid-item-card} Using r-obistools and r-obis to explore the OBIS database
129 | :margin: 3 0 0 0
130 | :link: ./data_access_notebooks/2018-02-20-obis.html
131 | :link-type: url
132 | :text-align: center
133 | :shadow: md
134 |
135 | {bdg-primary}`Data Access`
136 | {bdg-secondary}`OBIS`
137 | {bdg-info}`Pyhton/R`
138 | ^^^
139 |
140 |
141 | :::
142 |
143 | :::{grid-item-card} erddapy: a python client/URL builder for ERDDAP
144 | :margin: 3 0 0 0
145 | :link: ./data_access_notebooks/2018-03-01-erddapy.html
146 | :link-type: url
147 | :text-align: center
148 | :shadow: md
149 |
150 | {bdg-primary}`Data Access`
151 | {bdg-secondary}`ERDDAP`
152 | {bdg-info}`Python`
153 | ^^^
154 |
155 |
156 | :::
157 |
158 | :::{grid-item-card} IOOS models: Temperature Horizontal Slices
159 | :margin: 3 0 0 0
160 | :link: ./data_access_notebooks/2019-03-08-grids-temperature.html
161 | :link-type: url
162 | :text-align: center
163 | :shadow: md
164 |
165 | {bdg-primary}`Data Access`
166 | {bdg-secondary}`THREDDS`
167 | {bdg-info}`Python`
168 | ^^^
169 |
170 |
171 | :::
172 |
173 | :::{grid-item-card} Accessing data from SOS using NHC GIS files
174 | :margin: 3 0 0 0
175 | :link: ./data_access_notebooks/2019-05-27-hurricane_gis_part02.html
176 | :link-type: url
177 | :text-align: center
178 | :shadow: md
179 |
180 | {bdg-primary}`Data Access`
181 | {bdg-secondary}`SOS`
182 | {bdg-info}`Python`
183 | ^^^
184 |
185 |
186 | :::
187 |
188 | :::{grid-item-card} IOOS GTS Statistics
189 | :margin: 3 0 0 0
190 | :link: ./data_access_notebooks/2020-10-10-GTS.html
191 | :link-type: url
192 | :text-align: center
193 | :shadow: md
194 |
195 | {bdg-primary}`Data Access`
196 | {bdg-secondary}`NDBC`
197 | {bdg-info}`Python`
198 | ^^^
199 |
200 |
201 | :::
202 |
203 | :::{grid-item-card} Searching multiple ERDDAP servers
204 | :margin: 3 0 0 0
205 | :link: ./data_access_notebooks/2021-10-19-multiple-erddap-search.html
206 | :link-type: url
207 | :text-align: center
208 | :shadow: md
209 |
210 | {bdg-primary}`Data Access`
211 | {bdg-secondary}`ERDDAP`
212 | {bdg-info}`Python`
213 | ^^^
214 |
215 |
216 | :::
217 |
218 | :::{grid-item-card} Using pyobis to query for known datasets
219 | :margin: 3 0 0 0
220 | :link: ./data_access_notebooks/2022-11-23_pyobis_example.html
221 | :link-type: url
222 | :text-align: center
223 | :shadow: md
224 |
225 | {bdg-primary}`Data Access`
226 | {bdg-secondary}`OBIS`
227 | {bdg-info}`Python`
228 | ^^^
229 |
230 |
231 | :::
232 |
233 | :::{grid-item-card} Planning a surf trip using IOOS EDS Model Viewer
234 | :margin: 3 0 0 0
235 | :link: ./data_access_notebooks/2022-11-25-plan_surf_trip_EDS.html
236 | :link-type: url
237 | :text-align: center
238 | :shadow: md
239 |
240 | {bdg-primary}`Data Access`
241 | {bdg-secondary}`Model Viewer`
242 | {bdg-info}`python`
243 | ^^^
244 |
245 |
246 | :::
247 |
248 | :::{grid-item-card} Programmatically query the IOOS Data Catalog for a specific observation type
249 | :margin: 3 0 0 0
250 | :link: ./data_access_notebooks/2024-09-17-CKAN_API_Query.html
251 | :link-type: url
252 | :text-align: center
253 | :shadow: md
254 |
255 | {bdg-primary}`CKAN`
256 | {bdg-secondary}`Catalog`
257 | {bdg-info}`python`
258 | ^^^
259 |
260 |
261 | :::
262 |
263 | :::{grid-item-card} Parsing Conventions and standards with Python
264 | :margin: 3 0 0 0
265 | :link: ./data_analysis_and_visualization_notebooks/2016-11-16-CF-UGRID-SGRID-conventions.html
266 | :link-type: url
267 | :text-align: center
268 | :shadow: md
269 |
270 | {bdg-primary}`Data Analysis And Visualization`
271 | {bdg-secondary}`CF/UGRID/SGRID`
272 | {bdg-info}`Python`
273 | ^^^
274 |
275 |
276 | :::
277 |
278 | :::{grid-item-card} Quick demonstration of R-notebooks using the r-oce library
279 | :margin: 3 0 0 0
280 | :link: ./data_analysis_and_visualization_notebooks/2017-01-23-R-notebook.html
281 | :link-type: url
282 | :text-align: center
283 | :shadow: md
284 |
285 | {bdg-primary}`Data Analysis And Visualization`
286 | {bdg-secondary}`R-demo`
287 | {bdg-info}`R`
288 | ^^^
289 |
290 |
291 | :::
292 |
293 | :::{grid-item-card} A Matlab notebook primer
294 | :margin: 3 0 0 0
295 | :link: ./data_analysis_and_visualization_notebooks/2017-03-30-octave_notebook_example.html
296 | :link-type: url
297 | :text-align: center
298 | :shadow: md
299 |
300 | {bdg-primary}`Data Analysis And Visualization`
301 | {bdg-secondary}`Matlab-demo`
302 | {bdg-info}`Octave/Matlab`
303 | ^^^
304 |
305 |
306 | :::
307 |
308 | :::{grid-item-card} IOOS models
309 | :margin: 3 0 0 0
310 | :link: ./data_analysis_and_visualization_notebooks/2018-12-04-grids.html
311 | :link-type: url
312 | :text-align: center
313 | :shadow: md
314 |
315 | {bdg-primary}`Data Analysis And Visualization`
316 | {bdg-secondary}`Mapping`
317 | {bdg-info}`Python`
318 | ^^^
319 |
320 |
321 | :::
322 |
323 | :::{grid-item-card} IOOS QARTOD software (ioos_qc)
324 | :margin: 3 0 0 0
325 | :link: ./data_analysis_and_visualization_notebooks/2020-02-14-QARTOD_ioos_qc_Water-Level-Example.html
326 | :link-type: url
327 | :text-align: center
328 | :shadow: md
329 |
330 | {bdg-primary}`Data Analysis And Visualization`
331 | {bdg-secondary}`QARTOD`
332 | {bdg-info}`Python`
333 | ^^^
334 |
335 |
336 | :::
337 |
338 | :::{grid-item-card} Interpolating data remotely with ERDDAP
339 | :margin: 3 0 0 0
340 | :link: ./data_analysis_and_visualization_notebooks/2021-10-25-ERDDAP-interpolate.html
341 | :link-type: url
342 | :text-align: center
343 | :shadow: md
344 |
345 | {bdg-primary}`Data Analysis And Visualization`
346 | {bdg-secondary}`ERDDAP`
347 | {bdg-info}`Python`
348 | ^^^
349 |
350 |
351 | :::
352 |
353 | :::{grid-item-card} Interpolate MURSST to great white shark telemetry track with R and ERDDAP
354 | :margin: 3 0 0 0
355 | :link: ./data_analysis_and_visualization_notebooks/2024-05-16-white_shark_water_temp.html
356 | :link-type: url
357 | :text-align: center
358 | :shadow: md
359 |
360 | {bdg-primary}`ERDDAP`
361 | {bdg-secondary}`MURSST Track Interpolation`
362 | {bdg-info}`R`
363 | ^^^
364 |
365 |
366 | :::
367 |
368 | :::{grid-item-card} Using AphiaIDs to download OBIS occurrences for Bio/Eco EOVs
369 | :margin: 3 0 0 0
370 | :link: ./data_analysis_and_visualization_notebooks/2024-09-13-OBIS_EOVs.html
371 | :link-type: url
372 | :text-align: center
373 | :shadow: md
374 |
375 | {bdg-primary}`OBIS`
376 | {bdg-secondary}`EOVs`
377 | {bdg-info}`R`
378 | ^^^
379 |
380 |
381 | :::
382 |
383 | :::{grid-item-card} Shore Station Compliance Checker Script
384 | :margin: 3 0 0 0
385 | :link: ./data_management_notebooks/2017-05-14-running_compliance_checker.html
386 | :link-type: url
387 | :text-align: center
388 | :shadow: md
389 |
390 | {bdg-primary}`Data Management`
391 | {bdg-secondary}`Compliance-checker`
392 | {bdg-info}`Python`
393 | ^^^
394 |
395 |
396 | :::
397 |
398 | :::{grid-item-card} Using BagIt to tag oceanographic data
399 | :margin: 3 0 0 0
400 | :link: ./data_management_notebooks/2017-11-01-Creating-Archives-Using-Bagit.html
401 | :link-type: url
402 | :text-align: center
403 | :shadow: md
404 |
405 | {bdg-primary}`Data Management`
406 | {bdg-secondary}`BagIt`
407 | {bdg-info}`Python`
408 | ^^^
409 |
410 |
411 | :::
412 |
413 | :::{grid-item-card} Creating a CF-1.6 timeSeries using pocean
414 | :margin: 3 0 0 0
415 | :link: ./data_management_notebooks/2018-02-27-pocean-timeSeries-demo.html
416 | :link-type: url
417 | :text-align: center
418 | :shadow: md
419 |
420 | {bdg-primary}`Data Management`
421 | {bdg-secondary}`CF`
422 | {bdg-info}`Python`
423 | ^^^
424 |
425 |
426 | :::
427 |
428 | :::{grid-item-card} Aligning Data to Darwin Core
429 | :margin: 3 0 0 0
430 | :link: ./data_management_notebooks/2020-12-08-DataToDwC.html
431 | :link-type: url
432 | :text-align: center
433 | :shadow: md
434 |
435 | {bdg-primary}`Data Management`
436 | {bdg-secondary}`Darwin Core`
437 | {bdg-info}`Python`
438 | ^^^
439 |
440 |
441 | :::
442 |
443 | :::{grid-item-card} Reading and writting zarr files with xarray
444 | :margin: 3 0 0 0
445 | :link: ./data_management_notebooks/2023-03-20-Reading_and_writing_zarr.html
446 | :link-type: url
447 | :text-align: center
448 | :shadow: md
449 |
450 | {bdg-primary}`Data Management`
451 | {bdg-secondary}`Zarr`
452 | {bdg-info}`Python`
453 | ^^^
454 |
455 |
456 | :::
457 |
458 | ::::
459 | :::::
460 |
--------------------------------------------------------------------------------
/jupyterbook/content/images/2016-10-12-fetching_data.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2016-10-12-fetching_data.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2016-11-15-glider_data_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2016-11-15-glider_data_example.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2016-11-16-CF-UGRID-SGRID-conventions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2016-11-16-CF-UGRID-SGRID-conventions.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2016-12-19-exploring_csw.archived.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2016-12-19-exploring_csw.archived.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2016-12-20-searching_glider_deployments.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2016-12-20-searching_glider_deployments.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2016-12-22-boston_light_swim.archived.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2016-12-22-boston_light_swim.archived.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-01-18-siphon-explore-thredds.archived.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-01-18-siphon-explore-thredds.archived.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-01-23-R-notebook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-01-23-R-notebook.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-03-21-ERDDAP_IOOS_Sensor_Map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-03-21-ERDDAP_IOOS_Sensor_Map.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-03-30-octave_notebook_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-03-30-octave_notebook_example.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-06-12-NCEI_RA_archive_history.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-06-12-NCEI_RA_archive_history.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-07-25-HFRadar_currents.archived.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-07-25-HFRadar_currents.archived.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-08-01-xtractoR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-08-01-xtractoR.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-09-09-hurricane_irma.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-09-09-hurricane_irma.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-11-30-rerddap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-11-30-rerddap.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2017-12-15-finding_HFRadar_currents.archived.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2017-12-15-finding_HFRadar_currents.archived.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2018-02-20-obis.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2018-02-20-obis.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2018-02-27-pocean-timeSeries-demo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2018-02-27-pocean-timeSeries-demo.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2018-03-01-erddapy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2018-03-01-erddapy.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2018-03-30-wave_height_assessment.archived.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2018-03-30-wave_height_assessment.archived.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2018-12-04-grids.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2018-12-04-grids.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2019-03-08-grids-temperature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2019-03-08-grids-temperature.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2020-02-14-QARTOD_ioos_qc_Water-Level-Example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2020-02-14-QARTOD_ioos_qc_Water-Level-Example.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2020-10-10-GTS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2020-10-10-GTS.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2021-10-25-ERDDAP-interpolate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2021-10-25-ERDDAP-interpolate.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2022-11-23_pyobis_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2022-11-23_pyobis_example.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2022-11-25-plan_surf_trip_EDS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2022-11-25-plan_surf_trip_EDS.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2023-03-20-Reading_and_writing_zarr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2023-03-20-Reading_and_writing_zarr.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2024-05-16-white_shark_water_temp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2024-05-16-white_shark_water_temp.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/2024-09-17-CKAN_API_Query.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/2024-09-17-CKAN_API_Query.png
--------------------------------------------------------------------------------
/jupyterbook/content/images/placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/images/placeholder.png
--------------------------------------------------------------------------------
/jupyterbook/content/intro.md:
--------------------------------------------------------------------------------
1 | # IOOS CodeLab
2 |
3 | ```{image} ../images/ioos_CodeLab_image_multi_hex.png
4 | ---
5 | alt: IOOS CodeLab
6 | width: 770px
7 | ---
8 | ```
9 |
10 | The IOOS CodeLab is a collection of tutorials and examples of how to access and utilize the many IOOS technologies and data sources available.
11 | This site is geared towards scientists and environmental managers interested in “diving deep” into the numbers and creating original plots and data analysis.
12 | Most notebook examples are written in Python, however,
13 | we also have a growing number of notebooks written in Matlab, and R.
14 |
15 | The notebooks will come from a variety of authors including IOOS Program Office Staff,
16 | Regional Association data managers,
17 | and other IOOS partners.
18 | If you think you have a nice example you would like to share please see the [Contributor Guide](https://github.com/ioos/ioos_code_lab/blob/main/CONTRIBUTING.md)!
19 |
20 | Feedback and questions are welcome.
21 |
22 | Please contact us at data.ioos@noaa.gov
23 |
--------------------------------------------------------------------------------
/jupyterbook/content/ioos_installation_conda.md:
--------------------------------------------------------------------------------
1 | # Installing the IOOS conda environment
2 |
3 | For IOOS Python/R/Julia users we recommend the free
4 | [Miniforge](https://github.com/conda-forge/miniforge) distribution,
5 | a lightweight version of the [Anaconda Scientific Python Distribution](https://www.anaconda.com/download) with the conda-forge channel pre-configured.
6 | While the full Anaconda distribution will also work,
7 | it is faster to install Miniforge and you can install only the packages you need.
8 | If for some reason you decide later that you want the full Anaconda distribution,
9 | you can install it by typing `conda install -c defaults anaconda`.
10 |
11 | Note that if you have the Anaconda Distribution,
12 | or any other installation,
13 | in your machine you may want to follow
14 | [these uninstall instructions](https://docs.anaconda.com/anaconda/install/uninstall/)
15 | before proceeding.
16 |
17 | ## Install
18 |
19 | Download and install the appropriate Miniforge3 installer for your platform.
20 |
21 | ### Windows
22 |
23 | Download it from [https://github.com/conda-forge/miniforge](https://github.com/conda-forge/miniforge).
24 | Run the installer
25 | Choose _Just Me_ (not _All Users_),
26 | and choose an install location owned by you.
27 | The default is fine but kind of long.
28 | We recommend something on your C drive like `C:\Miniforge`.
29 |
30 | On the "Advanced Installation Options" screen,
31 | uncheck the boxes to make Miniforge your default Python to avoid conflicts with any existing installation.
32 |
33 | 
34 |
35 | ### Linux/macOS
36 |
37 | Copy-and-paste this in the terminal:
38 |
39 | ```shell
40 | curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
41 |
42 | bash Miniforge3-$(uname)-$(uname -m).sh
43 | ```
44 |
45 | and use all the default options,
46 | except for the license agreement where you must actively change it to `yes`.
47 |
48 | ## Create the IOOS conda environment
49 |
50 | Download the [environment.yml](https://raw.githubusercontent.com/ioos/ioos_code_lab/main/.binder/environment.yml),
51 | or the [environment-python_and_r.yml](https://raw.githubusercontent.com/ioos/ioos_code_lab/main/.binder/environment-python_and_r.yml) for a bigger environment with the R packages,
52 | by right clicking with the mouse and choosing `save as...`,
53 | or, on `macOS` and `Linux`, use these commands to download:
54 |
55 | ```bash
56 | url=https://raw.githubusercontent.com/ioos/ioos_code_lab/main/.binder/environment.yml
57 | curl $url -o environment.yml
58 | ```
59 |
60 | Open the Miniforge Prompt by click on the icon below:
61 |
62 | 
63 |
64 | or open the Linux/macOS terminal.
65 |
66 | Then, from the directory where you saved the file above,
67 | type the following command to update the packages in your base environment,
68 |
69 | ```bash
70 | conda update --yes --all
71 | ```
72 |
73 | and
74 |
75 | ```bash
76 | conda env create --quiet --file environment.yml
77 | ```
78 |
79 | to create the IOOS environment locally.
80 | Change the file name to environment-python_and_r.yml if you chose to use the IOOS environment with R.
81 |
82 | That will update the packages in your base environment and then install the IOOS environment.
83 | This will trigger the download and installation of many packages,
84 | you should probably go get a coffee.
85 |
86 | Once the environment is done building, you can activate it by typing:
87 |
88 | ```bash
89 | conda activate IOOS
90 | ```
91 |
92 | Now you can start hacking the notebook with `jupyter nbclassic`,
93 | for the old style notebooks,
94 | or `jupyter-lab` for the new IDE interface.
95 |
96 | ## Exiting the IOOS environment
97 |
98 | If you want to leave the IOOS environment and return to the root environment,
99 | you can type
100 |
101 | ```bash
102 | conda deactivate
103 | ```
104 |
105 | ## Updating the IOOS environment
106 |
107 | To update an existing environment you can do,
108 |
109 | ```bash
110 | conda activate IOOS
111 | conda update --all --yes
112 | ```
113 |
114 | Sometimes that operation can be slow if you have a really old version of the environment,
115 | or even impossible to update due to package conflicts.
116 | In that case we recommend removing and re-creating the environment.
117 | To remove an existing environment you have to run:
118 |
119 | ```shell
120 | conda env remove --name IOOS
121 | ```
122 |
123 | and follow the instructions from above to re-create.
124 | Note that you don't need to re-install Miniforge.
125 | Just download a fresh version of the environment file and re-create it.
126 |
127 | ## Why we use and recommend conda
128 |
129 | Conda users can just `conda install`,
130 | which installs not only binary packages for their platform,
131 | but the binary libraries they depend on.
132 | So it's easier than `pip install` and, thanks to binary relocation,
133 | more powerful than python wheels.
134 | System-level installation of libraries and admin privileges are not required.
135 | Check out [Travis Oliphant's blog piece](https://technicaldiscovery.blogspot.com/2013/12/why-i-promote-conda.html) for more info.
136 |
137 | ## How to get help
138 |
139 | - Raise an issue [here](https://github.com/ioos/ioos_code_lab/issues)
140 | - Please get help on the [IOOS-tech Google Group](https://groups.google.com/forum/?hl=en#!forum/ioos_tech)
141 |
142 | ## Appendix
143 |
144 | ### What to do when everything seems to be broken?
145 |
146 | For example, if you are seeing kernel errors like the one below.
147 |
148 | 
149 |
150 | 1. If you believe that only your environment is broken you can follow the [update environment](#updating-the-ioos-environment) instructions from above;
151 | 1. Sometimes conda updates can break backwards compatibility and updating is broken. In those cases remove the Miniforge3 directory and perform a fresh install of the new version.
152 | 1. In rare cases you may want to install a frozen version of the environment. Like, you need the exact same version that is running on our CIs. You can accomplish that by [downloading the lock file](https://raw.githubusercontent.com/ioos/ioos_code_lab/main/.binder/conda-lock.yml) and issuing the command:
153 |
154 | ```shell
155 | conda create --name IOOS --file .binder/conda-lock.yml
156 | ```
157 |
158 | ### conda-lock
159 |
160 | Locking environments can be useful for reproducibility,
161 | Continuous Integration (CI),
162 | or when one requires faster installation.
163 | The reason is because a locked environment saves the "solved" list of packages and only downloads them.
164 | Making it much faster than creating from the environment file,
165 | and ensuring that the same packages from the time you locked will be used.
166 |
167 | To lock an environment you will need to install conda-lock,
168 |
169 | ```shell
170 | conda install conda-lock
171 | ```
172 |
173 | then execute the locking command targeting the environment file you want to lock and the platforms, like:
174 |
175 | ```shell
176 | conda-lock -f environment.yml -p osx-64 -p linux-64 -p win-64
177 | ```
178 |
179 | In the example above we are locking for macOS, Linux and Windows.
180 |
181 | ### Trouble-shooting Windows
182 |
183 | Windows can be complicated and here are a few tips to help you troubleshoot it:
184 |
185 | 1. If you did not install Miniforge on your C:\\ drive you may have a "long path error." Usually that happens when you see failures in the environment creation;
186 | 1. Installation is "successful" but nothing was installed. Please see https://github.com/ContinuumIO/anaconda-issues/issues/6258 for some reasons to why that us happening. Most common ones are aggressive anti-virus or bank apps blocking the installation;
187 | 1. Installation was successful but calling `jupyter nbclassic` just hangs while "waiting for localhost:" that is probably a firewall setting blocking the notebook or you need to update your packages. See [update environment](#updating-the-ioos-environment).
188 |
--------------------------------------------------------------------------------
/jupyterbook/content/kernel_error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/kernel_error.png
--------------------------------------------------------------------------------
/jupyterbook/content/make_gallery.py:
--------------------------------------------------------------------------------
1 | import glob
2 | import os
3 |
4 | import nbformat
5 | from nbconvert.exporters import markdown
6 |
7 | SITE_DIR = "."
8 | IMAGE_DIR = os.path.join(SITE_DIR, "images")
9 |
10 |
11 | def extract_notebook_info(nb_path):
12 | title = "No title"
13 | image = "images/placeholder.png"
14 | exporter = markdown.MarkdownExporter()
15 | output, resources = exporter.from_filename(nb_path)
16 | for line in output.splitlines():
17 | line = line.strip()
18 | if line.startswith("#"):
19 | title = line.strip("#").strip()
20 | break
21 |
22 | images = sorted(resources["outputs"])
23 | if images:
24 | img_file = images[-1]
25 | thumb_name = os.path.join(
26 | IMAGE_DIR,
27 | os.path.splitext(os.path.basename(nb_path))[0]
28 | + os.path.splitext(img_file)[-1],
29 | )
30 |
31 | with open(os.path.join(thumb_name), "wb") as thumb:
32 | thumb.write(resources["outputs"][img_file])
33 |
34 | image = os.path.relpath(thumb_name, SITE_DIR)
35 | link = f"./{nb_path.replace('.ipynb', '.html')}"
36 | return title, image, link
37 |
38 |
39 | def make_gallery_entry(nb_path):
40 | title, image, link = extract_notebook_info(nb_path)
41 | nb = nbformat.read(nb_path, as_version=4)
42 | return f"""\
43 | :::{{grid-item-card}} {title}
44 | :margin: 3 0 0 0
45 | :link: {link}
46 | :link-type: url
47 | :text-align: center
48 | :shadow: md
49 |
50 | {{bdg-primary}}`DATA SERVICE`
51 | {{bdg-secondary}}`TOPICAL KEYWORD`
52 | {{bdg-info}}`{nb["metadata"]["language_info"]["name"]}`
53 | ^^^
54 |
55 |
56 | :::
57 | """
58 |
59 |
60 | for nb_path in sorted(glob.glob("code_gallery/**/*.ipynb")):
61 | print(make_gallery_entry(nb_path))
62 |
--------------------------------------------------------------------------------
/jupyterbook/content/miniforge_select_box.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/miniforge_select_box.png
--------------------------------------------------------------------------------
/jupyterbook/content/prompt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/content/prompt.png
--------------------------------------------------------------------------------
/jupyterbook/images/Data_Demo_Center_middlepic_size770.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/images/Data_Demo_Center_middlepic_size770.png
--------------------------------------------------------------------------------
/jupyterbook/images/GLOS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/images/GLOS.png
--------------------------------------------------------------------------------
/jupyterbook/images/IOOS_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/images/IOOS_logo.png
--------------------------------------------------------------------------------
/jupyterbook/images/NANOOS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/images/NANOOS.png
--------------------------------------------------------------------------------
/jupyterbook/images/OOI_Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/images/OOI_Logo.png
--------------------------------------------------------------------------------
/jupyterbook/images/ioos_CodeLab_image_multi_hex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/images/ioos_CodeLab_image_multi_hex.png
--------------------------------------------------------------------------------
/jupyterbook/images/placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/images/placeholder.png
--------------------------------------------------------------------------------
/jupyterbook/images/python.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ioos/ioos_code_lab/bc5fef525c990d62c7d6ae0184c7ad496a5015c5/jupyterbook/images/python.png
--------------------------------------------------------------------------------
/pytest.ini:
--------------------------------------------------------------------------------
1 | [pytest]
2 | addopts =
3 | # Archived
4 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2016-12-19-exploring_csw.archived.ipynb"
5 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2016-12-22-boston_light_swim.archived.ipynb"
6 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2017-01-18-siphon-explore-thredds.archived.ipynb"
7 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2017-07-25-HFRadar_currents.archived.ipynb"
8 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2017-12-15-finding_HFRadar_currents.archived.ipynb"
9 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2019-02-26-hurricane_gis_part01.archived.ipynb"
10 | --ignore="jupyterbook/content/code_gallery/data_analysis_and_visualization_notebooks/2018-03-15-ssh-skillscore.archived.ipynb"
11 | --ignore="jupyterbook/content/code_gallery/data_analysis_and_visualization_notebooks/2018-03-30-wave_height_assessment.archived.ipynb"
12 | # Missing library/rely on versions that are too old
13 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2017-09-09-hurricane_irma.ipynb"
14 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2019-05-27-hurricane_gis_part02.ipynb"
15 | --ignore="jupyterbook/content/code_gallery/data_analysis_and_visualization_notebooks/2017-03-30-octave_notebook_example.ipynb"
16 | --ignore="jupyterbook/content/code_gallery/data_management_notebooks/2017-11-01-Creating-Archives-Using-Bagit.ipynb"
17 | # Take too long to run
18 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2019-03-08-grids-temperature.ipynb"
19 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2024-09-17-CKAN_API_Query.ipynb"
20 | # Skipping all the notbooks with the R kernel
21 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2017-08-01-xtractoR.ipynb"
22 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2017-11-30-rerddap.ipynb"
23 | --ignore="jupyterbook/content/code_gallery/data_access_notebooks/2018-02-20-obis.ipynb"
24 | --ignore="jupyterbook/content/code_gallery/data_analysis_and_visualization_notebooks/2017-01-23-R-notebook.ipynb"
25 | --ignore="jupyterbook/content/code_gallery/data_analysis_and_visualization_notebooks/2024-05-16-white_shark_water_temp.ipynb"
26 | # ERDDAP 403
27 | --ignore="jupyterbook/content/code_gallery/data_analysis_and_visualization_notebooks/2021-10-25-ERDDAP-interpolate.ipynb"
28 |
--------------------------------------------------------------------------------
/ruff.toml:
--------------------------------------------------------------------------------
1 | target-version = "py312"
2 | line-length = 120
3 | lint.select = [
4 | "F", # flakes
5 | "I", # import sorting
6 | "U", # upgrade
7 | ]
8 |
9 | lint.ignore = [
10 | "E402", # Module level import not at top of file
11 | ]
12 |
13 | # Skipping b/c These notebooks mix R and Python
14 | # NB: nbqa-ruff acts on converted .py so we cannot glob .ipynb :-/
15 | # https://github.com/nbQA-dev/nbQA/issues/823
16 | [lint.extend-per-file-ignores]
17 | "jupyterbook/content/code_gallery/data_access_notebooks/2017-11-30-rerddap*" = [
18 | "F821", # Undefined name
19 | ]
20 | "jupyterbook/content/code_gallery/data_access_notebooks/2018-02-20-obis*" = [
21 | "F821", # Undefined name
22 | ]
23 |
--------------------------------------------------------------------------------