├── .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 | ![Image](https://github.com/user-attachments/assets/75af635f-e26a-434a-bd70-5b63680aa7b0) 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 | [![DOI](https://zenodo.org/badge/399546690.svg)](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 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | "
timelonlatdepthstationhumiditytemperature
01990-01-01 00:00:00-76.537.50.0Station189.70879415.698009
11990-01-01 00:00:00-76.537.510.0Station155.78947110.916656
21990-01-01 00:00:00-76.537.520.0Station150.17699415.666663
31990-01-01 00:00:00-76.537.530.0Station136.8550451.158752
41990-01-01 01:00:00-76.537.50.0Station165.01693731.059647
\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 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | "
timelongitudelatitudedepthuvstation
952022-05-10 15:18:50.687502-48.6256-27.5717100.440129-0.897934fake buoy
962022-05-11 15:18:50.687502-48.6256-27.5717100.348287-0.937388fake buoy
972022-05-12 15:18:50.687502-48.6256-27.5717100.252964-0.967476fake buoy
982022-05-13 15:18:50.687502-48.6256-27.5717100.155114-0.987897fake buoy
992022-05-14 15:18:50.687502-48.6256-27.5717100.055714-0.998447fake buoy
\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 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | "
txyzstationuv
02022-02-04 15:18:50.687502-48.6256-27.571710fake buoy-0.5063660.862319
12022-02-05 15:18:50.687502-48.6256-27.571710fake buoy-0.4177480.908563
22022-02-06 15:18:50.687502-48.6256-27.571710fake buoy-0.3249560.945729
32022-02-07 15:18:50.687502-48.6256-27.571710fake buoy-0.2289170.973446
42022-02-08 15:18:50.687502-48.6256-27.571710fake buoy-0.1305910.991436
\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 | ![miniforge_select_box](miniforge_select_box.png) 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 | ![prompt](prompt.png) 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 | ![kernel_error](kernel_error.png) 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 | --------------------------------------------------------------------------------