FREDML / src /analysis /economic_analyzer.py
Edwin Salguero
Enterprise: Transform to production-grade architecture with FastAPI, Docker, K8s, monitoring, and comprehensive tooling
832348e
#!/usr/bin/env python3
"""
Quick Start Guide for FRED Economic Data Analysis
Demonstrates how to load and analyze the collected data
"""
import os
import sys
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
from datetime import datetime, timedelta
from core.fred_client import FREDDataCollectorV2
def load_latest_data():
"""Load the most recent data file."""
import glob
import os
# Find the most recent data file
data_files = glob.glob("data/fred_economic_data_*.csv")
if not data_files:
print("No data files found. Run the collector first.")
return None
latest_file = max(data_files, key=os.path.getctime)
print(f"Loading data from: {latest_file}")
df = pd.read_csv(latest_file, index_col=0, parse_dates=True)
return df
def analyze_gdp_trends(df):
"""Analyze GDP trends."""
print("\n=== GDP Analysis ===")
if "GDP" not in df.columns:
print("GDP data not available")
return
gdp_data = df["GDP"].dropna()
print(f"GDP Data Points: {len(gdp_data)}")
print(f"Date Range: {gdp_data.index.min()} to {gdp_data.index.max()}")
print(f"Latest GDP: ${gdp_data.iloc[-1]:,.2f} billion")
print(
f"GDP Growth (last 5 years): {((gdp_data.iloc[-1] / gdp_data.iloc[-20]) - 1) * 100:.2f}%"
)
# Plot GDP trend
plt.figure(figsize=(12, 6))
gdp_data.plot(linewidth=2)
plt.title("US GDP Over Time")
plt.ylabel("GDP (Billions of Dollars)")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
def analyze_unemployment(df):
"""Analyze unemployment trends."""
print("\n=== Unemployment Analysis ===")
if "UNRATE" not in df.columns:
print("Unemployment data not available")
return
unrate_data = df["UNRATE"].dropna()
print(f"Unemployment Data Points: {len(unrate_data)}")
print(f"Current Unemployment Rate: {unrate_data.iloc[-1]:.1f}%")
print(f"Average Unemployment Rate: {unrate_data.mean():.1f}%")
print(f"Lowest Rate: {unrate_data.min():.1f}%")
print(f"Highest Rate: {unrate_data.max():.1f}%")
# Plot unemployment trend
plt.figure(figsize=(12, 6))
unrate_data.plot(linewidth=2, color="red")
plt.title("US Unemployment Rate Over Time")
plt.ylabel("Unemployment Rate (%)")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
def analyze_inflation(df):
"""Analyze inflation trends using CPI."""
print("\n=== Inflation Analysis (CPI) ===")
if "CPIAUCSL" not in df.columns:
print("CPI data not available")
return
cpi_data = df["CPIAUCSL"].dropna()
# Calculate year-over-year inflation
cpi_yoy = cpi_data.pct_change(periods=12) * 100
print(f"CPI Data Points: {len(cpi_data)}")
print(f"Current CPI: {cpi_data.iloc[-1]:.2f}")
print(f"Current YoY Inflation: {cpi_yoy.iloc[-1]:.2f}%")
print(f"Average YoY Inflation: {cpi_yoy.mean():.2f}%")
# Plot inflation trend
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))
cpi_data.plot(ax=ax1, linewidth=2, color="green")
ax1.set_title("Consumer Price Index (CPI)")
ax1.set_ylabel("CPI")
ax1.grid(True, alpha=0.3)
cpi_yoy.plot(ax=ax2, linewidth=2, color="orange")
ax2.set_title("Year-over-Year Inflation Rate")
ax2.set_ylabel("Inflation Rate (%)")
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
def analyze_interest_rates(df):
"""Analyze interest rate trends."""
print("\n=== Interest Rate Analysis ===")
rates_data = {}
if "FEDFUNDS" in df.columns:
rates_data["Federal Funds Rate"] = df["FEDFUNDS"].dropna()
if "DGS10" in df.columns:
rates_data["10-Year Treasury"] = df["DGS10"].dropna()
if not rates_data:
print("No interest rate data available")
return
for name, data in rates_data.items():
print(f"\n{name}:")
print(f" Current Rate: {data.iloc[-1]:.2f}%")
print(f" Average Rate: {data.mean():.2f}%")
print(f" Range: {data.min():.2f}% - {data.max():.2f}%")
# Plot interest rates
plt.figure(figsize=(12, 6))
for name, data in rates_data.items():
data.plot(linewidth=2, label=name)
plt.title("Interest Rates Over Time")
plt.ylabel("Interest Rate (%)")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
def correlation_analysis(df):
"""Analyze correlations between economic indicators."""
print("\n=== Correlation Analysis ===")
# Select available indicators
available_cols = [
col
for col in ["GDP", "UNRATE", "CPIAUCSL", "FEDFUNDS", "DGS10"]
if col in df.columns
]
if len(available_cols) < 2:
print("Need at least 2 indicators for correlation analysis")
return
# Calculate correlations
corr_data = df[available_cols].corr()
print("Correlation Matrix:")
print(corr_data.round(3))
# Plot correlation heatmap
plt.figure(figsize=(8, 6))
sns.heatmap(
corr_data, annot=True, cmap="coolwarm", center=0, square=True, linewidths=0.5
)
plt.title("Economic Indicators Correlation Matrix")
plt.tight_layout()
plt.show()
def main():
"""Run the quick start analysis."""
print("FRED Economic Data - Quick Start Analysis")
print("=" * 50)
# Load data
df = load_latest_data()
if df is None:
return
print(f"Data loaded successfully!")
print(f"Shape: {df.shape}")
print(f"Columns: {list(df.columns)}")
print(f"Date range: {df.index.min()} to {df.index.max()}")
# Run analyses
analyze_gdp_trends(df)
analyze_unemployment(df)
analyze_inflation(df)
analyze_interest_rates(df)
correlation_analysis(df)
print("\n=== Analysis Complete ===")
print("Check the generated plots for visual insights!")
if __name__ == "__main__":
main()