Files
claude-scientific-skills/scientific-skills/fred-economic-data/references/geofred.md

589 lines
14 KiB
Markdown

# FRED GeoFRED Endpoints
GeoFRED endpoints provide access to geographic/regional economic data and shape files for mapping.
## Table of Contents
1. [geofred/shapes/file](#geofredshapesfile) - Get geographic shape files
2. [geofred/series/group](#geofredseriesgroup) - Get series group metadata
3. [geofred/series/data](#geofredseriesdata) - Get regional series data
4. [geofred/regional/data](#geofredregionaldata) - Get regional data by group
## Base URL
```
https://api.stlouisfed.org/geofred/
```
## About GeoFRED
GeoFRED provides regional economic data for mapping and geographic analysis:
- State-level data (unemployment, income, GDP)
- County-level data
- Metropolitan Statistical Area (MSA) data
- Federal Reserve district data
- International country data
---
## geofred/shapes/file
Get geographic shape files in GeoJSON format for mapping.
**URL:** `https://api.stlouisfed.org/geofred/shapes/file`
### Required Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `api_key` | string | 32-character API key |
### Optional Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `shape` | string | Geographic shape type |
### Shape Types
| Value | Description |
|-------|-------------|
| `bea` | Bureau of Economic Analysis regions |
| `msa` | Metropolitan Statistical Areas |
| `frb` | Federal Reserve Bank districts |
| `necta` | New England City and Town Areas |
| `state` | US states |
| `country` | Countries |
| `county` | US counties |
| `censusregion` | Census regions |
| `censusdivision` | Census divisions |
### Example
```python
# Get US state boundaries
response = requests.get(
"https://api.stlouisfed.org/geofred/shapes/file",
params={
"api_key": API_KEY,
"shape": "state"
}
)
geojson = response.json()
```
### Response (GeoJSON FeatureCollection)
```json
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "California",
"fips": "06"
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [[[...]]]
}
},
{
"type": "Feature",
"properties": {
"name": "Texas",
"fips": "48"
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [[[...]]]
}
}
]
}
```
### Mapping Example with Plotly
```python
import plotly.express as px
# Get shapes
shapes = requests.get(
"https://api.stlouisfed.org/geofred/shapes/file",
params={"api_key": API_KEY, "shape": "state"}
).json()
# Get unemployment data
data = requests.get(
"https://api.stlouisfed.org/geofred/regional/data",
params={
"api_key": API_KEY,
"series_group": "1220",
"region_type": "state",
"date": "2023-01-01",
"units": "Percent",
"frequency": "a",
"season": "NSA",
"file_type": "json"
}
).json()
# Create choropleth
fig = px.choropleth(
data["data"]["2023-01-01"],
geojson=shapes,
locations="code",
featureidkey="properties.fips",
color="value",
scope="usa",
title="Unemployment Rate by State"
)
fig.show()
```
---
## geofred/series/group
Get meta information for a regional data series.
**URL:** `https://api.stlouisfed.org/geofred/series/group`
### Required Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `api_key` | string | 32-character API key |
| `series_id` | string | FRED series ID with geographic data |
### Optional Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `file_type` | string | xml | xml or json |
### Example
```python
# Get info about Texas employment series
response = requests.get(
"https://api.stlouisfed.org/geofred/series/group",
params={
"api_key": API_KEY,
"series_id": "TXNA",
"file_type": "json"
}
)
```
### Response
```json
{
"series_group": {
"title": "All Employees: Total Nonfarm",
"region_type": "state",
"series_group": "1223",
"season": "NSA",
"units": "Thousands of Persons",
"frequency": "Annual",
"min_date": "1990-01-01",
"max_date": "2023-01-01"
}
}
```
### Response Fields
| Field | Description |
|-------|-------------|
| `title` | Series title |
| `region_type` | Geographic region type |
| `series_group` | Group identifier for related series |
| `season` | Seasonality (NSA, SA, etc.) |
| `units` | Units of measurement |
| `frequency` | Data frequency |
| `min_date` | Earliest available date |
| `max_date` | Latest available date |
**Note:** This endpoint only works with FRED series that have associated geographic data.
---
## geofred/series/data
Get regional data for a specific series.
**URL:** `https://api.stlouisfed.org/geofred/series/data`
### Required Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `api_key` | string | 32-character API key |
| `series_id` | string | FRED series ID with geographic data |
### Optional Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `file_type` | string | xml | xml or json |
| `date` | string | most recent | YYYY-MM-DD |
| `start_date` | string | - | YYYY-MM-DD |
**Note:** XML format is unavailable for county-level data.
### Example
```python
# Get Wisconsin per capita income data
response = requests.get(
"https://api.stlouisfed.org/geofred/series/data",
params={
"api_key": API_KEY,
"series_id": "WIPCPI",
"file_type": "json",
"date": "2022-01-01"
}
)
```
### Response
```json
{
"meta": {
"title": "Per Capita Personal Income",
"region": "state",
"seasonality": "Not Seasonally Adjusted",
"units": "Dollars",
"frequency": "Annual",
"date": "2022-01-01"
},
"data": {
"2022-01-01": [
{
"region": "Alabama",
"code": "01",
"value": "48000",
"series_id": "ALPCPI"
},
{
"region": "Alaska",
"code": "02",
"value": "62000",
"series_id": "AKPCPI"
}
]
}
}
```
---
## geofred/regional/data
Get regional data using a series group ID. This is the most flexible endpoint for regional data.
**URL:** `https://api.stlouisfed.org/geofred/regional/data`
### Required Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `api_key` | string | 32-character API key |
| `series_group` | string | Series group ID |
| `region_type` | string | Geographic region type |
| `date` | string | Target date (YYYY-MM-DD) |
| `season` | string | Seasonality code |
| `units` | string | Units of measurement |
### Optional Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `file_type` | string | xml | xml or json |
| `start_date` | string | - | YYYY-MM-DD |
| `frequency` | string | - | Data frequency |
| `transformation` | string | lin | Data transformation |
| `aggregation_method` | string | avg | avg, sum, eop |
### Region Types
| Value | Description |
|-------|-------------|
| `bea` | Bureau of Economic Analysis regions |
| `msa` | Metropolitan Statistical Areas |
| `frb` | Federal Reserve Bank districts |
| `necta` | New England City and Town Areas |
| `state` | US states |
| `country` | Countries |
| `county` | US counties |
| `censusregion` | Census regions |
### Seasonality Codes
| Code | Description |
|------|-------------|
| SA | Seasonally Adjusted |
| NSA | Not Seasonally Adjusted |
| SSA | Smoothed Seasonally Adjusted |
| SAAR | Seasonally Adjusted Annual Rate |
| NSAAR | Not Seasonally Adjusted Annual Rate |
### Example: State Unemployment Rates
```python
response = requests.get(
"https://api.stlouisfed.org/geofred/regional/data",
params={
"api_key": API_KEY,
"series_group": "1220", # Unemployment rate
"region_type": "state",
"date": "2023-01-01",
"units": "Percent",
"frequency": "a",
"season": "NSA",
"file_type": "json"
}
)
```
### Response
```json
{
"meta": {
"title": "Unemployment Rate",
"region": "state",
"seasonality": "Not Seasonally Adjusted",
"units": "Percent",
"frequency": "Annual"
},
"data": {
"2023-01-01": [
{
"region": "Alabama",
"code": "01",
"value": "2.8",
"series_id": "ALUR"
},
{
"region": "California",
"code": "06",
"value": "4.3",
"series_id": "CAUR"
}
]
}
}
```
### Example: Per Capita Income by County
```python
response = requests.get(
"https://api.stlouisfed.org/geofred/regional/data",
params={
"api_key": API_KEY,
"series_group": "882", # Per capita income
"region_type": "county",
"date": "2021-01-01",
"units": "Dollars",
"frequency": "a",
"season": "NSA",
"file_type": "json"
}
)
```
### Example: GDP by Metro Area
```python
response = requests.get(
"https://api.stlouisfed.org/geofred/regional/data",
params={
"api_key": API_KEY,
"series_group": "1282", # Real GDP
"region_type": "msa",
"date": "2022-01-01",
"units": "Millions of Chained 2017 Dollars",
"frequency": "a",
"season": "NSA",
"file_type": "json"
}
)
```
---
## Common Series Groups
| Group ID | Description | Region Types |
|----------|-------------|--------------|
| 882 | Per Capita Personal Income | state, county, msa |
| 1220 | Unemployment Rate | state, county, msa |
| 1223 | Total Nonfarm Employment | state, msa |
| 1282 | Real GDP | state, msa |
| 1253 | House Price Index | state, msa |
| 1005 | Population | state, county |
---
## Building a Regional Dashboard
```python
def get_state_dashboard(api_key, state_code, date):
"""Get key economic indicators for a state."""
indicators = {
"unemployment": {"group": "1220", "units": "Percent"},
"income": {"group": "882", "units": "Dollars"},
"employment": {"group": "1223", "units": "Thousands of Persons"}
}
dashboard = {}
for name, params in indicators.items():
response = requests.get(
"https://api.stlouisfed.org/geofred/regional/data",
params={
"api_key": api_key,
"series_group": params["group"],
"region_type": "state",
"date": date,
"units": params["units"],
"frequency": "a",
"season": "NSA",
"file_type": "json"
}
)
data = response.json()
# Find state data
for region in data.get("data", {}).get(date, []):
if region["code"] == state_code:
dashboard[name] = {
"value": region["value"],
"units": params["units"],
"series_id": region["series_id"]
}
break
return dashboard
# Get California dashboard
ca_data = get_state_dashboard(API_KEY, "06", "2023-01-01")
```
## Creating Choropleth Maps
```python
import pandas as pd
import plotly.express as px
def create_state_map(api_key, series_group, date, title):
"""Create a choropleth map of state-level data."""
# Get shapes
shapes = requests.get(
f"https://api.stlouisfed.org/geofred/shapes/file",
params={"api_key": api_key, "shape": "state"}
).json()
# Get data
response = requests.get(
"https://api.stlouisfed.org/geofred/regional/data",
params={
"api_key": api_key,
"series_group": series_group,
"region_type": "state",
"date": date,
"units": "Percent",
"frequency": "a",
"season": "NSA",
"file_type": "json"
}
)
data = response.json()
# Convert to DataFrame
df = pd.DataFrame(data["data"][date])
df["value"] = pd.to_numeric(df["value"], errors="coerce")
# Create map
fig = px.choropleth(
df,
geojson=shapes,
locations="code",
featureidkey="properties.fips",
color="value",
hover_name="region",
scope="usa",
title=title,
color_continuous_scale="RdYlGn_r"
)
return fig
# Create unemployment map
map_fig = create_state_map(
API_KEY,
series_group="1220",
date="2023-01-01",
title="Unemployment Rate by State (2023)"
)
map_fig.show()
```
## Time Series by Region
```python
def get_regional_time_series(api_key, series_group, region_type, start_date, end_date):
"""Get time series data for all regions."""
from datetime import datetime
# Generate dates (annual)
start = datetime.strptime(start_date, "%Y-%m-%d")
end = datetime.strptime(end_date, "%Y-%m-%d")
all_data = {}
for year in range(start.year, end.year + 1):
date = f"{year}-01-01"
response = requests.get(
"https://api.stlouisfed.org/geofred/regional/data",
params={
"api_key": api_key,
"series_group": series_group,
"region_type": region_type,
"date": date,
"units": "Percent",
"frequency": "a",
"season": "NSA",
"file_type": "json"
}
)
data = response.json()
for region in data.get("data", {}).get(date, []):
region_name = region["region"]
if region_name not in all_data:
all_data[region_name] = {}
all_data[region_name][date] = region["value"]
return all_data
# Get 5-year unemployment trends by state
trends = get_regional_time_series(
API_KEY,
series_group="1220",
region_type="state",
start_date="2019-01-01",
end_date="2023-01-01"
)
```