Edwin Salguero
Enhanced FRED ML with improved Reports & Insights page, fixed alignment analysis, and comprehensive analytics improvements
2469150
#!/usr/bin/env python3 | |
""" | |
Alignment and Divergence Analysis Test | |
Test the new alignment/divergence analyzer with real FRED data | |
""" | |
import os | |
import sys | |
import pandas as pd | |
import numpy as np | |
from datetime import datetime | |
# Add src to path | |
sys.path.append(os.path.join(os.path.dirname(__file__), 'src')) | |
from src.core.enhanced_fred_client import EnhancedFREDClient | |
from src.analysis.alignment_divergence_analyzer import AlignmentDivergenceAnalyzer | |
def test_alignment_divergence_analysis(): | |
"""Test the new alignment and divergence analysis""" | |
# Use the provided API key | |
api_key = "acf8bbec7efe3b6dfa6ae083e7152314" | |
print("=== ALIGNMENT & DIVERGENCE ANALYSIS TEST ===") | |
print("Using Spearman correlation for long-term alignment detection") | |
print("Using Z-score analysis for sudden deviation detection") | |
print() | |
try: | |
# Initialize FRED client | |
client = EnhancedFREDClient(api_key) | |
# Fetch economic data (last 5 years for better trend analysis) | |
end_date = datetime.now() | |
start_date = end_date.replace(year=end_date.year - 5) | |
print("1. Fetching economic data...") | |
data = client.fetch_economic_data( | |
start_date=start_date.strftime('%Y-%m-%d'), | |
end_date=end_date.strftime('%Y-%m-%d') | |
) | |
if data.empty: | |
print("β No data fetched") | |
return | |
print(f"β Fetched {len(data)} observations across {len(data.columns)} indicators") | |
print(f" Date range: {data.index.min()} to {data.index.max()}") | |
print(f" Indicators: {list(data.columns)}") | |
print() | |
# Initialize alignment analyzer | |
analyzer = AlignmentDivergenceAnalyzer(data) | |
# 2. Analyze long-term alignment using Spearman correlation | |
print("2. Analyzing long-term alignment (Spearman correlation)...") | |
alignment_results = analyzer.analyze_long_term_alignment( | |
window_sizes=[12, 24, 48], # 1, 2, 4 years for quarterly data | |
min_periods=8 | |
) | |
print("β Long-term alignment analysis completed") | |
print(f" Analyzed {len(alignment_results['rolling_correlations'])} indicator pairs") | |
# Show alignment summary | |
summary = alignment_results['alignment_summary'] | |
print(f" Increasing alignment pairs: {len(summary['increasing_alignment'])}") | |
print(f" Decreasing alignment pairs: {len(summary['decreasing_alignment'])}") | |
print(f" Stable alignment pairs: {len(summary['stable_alignment'])}") | |
print(f" Strong trends: {len(summary['strong_trends'])}") | |
print() | |
# Show some specific alignment trends | |
if summary['increasing_alignment']: | |
print("πΊ Examples of increasing alignment:") | |
for pair in summary['increasing_alignment'][:3]: | |
print(f" - {pair}") | |
print() | |
if summary['decreasing_alignment']: | |
print("π» Examples of decreasing alignment:") | |
for pair in summary['decreasing_alignment'][:3]: | |
print(f" - {pair}") | |
print() | |
# 3. Detect sudden deviations using Z-score analysis | |
print("3. Detecting sudden deviations (Z-score analysis)...") | |
deviation_results = analyzer.detect_sudden_deviations( | |
z_threshold=2.0, # Flag deviations beyond 2 standard deviations | |
window_size=12, # 3-year rolling window for quarterly data | |
min_periods=6 | |
) | |
print("β Sudden deviation detection completed") | |
# Show deviation summary | |
dev_summary = deviation_results['deviation_summary'] | |
print(f" Total deviations detected: {dev_summary['total_deviations']}") | |
print(f" Indicators with deviations: {len(dev_summary['indicators_with_deviations'])}") | |
print(f" Extreme events: {dev_summary['extreme_events_count']}") | |
print() | |
# Show most volatile indicators | |
if dev_summary['most_volatile_indicators']: | |
print("π Most volatile indicators:") | |
for item in dev_summary['most_volatile_indicators'][:5]: | |
print(f" - {item['indicator']}: {item['volatility']:.4f} volatility") | |
print() | |
# Show extreme events | |
extreme_events = deviation_results['extreme_events'] | |
if extreme_events: | |
print("π¨ Recent extreme events (Z-score > 3.0):") | |
for indicator, events in extreme_events.items(): | |
if events['events']: | |
extreme_events_list = [e for e in events['events'] if abs(e['z_score']) > 3.0] | |
if extreme_events_list: | |
latest = extreme_events_list[0] | |
print(f" - {indicator}: {latest['date'].strftime('%Y-%m-%d')} " | |
f"(Z-score: {latest['z_score']:.2f}, Growth: {latest['growth_rate']:.2f}%)") | |
print() | |
# 4. Generate insights report | |
print("4. Generating comprehensive insights report...") | |
insights_report = analyzer.generate_insights_report() | |
print("β Insights report generated") | |
print() | |
# Save insights to file | |
with open('alignment_divergence_insights.txt', 'w') as f: | |
f.write(insights_report) | |
print("π Insights report saved to 'alignment_divergence_insights.txt'") | |
print() | |
# 5. Create visualization | |
print("5. Creating alignment analysis visualization...") | |
analyzer.plot_alignment_analysis(save_path='alignment_analysis_plot.png') | |
print("π Visualization saved to 'alignment_analysis_plot.png'") | |
print() | |
# 6. Detailed analysis examples | |
print("6. Detailed analysis examples:") | |
print() | |
# Show specific correlation trends | |
if alignment_results['trend_analysis']: | |
print("π Correlation Trend Examples:") | |
for pair_name, trends in list(alignment_results['trend_analysis'].items())[:3]: | |
print(f" {pair_name}:") | |
for window_name, trend_info in trends.items(): | |
if trend_info['trend'] != 'insufficient_data': | |
print(f" {window_name}: {trend_info['trend']} ({trend_info['strength']})") | |
print(f" Slope: {trend_info['slope']:.4f}, RΒ²: {trend_info['r_squared']:.3f}") | |
print() | |
# Show specific deviation patterns | |
if deviation_results['z_scores']: | |
print("β οΈ Deviation Pattern Examples:") | |
for indicator, z_scores in list(deviation_results['z_scores'].items())[:3]: | |
deviations = deviation_results['deviations'][indicator] | |
if not deviations.empty: | |
print(f" {indicator}:") | |
print(f" Total deviations: {len(deviations)}") | |
print(f" Max Z-score: {deviations.abs().max():.2f}") | |
print(f" Mean Z-score: {deviations.abs().mean():.2f}") | |
print(f" Recent deviations: {len(deviations[deviations.index > '2023-01-01'])}") | |
print() | |
print("=== ANALYSIS COMPLETED SUCCESSFULLY ===") | |
print("β Spearman correlation analysis for long-term alignment") | |
print("β Z-score analysis for sudden deviation detection") | |
print("β Comprehensive insights and visualizations generated") | |
print() | |
print("Key findings:") | |
print("- Long-term alignment patterns identified using rolling Spearman correlation") | |
print("- Sudden deviations flagged using Z-score analysis") | |
print("- Extreme events detected and categorized") | |
print("- Volatility patterns analyzed across indicators") | |
except Exception as e: | |
print(f"β Error during alignment/divergence analysis: {e}") | |
import traceback | |
traceback.print_exc() | |
if __name__ == "__main__": | |
test_alignment_divergence_analysis() |