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() | |