{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Searching datasets\n", "\n", "Erddapy can wrap the same form-like search capabilities of ERDDAP with the\n", "_search_for_ keyword.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:15:45.622531Z", "iopub.status.busy": "2026-09-14T11:15:45.622365Z", "iopub.status.idle": "2026-09-14T11:15:45.884515Z", "shell.execute_reply": "2026-09-14T11:15:45.883825Z" } }, "outputs": [], "source": [ "from erddapy import ERDDAP\n", "\n", "e = ERDDAP(\n", " server=\"https://erddap.ioos.us/erddap\",\n", " protocol=\"griddap\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Single word search.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:15:45.887061Z", "iopub.status.busy": "2026-09-14T11:15:45.886748Z", "iopub.status.idle": "2026-09-14T11:15:45.943268Z", "shell.execute_reply": "2026-09-14T11:15:45.942381Z" } }, "outputs": [ { "data": { "text/plain": [ "0 etopo5_EDDGridCopy\n", "Name: Dataset ID, dtype: str" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "search_for = \"etopo\"\n", "\n", "url = e.get_search_url(search_for=search_for, response=\"csv\")\n", "\n", "pd.read_csv(url)[\"Dataset ID\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Filtering the search with extra words.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:15:45.990515Z", "iopub.status.busy": "2026-09-14T11:15:45.990298Z", "iopub.status.idle": "2026-09-14T11:15:46.025458Z", "shell.execute_reply": "2026-09-14T11:15:46.024643Z" } }, "outputs": [ { "data": { "text/plain": [ "0 etopo5_EDDGridCopy\n", "Name: Dataset ID, dtype: str" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "search_for = \"etopo5\"\n", "\n", "url = e.get_search_url(search_for=search_for, response=\"csv\")\n", "\n", "pd.read_csv(url)[\"Dataset ID\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Filtering the search with words that should **not** be found.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:15:46.027300Z", "iopub.status.busy": "2026-09-14T11:15:46.027102Z", "iopub.status.idle": "2026-09-14T11:15:46.060550Z", "shell.execute_reply": "2026-09-14T11:15:46.059653Z" } }, "outputs": [ { "data": { "text/plain": [ "0 etopo5_EDDGridCopy\n", "Name: Dataset ID, dtype: str" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "search_for = \"etopo5 -lon360\"\n", "\n", "url = e.get_search_url(search_for=search_for, response=\"csv\")\n", "\n", "pd.read_csv(url)[\"Dataset ID\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quoted search or \"phrase search,\" first let us try the unquoted search.\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:15:46.062291Z", "iopub.status.busy": "2026-09-14T11:15:46.062118Z", "iopub.status.idle": "2026-09-14T11:15:46.103929Z", "shell.execute_reply": "2026-09-14T11:15:46.103032Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "search_for = \"ocean bathymetry\"\n", "\n", "url = e.get_search_url(search_for=search_for, response=\"csv\")\n", "\n", "len(pd.read_csv(url)[\"Dataset ID\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Too many datasets because wind, speed, and wind speed are matched. Now let's use\n", "the quoted search to reduce the number of results to only wind speed.\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:15:46.105559Z", "iopub.status.busy": "2026-09-14T11:15:46.105387Z", "iopub.status.idle": "2026-09-14T11:15:46.141036Z", "shell.execute_reply": "2026-09-14T11:15:46.140248Z" } }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "search_for = '\"ocean bathymetry\"'\n", "\n", "url = e.get_search_url(search_for=search_for, response=\"csv\")\n", "\n", "len(pd.read_csv(url)[\"Dataset ID\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another common search operation would be to search multiple servers instead of\n", "only one. In erddapy we can achieve that with `search_servers`:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:15:46.142965Z", "iopub.status.busy": "2026-09-14T11:15:46.142643Z", "iopub.status.idle": "2026-09-14T11:17:25.662675Z", "shell.execute_reply": "2026-09-14T11:17:25.661682Z" } }, "outputs": [], "source": [ "from erddapy.multiple_server_search import search_servers\n", "\n", "df = search_servers(\n", " query=\"glider\",\n", " servers_list=None,\n", " parallel=True,\n", " protocol=\"tabledap\",\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:17:25.664518Z", "iopub.status.busy": "2026-09-14T11:17:25.664322Z", "iopub.status.idle": "2026-09-14T11:17:25.667925Z", "shell.execute_reply": "2026-09-14T11:17:25.667168Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are 7295 entries in this search!\n" ] } ], "source": [ "print(f\"There are {len(df)} entries in this search!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are the servers that have glider data according to our query.\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:17:25.669644Z", "iopub.status.busy": "2026-09-14T11:17:25.669465Z", "iopub.status.idle": "2026-09-14T11:17:25.675656Z", "shell.execute_reply": "2026-09-14T11:17:25.674639Z" }, "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "{'http://erddap.cencoos.org/erddap/',\n", " 'http://erddap.secoora.org/erddap/',\n", " 'http://tds.marine.rutgers.edu/erddap/',\n", " 'https://cioosatlantic.ca/erddap/',\n", " 'https://coastwatch.pfeg.noaa.gov/erddap/',\n", " 'https://cwcgom.aoml.noaa.gov/erddap/',\n", " 'https://data.cioospacific.ca/erddap/',\n", " 'https://data.pmel.noaa.gov/pmel/erddap/',\n", " 'https://erddap.bco-dmo.org/erddap/',\n", " 'https://erddap.emodnet-physics.eu/erddap/',\n", " 'https://erddap.griidc.org/erddap/',\n", " 'https://erddap.observations.voiceoftheocean.org/erddap/',\n", " 'https://erddap.ondeckdata.com/erddap/',\n", " 'https://erddap.sensors.ioos.us/erddap/',\n", " 'https://gliders.ioos.us/erddap/',\n", " 'https://linkedsystems.uk/erddap/',\n", " 'https://oceanview.pfeg.noaa.gov/erddap/',\n", " 'https://pae-paha.pacioos.hawaii.edu/erddap/',\n", " 'https://spraydata.ucsd.edu/erddap/',\n", " 'https://upwell.pfeg.noaa.gov/erddap/',\n", " 'https://www.ifremer.fr/erddap/',\n", " 'https://www.smartatlantic.ca/erddap/'}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "set(df[\"Server url\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One way to reduce is to search a subset of the servers with the `servers_list`\n", "argument. We can also use it to search servers that are not part of the awesome\n", "ERDDAP list (https://github.com/IrishMarineInstitute/awesome-erddap).\n", "\n", "One can also perform an advanced search with ERDDAP constraints\n", "`advanced_search_servers`.\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2026-09-14T11:17:25.677281Z", "iopub.status.busy": "2026-09-14T11:17:25.677096Z", "iopub.status.idle": "2026-09-14T11:17:26.947771Z", "shell.execute_reply": "2026-09-14T11:17:26.946623Z" } }, "outputs": [ { "data": { "text/html": [ "
| \n", " | Title | \n", "Institution | \n", "Dataset ID | \n", "Server url | \n", "
|---|---|---|---|---|
| 0 | \n", "Coastal Endurance: Oregon Inshore Surface Moor... | \n", "Ocean Observatories Initiative (OOI) | \n", "ooi-ce01issm-rid16-02-flortd000 | \n", "https://erddap.dataexplorer.oceanobservatories... | \n", "
| 1 | \n", "Coastal Endurance: Oregon Inshore Surface Moor... | \n", "Ocean Observatories Initiative (OOI) | \n", "ooi-ce01issm-rid16-03-ctdbpc000 | \n", "https://erddap.dataexplorer.oceanobservatories... | \n", "
| 2 | \n", "Coastal Endurance: Oregon Inshore Surface Moor... | \n", "Ocean Observatories Initiative (OOI) | \n", "ooi-ce01issm-rid16-03-dostad000 | \n", "https://erddap.dataexplorer.oceanobservatories... | \n", "
| 3 | \n", "Coastal Endurance: Oregon Inshore Surface Moor... | \n", "Ocean Observatories Initiative (OOI) | \n", "ooi-ce01issm-rid16-07-nutnrb000 | \n", "https://erddap.dataexplorer.oceanobservatories... | \n", "
| 4 | \n", "Coastal Endurance: Oregon Inshore Surface Moor... | \n", "Ocean Observatories Initiative (OOI) | \n", "ooi-ce01issm-rid16-06-phsend000 | \n", "https://erddap.dataexplorer.oceanobservatories... | \n", "