Skip to main content
All posts

Walkthrough · Hurricane Ida, 2021

How much did Hurricane Ida cool the Gulf?

We asked AQUAVIEW in plain English, checked the answer with a script, and found out how far to trust it. Every prompt and script is here for you to run.

AQUAVIEW TeamSeptember 25, 20269 min read

The storm

Why Ida

Hurricane Ida crossed the Gulf of Mexico on 28 and 29 August 2021 and came ashore in Louisiana. In a single day its winds went from 80 to 150 mph, one of the fastest jumps on record. Drag the slider under the map to watch it happen.

Warm water feeds hurricanes, and the Gulf was very warm that summer. So we asked a simple question: after the storm passed, how much cooler was the water it left behind? And just as important, can we trust the answer?

The science, briefly

What a hurricane does to the ocean

At the surface, a hurricane makes huge waves and violent gusts. Below the surface, its winds stir the water so hard that cold water from deeper down mixes up into the warm top layer. The storm leaves a cooler strip behind it, called a cold wake. It is usually one to a few degrees cooler than before.

We can measure both, with two kinds of instrument:

  • Buoys are floats anchored in place that record wind, waves and air pressure every ten minutes. We used buoy 42040, south of Alabama, close to Ida's path.
  • Argo floats are drifting robots that sink to two kilometres, then rise and measure temperature and saltiness on the way up. Each trip is called a profile. The dots on the map are profiles.

The plan: take every Argo profile inside a box along the storm's path for ten days before Ida, do the same for ten days after, and compare.

Step 1

Find the data on the map

Everything here is public NOAA data, and it is already indexed on AQUAVIEW. This link opens the map with three sources and the storm weeks already set: the NDBC buoys, the Argo floats (listed as GADR), and the World Ocean Database.

Open the map for Ida's weeks
The map with the three sources and the storm weeks set. Each hexagon counts the datasets inside it.
The map with the three sources and the storm weeks set. Each hexagon counts the datasets inside it.

Each dataset has its own page with what it measures and a link back to NOAA's original. Here is the buoy.

Open buoy 42040
Buoy 42040's page: where it sits, what it measures, and buttons to open or save it.
Buoy 42040's page: where it sits, what it measures, and buttons to open or save it.

Step 2

Ask for it in plain English

Cowork is AQUAVIEW's chat. You describe the data you want, and before it downloads anything it shows you a plan card: the source, the variables, the place and the dates it understood. Nothing is pulled until you say yes. You need to be signed in to use it.

01

Wind gusts, wave height and air pressure from NDBC buoy 42040 from 26 August to 1 September 2021.

When the plan card appears, check it and type yes.

The plan card, a yes, and the finished pull: a Parquet download or a Colab notebook, ready to open.
The plan card, a yes, and the finished pull: a Parquet download or a Colab notebook, ready to open.

That brings back 865 readings, one every ten minutes for the whole week. Now give the result a name, so later questions can refer to it, and ask about it.

02

Call that ida_buoy. What was the peak wave height, and when?

The answer, with the two steps behind it: naming the result, then querying it.
The answer, with the two steps behind it: naming the result, then querying it.
Biggest wave at buoy 42040
8.27 m

29 August, 12:40 UTC, a few hours before landfall. About as tall as a three-storey building.

The chat did not guess that number. The steps above its answer show what it did: it named the result (name_frame), then ran a query on it (query_frames).

Step 3

The water before and after

Now the water under the surface. First, every Argo profile in the box for the ten days before Ida.

03

Argo float temperature and salinity between 92°W and 85°W, 24°N to 29.5°N, from 19 to 28 August 2021.

Type yes at the plan card.

The plan card now shows the box too, as REGION. After the yes, the pull runs in the background.
The plan card now shows the box too, as REGION. After the yes, the pull runs in the background.

Then the same box for the ten days after.

04

Call that argo_before. Now the same box and variables from 30 August to 8 September 2021.

Type yes again. If it asks for the box, paste it from prompt 3.

Naming the first pull argo_before, then the same box for the ten days after the storm.
Naming the first pull argo_before, then the same box for the ten days after the storm.

Now the question we came for.

05

Call that argo_after. Compare the mean temperature in the top 50 metres between @argo_before and @argo_after, and tell me how many floats and profiles are in each.

The comparison: both averages, and the float and profile counts for each window.
The comparison: both averages, and the float and profile counts for each window.
Top 50 m, before
29.14 °C

58 dives by 18 floats, 29,322 readings in all

Top 50 m, after
28.43 °C

