Edwin Salguero
Enhanced FRED ML with improved Reports & Insights page, fixed alignment analysis, and comprehensive analytics improvements
2122497
#!/usr/bin/env python3 | |
""" | |
Comprehensive Economic Analytics Demo | |
Demonstrates advanced analytics capabilities including forecasting, segmentation, and statistical modeling | |
""" | |
import logging | |
import os | |
import sys | |
from datetime import datetime | |
from pathlib import Path | |
# Add src to path | |
project_root = Path(__file__).parent.parent | |
sys.path.append(str(project_root)) | |
from src.analysis.comprehensive_analytics import ComprehensiveAnalytics | |
from src.core.enhanced_fred_client import EnhancedFREDClient | |
from config.settings import FRED_API_KEY | |
def setup_logging(): | |
"""Setup logging for demo""" | |
logging.basicConfig( | |
level=logging.INFO, | |
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' | |
) | |
def run_basic_demo(): | |
"""Run basic demo with key economic indicators""" | |
print("=" * 80) | |
print("ECONOMIC ANALYTICS DEMO - BASIC ANALYSIS") | |
print("=" * 80) | |
# Initialize client | |
client = EnhancedFREDClient(FRED_API_KEY) | |
# Fetch data for key indicators | |
indicators = ['GDPC1', 'INDPRO', 'RSAFS'] | |
print(f"\n๐ Fetching data for indicators: {indicators}") | |
try: | |
data = client.fetch_economic_data( | |
indicators=indicators, | |
start_date='2010-01-01', | |
end_date='2024-01-01' | |
) | |
print(f"โ Successfully fetched {len(data)} observations") | |
print(f"๐ Date range: {data.index.min().strftime('%Y-%m')} to {data.index.max().strftime('%Y-%m')}") | |
# Data quality report | |
quality_report = client.validate_data_quality(data) | |
print(f"\n๐ Data Quality Summary:") | |
for series, metrics in quality_report['missing_data'].items(): | |
print(f" โข {series}: {metrics['completeness']:.1f}% complete") | |
return data | |
except Exception as e: | |
print(f"โ Error fetching data: {e}") | |
return None | |
def run_forecasting_demo(data): | |
"""Run forecasting demo""" | |
print("\n" + "=" * 80) | |
print("FORECASTING DEMO") | |
print("=" * 80) | |
from src.analysis.economic_forecasting import EconomicForecaster | |
forecaster = EconomicForecaster(data) | |
# Forecast key indicators | |
indicators = ['GDPC1', 'INDPRO', 'RSAFS'] | |
available_indicators = [ind for ind in indicators if ind in data.columns] | |
print(f"๐ฎ Forecasting indicators: {available_indicators}") | |
for indicator in available_indicators: | |
try: | |
# Prepare data | |
series = forecaster.prepare_data(indicator) | |
# Check stationarity | |
stationarity = forecaster.check_stationarity(series) | |
print(f"\n๐ {indicator} Stationarity Test:") | |
print(f" โข ADF Statistic: {stationarity['adf_statistic']:.4f}") | |
print(f" โข P-value: {stationarity['p_value']:.4f}") | |
print(f" โข Is Stationary: {stationarity['is_stationary']}") | |
# Generate forecast | |
forecast_result = forecaster.forecast_series(series, forecast_periods=4) | |
print(f"๐ฎ {indicator} Forecast:") | |
print(f" โข Model: {forecast_result['model_type'].upper()}") | |
if forecast_result['aic']: | |
print(f" โข AIC: {forecast_result['aic']:.4f}") | |
# Backtest | |
backtest_result = forecaster.backtest_forecast(series) | |
if 'error' not in backtest_result: | |
print(f" โข Backtest MAPE: {backtest_result['mape']:.2f}%") | |
print(f" โข Backtest RMSE: {backtest_result['rmse']:.4f}") | |
except Exception as e: | |
print(f"โ Error forecasting {indicator}: {e}") | |
def run_segmentation_demo(data): | |
"""Run segmentation demo""" | |
print("\n" + "=" * 80) | |
print("SEGMENTATION DEMO") | |
print("=" * 80) | |
from src.analysis.economic_segmentation import EconomicSegmentation | |
segmentation = EconomicSegmentation(data) | |
# Time period clustering | |
print("๐ฏ Clustering time periods...") | |
try: | |
time_clusters = segmentation.cluster_time_periods( | |
indicators=['GDPC1', 'INDPRO', 'RSAFS'], | |
method='kmeans' | |
) | |
if 'error' not in time_clusters: | |
n_clusters = time_clusters['n_clusters'] | |
print(f"โ Time periods clustered into {n_clusters} economic regimes") | |
# Show cluster analysis | |
cluster_analysis = time_clusters['cluster_analysis'] | |
for cluster_id, analysis in cluster_analysis.items(): | |
print(f" โข Cluster {cluster_id}: {analysis['size']} periods ({analysis['percentage']:.1f}%)") | |
except Exception as e: | |
print(f"โ Error in time period clustering: {e}") | |
# Series clustering | |
print("\n๐ฏ Clustering economic series...") | |
try: | |
series_clusters = segmentation.cluster_economic_series( | |
indicators=['GDPC1', 'INDPRO', 'RSAFS', 'CPIAUCSL', 'FEDFUNDS', 'DGS10'], | |
method='kmeans' | |
) | |
if 'error' not in series_clusters: | |
n_clusters = series_clusters['n_clusters'] | |
print(f"โ Economic series clustered into {n_clusters} groups") | |
# Show cluster analysis | |
cluster_analysis = series_clusters['cluster_analysis'] | |
for cluster_id, analysis in cluster_analysis.items(): | |
print(f" โข Cluster {cluster_id}: {analysis['size']} series ({analysis['percentage']:.1f}%)") | |
except Exception as e: | |
print(f"โ Error in series clustering: {e}") | |
def run_statistical_demo(data): | |
"""Run statistical modeling demo""" | |
print("\n" + "=" * 80) | |
print("STATISTICAL MODELING DEMO") | |
print("=" * 80) | |
from src.analysis.statistical_modeling import StatisticalModeling | |
modeling = StatisticalModeling(data) | |
# Correlation analysis | |
print("๐ Performing correlation analysis...") | |
try: | |
corr_results = modeling.analyze_correlations() | |
significant_correlations = corr_results['significant_correlations'] | |
print(f"โ Found {len(significant_correlations)} significant correlations") | |
# Show top correlations | |
print("\n๐ Top 3 Strongest Correlations:") | |
for i, corr in enumerate(significant_correlations[:3]): | |
print(f" โข {corr['variable1']} โ {corr['variable2']}: {corr['correlation']:.3f} ({corr['strength']})") | |
except Exception as e: | |
print(f"โ Error in correlation analysis: {e}") | |
# Regression analysis | |
print("\n๐ Performing regression analysis...") | |
key_indicators = ['GDPC1', 'INDPRO', 'RSAFS'] | |
for target in key_indicators: | |
if target in data.columns: | |
try: | |
regression_result = modeling.fit_regression_model( | |
target=target, | |
lag_periods=4 | |
) | |
performance = regression_result['performance'] | |
print(f"โ {target} Regression Model:") | |
print(f" โข Rยฒ: {performance['r2']:.4f}") | |
print(f" โข RMSE: {performance['rmse']:.4f}") | |
print(f" โข MAE: {performance['mae']:.4f}") | |
# Show top coefficients | |
coefficients = regression_result['coefficients'] | |
print(f" โข Top 3 Variables:") | |
for i, row in coefficients.head(3).iterrows(): | |
print(f" - {row['variable']}: {row['coefficient']:.4f}") | |
except Exception as e: | |
print(f"โ Error in regression for {target}: {e}") | |
def run_comprehensive_demo(): | |
"""Run comprehensive analytics demo""" | |
print("=" * 80) | |
print("COMPREHENSIVE ECONOMIC ANALYTICS DEMO") | |
print("=" * 80) | |
# Initialize comprehensive analytics | |
analytics = ComprehensiveAnalytics(FRED_API_KEY, output_dir="data/exports/demo") | |
# Run complete analysis | |
print("\n๐ Running comprehensive analysis...") | |
try: | |
results = analytics.run_complete_analysis( | |
indicators=['GDPC1', 'INDPRO', 'RSAFS', 'CPIAUCSL', 'FEDFUNDS', 'DGS10'], | |
start_date='2010-01-01', | |
end_date='2024-01-01', | |
forecast_periods=4, | |
include_visualizations=True | |
) | |
print("โ Comprehensive analysis completed successfully!") | |
# Print key insights | |
if 'insights' in results: | |
insights = results['insights'] | |
print("\n๐ฏ KEY INSIGHTS:") | |
for finding in insights.get('key_findings', []): | |
print(f" โข {finding}") | |
# Print forecasting results | |
if 'forecasting' in results: | |
print("\n๐ฎ FORECASTING RESULTS:") | |
forecasting_results = results['forecasting'] | |
for indicator, result in forecasting_results.items(): | |
if 'error' not in result: | |
backtest = result.get('backtest', {}) | |
if 'error' not in backtest: | |
mape = backtest.get('mape', 0) | |
print(f" โข {indicator}: MAPE = {mape:.2f}%") | |
# Print segmentation results | |
if 'segmentation' in results: | |
print("\n๐ฏ SEGMENTATION RESULTS:") | |
segmentation_results = results['segmentation'] | |
if 'time_period_clusters' in segmentation_results: | |
time_clusters = segmentation_results['time_period_clusters'] | |
if 'error' not in time_clusters: | |
n_clusters = time_clusters.get('n_clusters', 0) | |
print(f" โข Time periods clustered into {n_clusters} economic regimes") | |
if 'series_clusters' in segmentation_results: | |
series_clusters = segmentation_results['series_clusters'] | |
if 'error' not in series_clusters: | |
n_clusters = series_clusters.get('n_clusters', 0) | |
print(f" โข Economic series clustered into {n_clusters} groups") | |
print(f"\n๐ Results saved to: data/exports/demo") | |
except Exception as e: | |
print(f"โ Error in comprehensive analysis: {e}") | |
def main(): | |
"""Main demo function""" | |
setup_logging() | |
print("๐ฏ ECONOMIC ANALYTICS DEMO") | |
print("This demo showcases advanced analytics capabilities including:") | |
print(" โข Economic data collection and quality assessment") | |
print(" โข Time series forecasting with ARIMA/ETS models") | |
print(" โข Economic segmentation (time periods and series)") | |
print(" โข Statistical modeling and correlation analysis") | |
print(" โข Comprehensive insights extraction") | |
# Check if API key is available | |
if not FRED_API_KEY: | |
print("\nโ FRED API key not found. Please set FRED_API_KEY environment variable.") | |
return | |
# Run basic demo | |
data = run_basic_demo() | |
if data is None: | |
return | |
# Run individual demos | |
run_forecasting_demo(data) | |
run_segmentation_demo(data) | |
run_statistical_demo(data) | |
# Run comprehensive demo | |
run_comprehensive_demo() | |
print("\n" + "=" * 80) | |
print("DEMO COMPLETED!") | |
print("=" * 80) | |
print("Generated outputs:") | |
print(" ๐ data/exports/demo/ - Comprehensive analysis results") | |
print(" ๐ Visualizations and reports") | |
print(" ๐ Statistical diagnostics") | |
print(" ๐ฎ Forecasting results") | |
print(" ๐ฏ Segmentation analysis") | |
if __name__ == "__main__": | |
main() |