51 dives by 17 floats, 40,006 readings in all

The top 50 metres came out 0.7 °C cooler after the storm. Again, the steps above the answer show how it got there: it looked at both named results, then ran one query across them.

And if you want the data itself, ask for it:

06

Give me a download of @argo_after.

All 40,006 rows of argo_after, as a Parquet file.
All 40,006 rows of argo_after, as a Parquet file.

The honest part

Can we trust that number?

The arithmetic is right. What it means is a different question. The floats drift, so the dives before the storm and the dives after it were made by partly different floats, in different places. Some of the difference could simply be that they measured different water.

One way to check: a cold wake is shallow. The storm mixes the top of the ocean, so the cooling should fade as you go deeper. Here is the average temperature at each depth, before and after.

Before, 19 to 28 AugAfter, 30 Aug to 8 SepTop 50 m

The gap does not fade. At 300 metres the two lines are still 0.7 °C apart, and a storm does not do that on its own. So part of the difference comes from where the floats happened to be.

We can narrow it down. 15 floats dived both before and after the storm. Comparing only those, the top 50 metres went from 29.05 °C to 28.47 °C, a drop of 0.6 °C. That is closer to a fair comparison, but the floats still moved between dives.

Treat this as a walkthrough of the method, not a scientific result. Cold wakes behind big hurricanes are well documented. Measuring this one properly means matching dives by place as well as by float.

That is the point of showing the query and the data. You do not have to take the chat's word for anything, and you can check it yourself.

Try it yourself

Same data, without the chat

Everything the chat did is a normal request to AQUAVIEW's API, so a script can make the same requests and get the same answer. None of these need an account, because this is public NOAA data.

1Save this as ida.py. It asks for the same box and dates as the chat, plus the buoy.

python
import io, aquaview, pandas as pd

client = aquaview.Client()            # no key needed for public NOAA data
BOX = [-92, 24, -85, 29.5]            # west, south, east, north

def argo(window):
    raw = client.get_data("gadr",
        variables=["time", "platform_number", "depth", "temperature", "salinity"],
        bbox=BOX, datetime=window, format="parquet")
    return pd.read_parquet(io.BytesIO(raw))

before = argo("2021-08-19/2021-08-28T23:59:59Z")   # 19 to 28 August, whole days
after  = argo("2021-08-30/2021-09-08T23:59:59Z")   # 30 August to 8 September

for name, df in (("before", before), ("after", after)):
    top = df[df.depth <= 50]
    print(name, f"{len(df):,} rows", df.platform_number.nunique(), "floats",
          top.groupby(["platform_number", "time"]).ngroups, "profiles",
          f"mean T top 50 m {top.temperature.mean():.2f} C")

buoy = pd.read_parquet(io.BytesIO(client.get_data("ndbc",
    variables=["time", "wind_gust", "wave_height", "air_pressure"],
    datetime="2021-08-26/2021-09-01", filters={"station_id": "42040"},
    format="parquet")))
peak = buoy.loc[buoy.wave_height.idxmax()]
print("buoy 42040:", len(buoy), "obs, peak wave", peak.wave_height, "m at", peak.time)

2In a terminal, in the same folder, run these four lines. You need Python 3.10 or newer. The script takes about a minute.

bash
python3 -m venv ida
. ida/bin/activate
pip install aquaview pandas pyarrow
python ida.py

3You should see the same numbers as the chat:

output
before 29,322 rows 18 floats 58 profiles mean T top 50 m 29.14 C
after 40,006 rows 17 floats 51 profiles mean T top 50 m 28.43 C
buoy 42040: 865 obs, peak wave 8.27 m at 2021-08-29 12:40:00+00:00

Questions

Things people usually ask

Can the AI make the numbers up?+

Not these ones. The row counts come from the data it pulled, the averages come from a query it shows you, and a plain script gets the same numbers. If the chat and the script ever disagreed, you would see it.

Is the same float counted twice?+

No. We compared Argo with Argo. The World Ocean Database also holds copies of Argo dives, and we did not mix the two.

What about quality flags?+

We used all the data to keep the example short. Both sources carry quality flags, and you can filter on them in the same request.

Am I locked in?+

No. The catalog is standard STAC, the data comes out as CSV, Parquet or Arrow, the AI connector uses the open MCP standard, and the Python package is open source on PyPI.

Your turn

Pick a storm, any storm

Nothing here is special to Ida. Change the box and the dates and the same prompts, script and command work for other storms and other stretches of ocean.

Share this article

New posts by email

Stay up to date with AQUAVIEW. No spam, ever.