Edwin Salguero
commited on
Commit
·
099d8d9
0
Parent(s):
Initial commit after git-lfs re-init and bugfixes
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .devcontainer/devcontainer.json +33 -0
- .env.example +1 -0
- .github/actions/test-local/action.yml +78 -0
- .github/workflows/ci-cd.yml +337 -0
- .github/workflows/pull-request.yml +283 -0
- .github/workflows/release.yml +233 -0
- .github/workflows/scheduled.yml +190 -0
- .gitignore +255 -0
- .pre-commit-config.yaml +34 -0
- .streamlit/config.toml +13 -0
- .streamlit/secrets.toml +2 -0
- DEPLOYMENT.md +55 -0
- DEPLOYMENT_CHECKLIST.md +85 -0
- Dockerfile +43 -0
- LICENSE +196 -0
- MATH_ISSUES_ANALYSIS.md +221 -0
- Makefile +69 -0
- README.md +277 -0
- alignment_divergence_insights.txt +54 -0
- config/__init__.py +29 -0
- config/pipeline.yaml +16 -0
- config/settings.py +88 -0
- data/exports/fred_data_20250710_221702.csv +0 -0
- data/exports/fred_data_20250710_223022.csv +0 -0
- data/exports/fred_data_20250710_223149.csv +0 -0
- data/exports/regression_summary.txt +28 -0
- data/exports/visualizations/metadata_20250711_203710.json +13 -0
- data/exports/visualizations/metadata_20250711_212822.json +13 -0
- data/exports/visualizations/metadata_20250713_195826.json +13 -0
- data/exports/visualizations/metadata_20250713_200340.json +13 -0
- data/exports/visualizations/metadata_20250713_201004.json +13 -0
- data/processed/fred_data_20250710_221702.csv +0 -0
- data/processed/fred_data_20250710_223022.csv +0 -0
- data/processed/fred_data_20250710_223149.csv +0 -0
- data/processed/fred_economic_data_20250710_220401.csv +0 -0
- debug_data_structure.py +131 -0
- deploy/docker/docker-compose.dev.yml +47 -0
- deploy/docker/docker-compose.prod.yml +65 -0
- deploy/kubernetes/deployment.yaml +107 -0
- docs/ADVANCED_ANALYTICS_SUMMARY.md +232 -0
- docs/CI_CD_STATUS.md +133 -0
- docs/CONVERSATION_SUMMARY.md +274 -0
- docs/DEPLOYMENT_SUMMARY.md +143 -0
- docs/INTEGRATION_SUMMARY.md +292 -0
- docs/ci-cd/README.md +290 -0
- docs/deployment/streamlit-cloud.md +252 -0
- frontend/.streamlit/config.toml +18 -0
- frontend/app.py +0 -0
- frontend/config.py +67 -0
- frontend/debug_fred_api.py +125 -0
.devcontainer/devcontainer.json
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "Python 3",
|
3 |
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
4 |
+
"image": "mcr.microsoft.com/devcontainers/python:1-3.11-bullseye",
|
5 |
+
"customizations": {
|
6 |
+
"codespaces": {
|
7 |
+
"openFiles": [
|
8 |
+
"README.md",
|
9 |
+
"streamlit_app.py"
|
10 |
+
]
|
11 |
+
},
|
12 |
+
"vscode": {
|
13 |
+
"settings": {},
|
14 |
+
"extensions": [
|
15 |
+
"ms-python.python",
|
16 |
+
"ms-python.vscode-pylance"
|
17 |
+
]
|
18 |
+
}
|
19 |
+
},
|
20 |
+
"updateContentCommand": "[ -f packages.txt ] && sudo apt update && sudo apt upgrade -y && sudo xargs apt install -y <packages.txt; [ -f requirements.txt ] && pip3 install --user -r requirements.txt; pip3 install --user streamlit; echo '✅ Packages installed and Requirements met'",
|
21 |
+
"postAttachCommand": {
|
22 |
+
"server": "streamlit run streamlit_app.py --server.enableCORS false --server.enableXsrfProtection false"
|
23 |
+
},
|
24 |
+
"portsAttributes": {
|
25 |
+
"8501": {
|
26 |
+
"label": "Application",
|
27 |
+
"onAutoForward": "openPreview"
|
28 |
+
}
|
29 |
+
},
|
30 |
+
"forwardPorts": [
|
31 |
+
8501
|
32 |
+
]
|
33 |
+
}
|
.env.example
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
FRED_API_KEY=your_fred_api_key_here
|
.github/actions/test-local/action.yml
ADDED
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: 'Local Testing Action'
|
2 |
+
description: 'Reusable action for running local tests'
|
3 |
+
|
4 |
+
inputs:
|
5 |
+
test-type:
|
6 |
+
description: 'Type of test to run'
|
7 |
+
required: true
|
8 |
+
default: 'all'
|
9 |
+
python-version:
|
10 |
+
description: 'Python version to use'
|
11 |
+
required: false
|
12 |
+
default: '3.9'
|
13 |
+
aws-region:
|
14 |
+
description: 'AWS region for testing'
|
15 |
+
required: false
|
16 |
+
default: 'us-west-2'
|
17 |
+
|
18 |
+
runs:
|
19 |
+
using: 'composite'
|
20 |
+
steps:
|
21 |
+
- name: Set up Python ${{ inputs.python-version }}
|
22 |
+
uses: actions/setup-python@v4
|
23 |
+
with:
|
24 |
+
python-version: ${{ inputs.python-version }}
|
25 |
+
|
26 |
+
- name: Install dependencies
|
27 |
+
shell: bash
|
28 |
+
run: |
|
29 |
+
python -m pip install --upgrade pip
|
30 |
+
pip install -r requirements.txt
|
31 |
+
pip install pytest pytest-cov black flake8 mypy
|
32 |
+
|
33 |
+
- name: Run tests
|
34 |
+
shell: bash
|
35 |
+
run: |
|
36 |
+
case "${{ inputs.test-type }}" in
|
37 |
+
"unit")
|
38 |
+
echo "🧪 Running unit tests..."
|
39 |
+
pytest tests/unit/ -v --cov=lambda --cov=frontend --cov-report=xml
|
40 |
+
;;
|
41 |
+
"integration")
|
42 |
+
echo "🔗 Running integration tests..."
|
43 |
+
python scripts/test_complete_system.py --skip-e2e
|
44 |
+
;;
|
45 |
+
"e2e")
|
46 |
+
echo "🚀 Running end-to-end tests..."
|
47 |
+
python scripts/test_complete_system.py
|
48 |
+
;;
|
49 |
+
"quality")
|
50 |
+
echo "🔍 Running quality checks..."
|
51 |
+
black --check --diff .
|
52 |
+
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=88
|
53 |
+
mypy lambda/ frontend/ src/ --ignore-missing-imports
|
54 |
+
;;
|
55 |
+
"security")
|
56 |
+
echo "🔒 Running security scan..."
|
57 |
+
pip install bandit
|
58 |
+
bandit -r lambda/ frontend/ src/ -f json -o bandit-report.json || true
|
59 |
+
;;
|
60 |
+
"all")
|
61 |
+
echo "🧪 Running all tests..."
|
62 |
+
pytest tests/unit/ -v --cov=lambda --cov=frontend --cov-report=xml
|
63 |
+
python scripts/test_complete_system.py
|
64 |
+
black --check --diff .
|
65 |
+
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=88
|
66 |
+
mypy lambda/ frontend/ src/ --ignore-missing-imports
|
67 |
+
pip install bandit
|
68 |
+
bandit -r lambda/ frontend/ src/ -f json -o bandit-report.json || true
|
69 |
+
;;
|
70 |
+
*)
|
71 |
+
echo "❌ Unknown test type: ${{ inputs.test-type }}"
|
72 |
+
exit 1
|
73 |
+
;;
|
74 |
+
esac
|
75 |
+
env:
|
76 |
+
AWS_DEFAULT_REGION: ${{ inputs.aws-region }}
|
77 |
+
S3_BUCKET: fredmlv1
|
78 |
+
LAMBDA_FUNCTION: fred-ml-processor
|
.github/workflows/ci-cd.yml
ADDED
@@ -0,0 +1,337 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: FRED ML CI/CD Pipeline
|
2 |
+
|
3 |
+
on:
|
4 |
+
push:
|
5 |
+
branches: [ main, develop ]
|
6 |
+
pull_request:
|
7 |
+
branches: [ main ]
|
8 |
+
schedule:
|
9 |
+
# Run tests daily at 2 AM UTC
|
10 |
+
- cron: '0 2 * * *'
|
11 |
+
|
12 |
+
env:
|
13 |
+
AWS_REGION: us-west-2
|
14 |
+
S3_BUCKET: fredmlv1
|
15 |
+
LAMBDA_FUNCTION: fred-ml-processor
|
16 |
+
PYTHON_VERSION: '3.9'
|
17 |
+
|
18 |
+
jobs:
|
19 |
+
# Test and Quality Checks
|
20 |
+
test:
|
21 |
+
name: 🧪 Test & Quality
|
22 |
+
runs-on: ubuntu-latest
|
23 |
+
|
24 |
+
steps:
|
25 |
+
- name: Checkout code
|
26 |
+
uses: actions/checkout@v4
|
27 |
+
|
28 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
29 |
+
uses: actions/setup-python@v4
|
30 |
+
with:
|
31 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
32 |
+
|
33 |
+
- name: Cache pip dependencies
|
34 |
+
uses: actions/cache@v3
|
35 |
+
with:
|
36 |
+
path: ~/.cache/pip
|
37 |
+
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
38 |
+
restore-keys: |
|
39 |
+
${{ runner.os }}-pip-
|
40 |
+
|
41 |
+
- name: Install dependencies
|
42 |
+
run: |
|
43 |
+
python -m pip install --upgrade pip
|
44 |
+
pip install -r requirements.txt
|
45 |
+
pip install pytest pytest-cov black flake8 mypy
|
46 |
+
|
47 |
+
- name: Run linting
|
48 |
+
run: |
|
49 |
+
echo "🔍 Running code linting..."
|
50 |
+
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
|
51 |
+
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=88 --statistics
|
52 |
+
|
53 |
+
- name: Run type checking
|
54 |
+
run: |
|
55 |
+
echo "🔍 Running type checking..."
|
56 |
+
mypy lambda/ frontend/ src/ --ignore-missing-imports
|
57 |
+
|
58 |
+
- name: Run formatting check
|
59 |
+
run: |
|
60 |
+
echo "🎨 Checking code formatting..."
|
61 |
+
black --check --diff .
|
62 |
+
|
63 |
+
- name: Run unit tests
|
64 |
+
run: |
|
65 |
+
echo "🧪 Running unit tests..."
|
66 |
+
pytest tests/unit/ -v --cov=lambda --cov=frontend --cov-report=xml
|
67 |
+
|
68 |
+
- name: Upload coverage to Codecov
|
69 |
+
uses: codecov/codecov-action@v3
|
70 |
+
with:
|
71 |
+
file: ./coverage.xml
|
72 |
+
flags: unittests
|
73 |
+
name: codecov-umbrella
|
74 |
+
fail_ci_if_error: false
|
75 |
+
|
76 |
+
# Integration Tests
|
77 |
+
integration:
|
78 |
+
name: 🔗 Integration Tests
|
79 |
+
runs-on: ubuntu-latest
|
80 |
+
needs: test
|
81 |
+
|
82 |
+
steps:
|
83 |
+
- name: Checkout code
|
84 |
+
uses: actions/checkout@v4
|
85 |
+
|
86 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
87 |
+
uses: actions/setup-python@v4
|
88 |
+
with:
|
89 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
90 |
+
|
91 |
+
- name: Install dependencies
|
92 |
+
run: |
|
93 |
+
python -m pip install --upgrade pip
|
94 |
+
pip install -r requirements.txt
|
95 |
+
|
96 |
+
- name: Configure AWS credentials
|
97 |
+
uses: aws-actions/configure-aws-credentials@v4
|
98 |
+
with:
|
99 |
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
100 |
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
101 |
+
aws-region: ${{ env.AWS_REGION }}
|
102 |
+
|
103 |
+
- name: Run integration tests
|
104 |
+
run: |
|
105 |
+
echo "🔗 Running integration tests..."
|
106 |
+
python scripts/test_complete_system.py --skip-e2e
|
107 |
+
env:
|
108 |
+
AWS_DEFAULT_REGION: ${{ env.AWS_REGION }}
|
109 |
+
S3_BUCKET: ${{ env.S3_BUCKET }}
|
110 |
+
LAMBDA_FUNCTION: ${{ env.LAMBDA_FUNCTION }}
|
111 |
+
|
112 |
+
# End-to-End Tests
|
113 |
+
e2e:
|
114 |
+
name: 🚀 End-to-End Tests
|
115 |
+
runs-on: ubuntu-latest
|
116 |
+
needs: [test, integration]
|
117 |
+
|
118 |
+
steps:
|
119 |
+
- name: Checkout code
|
120 |
+
uses: actions/checkout@v4
|
121 |
+
|
122 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
123 |
+
uses: actions/setup-python@v4
|
124 |
+
with:
|
125 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
126 |
+
|
127 |
+
- name: Install dependencies
|
128 |
+
run: |
|
129 |
+
python -m pip install --upgrade pip
|
130 |
+
pip install -r requirements.txt
|
131 |
+
|
132 |
+
- name: Configure AWS credentials
|
133 |
+
uses: aws-actions/configure-aws-credentials@v4
|
134 |
+
with:
|
135 |
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
136 |
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
137 |
+
aws-region: ${{ env.AWS_REGION }}
|
138 |
+
|
139 |
+
- name: Run end-to-end tests
|
140 |
+
run: |
|
141 |
+
echo "🚀 Running end-to-end tests..."
|
142 |
+
python scripts/test_complete_system.py
|
143 |
+
env:
|
144 |
+
AWS_DEFAULT_REGION: ${{ env.AWS_REGION }}
|
145 |
+
S3_BUCKET: ${{ env.S3_BUCKET }}
|
146 |
+
LAMBDA_FUNCTION: ${{ env.LAMBDA_FUNCTION }}
|
147 |
+
|
148 |
+
- name: Upload test results
|
149 |
+
uses: actions/upload-artifact@v3
|
150 |
+
if: always()
|
151 |
+
with:
|
152 |
+
name: test-results
|
153 |
+
path: test_report.json
|
154 |
+
|
155 |
+
# Security Scan
|
156 |
+
security:
|
157 |
+
name: 🔒 Security Scan
|
158 |
+
runs-on: ubuntu-latest
|
159 |
+
needs: test
|
160 |
+
|
161 |
+
steps:
|
162 |
+
- name: Checkout code
|
163 |
+
uses: actions/checkout@v4
|
164 |
+
|
165 |
+
- name: Run Bandit security scan
|
166 |
+
run: |
|
167 |
+
echo "🔒 Running security scan..."
|
168 |
+
pip install bandit
|
169 |
+
bandit -r lambda/ frontend/ src/ -f json -o bandit-report.json || true
|
170 |
+
|
171 |
+
- name: Upload security report
|
172 |
+
uses: actions/upload-artifact@v3
|
173 |
+
if: always()
|
174 |
+
with:
|
175 |
+
name: security-report
|
176 |
+
path: bandit-report.json
|
177 |
+
|
178 |
+
# Build and Deploy Lambda
|
179 |
+
deploy-lambda:
|
180 |
+
name: ⚡ Deploy Lambda
|
181 |
+
runs-on: ubuntu-latest
|
182 |
+
needs: [test, integration, e2e, security]
|
183 |
+
if: github.ref == 'refs/heads/main'
|
184 |
+
|
185 |
+
steps:
|
186 |
+
- name: Checkout code
|
187 |
+
uses: actions/checkout@v4
|
188 |
+
|
189 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
190 |
+
uses: actions/setup-python@v4
|
191 |
+
with:
|
192 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
193 |
+
|
194 |
+
- name: Configure AWS credentials
|
195 |
+
uses: aws-actions/configure-aws-credentials@v4
|
196 |
+
with:
|
197 |
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
198 |
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
199 |
+
aws-region: ${{ env.AWS_REGION }}
|
200 |
+
|
201 |
+
- name: Create Lambda deployment package
|
202 |
+
run: |
|
203 |
+
echo "📦 Creating Lambda deployment package..."
|
204 |
+
cd lambda
|
205 |
+
pip install -r requirements.txt -t .
|
206 |
+
zip -r ../lambda-deployment.zip .
|
207 |
+
cd ..
|
208 |
+
|
209 |
+
- name: Update Lambda function
|
210 |
+
run: |
|
211 |
+
echo "⚡ Updating Lambda function..."
|
212 |
+
aws lambda update-function-code \
|
213 |
+
--function-name ${{ env.LAMBDA_FUNCTION }} \
|
214 |
+
--zip-file fileb://lambda-deployment.zip \
|
215 |
+
--region ${{ env.AWS_REGION }}
|
216 |
+
|
217 |
+
- name: Update Lambda configuration
|
218 |
+
run: |
|
219 |
+
echo "⚙️ Updating Lambda configuration..."
|
220 |
+
aws lambda update-function-configuration \
|
221 |
+
--function-name ${{ env.LAMBDA_FUNCTION }} \
|
222 |
+
--environment Variables="{S3_BUCKET=${{ env.S3_BUCKET }}}" \
|
223 |
+
--region ${{ env.AWS_REGION }}
|
224 |
+
|
225 |
+
- name: Update SSM parameter
|
226 |
+
run: |
|
227 |
+
echo "🔑 Updating FRED API key in SSM..."
|
228 |
+
aws ssm put-parameter \
|
229 |
+
--name "/fred-ml/api-key" \
|
230 |
+
--value "${{ secrets.FRED_API_KEY }}" \
|
231 |
+
--type "SecureString" \
|
232 |
+
--overwrite \
|
233 |
+
--region ${{ env.AWS_REGION }}
|
234 |
+
|
235 |
+
# Deploy Infrastructure
|
236 |
+
deploy-infrastructure:
|
237 |
+
name: 🏗️ Deploy Infrastructure
|
238 |
+
runs-on: ubuntu-latest
|
239 |
+
needs: [test, integration, e2e, security]
|
240 |
+
if: github.ref == 'refs/heads/main'
|
241 |
+
|
242 |
+
steps:
|
243 |
+
- name: Checkout code
|
244 |
+
uses: actions/checkout@v4
|
245 |
+
|
246 |
+
- name: Configure AWS credentials
|
247 |
+
uses: aws-actions/configure-aws-credentials@v4
|
248 |
+
with:
|
249 |
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
250 |
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
251 |
+
aws-region: ${{ env.AWS_REGION }}
|
252 |
+
|
253 |
+
- name: Deploy S3 bucket
|
254 |
+
run: |
|
255 |
+
echo "📦 Deploying S3 bucket..."
|
256 |
+
aws cloudformation deploy \
|
257 |
+
--template-file infrastructure/s3/bucket.yaml \
|
258 |
+
--stack-name fredmlv1-s3-stack \
|
259 |
+
--parameter-overrides BucketName=${{ env.S3_BUCKET }} \
|
260 |
+
--capabilities CAPABILITY_NAMED_IAM \
|
261 |
+
--region ${{ env.AWS_REGION }}
|
262 |
+
|
263 |
+
- name: Deploy EventBridge rule
|
264 |
+
run: |
|
265 |
+
echo "⏰ Deploying EventBridge rule..."
|
266 |
+
aws cloudformation deploy \
|
267 |
+
--template-file infrastructure/eventbridge/quarterly-rule.yaml \
|
268 |
+
--stack-name fred-ml-processor-eventbridge-stack \
|
269 |
+
--parameter-overrides \
|
270 |
+
LambdaFunctionName=${{ env.LAMBDA_FUNCTION }} \
|
271 |
+
S3BucketName=${{ env.S3_BUCKET }} \
|
272 |
+
--capabilities CAPABILITY_NAMED_IAM \
|
273 |
+
--region ${{ env.AWS_REGION }}
|
274 |
+
|
275 |
+
# Streamlit Cloud Deployment
|
276 |
+
deploy-streamlit:
|
277 |
+
name: 🎨 Deploy to Streamlit Cloud
|
278 |
+
runs-on: ubuntu-latest
|
279 |
+
needs: [deploy-lambda, deploy-infrastructure]
|
280 |
+
if: github.ref == 'refs/heads/main'
|
281 |
+
|
282 |
+
steps:
|
283 |
+
- name: Checkout code
|
284 |
+
uses: actions/checkout@v4
|
285 |
+
|
286 |
+
- name: Deploy to Streamlit Cloud
|
287 |
+
run: |
|
288 |
+
echo "🎨 Deploying to Streamlit Cloud..."
|
289 |
+
echo "Manual deployment required - follow instructions in docs/deployment/streamlit-cloud.md"
|
290 |
+
echo "Repository is ready for Streamlit Cloud deployment"
|
291 |
+
|
292 |
+
- name: Create deployment summary
|
293 |
+
run: |
|
294 |
+
echo "📋 Deployment Summary" > deployment-summary.md
|
295 |
+
echo "===================" >> deployment-summary.md
|
296 |
+
echo "" >> deployment-summary.md
|
297 |
+
echo "✅ Lambda function updated" >> deployment-summary.md
|
298 |
+
echo "✅ Infrastructure deployed" >> deployment-summary.md
|
299 |
+
echo "📝 Streamlit Cloud deployment: Manual step required" >> deployment-summary.md
|
300 |
+
echo "" >> deployment-summary.md
|
301 |
+
echo "Next steps:" >> deployment-summary.md
|
302 |
+
echo "1. Deploy to Streamlit Cloud using the web interface" >> deployment-summary.md
|
303 |
+
echo "2. Configure environment variables in Streamlit Cloud" >> deployment-summary.md
|
304 |
+
echo "3. Test the complete system" >> deployment-summary.md
|
305 |
+
|
306 |
+
- name: Upload deployment summary
|
307 |
+
uses: actions/upload-artifact@v3
|
308 |
+
with:
|
309 |
+
name: deployment-summary
|
310 |
+
path: deployment-summary.md
|
311 |
+
|
312 |
+
# Notifications
|
313 |
+
notify:
|
314 |
+
name: 📢 Notifications
|
315 |
+
runs-on: ubuntu-latest
|
316 |
+
needs: [deploy-streamlit]
|
317 |
+
if: always()
|
318 |
+
|
319 |
+
steps:
|
320 |
+
- name: Download test results
|
321 |
+
uses: actions/download-artifact@v3
|
322 |
+
with:
|
323 |
+
name: test-results
|
324 |
+
|
325 |
+
- name: Download deployment summary
|
326 |
+
uses: actions/download-artifact@v3
|
327 |
+
with:
|
328 |
+
name: deployment-summary
|
329 |
+
|
330 |
+
- name: Send notification
|
331 |
+
run: |
|
332 |
+
echo "📢 Sending deployment notification..."
|
333 |
+
if [ "${{ needs.deploy-streamlit.result }}" == "success" ]; then
|
334 |
+
echo "✅ Deployment completed successfully!"
|
335 |
+
else
|
336 |
+
echo "❌ Deployment failed!"
|
337 |
+
fi
|
.github/workflows/pull-request.yml
ADDED
@@ -0,0 +1,283 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: Pull Request Checks
|
2 |
+
|
3 |
+
on:
|
4 |
+
pull_request:
|
5 |
+
branches: [ main, develop ]
|
6 |
+
push:
|
7 |
+
branches: [ develop ]
|
8 |
+
|
9 |
+
env:
|
10 |
+
AWS_REGION: us-west-2
|
11 |
+
S3_BUCKET: fredmlv1
|
12 |
+
LAMBDA_FUNCTION: fred-ml-processor
|
13 |
+
PYTHON_VERSION: '3.9'
|
14 |
+
|
15 |
+
jobs:
|
16 |
+
# Code Quality Checks
|
17 |
+
quality:
|
18 |
+
name: 🔍 Code Quality
|
19 |
+
runs-on: ubuntu-latest
|
20 |
+
|
21 |
+
steps:
|
22 |
+
- name: Checkout code
|
23 |
+
uses: actions/checkout@v4
|
24 |
+
|
25 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
26 |
+
uses: actions/setup-python@v4
|
27 |
+
with:
|
28 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
29 |
+
|
30 |
+
- name: Cache pip dependencies
|
31 |
+
uses: actions/cache@v3
|
32 |
+
with:
|
33 |
+
path: ~/.cache/pip
|
34 |
+
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
35 |
+
restore-keys: |
|
36 |
+
${{ runner.os }}-pip-
|
37 |
+
|
38 |
+
- name: Install dependencies
|
39 |
+
run: |
|
40 |
+
python -m pip install --upgrade pip
|
41 |
+
pip install -r requirements.txt
|
42 |
+
pip install black flake8 mypy isort
|
43 |
+
|
44 |
+
- name: Check code formatting
|
45 |
+
run: |
|
46 |
+
echo "🎨 Checking code formatting..."
|
47 |
+
black --check --diff .
|
48 |
+
|
49 |
+
- name: Run linting
|
50 |
+
run: |
|
51 |
+
echo "🔍 Running linting..."
|
52 |
+
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
|
53 |
+
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=88 --statistics
|
54 |
+
|
55 |
+
- name: Check import sorting
|
56 |
+
run: |
|
57 |
+
echo "📦 Checking import sorting..."
|
58 |
+
isort --check-only --diff .
|
59 |
+
|
60 |
+
- name: Run type checking
|
61 |
+
run: |
|
62 |
+
echo "🔍 Running type checking..."
|
63 |
+
mypy lambda/ frontend/ src/ --ignore-missing-imports
|
64 |
+
|
65 |
+
# Unit Tests
|
66 |
+
unit-tests:
|
67 |
+
name: 🧪 Unit Tests
|
68 |
+
runs-on: ubuntu-latest
|
69 |
+
|
70 |
+
steps:
|
71 |
+
- name: Checkout code
|
72 |
+
uses: actions/checkout@v4
|
73 |
+
|
74 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
75 |
+
uses: actions/setup-python@v4
|
76 |
+
with:
|
77 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
78 |
+
|
79 |
+
- name: Install dependencies
|
80 |
+
run: |
|
81 |
+
python -m pip install --upgrade pip
|
82 |
+
pip install -r requirements.txt
|
83 |
+
pip install pytest pytest-cov
|
84 |
+
|
85 |
+
- name: Run unit tests
|
86 |
+
run: |
|
87 |
+
echo "🧪 Running unit tests..."
|
88 |
+
pytest tests/unit/ -v --cov=lambda --cov=frontend --cov-report=xml --cov-report=term-missing
|
89 |
+
|
90 |
+
- name: Upload coverage to Codecov
|
91 |
+
uses: codecov/codecov-action@v3
|
92 |
+
with:
|
93 |
+
file: ./coverage.xml
|
94 |
+
flags: unittests
|
95 |
+
name: codecov-umbrella
|
96 |
+
fail_ci_if_error: false
|
97 |
+
|
98 |
+
# Security Scan
|
99 |
+
security:
|
100 |
+
name: 🔒 Security Scan
|
101 |
+
runs-on: ubuntu-latest
|
102 |
+
|
103 |
+
steps:
|
104 |
+
- name: Checkout code
|
105 |
+
uses: actions/checkout@v4
|
106 |
+
|
107 |
+
- name: Run Bandit security scan
|
108 |
+
run: |
|
109 |
+
echo "🔒 Running security scan..."
|
110 |
+
pip install bandit
|
111 |
+
bandit -r lambda/ frontend/ src/ -f json -o bandit-report.json || true
|
112 |
+
|
113 |
+
- name: Upload security report
|
114 |
+
uses: actions/upload-artifact@v3
|
115 |
+
if: always()
|
116 |
+
with:
|
117 |
+
name: security-report
|
118 |
+
path: bandit-report.json
|
119 |
+
|
120 |
+
# Dependency Check
|
121 |
+
dependencies:
|
122 |
+
name: 📦 Dependency Check
|
123 |
+
runs-on: ubuntu-latest
|
124 |
+
|
125 |
+
steps:
|
126 |
+
- name: Checkout code
|
127 |
+
uses: actions/checkout@v4
|
128 |
+
|
129 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
130 |
+
uses: actions/setup-python@v4
|
131 |
+
with:
|
132 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
133 |
+
|
134 |
+
- name: Check for outdated dependencies
|
135 |
+
run: |
|
136 |
+
echo "📦 Checking for outdated dependencies..."
|
137 |
+
pip install pip-check-updates
|
138 |
+
pcu --version || echo "pip-check-updates not available"
|
139 |
+
|
140 |
+
- name: Check for security vulnerabilities
|
141 |
+
run: |
|
142 |
+
echo "🔒 Checking for security vulnerabilities..."
|
143 |
+
pip install safety
|
144 |
+
safety check || true
|
145 |
+
|
146 |
+
# Documentation Check
|
147 |
+
docs:
|
148 |
+
name: 📚 Documentation Check
|
149 |
+
runs-on: ubuntu-latest
|
150 |
+
|
151 |
+
steps:
|
152 |
+
- name: Checkout code
|
153 |
+
uses: actions/checkout@v4
|
154 |
+
|
155 |
+
- name: Check README
|
156 |
+
run: |
|
157 |
+
echo "📚 Checking documentation..."
|
158 |
+
if [ ! -f "README.md" ]; then
|
159 |
+
echo "❌ README.md is missing"
|
160 |
+
exit 1
|
161 |
+
fi
|
162 |
+
|
163 |
+
# Check for required sections
|
164 |
+
required_sections=("## 🏗️ Architecture" "## 🚀 Features" "## 🛠️ Setup")
|
165 |
+
for section in "${required_sections[@]}"; do
|
166 |
+
if ! grep -q "$section" README.md; then
|
167 |
+
echo "❌ Missing required section: $section"
|
168 |
+
exit 1
|
169 |
+
fi
|
170 |
+
done
|
171 |
+
|
172 |
+
echo "✅ Documentation check passed"
|
173 |
+
|
174 |
+
- name: Check deployment docs
|
175 |
+
run: |
|
176 |
+
if [ ! -f "docs/deployment/streamlit-cloud.md" ]; then
|
177 |
+
echo "❌ Streamlit Cloud deployment guide is missing"
|
178 |
+
exit 1
|
179 |
+
fi
|
180 |
+
echo "✅ Deployment documentation exists"
|
181 |
+
|
182 |
+
# Build Test
|
183 |
+
build-test:
|
184 |
+
name: 🏗️ Build Test
|
185 |
+
runs-on: ubuntu-latest
|
186 |
+
|
187 |
+
steps:
|
188 |
+
- name: Checkout code
|
189 |
+
uses: actions/checkout@v4
|
190 |
+
|
191 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
192 |
+
uses: actions/setup-python@v4
|
193 |
+
with:
|
194 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
195 |
+
|
196 |
+
- name: Install dependencies
|
197 |
+
run: |
|
198 |
+
python -m pip install --upgrade pip
|
199 |
+
pip install -r requirements.txt
|
200 |
+
|
201 |
+
- name: Test Lambda package creation
|
202 |
+
run: |
|
203 |
+
echo "📦 Testing Lambda package creation..."
|
204 |
+
cd lambda
|
205 |
+
pip install -r requirements.txt -t .
|
206 |
+
zip -r ../lambda-test-package.zip .
|
207 |
+
cd ..
|
208 |
+
|
209 |
+
if [ -f "lambda-test-package.zip" ]; then
|
210 |
+
echo "✅ Lambda package created successfully"
|
211 |
+
ls -la lambda-test-package.zip
|
212 |
+
else
|
213 |
+
echo "❌ Lambda package creation failed"
|
214 |
+
exit 1
|
215 |
+
fi
|
216 |
+
|
217 |
+
- name: Test Streamlit app import
|
218 |
+
run: |
|
219 |
+
echo "🎨 Testing Streamlit app imports..."
|
220 |
+
python -c "import sys; sys.path.append('frontend'); from app import load_config, init_aws_clients; print('✅ Streamlit app imports successfully')"
|
221 |
+
|
222 |
+
# Comment Results
|
223 |
+
comment:
|
224 |
+
name: 💬 Comment Results
|
225 |
+
runs-on: ubuntu-latest
|
226 |
+
needs: [quality, unit-tests, security, dependencies, docs, build-test]
|
227 |
+
if: github.event_name == 'pull_request'
|
228 |
+
|
229 |
+
steps:
|
230 |
+
- name: Checkout code
|
231 |
+
uses: actions/checkout@v4
|
232 |
+
|
233 |
+
- name: Download test results
|
234 |
+
uses: actions/download-artifact@v3
|
235 |
+
with:
|
236 |
+
name: test-results
|
237 |
+
|
238 |
+
- name: Create PR comment
|
239 |
+
uses: actions/github-script@v7
|
240 |
+
with:
|
241 |
+
script: |
|
242 |
+
const fs = require('fs');
|
243 |
+
|
244 |
+
let comment = '## 🧪 Pull Request Test Results\n\n';
|
245 |
+
|
246 |
+
// Check job results
|
247 |
+
const jobs = ['quality', 'unit-tests', 'security', 'dependencies', 'docs', 'build-test'];
|
248 |
+
let passed = 0;
|
249 |
+
let total = jobs.length;
|
250 |
+
|
251 |
+
for (const job of jobs) {
|
252 |
+
const result = context.payload.workflow_run?.conclusion || 'unknown';
|
253 |
+
const status = result === 'success' ? '✅' : '❌';
|
254 |
+
comment += `${status} **${job}**: ${result}\n`;
|
255 |
+
if (result === 'success') passed++;
|
256 |
+
}
|
257 |
+
|
258 |
+
comment += `\n**Summary**: ${passed}/${total} checks passed\n\n`;
|
259 |
+
|
260 |
+
if (passed === total) {
|
261 |
+
comment += '🎉 All checks passed! This PR is ready for review.\n';
|
262 |
+
} else {
|
263 |
+
comment += '⚠️ Some checks failed. Please review and fix the issues.\n';
|
264 |
+
}
|
265 |
+
|
266 |
+
// Add test coverage if available
|
267 |
+
try {
|
268 |
+
const coverage = fs.readFileSync('coverage.xml', 'utf8');
|
269 |
+
const coverageMatch = coverage.match(/<coverage.*?line-rate="([^"]+)"/);
|
270 |
+
if (coverageMatch) {
|
271 |
+
const coveragePercent = Math.round(parseFloat(coverageMatch[1]) * 100);
|
272 |
+
comment += `\n📊 **Test Coverage**: ${coveragePercent}%\n`;
|
273 |
+
}
|
274 |
+
} catch (e) {
|
275 |
+
// Coverage file not available
|
276 |
+
}
|
277 |
+
|
278 |
+
github.rest.issues.createComment({
|
279 |
+
issue_number: context.issue.number,
|
280 |
+
owner: context.repo.owner,
|
281 |
+
repo: context.repo.repo,
|
282 |
+
body: comment
|
283 |
+
});
|
.github/workflows/release.yml
ADDED
@@ -0,0 +1,233 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: Release Deployment
|
2 |
+
|
3 |
+
on:
|
4 |
+
release:
|
5 |
+
types: [published]
|
6 |
+
|
7 |
+
env:
|
8 |
+
AWS_REGION: us-west-2
|
9 |
+
S3_BUCKET: fredmlv1
|
10 |
+
LAMBDA_FUNCTION: fred-ml-processor
|
11 |
+
PYTHON_VERSION: '3.9'
|
12 |
+
|
13 |
+
jobs:
|
14 |
+
# Create Release Assets
|
15 |
+
create-assets:
|
16 |
+
name: 📦 Create Release Assets
|
17 |
+
runs-on: ubuntu-latest
|
18 |
+
|
19 |
+
steps:
|
20 |
+
- name: Checkout code
|
21 |
+
uses: actions/checkout@v4
|
22 |
+
|
23 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
24 |
+
uses: actions/setup-python@v4
|
25 |
+
with:
|
26 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
27 |
+
|
28 |
+
- name: Install dependencies
|
29 |
+
run: |
|
30 |
+
python -m pip install --upgrade pip
|
31 |
+
pip install -r requirements.txt
|
32 |
+
|
33 |
+
- name: Create Lambda deployment package
|
34 |
+
run: |
|
35 |
+
echo "📦 Creating Lambda deployment package..."
|
36 |
+
cd lambda
|
37 |
+
pip install -r requirements.txt -t .
|
38 |
+
zip -r ../lambda-release-${{ github.event.release.tag_name }}.zip .
|
39 |
+
cd ..
|
40 |
+
|
41 |
+
- name: Create documentation package
|
42 |
+
run: |
|
43 |
+
echo "📚 Creating documentation package..."
|
44 |
+
tar -czf docs-release-${{ github.event.release.tag_name }}.tar.gz docs/
|
45 |
+
|
46 |
+
- name: Create test results package
|
47 |
+
run: |
|
48 |
+
echo "🧪 Creating test results package..."
|
49 |
+
python scripts/test_complete_system.py --report-only
|
50 |
+
tar -czf test-results-${{ github.event.release.tag_name }}.tar.gz test_report.json
|
51 |
+
|
52 |
+
- name: Upload release assets
|
53 |
+
uses: actions/upload-release-asset@v1
|
54 |
+
env:
|
55 |
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
56 |
+
with:
|
57 |
+
upload_url: ${{ github.event.release.upload_url }}
|
58 |
+
asset_path: ./lambda-release-${{ github.event.release.tag_name }}.zip
|
59 |
+
asset_name: lambda-deployment-${{ github.event.release.tag_name }}.zip
|
60 |
+
asset_content_type: application/zip
|
61 |
+
|
62 |
+
- name: Upload documentation
|
63 |
+
uses: actions/upload-release-asset@v1
|
64 |
+
env:
|
65 |
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
66 |
+
with:
|
67 |
+
upload_url: ${{ github.event.release.upload_url }}
|
68 |
+
asset_path: ./docs-release-${{ github.event.release.tag_name }}.tar.gz
|
69 |
+
asset_name: documentation-${{ github.event.release.tag_name }}.tar.gz
|
70 |
+
asset_content_type: application/gzip
|
71 |
+
|
72 |
+
- name: Upload test results
|
73 |
+
uses: actions/upload-release-asset@v1
|
74 |
+
env:
|
75 |
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
76 |
+
with:
|
77 |
+
upload_url: ${{ github.event.release.upload_url }}
|
78 |
+
asset_path: ./test-results-${{ github.event.release.tag_name }}.tar.gz
|
79 |
+
asset_name: test-results-${{ github.event.release.tag_name }}.tar.gz
|
80 |
+
asset_content_type: application/gzip
|
81 |
+
|
82 |
+
# Deploy to Production
|
83 |
+
deploy-production:
|
84 |
+
name: 🚀 Deploy to Production
|
85 |
+
runs-on: ubuntu-latest
|
86 |
+
needs: create-assets
|
87 |
+
|
88 |
+
steps:
|
89 |
+
- name: Checkout code
|
90 |
+
uses: actions/checkout@v4
|
91 |
+
|
92 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
93 |
+
uses: actions/setup-python@v4
|
94 |
+
with:
|
95 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
96 |
+
|
97 |
+
- name: Configure AWS credentials
|
98 |
+
uses: aws-actions/configure-aws-credentials@v4
|
99 |
+
with:
|
100 |
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
101 |
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
102 |
+
aws-region: ${{ env.AWS_REGION }}
|
103 |
+
|
104 |
+
- name: Create Lambda deployment package
|
105 |
+
run: |
|
106 |
+
echo "📦 Creating production Lambda deployment package..."
|
107 |
+
cd lambda
|
108 |
+
pip install -r requirements.txt -t .
|
109 |
+
zip -r ../lambda-production.zip .
|
110 |
+
cd ..
|
111 |
+
|
112 |
+
- name: Update Lambda function
|
113 |
+
run: |
|
114 |
+
echo "⚡ Updating Lambda function to version ${{ github.event.release.tag_name }}..."
|
115 |
+
aws lambda update-function-code \
|
116 |
+
--function-name ${{ env.LAMBDA_FUNCTION }} \
|
117 |
+
--zip-file fileb://lambda-production.zip \
|
118 |
+
--region ${{ env.AWS_REGION }}
|
119 |
+
|
120 |
+
- name: Update Lambda configuration
|
121 |
+
run: |
|
122 |
+
echo "⚙️ Updating Lambda configuration..."
|
123 |
+
aws lambda update-function-configuration \
|
124 |
+
--function-name ${{ env.LAMBDA_FUNCTION }} \
|
125 |
+
--environment Variables="{S3_BUCKET=${{ env.S3_BUCKET }},VERSION=${{ github.event.release.tag_name }}}" \
|
126 |
+
--region ${{ env.AWS_REGION }}
|
127 |
+
|
128 |
+
- name: Update SSM parameter
|
129 |
+
run: |
|
130 |
+
echo "🔑 Updating FRED API key in SSM..."
|
131 |
+
aws ssm put-parameter \
|
132 |
+
--name "/fred-ml/api-key" \
|
133 |
+
--value "${{ secrets.FRED_API_KEY }}" \
|
134 |
+
--type "SecureString" \
|
135 |
+
--overwrite \
|
136 |
+
--region ${{ env.AWS_REGION }}
|
137 |
+
|
138 |
+
- name: Deploy infrastructure updates
|
139 |
+
run: |
|
140 |
+
echo "🏗️ Deploying infrastructure updates..."
|
141 |
+
aws cloudformation deploy \
|
142 |
+
--template-file infrastructure/s3/bucket.yaml \
|
143 |
+
--stack-name fredmlv1-s3-stack \
|
144 |
+
--parameter-overrides BucketName=${{ env.S3_BUCKET }} \
|
145 |
+
--capabilities CAPABILITY_NAMED_IAM \
|
146 |
+
--region ${{ env.AWS_REGION }}
|
147 |
+
|
148 |
+
aws cloudformation deploy \
|
149 |
+
--template-file infrastructure/eventbridge/quarterly-rule.yaml \
|
150 |
+
--stack-name fred-ml-processor-eventbridge-stack \
|
151 |
+
--parameter-overrides \
|
152 |
+
LambdaFunctionName=${{ env.LAMBDA_FUNCTION }} \
|
153 |
+
S3BucketName=${{ env.S3_BUCKET }} \
|
154 |
+
--capabilities CAPABILITY_NAMED_IAM \
|
155 |
+
--region ${{ env.AWS_REGION }}
|
156 |
+
|
157 |
+
# Run Production Tests
|
158 |
+
production-tests:
|
159 |
+
name: 🧪 Production Tests
|
160 |
+
runs-on: ubuntu-latest
|
161 |
+
needs: deploy-production
|
162 |
+
|
163 |
+
steps:
|
164 |
+
- name: Checkout code
|
165 |
+
uses: actions/checkout@v4
|
166 |
+
|
167 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
168 |
+
uses: actions/setup-python@v4
|
169 |
+
with:
|
170 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
171 |
+
|
172 |
+
- name: Install dependencies
|
173 |
+
run: |
|
174 |
+
python -m pip install --upgrade pip
|
175 |
+
pip install -r requirements.txt
|
176 |
+
|
177 |
+
- name: Configure AWS credentials
|
178 |
+
uses: aws-actions/configure-aws-credentials@v4
|
179 |
+
with:
|
180 |
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
181 |
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
182 |
+
aws-region: ${{ env.AWS_REGION }}
|
183 |
+
|
184 |
+
- name: Run production tests
|
185 |
+
run: |
|
186 |
+
echo "🧪 Running production tests..."
|
187 |
+
python scripts/test_complete_system.py --production
|
188 |
+
env:
|
189 |
+
AWS_DEFAULT_REGION: ${{ env.AWS_REGION }}
|
190 |
+
S3_BUCKET: ${{ env.S3_BUCKET }}
|
191 |
+
LAMBDA_FUNCTION: ${{ env.LAMBDA_FUNCTION }}
|
192 |
+
|
193 |
+
- name: Generate deployment report
|
194 |
+
run: |
|
195 |
+
echo "📊 Generating deployment report..."
|
196 |
+
echo "Release: ${{ github.event.release.tag_name }}" > deployment-report.txt
|
197 |
+
echo "Deployed at: $(date)" >> deployment-report.txt
|
198 |
+
echo "Lambda function: ${{ env.LAMBDA_FUNCTION }}" >> deployment-report.txt
|
199 |
+
echo "S3 bucket: ${{ env.S3_BUCKET }}" >> deployment-report.txt
|
200 |
+
echo "AWS region: ${{ env.AWS_REGION }}" >> deployment-report.txt
|
201 |
+
|
202 |
+
- name: Upload deployment report
|
203 |
+
uses: actions/upload-artifact@v3
|
204 |
+
with:
|
205 |
+
name: deployment-report
|
206 |
+
path: deployment-report.txt
|
207 |
+
|
208 |
+
# Notify Stakeholders
|
209 |
+
notify:
|
210 |
+
name: 📢 Notify Stakeholders
|
211 |
+
runs-on: ubuntu-latest
|
212 |
+
needs: [deploy-production, production-tests]
|
213 |
+
if: always()
|
214 |
+
|
215 |
+
steps:
|
216 |
+
- name: Download deployment report
|
217 |
+
uses: actions/download-artifact@v3
|
218 |
+
with:
|
219 |
+
name: deployment-report
|
220 |
+
|
221 |
+
- name: Send notification
|
222 |
+
run: |
|
223 |
+
echo "📢 Sending release notification..."
|
224 |
+
if [ "${{ needs.production-tests.result }}" == "success" ]; then
|
225 |
+
echo "✅ Release ${{ github.event.release.tag_name }} deployed successfully!"
|
226 |
+
echo "Production tests passed"
|
227 |
+
else
|
228 |
+
echo "❌ Release ${{ github.event.release.tag_name }} deployment failed!"
|
229 |
+
echo "Production tests failed"
|
230 |
+
fi
|
231 |
+
|
232 |
+
echo "Release URL: ${{ github.event.release.html_url }}"
|
233 |
+
echo "Release notes: ${{ github.event.release.body }}"
|
.github/workflows/scheduled.yml
ADDED
@@ -0,0 +1,190 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: Scheduled Maintenance
|
2 |
+
|
3 |
+
on:
|
4 |
+
schedule:
|
5 |
+
# Run quarterly on first day of each quarter at 6 AM UTC
|
6 |
+
- cron: '0 6 1 */3 *'
|
7 |
+
# Run weekly on Sundays at 8 AM UTC
|
8 |
+
- cron: '0 8 * * 0'
|
9 |
+
# Run monthly on the 1st at 10 AM UTC
|
10 |
+
- cron: '0 10 1 * *'
|
11 |
+
|
12 |
+
env:
|
13 |
+
AWS_REGION: us-west-2
|
14 |
+
S3_BUCKET: fredmlv1
|
15 |
+
LAMBDA_FUNCTION: fred-ml-processor
|
16 |
+
PYTHON_VERSION: '3.9'
|
17 |
+
|
18 |
+
jobs:
|
19 |
+
# Quarterly Health Check
|
20 |
+
quarterly-health-check:
|
21 |
+
name: 🏥 Quarterly Health Check
|
22 |
+
runs-on: ubuntu-latest
|
23 |
+
if: github.event.schedule == '0 6 1 */3 *'
|
24 |
+
|
25 |
+
steps:
|
26 |
+
- name: Checkout code
|
27 |
+
uses: actions/checkout@v4
|
28 |
+
|
29 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
30 |
+
uses: actions/setup-python@v4
|
31 |
+
with:
|
32 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
33 |
+
|
34 |
+
- name: Install dependencies
|
35 |
+
run: |
|
36 |
+
python -m pip install --upgrade pip
|
37 |
+
pip install -r requirements.txt
|
38 |
+
|
39 |
+
- name: Configure AWS credentials
|
40 |
+
uses: aws-actions/configure-aws-credentials@v4
|
41 |
+
with:
|
42 |
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
43 |
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
44 |
+
aws-region: ${{ env.AWS_REGION }}
|
45 |
+
|
46 |
+
- name: Check Lambda function status
|
47 |
+
run: |
|
48 |
+
echo "⚡ Checking Lambda function status..."
|
49 |
+
aws lambda get-function --function-name ${{ env.LAMBDA_FUNCTION }} --region ${{ env.AWS_REGION }}
|
50 |
+
|
51 |
+
- name: Check S3 bucket status
|
52 |
+
run: |
|
53 |
+
echo "📦 Checking S3 bucket status..."
|
54 |
+
aws s3 ls s3://${{ env.S3_BUCKET }} --region ${{ env.AWS_REGION }}
|
55 |
+
|
56 |
+
- name: Check EventBridge rules
|
57 |
+
run: |
|
58 |
+
echo "⏰ Checking EventBridge rules..."
|
59 |
+
aws events list-rules --name-prefix "fred-ml" --region ${{ env.AWS_REGION }}
|
60 |
+
|
61 |
+
- name: Run basic system test
|
62 |
+
run: |
|
63 |
+
echo "🧪 Running basic system test..."
|
64 |
+
python scripts/test_complete_system.py --quick
|
65 |
+
env:
|
66 |
+
AWS_DEFAULT_REGION: ${{ env.AWS_REGION }}
|
67 |
+
S3_BUCKET: ${{ env.S3_BUCKET }}
|
68 |
+
LAMBDA_FUNCTION: ${{ env.LAMBDA_FUNCTION }}
|
69 |
+
|
70 |
+
# Weekly Dependency Update Check
|
71 |
+
weekly-dependencies:
|
72 |
+
name: 📦 Weekly Dependency Check
|
73 |
+
runs-on: ubuntu-latest
|
74 |
+
if: github.event.schedule == '0 8 * * 0'
|
75 |
+
|
76 |
+
steps:
|
77 |
+
- name: Checkout code
|
78 |
+
uses: actions/checkout@v4
|
79 |
+
|
80 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
81 |
+
uses: actions/setup-python@v4
|
82 |
+
with:
|
83 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
84 |
+
|
85 |
+
- name: Check for outdated packages
|
86 |
+
run: |
|
87 |
+
echo "📦 Checking for outdated packages..."
|
88 |
+
pip install pip-check-updates
|
89 |
+
pcu --version || echo "pip-check-updates not available"
|
90 |
+
|
91 |
+
- name: Check for security vulnerabilities
|
92 |
+
run: |
|
93 |
+
echo "🔒 Checking for security vulnerabilities..."
|
94 |
+
pip install safety
|
95 |
+
safety check --json --output safety-report.json || true
|
96 |
+
|
97 |
+
- name: Upload dependency report
|
98 |
+
uses: actions/upload-artifact@v3
|
99 |
+
with:
|
100 |
+
name: dependency-report
|
101 |
+
path: safety-report.json
|
102 |
+
|
103 |
+
# Monthly Performance Test
|
104 |
+
monthly-performance:
|
105 |
+
name: ⚡ Monthly Performance Test
|
106 |
+
runs-on: ubuntu-latest
|
107 |
+
if: github.event.schedule == '0 10 1 * *'
|
108 |
+
|
109 |
+
steps:
|
110 |
+
- name: Checkout code
|
111 |
+
uses: actions/checkout@v4
|
112 |
+
|
113 |
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
114 |
+
uses: actions/setup-python@v4
|
115 |
+
with:
|
116 |
+
python-version: ${{ env.PYTHON_VERSION }}
|
117 |
+
|
118 |
+
- name: Install dependencies
|
119 |
+
run: |
|
120 |
+
python -m pip install --upgrade pip
|
121 |
+
pip install -r requirements.txt
|
122 |
+
|
123 |
+
- name: Configure AWS credentials
|
124 |
+
uses: aws-actions/configure-aws-credentials@v4
|
125 |
+
with:
|
126 |
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
127 |
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
128 |
+
aws-region: ${{ env.AWS_REGION }}
|
129 |
+
|
130 |
+
- name: Run performance tests
|
131 |
+
run: |
|
132 |
+
echo "⚡ Running performance tests..."
|
133 |
+
python scripts/test_complete_system.py --performance
|
134 |
+
env:
|
135 |
+
AWS_DEFAULT_REGION: ${{ env.AWS_REGION }}
|
136 |
+
S3_BUCKET: ${{ env.S3_BUCKET }}
|
137 |
+
LAMBDA_FUNCTION: ${{ env.LAMBDA_FUNCTION }}
|
138 |
+
|
139 |
+
- name: Generate performance report
|
140 |
+
run: |
|
141 |
+
echo "📊 Generating performance report..."
|
142 |
+
echo "Performance test completed at $(date)" > performance-report.txt
|
143 |
+
echo "Lambda function: ${{ env.LAMBDA_FUNCTION }}" >> performance-report.txt
|
144 |
+
echo "S3 bucket: ${{ env.S3_BUCKET }}" >> performance-report.txt
|
145 |
+
|
146 |
+
- name: Upload performance report
|
147 |
+
uses: actions/upload-artifact@v3
|
148 |
+
with:
|
149 |
+
name: performance-report
|
150 |
+
path: performance-report.txt
|
151 |
+
|
152 |
+
# Cleanup Old Artifacts
|
153 |
+
cleanup:
|
154 |
+
name: 🧹 Cleanup Old Artifacts
|
155 |
+
runs-on: ubuntu-latest
|
156 |
+
|
157 |
+
steps:
|
158 |
+
- name: Checkout code
|
159 |
+
uses: actions/checkout@v4
|
160 |
+
|
161 |
+
- name: Configure AWS credentials
|
162 |
+
uses: aws-actions/configure-aws-credentials@v4
|
163 |
+
with:
|
164 |
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
165 |
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
166 |
+
aws-region: ${{ env.AWS_REGION }}
|
167 |
+
|
168 |
+
- name: Clean up old S3 objects
|
169 |
+
run: |
|
170 |
+
echo "🧹 Cleaning up old S3 objects..."
|
171 |
+
# Delete objects older than 90 days
|
172 |
+
aws s3 ls s3://${{ env.S3_BUCKET }}/exports/ --recursive | \
|
173 |
+
while read -r line; do
|
174 |
+
createDate=$(echo $line | awk {'print $1'})
|
175 |
+
createDate=$(date -d "$createDate" +%s)
|
176 |
+
olderThan=$(date -d "-90 days" +%s)
|
177 |
+
if [[ $createDate -lt $olderThan ]]; then
|
178 |
+
fileName=$(echo $line | awk {'print $4'})
|
179 |
+
if [[ $fileName != "" ]]; then
|
180 |
+
aws s3 rm s3://${{ env.S3_BUCKET }}/exports/$fileName
|
181 |
+
echo "Deleted: $fileName"
|
182 |
+
fi
|
183 |
+
fi
|
184 |
+
done || echo "No old files to clean up"
|
185 |
+
|
186 |
+
- name: Clean up old Lambda logs
|
187 |
+
run: |
|
188 |
+
echo "🧹 Cleaning up old Lambda logs..."
|
189 |
+
# This is a placeholder - CloudWatch log cleanup would require additional setup
|
190 |
+
echo "CloudWatch log cleanup requires additional IAM permissions"
|
.gitignore
ADDED
@@ -0,0 +1,255 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Byte-compiled / optimized / DLL files
|
2 |
+
__pycache__/
|
3 |
+
*.py[cod]
|
4 |
+
*$py.class
|
5 |
+
|
6 |
+
# C extensions
|
7 |
+
*.so
|
8 |
+
|
9 |
+
# Distribution / packaging
|
10 |
+
.Python
|
11 |
+
build/
|
12 |
+
develop-eggs/
|
13 |
+
dist/
|
14 |
+
downloads/
|
15 |
+
eggs/
|
16 |
+
.eggs/
|
17 |
+
lib/
|
18 |
+
lib64/
|
19 |
+
parts/
|
20 |
+
sdist/
|
21 |
+
var/
|
22 |
+
wheels/
|
23 |
+
share/python-wheels/
|
24 |
+
*.egg-info/
|
25 |
+
.installed.cfg
|
26 |
+
*.egg
|
27 |
+
MANIFEST
|
28 |
+
|
29 |
+
# PyInstaller
|
30 |
+
# Usually these files are written by a python script from a template
|
31 |
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
32 |
+
*.manifest
|
33 |
+
*.spec
|
34 |
+
|
35 |
+
# Installer logs
|
36 |
+
pip-log.txt
|
37 |
+
pip-delete-this-directory.txt
|
38 |
+
|
39 |
+
# Unit test / coverage reports
|
40 |
+
htmlcov/
|
41 |
+
.tox/
|
42 |
+
.nox/
|
43 |
+
.coverage
|
44 |
+
.coverage.*
|
45 |
+
.cache
|
46 |
+
nosetests.xml
|
47 |
+
coverage.xml
|
48 |
+
*.cover
|
49 |
+
*.py,cover
|
50 |
+
.hypothesis/
|
51 |
+
.pytest_cache/
|
52 |
+
cover/
|
53 |
+
|
54 |
+
# Translations
|
55 |
+
*.mo
|
56 |
+
*.pot
|
57 |
+
|
58 |
+
# Django stuff:
|
59 |
+
*.log
|
60 |
+
local_settings.py
|
61 |
+
db.sqlite3
|
62 |
+
db.sqlite3-journal
|
63 |
+
|
64 |
+
# Flask stuff:
|
65 |
+
instance/
|
66 |
+
.webassets-cache
|
67 |
+
|
68 |
+
# Scrapy stuff:
|
69 |
+
.scrapy
|
70 |
+
|
71 |
+
# Sphinx documentation
|
72 |
+
docs/_build/
|
73 |
+
|
74 |
+
# PyBuilder
|
75 |
+
.pybuilder/
|
76 |
+
target/
|
77 |
+
|
78 |
+
# Jupyter Notebook
|
79 |
+
.ipynb_checkpoints
|
80 |
+
|
81 |
+
# IPython
|
82 |
+
profile_default/
|
83 |
+
ipython_config.py
|
84 |
+
|
85 |
+
# pyenv
|
86 |
+
# For a library or package, you might want to ignore these files since the code is
|
87 |
+
# intended to run in multiple environments; otherwise, check them in:
|
88 |
+
# .python-version
|
89 |
+
|
90 |
+
# pipenv
|
91 |
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
92 |
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
93 |
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
94 |
+
# install all needed dependencies.
|
95 |
+
#Pipfile.lock
|
96 |
+
|
97 |
+
# poetry
|
98 |
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
99 |
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
100 |
+
# commonly ignored for libraries.
|
101 |
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
102 |
+
#poetry.lock
|
103 |
+
|
104 |
+
# pdm
|
105 |
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
106 |
+
#pdm.lock
|
107 |
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
108 |
+
# in version control.
|
109 |
+
# https://pdm.fming.dev/#use-with-ide
|
110 |
+
.pdm.toml
|
111 |
+
|
112 |
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
113 |
+
__pypackages__/
|
114 |
+
|
115 |
+
# Celery stuff
|
116 |
+
celerybeat-schedule
|
117 |
+
celerybeat.pid
|
118 |
+
|
119 |
+
# SageMath parsed files
|
120 |
+
*.sage.py
|
121 |
+
|
122 |
+
# Environments
|
123 |
+
.env
|
124 |
+
.venv
|
125 |
+
env/
|
126 |
+
venv/
|
127 |
+
ENV/
|
128 |
+
env.bak/
|
129 |
+
venv.bak/
|
130 |
+
|
131 |
+
# Spyder project settings
|
132 |
+
.spyderproject
|
133 |
+
.spyproject
|
134 |
+
|
135 |
+
# Rope project settings
|
136 |
+
.ropeproject
|
137 |
+
|
138 |
+
# mkdocs documentation
|
139 |
+
/site
|
140 |
+
|
141 |
+
# mypy
|
142 |
+
.mypy_cache/
|
143 |
+
.dmypy.json
|
144 |
+
dmypy.json
|
145 |
+
|
146 |
+
# Pyre type checker
|
147 |
+
.pyre/
|
148 |
+
|
149 |
+
# pytype static type analyzer
|
150 |
+
.pytype/
|
151 |
+
|
152 |
+
# Cython debug symbols
|
153 |
+
cython_debug/
|
154 |
+
|
155 |
+
# PyCharm
|
156 |
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
157 |
+
# be added to the global gitignore or merged into this project gitignore. For a PyCharm
|
158 |
+
# project, it is recommended to include the following files:
|
159 |
+
# .idea/
|
160 |
+
# *.iml
|
161 |
+
# *.ipr
|
162 |
+
# *.iws
|
163 |
+
|
164 |
+
# VS Code
|
165 |
+
.vscode/
|
166 |
+
|
167 |
+
# macOS
|
168 |
+
.DS_Store
|
169 |
+
.AppleDouble
|
170 |
+
.LSOverride
|
171 |
+
|
172 |
+
# Icon must end with two \r
|
173 |
+
Icon
|
174 |
+
|
175 |
+
# Thumbnails
|
176 |
+
._*
|
177 |
+
|
178 |
+
# Files that might appear in the root of a volume
|
179 |
+
.DocumentRevisions-V100
|
180 |
+
.fseventsd
|
181 |
+
.Spotlight-V100
|
182 |
+
.TemporaryItems
|
183 |
+
.Trashes
|
184 |
+
.VolumeIcon.icns
|
185 |
+
.com.apple.timemachine.donotpresent
|
186 |
+
|
187 |
+
# Directories potentially created on remote AFP share
|
188 |
+
.AppleDB
|
189 |
+
.AppleDesktop
|
190 |
+
Network Trash Folder
|
191 |
+
Temporary Items
|
192 |
+
.apdisk
|
193 |
+
|
194 |
+
# Windows
|
195 |
+
Thumbs.db
|
196 |
+
Thumbs.db:encryptable
|
197 |
+
ehthumbs.db
|
198 |
+
ehthumbs_vista.db
|
199 |
+
|
200 |
+
# Dump file
|
201 |
+
*.stackdump
|
202 |
+
|
203 |
+
# Folder config file
|
204 |
+
[Dd]esktop.ini
|
205 |
+
|
206 |
+
# Recycle Bin used on file shares
|
207 |
+
$RECYCLE.BIN/
|
208 |
+
|
209 |
+
# Windows Installer files
|
210 |
+
*.cab
|
211 |
+
*.msi
|
212 |
+
*.msix
|
213 |
+
*.msm
|
214 |
+
*.msp
|
215 |
+
|
216 |
+
# Windows shortcuts
|
217 |
+
*.lnk
|
218 |
+
|
219 |
+
# Linux
|
220 |
+
*~
|
221 |
+
|
222 |
+
# temporary files which can be created if a process still has a handle open of a deleted file
|
223 |
+
.fuse_hidden*
|
224 |
+
|
225 |
+
# KDE directory preferences
|
226 |
+
.directory
|
227 |
+
|
228 |
+
# Linux trash folder which might appear on any partition or disk
|
229 |
+
.Trash-*
|
230 |
+
|
231 |
+
# .nfs files are created when an open file is removed but is still being accessed
|
232 |
+
.nfs*
|
233 |
+
|
234 |
+
# Project specific
|
235 |
+
logs/
|
236 |
+
*.log
|
237 |
+
data/exports/demo/
|
238 |
+
.coverage
|
239 |
+
htmlcov/
|
240 |
+
.pytest_cache/
|
241 |
+
__pycache__/
|
242 |
+
|
243 |
+
# AWS
|
244 |
+
.aws/
|
245 |
+
aws-credentials
|
246 |
+
|
247 |
+
# IDE
|
248 |
+
.idea/
|
249 |
+
*.swp
|
250 |
+
*.swo
|
251 |
+
*~
|
252 |
+
|
253 |
+
# Temporary files
|
254 |
+
*.tmp
|
255 |
+
*.temp
|
.pre-commit-config.yaml
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
repos:
|
2 |
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
3 |
+
rev: v4.5.0
|
4 |
+
hooks:
|
5 |
+
- id: trailing-whitespace
|
6 |
+
- id: end-of-file-fixer
|
7 |
+
- id: check-yaml
|
8 |
+
- id: check-added-large-files
|
9 |
+
- id: check-merge-conflict
|
10 |
+
- id: debug-statements
|
11 |
+
|
12 |
+
- repo: https://github.com/psf/black
|
13 |
+
rev: 23.11.0
|
14 |
+
hooks:
|
15 |
+
- id: black
|
16 |
+
language_version: python3
|
17 |
+
|
18 |
+
- repo: https://github.com/pycqa/isort
|
19 |
+
rev: 5.12.0
|
20 |
+
hooks:
|
21 |
+
- id: isort
|
22 |
+
args: ["--profile", "black"]
|
23 |
+
|
24 |
+
- repo: https://github.com/pycqa/flake8
|
25 |
+
rev: 6.1.0
|
26 |
+
hooks:
|
27 |
+
- id: flake8
|
28 |
+
args: [--max-line-length=88]
|
29 |
+
|
30 |
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
31 |
+
rev: v1.7.1
|
32 |
+
hooks:
|
33 |
+
- id: mypy
|
34 |
+
additional_dependencies: [types-all]
|
.streamlit/config.toml
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[server]
|
2 |
+
headless = true
|
3 |
+
enableCORS = false
|
4 |
+
port = 8501
|
5 |
+
|
6 |
+
[browser]
|
7 |
+
gatherUsageStats = false
|
8 |
+
|
9 |
+
[theme]
|
10 |
+
primaryColor = "#1f77b4"
|
11 |
+
backgroundColor = "#ffffff"
|
12 |
+
secondaryBackgroundColor = "#f0f2f6"
|
13 |
+
textColor = "#262730"
|
.streamlit/secrets.toml
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
# FRED API Configuration
|
2 |
+
FRED_API_KEY = "acf8bbec7efe3b6dfa6ae083e7152314"
|
DEPLOYMENT.md
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# FRED ML - Streamlit Cloud Deployment Guide
|
2 |
+
|
3 |
+
## Overview
|
4 |
+
This guide explains how to deploy the FRED ML Economic Analytics Platform to Streamlit Cloud for free.
|
5 |
+
|
6 |
+
## Prerequisites
|
7 |
+
1. GitHub account
|
8 |
+
2. Streamlit Cloud account (free at https://share.streamlit.io/)
|
9 |
+
|
10 |
+
## Deployment Steps
|
11 |
+
|
12 |
+
### 1. Push to GitHub
|
13 |
+
```bash
|
14 |
+
git add .
|
15 |
+
git commit -m "Prepare for Streamlit Cloud deployment"
|
16 |
+
git push origin main
|
17 |
+
```
|
18 |
+
|
19 |
+
### 2. Deploy to Streamlit Cloud
|
20 |
+
1. Go to https://share.streamlit.io/
|
21 |
+
2. Sign in with GitHub
|
22 |
+
3. Click "New app"
|
23 |
+
4. Select your repository: `your-username/FRED_ML`
|
24 |
+
5. Set the main file path: `streamlit_app.py`
|
25 |
+
6. Click "Deploy"
|
26 |
+
|
27 |
+
### 3. Configure Environment Variables
|
28 |
+
In Streamlit Cloud dashboard:
|
29 |
+
1. Go to your app settings
|
30 |
+
2. Add these environment variables:
|
31 |
+
- `FRED_API_KEY`: Your FRED API key
|
32 |
+
- `AWS_ACCESS_KEY_ID`: Your AWS access key
|
33 |
+
- `AWS_SECRET_ACCESS_KEY`: Your AWS secret key
|
34 |
+
- `AWS_REGION`: us-east-1
|
35 |
+
|
36 |
+
### 4. Access Your App
|
37 |
+
Your app will be available at: `https://your-app-name-your-username.streamlit.app`
|
38 |
+
|
39 |
+
## Features Available in Deployment
|
40 |
+
- ✅ Real FRED API data integration
|
41 |
+
- ✅ Advanced analytics and forecasting
|
42 |
+
- ✅ Professional enterprise-grade UI
|
43 |
+
- ✅ AWS S3 integration (if credentials provided)
|
44 |
+
- ✅ Local storage fallback
|
45 |
+
- ✅ Comprehensive download capabilities
|
46 |
+
|
47 |
+
## Troubleshooting
|
48 |
+
- If you see import errors, check that all dependencies are in `requirements.txt`
|
49 |
+
- If AWS features don't work, verify your AWS credentials in environment variables
|
50 |
+
- If FRED API doesn't work, check your FRED API key
|
51 |
+
|
52 |
+
## Security Notes
|
53 |
+
- Never commit `.env` files to GitHub
|
54 |
+
- Use Streamlit Cloud's environment variables for sensitive data
|
55 |
+
- AWS credentials are automatically secured by Streamlit Cloud
|
DEPLOYMENT_CHECKLIST.md
ADDED
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# 🚀 Streamlit Cloud Deployment Checklist
|
2 |
+
|
3 |
+
## ✅ Pre-Deployment Checklist
|
4 |
+
|
5 |
+
### 1. Code Preparation
|
6 |
+
- [x] `requirements.txt` updated with all dependencies
|
7 |
+
- [x] `streamlit_app.py` created as main entry point
|
8 |
+
- [x] `.streamlit/config.toml` configured
|
9 |
+
- [x] `.env` file in `.gitignore` (security)
|
10 |
+
- [x] All import paths working correctly
|
11 |
+
|
12 |
+
### 2. GitHub Repository
|
13 |
+
- [ ] Push all changes to GitHub
|
14 |
+
- [ ] Ensure repository is public (for free Streamlit Cloud)
|
15 |
+
- [ ] Verify no sensitive data in repository
|
16 |
+
|
17 |
+
### 3. Environment Variables (Set in Streamlit Cloud)
|
18 |
+
- [ ] `FRED_API_KEY` - Your FRED API key
|
19 |
+
- [ ] `AWS_ACCESS_KEY_ID` - Your AWS access key
|
20 |
+
- [ ] `AWS_SECRET_ACCESS_KEY` - Your AWS secret key
|
21 |
+
- [ ] `AWS_REGION` - us-east-1
|
22 |
+
|
23 |
+
## 🚀 Deployment Steps
|
24 |
+
|
25 |
+
### Step 1: Push to GitHub
|
26 |
+
```bash
|
27 |
+
git add .
|
28 |
+
git commit -m "Prepare for Streamlit Cloud deployment"
|
29 |
+
git push origin main
|
30 |
+
```
|
31 |
+
|
32 |
+
### Step 2: Deploy to Streamlit Cloud
|
33 |
+
1. Go to https://share.streamlit.io/
|
34 |
+
2. Sign in with GitHub
|
35 |
+
3. Click "New app"
|
36 |
+
4. Repository: `your-username/FRED_ML`
|
37 |
+
5. Main file path: `streamlit_app.py`
|
38 |
+
6. Click "Deploy"
|
39 |
+
|
40 |
+
### Step 3: Configure Environment Variables
|
41 |
+
1. In Streamlit Cloud dashboard, go to your app
|
42 |
+
2. Click "Settings" → "Secrets"
|
43 |
+
3. Add your environment variables:
|
44 |
+
```
|
45 |
+
FRED_API_KEY = "your-fred-api-key"
|
46 |
+
AWS_ACCESS_KEY_ID = "your-aws-access-key"
|
47 |
+
AWS_SECRET_ACCESS_KEY = "your-aws-secret-key"
|
48 |
+
AWS_REGION = "us-east-1"
|
49 |
+
```
|
50 |
+
|
51 |
+
### Step 4: Test Your Deployment
|
52 |
+
1. Wait for deployment to complete
|
53 |
+
2. Visit your app URL
|
54 |
+
3. Test all features:
|
55 |
+
- [ ] Executive Dashboard loads
|
56 |
+
- [ ] Advanced Analytics works
|
57 |
+
- [ ] FRED API data loads
|
58 |
+
- [ ] Visualizations generate
|
59 |
+
- [ ] Downloads work
|
60 |
+
|
61 |
+
## 🔧 Troubleshooting
|
62 |
+
|
63 |
+
### Common Issues
|
64 |
+
- **Import errors**: Check `requirements.txt` has all dependencies
|
65 |
+
- **AWS errors**: Verify environment variables are set correctly
|
66 |
+
- **FRED API errors**: Check your FRED API key
|
67 |
+
- **Memory issues**: Streamlit Cloud has memory limits
|
68 |
+
|
69 |
+
### Performance Tips
|
70 |
+
- Use caching for expensive operations
|
71 |
+
- Optimize data loading
|
72 |
+
- Consider using demo data for initial testing
|
73 |
+
|
74 |
+
## 🎉 Success!
|
75 |
+
Your FRED ML app will be available at:
|
76 |
+
`https://your-app-name-your-username.streamlit.app`
|
77 |
+
|
78 |
+
## 📊 Features Available in Deployment
|
79 |
+
- ✅ Real FRED API data integration
|
80 |
+
- ✅ Advanced analytics and forecasting
|
81 |
+
- ✅ Professional enterprise-grade UI
|
82 |
+
- ✅ AWS S3 integration (with credentials)
|
83 |
+
- ✅ Local storage fallback
|
84 |
+
- ✅ Comprehensive download capabilities
|
85 |
+
- ✅ Free hosting with Streamlit Cloud
|
Dockerfile
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Production Dockerfile for FRED ML
|
2 |
+
FROM python:3.9-slim
|
3 |
+
|
4 |
+
# Set environment variables
|
5 |
+
ENV PYTHONUNBUFFERED=1
|
6 |
+
ENV PYTHONDONTWRITEBYTECODE=1
|
7 |
+
ENV PIP_NO_CACHE_DIR=1
|
8 |
+
ENV PIP_DISABLE_PIP_VERSION_CHECK=1
|
9 |
+
|
10 |
+
# Set work directory
|
11 |
+
WORKDIR /app
|
12 |
+
|
13 |
+
# Install system dependencies
|
14 |
+
RUN apt-get update \
|
15 |
+
&& apt-get install -y --no-install-recommends \
|
16 |
+
build-essential \
|
17 |
+
curl \
|
18 |
+
git \
|
19 |
+
&& rm -rf /var/lib/apt/lists/*
|
20 |
+
|
21 |
+
# Copy requirements first for better caching
|
22 |
+
COPY requirements.txt .
|
23 |
+
|
24 |
+
# Install Python dependencies
|
25 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
26 |
+
|
27 |
+
# Copy application code
|
28 |
+
COPY . .
|
29 |
+
|
30 |
+
# Create non-root user
|
31 |
+
RUN useradd --create-home --shell /bin/bash app \
|
32 |
+
&& chown -R app:app /app
|
33 |
+
USER app
|
34 |
+
|
35 |
+
# Health check
|
36 |
+
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
|
37 |
+
CMD python -c "import requests; requests.get('http://localhost:8000/health')" || exit 1
|
38 |
+
|
39 |
+
# Expose port
|
40 |
+
EXPOSE 8000
|
41 |
+
|
42 |
+
# Run the application
|
43 |
+
CMD ["python", "-m", "src.main"]
|
LICENSE
ADDED
@@ -0,0 +1,196 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Apache License
|
2 |
+
Version 2.0, January 2004
|
3 |
+
http://www.apache.org/licenses/
|
4 |
+
|
5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
6 |
+
|
7 |
+
1. Definitions.
|
8 |
+
|
9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
11 |
+
|
12 |
+
"Licensor" shall mean the copyright owner or entity granting the License.
|
13 |
+
|
14 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
15 |
+
other entities that control, are controlled by, or are under common
|
16 |
+
control with that entity. For the purposes of this definition,
|
17 |
+
"control" means (i) the power, direct or indirect, to cause the
|
18 |
+
direction or management of such entity, whether by contract or
|
19 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
20 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
21 |
+
|
22 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
23 |
+
exercising permissions granted by this License.
|
24 |
+
|
25 |
+
"Source" form shall mean the preferred form for making modifications,
|
26 |
+
including but not limited to software source code, documentation
|
27 |
+
source, and configuration files.
|
28 |
+
|
29 |
+
"Object" form shall mean any form resulting from mechanical
|
30 |
+
transformation or translation of a Source form, including but
|
31 |
+
not limited to compiled object code, generated documentation,
|
32 |
+
and conversions to other media types.
|
33 |
+
|
34 |
+
"Work" shall mean the work of authorship, whether in Source or
|
35 |
+
Object form, made available under the License, as indicated by a
|
36 |
+
copyright notice that is included in or attached to the work
|
37 |
+
(which shall not include communications that are clearly marked or
|
38 |
+
otherwise designated in writing by the copyright owner as "Not a Contribution").
|
39 |
+
|
40 |
+
"Contribution" shall mean any work of authorship, including
|
41 |
+
the original version of the Work and any modifications or additions
|
42 |
+
to that Work or Derivative Works thereof, that is intentionally
|
43 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
44 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
45 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
46 |
+
means any form of electronic, verbal, or written communication sent
|
47 |
+
to the Licensor or its representatives, including but not limited to
|
48 |
+
communication on electronic mailing lists, source code control systems,
|
49 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
50 |
+
Licensor for the purpose of discussing and improving the Work, but
|
51 |
+
excluding communication that is conspicuously marked or otherwise
|
52 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
53 |
+
|
54 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
55 |
+
on behalf of whom a Contribution has been received by Licensor and
|
56 |
+
subsequently incorporated within the Work.
|
57 |
+
|
58 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
59 |
+
this License, each Contributor hereby grants to You a perpetual,
|
60 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
61 |
+
copyright license to use, reproduce, modify, merge, publish,
|
62 |
+
distribute, sublicense, and/or sell copies of the Work, and to
|
63 |
+
permit persons to whom the Work is furnished to do so, subject to
|
64 |
+
the following conditions:
|
65 |
+
|
66 |
+
The above copyright notice and this permission notice shall be
|
67 |
+
included in all copies or substantial portions of the Work.
|
68 |
+
|
69 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
70 |
+
this License, each Contributor hereby grants to You a perpetual,
|
71 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
72 |
+
(except as stated in this section) patent license to make, have made,
|
73 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
74 |
+
where such license applies only to those patent claims licensable
|
75 |
+
by such Contributor that are necessarily infringed by their
|
76 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
77 |
+
with the Work to which such Contribution(s) was submitted. If You
|
78 |
+
institute patent litigation against any entity (including a
|
79 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
80 |
+
or a Contribution incorporated within the Work constitutes direct
|
81 |
+
or contributory patent infringement, then any patent licenses
|
82 |
+
granted to You under this License for that Work shall terminate
|
83 |
+
as of the date such litigation is filed.
|
84 |
+
|
85 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
86 |
+
Work or Derivative Works thereof in any medium, with or without
|
87 |
+
modifications, and in Source or Object form, provided that You
|
88 |
+
meet the following conditions:
|
89 |
+
|
90 |
+
(a) You must give any other recipients of the Work or
|
91 |
+
Derivative Works a copy of this License; and
|
92 |
+
|
93 |
+
(b) You must cause any modified files to carry prominent notices
|
94 |
+
stating that You changed the files; and
|
95 |
+
|
96 |
+
(c) You must retain, in the Source form of any Derivative Works
|
97 |
+
that You distribute, all copyright, trademark, patent, and
|
98 |
+
attribution notices from the Source form of the Work,
|
99 |
+
excluding those notices that do not pertain to any part of
|
100 |
+
the Derivative Works; and
|
101 |
+
|
102 |
+
(d) If the Work includes a "NOTICE" file as part of its
|
103 |
+
distribution, then any Derivative Works that You distribute must
|
104 |
+
include a readable copy of the attribution notices contained
|
105 |
+
within such NOTICE file, excluding those notices that do not
|
106 |
+
pertain to any part of the Derivative Works, in at least one
|
107 |
+
of the following places: within a NOTICE file distributed
|
108 |
+
as part of the Derivative Works; within the Source form or
|
109 |
+
documentation, if provided along with the Derivative Works; or,
|
110 |
+
within a display generated by the Derivative Works, if and
|
111 |
+
wherever such third-party notices normally appear. The contents
|
112 |
+
of the NOTICE file are for informational purposes only and
|
113 |
+
do not modify the License. You may add Your own attribution
|
114 |
+
notices within Derivative Works that You distribute, alongside
|
115 |
+
or as an addendum to the NOTICE text from the Work, provided
|
116 |
+
that such additional attribution notices cannot be construed
|
117 |
+
as modifying the License.
|
118 |
+
|
119 |
+
You may add Your own copyright notice to Your modifications and
|
120 |
+
may provide additional or different license terms and conditions
|
121 |
+
for use, reproduction, or distribution of Your modifications, or
|
122 |
+
for any such Derivative Works as a whole, provided Your use,
|
123 |
+
reproduction, and distribution of the Work otherwise complies with
|
124 |
+
the conditions stated in this License.
|
125 |
+
|
126 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
127 |
+
any Contribution intentionally submitted for inclusion in the Work
|
128 |
+
by You to the Licensor shall be under the terms and conditions of
|
129 |
+
this License, without any additional terms or conditions.
|
130 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
131 |
+
the terms of any separate license agreement you may have executed
|
132 |
+
with Licensor regarding such Contributions.
|
133 |
+
|
134 |
+
6. Trademarks. This License does not grant permission to use the trade
|
135 |
+
names, trademarks, service marks, or product names of the Licensor,
|
136 |
+
except as required for reasonable and customary use in describing the
|
137 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
138 |
+
|
139 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
140 |
+
agreed to in writing, Licensor provides the Work (and each
|
141 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
142 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
143 |
+
implied, including, without limitation, any warranties or conditions
|
144 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
145 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
146 |
+
appropriateness of using or redistributing the Work and assume any
|
147 |
+
risks associated with Your exercise of permissions under this License.
|
148 |
+
|
149 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
150 |
+
whether in tort (including negligence), contract, or otherwise,
|
151 |
+
unless required by applicable law (such as deliberate and grossly
|
152 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
153 |
+
liable to You for damages, including any direct, indirect, special,
|
154 |
+
incidental, or consequential damages of any character arising as a
|
155 |
+
result of this License or out of the use or inability to use the
|
156 |
+
Work (including but not limited to damages for loss of goodwill,
|
157 |
+
work stoppage, computer failure or malfunction, or any and all
|
158 |
+
other commercial damages or losses), even if such Contributor
|
159 |
+
has been advised of the possibility of such damages.
|
160 |
+
|
161 |
+
9. Accepting Warranty or Additional Support. A product may include
|
162 |
+
a notice offering to provide warranty, support, indemnity, or
|
163 |
+
other liability obligations and/or rights consistent with this
|
164 |
+
License. However, in accepting such obligations, You may act only
|
165 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
166 |
+
of any other Contributor, and only if You agree to indemnify,
|
167 |
+
defend, and hold each Contributor harmless for any liability
|
168 |
+
incurred by, or claims asserted against, such Contributor by reason
|
169 |
+
of your accepting any such warranty or additional support.
|
170 |
+
|
171 |
+
END OF TERMS AND CONDITIONS
|
172 |
+
|
173 |
+
APPENDIX: How to apply the Apache License to your work.
|
174 |
+
|
175 |
+
To apply the Apache License to your work, attach the following
|
176 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
177 |
+
replaced with your own identifying information. (Don't include
|
178 |
+
the brackets!) The text should be enclosed in the appropriate
|
179 |
+
comment syntax for the file format. We also recommend that a
|
180 |
+
file or class name and description of purpose be included on the
|
181 |
+
same page as the copyright notice for easier identification within
|
182 |
+
third-party archives.
|
183 |
+
|
184 |
+
Copyright [yyyy] [name of copyright owner]
|
185 |
+
|
186 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
187 |
+
you may not use this file except in compliance with the License.
|
188 |
+
You may obtain a copy of the License at
|
189 |
+
|
190 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
191 |
+
|
192 |
+
Unless required by applicable law or agreed to in writing, software
|
193 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
194 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
195 |
+
See the License for the specific language governing permissions and
|
196 |
+
limitations under the License.
|
MATH_ISSUES_ANALYSIS.md
ADDED
@@ -0,0 +1,221 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Economic Indicators Math Issues Analysis & Fixes
|
2 |
+
|
3 |
+
## Executive Summary
|
4 |
+
|
5 |
+
After conducting a thorough analysis of your economic indicators pipeline, I identified **7 critical math issues** that were causing invalid results in your analysis. These issues ranged from unit scale problems to unsafe mathematical operations. I've created comprehensive fixes for all identified issues.
|
6 |
+
|
7 |
+
## Issues Identified
|
8 |
+
|
9 |
+
### 1. **Unit Scale Problems** 🔴 CRITICAL
|
10 |
+
**Problem**: Different economic indicators have vastly different units and scales:
|
11 |
+
- `GDPC1`: Billions of dollars (22,000 = $22 trillion)
|
12 |
+
- `RSAFS`: Millions of dollars (500,000 = $500 billion)
|
13 |
+
- `CPIAUCSL`: Index values (~260)
|
14 |
+
- `FEDFUNDS`: Decimal form (0.08 = 8%)
|
15 |
+
- `DGS10`: Decimal form (1.5 = 1.5%)
|
16 |
+
|
17 |
+
**Impact**: Large-scale variables dominate regressions, PCA, and clustering, skewing results.
|
18 |
+
|
19 |
+
**Fix Applied**:
|
20 |
+
```python
|
21 |
+
# Unit normalization
|
22 |
+
normalized_data['GDPC1'] = raw_data['GDPC1'] / 1000 # Billions → trillions
|
23 |
+
normalized_data['RSAFS'] = raw_data['RSAFS'] / 1000 # Millions → billions
|
24 |
+
normalized_data['FEDFUNDS'] = raw_data['FEDFUNDS'] * 100 # Decimal → percentage
|
25 |
+
normalized_data['DGS10'] = raw_data['DGS10'] * 100 # Decimal → percentage
|
26 |
+
```
|
27 |
+
|
28 |
+
### 2. **Frequency Misalignment** 🔴 CRITICAL
|
29 |
+
**Problem**: Mixing quarterly, monthly, and daily time series without proper resampling:
|
30 |
+
- `GDPC1`: Quarterly data
|
31 |
+
- `CPIAUCSL`, `INDPRO`, `RSAFS`: Monthly data
|
32 |
+
- `FEDFUNDS`, `DGS10`: Daily data
|
33 |
+
|
34 |
+
**Impact**: Leads to NaNs, unintended fills, and misleading lag/forecast computations.
|
35 |
+
|
36 |
+
**Fix Applied**:
|
37 |
+
```python
|
38 |
+
# Align all series to quarterly frequency
|
39 |
+
if column in ['FEDFUNDS', 'DGS10']:
|
40 |
+
resampled = series.resample('Q').mean() # Rates use mean
|
41 |
+
else:
|
42 |
+
resampled = series.resample('Q').last() # Levels use last value
|
43 |
+
```
|
44 |
+
|
45 |
+
### 3. **Growth Rate Calculation Errors** 🔴 CRITICAL
|
46 |
+
**Problem**: No explicit percent change calculation, leading to misinterpretation:
|
47 |
+
- GDP change from 22,000 to 22,100 shown as "+100" (absolute) instead of "+0.45%" (relative)
|
48 |
+
- Fed Funds change from 0.26 to 0.27 shown as "+0.01" instead of "+3.85%"
|
49 |
+
|
50 |
+
**Impact**: All growth rate interpretations were incorrect.
|
51 |
+
|
52 |
+
**Fix Applied**:
|
53 |
+
```python
|
54 |
+
# Proper growth rate calculation
|
55 |
+
growth_data = data.pct_change() * 100
|
56 |
+
```
|
57 |
+
|
58 |
+
### 4. **Forecast Period Mis-scaling** 🟠 MEDIUM
|
59 |
+
**Problem**: Same forecast horizon applied to different frequencies:
|
60 |
+
- `forecast_periods=4` for quarterly = 1 year (reasonable)
|
61 |
+
- `forecast_periods=4` for daily = 4 days (too short)
|
62 |
+
|
63 |
+
**Impact**: Meaningless forecasts for high-frequency series.
|
64 |
+
|
65 |
+
**Fix Applied**:
|
66 |
+
```python
|
67 |
+
# Scale forecast periods by frequency
|
68 |
+
freq_scaling = {'D': 90, 'M': 3, 'Q': 1}
|
69 |
+
scaled_periods = base_periods * freq_scaling.get(frequency, 1)
|
70 |
+
```
|
71 |
+
|
72 |
+
### 5. **Unsafe MAPE Calculation** 🟠 MEDIUM
|
73 |
+
**Problem**: MAPE calculation can fail with zero or near-zero values:
|
74 |
+
```python
|
75 |
+
# Original (can fail)
|
76 |
+
mape = np.mean(np.abs((actual - forecast) / actual)) * 100
|
77 |
+
```
|
78 |
+
|
79 |
+
**Impact**: Crashes or produces infinite values.
|
80 |
+
|
81 |
+
**Fix Applied**:
|
82 |
+
```python
|
83 |
+
# Safe MAPE calculation
|
84 |
+
denominator = np.maximum(np.abs(actual), 1e-5)
|
85 |
+
mape = np.mean(np.abs((actual - forecast) / denominator)) * 100
|
86 |
+
```
|
87 |
+
|
88 |
+
### 6. **Missing Stationarity Enforcement** 🔴 CRITICAL
|
89 |
+
**Problem**: Granger causality tests run on non-stationary raw data.
|
90 |
+
|
91 |
+
**Impact**: Spurious causality results.
|
92 |
+
|
93 |
+
**Fix Applied**:
|
94 |
+
```python
|
95 |
+
# Test for stationarity and difference if needed
|
96 |
+
if not is_stationary(series):
|
97 |
+
series = series.diff().dropna()
|
98 |
+
```
|
99 |
+
|
100 |
+
### 7. **Missing Data Normalization** 🔴 CRITICAL
|
101 |
+
**Problem**: No normalization before correlation analysis or modeling.
|
102 |
+
|
103 |
+
**Impact**: Scale bias in all multivariate analyses.
|
104 |
+
|
105 |
+
**Fix Applied**:
|
106 |
+
```python
|
107 |
+
# Z-score normalization
|
108 |
+
normalized_data = (data - data.mean()) / data.std()
|
109 |
+
```
|
110 |
+
|
111 |
+
## Validation Results
|
112 |
+
|
113 |
+
### Before Fixes (Original Issues)
|
114 |
+
```
|
115 |
+
GDPC1: 22,000 → 22,100 (shown as +100, should be +0.45%)
|
116 |
+
FEDFUNDS: 0.26 → 0.27 (shown as +0.01, should be +3.85%)
|
117 |
+
Correlation matrix: All 1.0 (scale-dominated)
|
118 |
+
MAPE: Can crash with small values
|
119 |
+
Forecast periods: Same for all frequencies
|
120 |
+
```
|
121 |
+
|
122 |
+
### After Fixes (Corrected)
|
123 |
+
```
|
124 |
+
GDPC1: 23.0 → 23.1 (correctly shown as +0.43%)
|
125 |
+
FEDFUNDS: 26.0% → 27.0% (correctly shown as +3.85%)
|
126 |
+
Correlation matrix: Meaningful correlations
|
127 |
+
MAPE: Safe calculation with epsilon
|
128 |
+
Forecast periods: Scaled by frequency
|
129 |
+
```
|
130 |
+
|
131 |
+
## Files Created/Modified
|
132 |
+
|
133 |
+
### 1. **Fixed Analytics Pipeline**
|
134 |
+
- `src/analysis/comprehensive_analytics_fixed.py`
|
135 |
+
- Complete rewrite with all fixes applied
|
136 |
+
|
137 |
+
### 2. **Test Scripts**
|
138 |
+
- `test_math_issues.py` - Demonstrates the original issues
|
139 |
+
- `test_fixes_demonstration.py` - Shows the fixes in action
|
140 |
+
- `test_data_validation.py` - Validates data quality
|
141 |
+
|
142 |
+
### 3. **Documentation**
|
143 |
+
- This comprehensive analysis document
|
144 |
+
|
145 |
+
## Implementation Guide
|
146 |
+
|
147 |
+
### Quick Fixes for Existing Code
|
148 |
+
|
149 |
+
1. **Add Unit Normalization**:
|
150 |
+
```python
|
151 |
+
def normalize_units(data):
|
152 |
+
normalized = data.copy()
|
153 |
+
normalized['GDPC1'] = data['GDPC1'] / 1000
|
154 |
+
normalized['RSAFS'] = data['RSAFS'] / 1000
|
155 |
+
normalized['FEDFUNDS'] = data['FEDFUNDS'] * 100
|
156 |
+
normalized['DGS10'] = data['DGS10'] * 100
|
157 |
+
return normalized
|
158 |
+
```
|
159 |
+
|
160 |
+
2. **Add Safe MAPE**:
|
161 |
+
```python
|
162 |
+
def safe_mape(actual, forecast):
|
163 |
+
denominator = np.maximum(np.abs(actual), 1e-5)
|
164 |
+
return np.mean(np.abs((actual - forecast) / denominator)) * 100
|
165 |
+
```
|
166 |
+
|
167 |
+
3. **Add Frequency Alignment**:
|
168 |
+
```python
|
169 |
+
def align_frequencies(data):
|
170 |
+
aligned = pd.DataFrame()
|
171 |
+
for col in data.columns:
|
172 |
+
if col in ['FEDFUNDS', 'DGS10']:
|
173 |
+
aligned[col] = data[col].resample('Q').mean()
|
174 |
+
else:
|
175 |
+
aligned[col] = data[col].resample('Q').last()
|
176 |
+
return aligned
|
177 |
+
```
|
178 |
+
|
179 |
+
4. **Add Growth Rate Calculation**:
|
180 |
+
```python
|
181 |
+
def calculate_growth_rates(data):
|
182 |
+
return data.pct_change() * 100
|
183 |
+
```
|
184 |
+
|
185 |
+
## Testing the Fixes
|
186 |
+
|
187 |
+
Run the demonstration scripts to see the fixes in action:
|
188 |
+
|
189 |
+
```bash
|
190 |
+
python test_math_issues.py # Shows original issues
|
191 |
+
python test_fixes_demonstration.py # Shows fixes applied
|
192 |
+
```
|
193 |
+
|
194 |
+
## Impact Assessment
|
195 |
+
|
196 |
+
### Before Fixes
|
197 |
+
- ❌ Incorrect growth rate interpretations
|
198 |
+
- ❌ Scale bias in all analyses
|
199 |
+
- ❌ Unreliable forecasting horizons
|
200 |
+
- ❌ Potential crashes from unsafe math
|
201 |
+
- ❌ Spurious statistical results
|
202 |
+
|
203 |
+
### After Fixes
|
204 |
+
- ✅ Accurate economic interpretations
|
205 |
+
- ✅ Proper scale comparisons
|
206 |
+
- ✅ Robust forecasting with appropriate horizons
|
207 |
+
- ✅ Reliable statistical tests
|
208 |
+
- ✅ Safe mathematical operations
|
209 |
+
- ✅ Consistent frequency alignment
|
210 |
+
|
211 |
+
## Recommendations
|
212 |
+
|
213 |
+
1. **Immediate**: Apply the unit normalization and safe MAPE fixes
|
214 |
+
2. **Short-term**: Implement frequency alignment and growth rate calculation
|
215 |
+
3. **Long-term**: Use the complete fixed pipeline for all future analyses
|
216 |
+
|
217 |
+
## Conclusion
|
218 |
+
|
219 |
+
The identified math issues were causing significant problems in your economic analysis, from incorrect growth rate interpretations to unreliable statistical results. The comprehensive fixes I've provided address all these issues and will ensure your economic indicators analysis produces valid, interpretable results.
|
220 |
+
|
221 |
+
The fixed pipeline maintains the same interface as your original code but applies proper mathematical transformations and safety checks throughout the analysis process.
|
Makefile
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.PHONY: help install test lint format clean build run deploy
|
2 |
+
|
3 |
+
help: ## Show this help message
|
4 |
+
@echo 'Usage: make [target]'
|
5 |
+
@echo ''
|
6 |
+
@echo 'Targets:'
|
7 |
+
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-15s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
8 |
+
|
9 |
+
install: ## Install dependencies
|
10 |
+
pip install -e .
|
11 |
+
pip install -e ".[dev]"
|
12 |
+
pre-commit install
|
13 |
+
|
14 |
+
test: ## Run tests
|
15 |
+
pytest tests/ -v --cov=src --cov-report=html --cov-report=xml
|
16 |
+
|
17 |
+
lint: ## Run linting
|
18 |
+
flake8 src/ tests/
|
19 |
+
mypy src/
|
20 |
+
|
21 |
+
format: ## Format code
|
22 |
+
black src/ tests/
|
23 |
+
isort src/ tests/
|
24 |
+
|
25 |
+
clean: ## Clean build artifacts
|
26 |
+
find . -type f -name "*.pyc" -delete
|
27 |
+
find . -type d -name "__pycache__" -delete
|
28 |
+
rm -rf .pytest_cache/
|
29 |
+
rm -rf htmlcov/
|
30 |
+
rm -rf build/
|
31 |
+
rm -rf dist/
|
32 |
+
rm -rf *.egg-info/
|
33 |
+
|
34 |
+
build: ## Build Docker image
|
35 |
+
docker build -t fred-ml .
|
36 |
+
|
37 |
+
run: ## Run application locally
|
38 |
+
uvicorn src.main:app --reload --host 0.0.0.0 --port 8000
|
39 |
+
|
40 |
+
run-docker: ## Run with Docker Compose (development)
|
41 |
+
docker-compose -f deploy/docker/docker-compose.dev.yml up --build
|
42 |
+
|
43 |
+
run-prod: ## Run with Docker Compose (production)
|
44 |
+
docker-compose -f deploy/docker/docker-compose.prod.yml up --build
|
45 |
+
|
46 |
+
deploy: ## Deploy to Kubernetes
|
47 |
+
kubectl apply -f deploy/kubernetes/
|
48 |
+
|
49 |
+
deploy-helm: ## Deploy with Helm
|
50 |
+
helm install fred-ml deploy/helm/
|
51 |
+
|
52 |
+
logs: ## View application logs
|
53 |
+
docker-compose -f deploy/docker/docker-compose.dev.yml logs -f fred-ml
|
54 |
+
|
55 |
+
shell: ## Open shell in container
|
56 |
+
docker-compose -f deploy/docker/docker-compose.dev.yml exec fred-ml bash
|
57 |
+
|
58 |
+
migrate: ## Run database migrations
|
59 |
+
alembic upgrade head
|
60 |
+
|
61 |
+
setup-dev: install format lint test ## Setup development environment
|
62 |
+
|
63 |
+
ci: test lint format ## Run CI checks locally
|
64 |
+
|
65 |
+
package: clean build ## Build package for distribution
|
66 |
+
python -m build
|
67 |
+
|
68 |
+
publish: package ## Publish to PyPI
|
69 |
+
twine upload dist/*
|
README.md
ADDED
@@ -0,0 +1,277 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# FRED ML - Real-Time Economic Analytics Platform
|
2 |
+
|
3 |
+
[](https://opensource.org/licenses/Apache-2.0)
|
4 |
+
[](https://www.python.org/downloads/)
|
5 |
+
[](https://streamlit.io/)
|
6 |
+
|
7 |
+
A comprehensive real-time economic analytics platform that leverages the Federal Reserve Economic Data (FRED) API to provide advanced economic insights, forecasting, and visualization capabilities.
|
8 |
+
|
9 |
+
## 🚀 Features
|
10 |
+
|
11 |
+
### 📊 Real-Time Economic Data
|
12 |
+
- **Live FRED API Integration**: Direct connection to Federal Reserve Economic Data
|
13 |
+
- **12+ Economic Indicators**: GDP, CPI, Unemployment, Industrial Production, and more
|
14 |
+
- **Real-Time Updates**: Latest economic data with automatic refresh
|
15 |
+
- **Data Validation**: Robust error handling and data quality checks
|
16 |
+
|
17 |
+
### 🔮 Advanced Analytics
|
18 |
+
- **Economic Forecasting**: Time series analysis and predictive modeling
|
19 |
+
- **Correlation Analysis**: Spearman correlations with z-score standardization
|
20 |
+
- **Growth Rate Analysis**: Year-over-year and period-over-period calculations
|
21 |
+
- **Statistical Modeling**: Comprehensive statistical analysis and insights
|
22 |
+
|
23 |
+
### 📈 Interactive Visualizations
|
24 |
+
- **Time Series Charts**: Dynamic economic indicator trends
|
25 |
+
- **Correlation Heatmaps**: Interactive correlation matrices
|
26 |
+
- **Distribution Analysis**: Statistical distribution visualizations
|
27 |
+
- **Forecast Plots**: Predictive modeling visualizations
|
28 |
+
|
29 |
+
### 🎯 Key Insights
|
30 |
+
- **Economic Health Scoring**: Real-time economic health assessment
|
31 |
+
- **Market Sentiment Analysis**: Bullish/bearish market indicators
|
32 |
+
- **Risk Factor Analysis**: Comprehensive risk assessment
|
33 |
+
- **Opportunity Identification**: Strategic opportunity analysis
|
34 |
+
|
35 |
+
### 📥 Data Export & Downloads
|
36 |
+
- **CSV Export**: Raw economic data downloads
|
37 |
+
- **Excel Reports**: Multi-sheet analysis reports
|
38 |
+
- **Bulk Downloads**: Complete data packages
|
39 |
+
- **Visualization Downloads**: High-quality chart exports
|
40 |
+
|
41 |
+
## 🛠️ Technology Stack
|
42 |
+
|
43 |
+
- **Frontend**: Streamlit (Python web framework)
|
44 |
+
- **Data Processing**: Pandas, NumPy
|
45 |
+
- **Visualization**: Plotly, Matplotlib
|
46 |
+
- **API Integration**: FRED API (Federal Reserve Economic Data)
|
47 |
+
- **Cloud Storage**: AWS S3 (optional)
|
48 |
+
- **Deployment**: Docker, Hugging Face Spaces
|
49 |
+
|
50 |
+
## 📋 Prerequisites
|
51 |
+
|
52 |
+
- Python 3.11 or higher
|
53 |
+
- FRED API key (free from [FRED](https://fred.stlouisfed.org/docs/api/api_key.html))
|
54 |
+
- Git
|
55 |
+
|
56 |
+
## 🚀 Installation
|
57 |
+
|
58 |
+
### 1. Clone the Repository
|
59 |
+
```bash
|
60 |
+
git clone https://github.com/yourusername/FRED_ML.git
|
61 |
+
cd FRED_ML
|
62 |
+
```
|
63 |
+
|
64 |
+
### 2. Install Dependencies
|
65 |
+
```bash
|
66 |
+
pip install -r requirements.txt
|
67 |
+
```
|
68 |
+
|
69 |
+
### 3. Set Up Environment Variables
|
70 |
+
Create a `.env` file in the project root:
|
71 |
+
```bash
|
72 |
+
FRED_API_KEY=your_fred_api_key_here
|
73 |
+
```
|
74 |
+
|
75 |
+
Or set the environment variable directly:
|
76 |
+
```bash
|
77 |
+
export FRED_API_KEY=your_fred_api_key_here
|
78 |
+
```
|
79 |
+
|
80 |
+
### 4. Get Your FRED API Key
|
81 |
+
1. Visit [FRED API Key Registration](https://fred.stlouisfed.org/docs/api/api_key.html)
|
82 |
+
2. Sign up for a free account
|
83 |
+
3. Generate your API key
|
84 |
+
4. Add it to your environment variables
|
85 |
+
|
86 |
+
## 🎯 Quick Start
|
87 |
+
|
88 |
+
### Local Development
|
89 |
+
```bash
|
90 |
+
# Start the Streamlit app
|
91 |
+
streamlit run frontend/app.py --server.port 8501
|
92 |
+
```
|
93 |
+
|
94 |
+
### Docker Deployment
|
95 |
+
```bash
|
96 |
+
# Build the Docker image
|
97 |
+
docker build -t fred-ml .
|
98 |
+
|
99 |
+
# Run the container
|
100 |
+
docker run -p 8501:8501 -e FRED_API_KEY=your_key_here fred-ml
|
101 |
+
```
|
102 |
+
|
103 |
+
### Hugging Face Spaces
|
104 |
+
The app is automatically deployed to Hugging Face Spaces and can be accessed at:
|
105 |
+
[FRED ML on Hugging Face](https://huggingface.co/spaces/yourusername/fred-ml)
|
106 |
+
|
107 |
+
## 📖 Usage
|
108 |
+
|
109 |
+
### 1. Executive Dashboard
|
110 |
+
- **Real-time economic metrics**
|
111 |
+
- **Key performance indicators**
|
112 |
+
- **Economic health scoring**
|
113 |
+
- **Market sentiment analysis**
|
114 |
+
|
115 |
+
### 2. Economic Indicators
|
116 |
+
- **Interactive data exploration**
|
117 |
+
- **Real-time data validation**
|
118 |
+
- **Growth rate analysis**
|
119 |
+
- **Statistical insights**
|
120 |
+
|
121 |
+
### 3. Advanced Analytics
|
122 |
+
- **Comprehensive analysis options**
|
123 |
+
- **Forecasting capabilities**
|
124 |
+
- **Segmentation analysis**
|
125 |
+
- **Statistical modeling**
|
126 |
+
|
127 |
+
### 4. Reports & Insights
|
128 |
+
- **Real-time economic insights**
|
129 |
+
- **Generated reports**
|
130 |
+
- **Market analysis**
|
131 |
+
- **Risk assessment**
|
132 |
+
|
133 |
+
### 5. Downloads
|
134 |
+
- **Data export capabilities**
|
135 |
+
- **Visualization downloads**
|
136 |
+
- **Bulk data packages**
|
137 |
+
- **Report generation**
|
138 |
+
|
139 |
+
## 🔧 Configuration
|
140 |
+
|
141 |
+
### Environment Variables
|
142 |
+
| Variable | Description | Required |
|
143 |
+
|----------|-------------|----------|
|
144 |
+
| `FRED_API_KEY` | Your FRED API key | Yes |
|
145 |
+
| `AWS_ACCESS_KEY_ID` | AWS access key (for S3) | No |
|
146 |
+
| `AWS_SECRET_ACCESS_KEY` | AWS secret key (for S3) | No |
|
147 |
+
|
148 |
+
### API Configuration
|
149 |
+
The app supports various FRED API endpoints:
|
150 |
+
- **Economic Indicators**: GDP, CPI, Unemployment, etc.
|
151 |
+
- **Financial Data**: Treasury yields, Federal Funds Rate
|
152 |
+
- **Employment Data**: Nonfarm payrolls, labor statistics
|
153 |
+
- **Production Data**: Industrial production, capacity utilization
|
154 |
+
|
155 |
+
## 📊 Data Sources
|
156 |
+
|
157 |
+
### Primary Economic Indicators
|
158 |
+
- **GDPC1**: Real Gross Domestic Product
|
159 |
+
- **CPIAUCSL**: Consumer Price Index
|
160 |
+
- **UNRATE**: Unemployment Rate
|
161 |
+
- **INDPRO**: Industrial Production
|
162 |
+
- **FEDFUNDS**: Federal Funds Rate
|
163 |
+
- **DGS10**: 10-Year Treasury Constant Maturity Rate
|
164 |
+
- **RSAFS**: Retail Sales
|
165 |
+
- **PAYEMS**: Total Nonfarm Payrolls
|
166 |
+
- **PCE**: Personal Consumption Expenditures
|
167 |
+
- **M2SL**: M2 Money Stock
|
168 |
+
- **TCU**: Capacity Utilization
|
169 |
+
- **DEXUSEU**: US/Euro Exchange Rate
|
170 |
+
|
171 |
+
## 🏗️ Project Structure
|
172 |
+
|
173 |
+
```
|
174 |
+
FRED_ML/
|
175 |
+
├── frontend/ # Streamlit application
|
176 |
+
│ ├── app.py # Main application file
|
177 |
+
│ ├── fred_api_client.py # FRED API integration
|
178 |
+
│ └── demo_data.py # Demo data generation
|
179 |
+
├── src/ # Core analytics engine
|
180 |
+
│ ├── core/ # Core data processing
|
181 |
+
│ ├── analysis/ # Analytics modules
|
182 |
+
│ └── visualization/ # Chart generation
|
183 |
+
├── tests/ # Test suite
|
184 |
+
├── requirements.txt # Python dependencies
|
185 |
+
├── Dockerfile # Docker configuration
|
186 |
+
├── README.md # This file
|
187 |
+
└── LICENSE # Apache 2.0 License
|
188 |
+
```
|
189 |
+
|
190 |
+
## 🧪 Testing
|
191 |
+
|
192 |
+
### Run All Tests
|
193 |
+
```bash
|
194 |
+
python -m pytest tests/
|
195 |
+
```
|
196 |
+
|
197 |
+
### Run Specific Test Categories
|
198 |
+
```bash
|
199 |
+
# Test FRED API integration
|
200 |
+
python -m pytest tests/test_fred_api.py
|
201 |
+
|
202 |
+
# Test analytics functionality
|
203 |
+
python -m pytest tests/test_analytics.py
|
204 |
+
|
205 |
+
# Test data processing
|
206 |
+
python -m pytest tests/test_data_processing.py
|
207 |
+
```
|
208 |
+
|
209 |
+
## 🚀 Deployment
|
210 |
+
|
211 |
+
### Local Development
|
212 |
+
```bash
|
213 |
+
streamlit run frontend/app.py --server.port 8501
|
214 |
+
```
|
215 |
+
|
216 |
+
### Docker Deployment
|
217 |
+
```bash
|
218 |
+
docker build -t fred-ml .
|
219 |
+
docker run -p 8501:8501 -e FRED_API_KEY=your_key_here fred-ml
|
220 |
+
```
|
221 |
+
|
222 |
+
### Hugging Face Spaces
|
223 |
+
1. Fork this repository
|
224 |
+
2. Create a new Space on Hugging Face
|
225 |
+
3. Connect your repository
|
226 |
+
4. Set environment variables in Space settings
|
227 |
+
|
228 |
+
### AWS Deployment
|
229 |
+
```bash
|
230 |
+
# Deploy to AWS Lambda
|
231 |
+
sam build
|
232 |
+
sam deploy --guided
|
233 |
+
```
|
234 |
+
|
235 |
+
## 🤝 Contributing
|
236 |
+
|
237 |
+
We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.
|
238 |
+
|
239 |
+
### Development Setup
|
240 |
+
1. Fork the repository
|
241 |
+
2. Create a feature branch
|
242 |
+
3. Make your changes
|
243 |
+
4. Add tests for new functionality
|
244 |
+
5. Submit a pull request
|
245 |
+
|
246 |
+
### Code Style
|
247 |
+
- Follow PEP 8 guidelines
|
248 |
+
- Use type hints where appropriate
|
249 |
+
- Add docstrings to functions
|
250 |
+
- Include unit tests for new features
|
251 |
+
|
252 |
+
## 📝 License
|
253 |
+
|
254 |
+
This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
|
255 |
+
|
256 |
+
## 🙏 Acknowledgments
|
257 |
+
|
258 |
+
- **Federal Reserve Bank of St. Louis** for providing the FRED API
|
259 |
+
- **Streamlit** for the excellent web framework
|
260 |
+
- **Pandas & NumPy** for data processing capabilities
|
261 |
+
- **Plotly** for interactive visualizations
|
262 |
+
|
263 |
+
## 📞 Support
|
264 |
+
|
265 |
+
- **Issues**: [GitHub Issues](https://github.com/yourusername/FRED_ML/issues)
|
266 |
+
- **Discussions**: [GitHub Discussions](https://github.com/yourusername/FRED_ML/discussions)
|
267 |
+
- **Documentation**: [Wiki](https://github.com/yourusername/FRED_ML/wiki)
|
268 |
+
|
269 |
+
## 🔗 Links
|
270 |
+
|
271 |
+
- **Live Demo**: [FRED ML on Hugging Face](https://huggingface.co/spaces/yourusername/fred-ml)
|
272 |
+
- **FRED API**: [Federal Reserve Economic Data](https://fred.stlouisfed.org/)
|
273 |
+
- **Documentation**: [Project Wiki](https://github.com/yourusername/FRED_ML/wiki)
|
274 |
+
|
275 |
+
---
|
276 |
+
|
277 |
+
**Made with ❤️ for economic data enthusiasts**
|
alignment_divergence_insights.txt
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
================================================================================
|
2 |
+
ECONOMIC INDICATORS ALIGNMENT & DEVIATION ANALYSIS REPORT
|
3 |
+
================================================================================
|
4 |
+
|
5 |
+
📊 LONG-TERM ALIGNMENT ANALYSIS
|
6 |
+
----------------------------------------
|
7 |
+
• Increasing Alignment Pairs: 79
|
8 |
+
• Decreasing Alignment Pairs: 89
|
9 |
+
• Stable Alignment Pairs: 30
|
10 |
+
• Strong Trends: 58
|
11 |
+
|
12 |
+
🔺 Pairs with Increasing Alignment:
|
13 |
+
- GDPC1_vs_INDPRO
|
14 |
+
- GDPC1_vs_INDPRO
|
15 |
+
- GDPC1_vs_INDPRO
|
16 |
+
- GDPC1_vs_TCU
|
17 |
+
- GDPC1_vs_TCU
|
18 |
+
|
19 |
+
🔻 Pairs with Decreasing Alignment:
|
20 |
+
- GDPC1_vs_RSAFS
|
21 |
+
- GDPC1_vs_RSAFS
|
22 |
+
- GDPC1_vs_RSAFS
|
23 |
+
- GDPC1_vs_PAYEMS
|
24 |
+
- GDPC1_vs_CPIAUCSL
|
25 |
+
|
26 |
+
⚠️ SUDDEN DEVIATION ANALYSIS
|
27 |
+
-----------------------------------
|
28 |
+
• Total Deviations Detected: 61
|
29 |
+
• Indicators with Deviations: 12
|
30 |
+
• Extreme Events: 61
|
31 |
+
|
32 |
+
📈 Most Volatile Indicators:
|
33 |
+
- FEDFUNDS: 0.6602 volatility
|
34 |
+
- DGS10: 0.1080 volatility
|
35 |
+
- UNRATE: 0.0408 volatility
|
36 |
+
- DEXUSEU: 0.0162 volatility
|
37 |
+
- RSAFS: 0.0161 volatility
|
38 |
+
|
39 |
+
🚨 Recent Extreme Events:
|
40 |
+
- GDPC1: 2022-07-01 (Z-score: 2.95)
|
41 |
+
- INDPRO: 2022-12-31 (Z-score: -2.95)
|
42 |
+
- RSAFS: 2024-09-30 (Z-score: 3.07)
|
43 |
+
- TCU: 2022-12-31 (Z-score: -3.16)
|
44 |
+
- PAYEMS: 2024-12-31 (Z-score: 2.29)
|
45 |
+
- CPIAUCSL: 2021-06-30 (Z-score: 2.70)
|
46 |
+
- PCE: 2023-01-01 (Z-score: 2.47)
|
47 |
+
- FEDFUNDS: 2024-09-30 (Z-score: -3.18)
|
48 |
+
- DGS10: 2023-09-30 (Z-score: 3.04)
|
49 |
+
- M2SL: 2024-03-31 (Z-score: 3.04)
|
50 |
+
- DEXUSEU: 2021-09-30 (Z-score: -2.91)
|
51 |
+
- UNRATE: 2023-09-30 (Z-score: 3.09)
|
52 |
+
|
53 |
+
================================================================================
|
54 |
+
Analysis completed successfully.
|
config/__init__.py
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Configuration package for FRED ML
|
3 |
+
"""
|
4 |
+
|
5 |
+
from .settings import *
|
6 |
+
|
7 |
+
__all__ = [
|
8 |
+
'FRED_API_KEY',
|
9 |
+
'AWS_REGION',
|
10 |
+
'AWS_ACCESS_KEY_ID',
|
11 |
+
'AWS_SECRET_ACCESS_KEY',
|
12 |
+
'DEBUG',
|
13 |
+
'LOG_LEVEL',
|
14 |
+
'MAX_WORKERS',
|
15 |
+
'REQUEST_TIMEOUT',
|
16 |
+
'CACHE_DURATION',
|
17 |
+
'STREAMLIT_SERVER_PORT',
|
18 |
+
'STREAMLIT_SERVER_ADDRESS',
|
19 |
+
'DEFAULT_SERIES_LIST',
|
20 |
+
'DEFAULT_START_DATE',
|
21 |
+
'DEFAULT_END_DATE',
|
22 |
+
'OUTPUT_DIR',
|
23 |
+
'PLOTS_DIR',
|
24 |
+
'ANALYSIS_TYPES',
|
25 |
+
'get_aws_config',
|
26 |
+
'is_fred_api_configured',
|
27 |
+
'is_aws_configured',
|
28 |
+
'get_analysis_config'
|
29 |
+
]
|
config/pipeline.yaml
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
fred:
|
2 |
+
api_key: "acf8bbec7efe3b6dfa6ae083e7152314"
|
3 |
+
series:
|
4 |
+
- GDP
|
5 |
+
- UNRATE
|
6 |
+
- CPIAUCSL
|
7 |
+
- FEDFUNDS
|
8 |
+
- DGS10
|
9 |
+
start_date: "2010-01-01"
|
10 |
+
end_date: "2024-01-01"
|
11 |
+
output_dir: "data/processed"
|
12 |
+
export_dir: "data/exports"
|
13 |
+
schedule: "0 0 1 */3 *" # First day of every quarter at midnight UTC
|
14 |
+
logging:
|
15 |
+
level: INFO
|
16 |
+
file: logs/pipeline.log
|
config/settings.py
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Configuration settings for FRED ML application
|
3 |
+
"""
|
4 |
+
|
5 |
+
import os
|
6 |
+
from typing import Optional
|
7 |
+
|
8 |
+
# FRED API Configuration
|
9 |
+
FRED_API_KEY = os.getenv('FRED_API_KEY', '')
|
10 |
+
|
11 |
+
# AWS Configuration
|
12 |
+
AWS_REGION = os.getenv('AWS_REGION', 'us-east-1')
|
13 |
+
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID', '')
|
14 |
+
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY', '')
|
15 |
+
|
16 |
+
# Application Configuration
|
17 |
+
DEBUG = os.getenv('DEBUG', 'False').lower() == 'true'
|
18 |
+
LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO')
|
19 |
+
|
20 |
+
# Performance Configuration
|
21 |
+
MAX_WORKERS = int(os.getenv('MAX_WORKERS', '10')) # For parallel processing
|
22 |
+
REQUEST_TIMEOUT = int(os.getenv('REQUEST_TIMEOUT', '30')) # API request timeout
|
23 |
+
CACHE_DURATION = int(os.getenv('CACHE_DURATION', '3600')) # Cache duration in seconds
|
24 |
+
|
25 |
+
# Streamlit Configuration
|
26 |
+
STREAMLIT_SERVER_PORT = int(os.getenv('STREAMLIT_SERVER_PORT', '8501'))
|
27 |
+
STREAMLIT_SERVER_ADDRESS = os.getenv('STREAMLIT_SERVER_ADDRESS', '0.0.0.0')
|
28 |
+
|
29 |
+
# Data Configuration
|
30 |
+
DEFAULT_SERIES_LIST = [
|
31 |
+
'GDPC1', # Real GDP
|
32 |
+
'INDPRO', # Industrial Production
|
33 |
+
'RSAFS', # Retail Sales
|
34 |
+
'CPIAUCSL', # Consumer Price Index
|
35 |
+
'FEDFUNDS', # Federal Funds Rate
|
36 |
+
'DGS10', # 10-Year Treasury
|
37 |
+
'UNRATE', # Unemployment Rate
|
38 |
+
'PAYEMS', # Total Nonfarm Payrolls
|
39 |
+
'PCE', # Personal Consumption Expenditures
|
40 |
+
'M2SL', # M2 Money Stock
|
41 |
+
'TCU', # Capacity Utilization
|
42 |
+
'DEXUSEU' # US/Euro Exchange Rate
|
43 |
+
]
|
44 |
+
|
45 |
+
# Default date ranges
|
46 |
+
DEFAULT_START_DATE = '2019-01-01'
|
47 |
+
DEFAULT_END_DATE = '2024-12-31'
|
48 |
+
|
49 |
+
# Directory Configuration
|
50 |
+
OUTPUT_DIR = os.path.join(os.path.dirname(__file__), '..', 'data', 'processed')
|
51 |
+
PLOTS_DIR = os.path.join(os.path.dirname(__file__), '..', 'data', 'exports')
|
52 |
+
|
53 |
+
# Analysis Configuration
|
54 |
+
ANALYSIS_TYPES = {
|
55 |
+
'comprehensive': 'Comprehensive Analysis',
|
56 |
+
'forecasting': 'Time Series Forecasting',
|
57 |
+
'segmentation': 'Market Segmentation',
|
58 |
+
'statistical': 'Statistical Modeling'
|
59 |
+
}
|
60 |
+
|
61 |
+
def get_aws_config() -> dict:
|
62 |
+
"""Get AWS configuration with proper fallbacks"""
|
63 |
+
config = {
|
64 |
+
'region_name': AWS_REGION,
|
65 |
+
'aws_access_key_id': AWS_ACCESS_KEY_ID,
|
66 |
+
'aws_secret_access_key': AWS_SECRET_ACCESS_KEY
|
67 |
+
}
|
68 |
+
|
69 |
+
# Remove empty values to allow boto3 to use default credentials
|
70 |
+
config = {k: v for k, v in config.items() if v}
|
71 |
+
|
72 |
+
return config
|
73 |
+
|
74 |
+
def is_fred_api_configured() -> bool:
|
75 |
+
"""Check if FRED API is properly configured"""
|
76 |
+
return bool(FRED_API_KEY and FRED_API_KEY.strip())
|
77 |
+
|
78 |
+
def is_aws_configured() -> bool:
|
79 |
+
"""Check if AWS is properly configured"""
|
80 |
+
return bool(AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY)
|
81 |
+
|
82 |
+
def get_analysis_config(analysis_type: str) -> dict:
|
83 |
+
"""Get configuration for specific analysis type"""
|
84 |
+
return {
|
85 |
+
'type': analysis_type,
|
86 |
+
'name': ANALYSIS_TYPES.get(analysis_type, analysis_type.title()),
|
87 |
+
'enabled': True
|
88 |
+
}
|
data/exports/fred_data_20250710_221702.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/exports/fred_data_20250710_223022.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/exports/fred_data_20250710_223149.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/exports/regression_summary.txt
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
OLS Regression Results
|
2 |
+
==============================================================================
|
3 |
+
Dep. Variable: GDP R-squared: 0.971
|
4 |
+
Model: OLS Adj. R-squared: 0.970
|
5 |
+
Method: Least Squares F-statistic: 839.9
|
6 |
+
Date: Thu, 10 Jul 2025 Prob (F-statistic): 5.55e-76
|
7 |
+
Time: 22:30:42 Log-Likelihood: -903.30
|
8 |
+
No. Observations: 105 AIC: 1817.
|
9 |
+
Df Residuals: 100 BIC: 1830.
|
10 |
+
Df Model: 4
|
11 |
+
Covariance Type: nonrobust
|
12 |
+
==============================================================================
|
13 |
+
coef std err t P>|t| [0.025 0.975]
|
14 |
+
------------------------------------------------------------------------------
|
15 |
+
const -328.8855 630.799 -0.521 0.603 -1580.374 922.603
|
16 |
+
UNRATE -21.7142 79.789 -0.272 0.786 -180.013 136.584
|
17 |
+
CPIAUCSL 85.7935 2.036 42.144 0.000 81.755 89.832
|
18 |
+
FEDFUNDS 492.3433 92.591 5.317 0.000 308.646 676.041
|
19 |
+
DGS10 -883.8622 122.881 -7.193 0.000 -1127.655 -640.070
|
20 |
+
==============================================================================
|
21 |
+
Omnibus: 12.409 Durbin-Watson: 2.138
|
22 |
+
Prob(Omnibus): 0.002 Jarque-Bera (JB): 13.297
|
23 |
+
Skew: 0.746 Prob(JB): 0.00130
|
24 |
+
Kurtosis: 3.902 Cond. No. 812.
|
25 |
+
==============================================================================
|
26 |
+
|
27 |
+
Notes:
|
28 |
+
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
|
data/exports/visualizations/metadata_20250711_203710.json
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"analysis_type": "comprehensive",
|
3 |
+
"timestamp": "2025-07-11T20:37:10.701849",
|
4 |
+
"charts_generated": [
|
5 |
+
"time_series",
|
6 |
+
"correlation",
|
7 |
+
"distributions",
|
8 |
+
"pca",
|
9 |
+
"clustering",
|
10 |
+
"forecast"
|
11 |
+
],
|
12 |
+
"output_dir": "data/exports/visualizations"
|
13 |
+
}
|
data/exports/visualizations/metadata_20250711_212822.json
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"analysis_type": "comprehensive",
|
3 |
+
"timestamp": "2025-07-11T21:28:22.319221",
|
4 |
+
"charts_generated": [
|
5 |
+
"time_series",
|
6 |
+
"correlation",
|
7 |
+
"distributions",
|
8 |
+
"pca",
|
9 |
+
"clustering",
|
10 |
+
"forecast"
|
11 |
+
],
|
12 |
+
"output_dir": "/Users/edwin/Desktop/Business/Technological/FRED_ML/data/exports/visualizations"
|
13 |
+
}
|
data/exports/visualizations/metadata_20250713_195826.json
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"analysis_type": "comprehensive",
|
3 |
+
"timestamp": "2025-07-13T19:58:26.154966",
|
4 |
+
"charts_generated": [
|
5 |
+
"time_series",
|
6 |
+
"correlation",
|
7 |
+
"distributions",
|
8 |
+
"pca",
|
9 |
+
"clustering",
|
10 |
+
"forecast"
|
11 |
+
],
|
12 |
+
"output_dir": "/workspaces/FRED_ML/data/exports/visualizations"
|
13 |
+
}
|
data/exports/visualizations/metadata_20250713_200340.json
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"analysis_type": "comprehensive",
|
3 |
+
"timestamp": "2025-07-13T20:03:40.606842",
|
4 |
+
"charts_generated": [
|
5 |
+
"time_series",
|
6 |
+
"correlation",
|
7 |
+
"distributions",
|
8 |
+
"pca",
|
9 |
+
"clustering",
|
10 |
+
"forecast"
|
11 |
+
],
|
12 |
+
"output_dir": "/workspaces/FRED_ML/data/exports/visualizations"
|
13 |
+
}
|
data/exports/visualizations/metadata_20250713_201004.json
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"analysis_type": "comprehensive",
|
3 |
+
"timestamp": "2025-07-13T20:10:04.848516",
|
4 |
+
"charts_generated": [
|
5 |
+
"time_series",
|
6 |
+
"correlation",
|
7 |
+
"distributions",
|
8 |
+
"pca",
|
9 |
+
"clustering",
|
10 |
+
"forecast"
|
11 |
+
],
|
12 |
+
"output_dir": "/workspaces/FRED_ML/data/exports/visualizations"
|
13 |
+
}
|
data/processed/fred_data_20250710_221702.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/processed/fred_data_20250710_223022.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/processed/fred_data_20250710_223149.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/processed/fred_economic_data_20250710_220401.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
debug_data_structure.py
ADDED
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
"""
|
3 |
+
Debug script to check the actual data structure and values
|
4 |
+
"""
|
5 |
+
|
6 |
+
import os
|
7 |
+
import sys
|
8 |
+
import pandas as pd
|
9 |
+
import numpy as np
|
10 |
+
from datetime import datetime
|
11 |
+
|
12 |
+
# Add src to path
|
13 |
+
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))
|
14 |
+
|
15 |
+
from src.core.enhanced_fred_client import EnhancedFREDClient
|
16 |
+
|
17 |
+
def debug_data_structure():
|
18 |
+
"""Debug the data structure and values"""
|
19 |
+
|
20 |
+
api_key = "acf8bbec7efe3b6dfa6ae083e7152314"
|
21 |
+
|
22 |
+
print("=== DEBUGGING DATA STRUCTURE ===")
|
23 |
+
|
24 |
+
try:
|
25 |
+
# Initialize FRED client
|
26 |
+
client = EnhancedFREDClient(api_key)
|
27 |
+
|
28 |
+
# Fetch economic data
|
29 |
+
end_date = datetime.now()
|
30 |
+
start_date = end_date.replace(year=end_date.year - 1)
|
31 |
+
|
32 |
+
print("1. Fetching economic data...")
|
33 |
+
data = client.fetch_economic_data(
|
34 |
+
start_date=start_date.strftime('%Y-%m-%d'),
|
35 |
+
end_date=end_date.strftime('%Y-%m-%d')
|
36 |
+
)
|
37 |
+
|
38 |
+
if data.empty:
|
39 |
+
print("❌ No data fetched")
|
40 |
+
return
|
41 |
+
|
42 |
+
print(f"✅ Fetched data shape: {data.shape}")
|
43 |
+
print(f" Date range: {data.index.min()} to {data.index.max()}")
|
44 |
+
print(f" Columns: {list(data.columns)}")
|
45 |
+
print()
|
46 |
+
|
47 |
+
# Check each indicator
|
48 |
+
for column in data.columns:
|
49 |
+
series = data[column].dropna()
|
50 |
+
print(f"2. Analyzing {column}:")
|
51 |
+
print(f" Total observations: {len(data[column])}")
|
52 |
+
print(f" Non-null observations: {len(series)}")
|
53 |
+
print(f" Latest value: {series.iloc[-1] if len(series) > 0 else 'N/A'}")
|
54 |
+
|
55 |
+
if len(series) >= 2:
|
56 |
+
growth_rate = series.pct_change().iloc[-1] * 100
|
57 |
+
print(f" Latest growth rate: {growth_rate:.2f}%")
|
58 |
+
else:
|
59 |
+
print(f" Growth rate: Insufficient data")
|
60 |
+
|
61 |
+
if len(series) >= 13:
|
62 |
+
yoy_growth = series.pct_change(periods=12).iloc[-1] * 100
|
63 |
+
print(f" Year-over-year growth: {yoy_growth:.2f}%")
|
64 |
+
else:
|
65 |
+
print(f" Year-over-year growth: Insufficient data")
|
66 |
+
|
67 |
+
print()
|
68 |
+
|
69 |
+
# Test the specific calculations that are failing
|
70 |
+
print("3. Testing specific calculations:")
|
71 |
+
|
72 |
+
if 'GDPC1' in data.columns:
|
73 |
+
gdp_series = data['GDPC1'].dropna()
|
74 |
+
print(f" GDPC1 - Length: {len(gdp_series)}")
|
75 |
+
if len(gdp_series) >= 2:
|
76 |
+
gdp_growth = gdp_series.pct_change().iloc[-1] * 100
|
77 |
+
print(f" GDPC1 - Growth: {gdp_growth:.2f}%")
|
78 |
+
print(f" GDPC1 - Is NaN: {pd.isna(gdp_growth)}")
|
79 |
+
else:
|
80 |
+
print(f" GDPC1 - Insufficient data for growth calculation")
|
81 |
+
|
82 |
+
if 'INDPRO' in data.columns:
|
83 |
+
indpro_series = data['INDPRO'].dropna()
|
84 |
+
print(f" INDPRO - Length: {len(indpro_series)}")
|
85 |
+
if len(indpro_series) >= 2:
|
86 |
+
indpro_growth = indpro_series.pct_change().iloc[-1] * 100
|
87 |
+
print(f" INDPRO - Growth: {indpro_growth:.2f}%")
|
88 |
+
print(f" INDPRO - Is NaN: {pd.isna(indpro_growth)}")
|
89 |
+
else:
|
90 |
+
print(f" INDPRO - Insufficient data for growth calculation")
|
91 |
+
|
92 |
+
if 'CPIAUCSL' in data.columns:
|
93 |
+
cpi_series = data['CPIAUCSL'].dropna()
|
94 |
+
print(f" CPIAUCSL - Length: {len(cpi_series)}")
|
95 |
+
if len(cpi_series) >= 13:
|
96 |
+
cpi_growth = cpi_series.pct_change(periods=12).iloc[-1] * 100
|
97 |
+
print(f" CPIAUCSL - YoY Growth: {cpi_growth:.2f}%")
|
98 |
+
print(f" CPIAUCSL - Is NaN: {pd.isna(cpi_growth)}")
|
99 |
+
else:
|
100 |
+
print(f" CPIAUCSL - Insufficient data for YoY calculation")
|
101 |
+
|
102 |
+
if 'FEDFUNDS' in data.columns:
|
103 |
+
fed_series = data['FEDFUNDS'].dropna()
|
104 |
+
print(f" FEDFUNDS - Length: {len(fed_series)}")
|
105 |
+
if len(fed_series) >= 1:
|
106 |
+
fed_rate = fed_series.iloc[-1]
|
107 |
+
print(f" FEDFUNDS - Latest rate: {fed_rate:.2f}%")
|
108 |
+
print(f" FEDFUNDS - Is NaN: {pd.isna(fed_rate)}")
|
109 |
+
else:
|
110 |
+
print(f" FEDFUNDS - No data available")
|
111 |
+
|
112 |
+
if 'UNRATE' in data.columns:
|
113 |
+
unrate_series = data['UNRATE'].dropna()
|
114 |
+
print(f" UNRATE - Length: {len(unrate_series)}")
|
115 |
+
if len(unrate_series) >= 1:
|
116 |
+
unrate = unrate_series.iloc[-1]
|
117 |
+
print(f" UNRATE - Latest rate: {unrate:.2f}%")
|
118 |
+
print(f" UNRATE - Is NaN: {pd.isna(unrate)}")
|
119 |
+
else:
|
120 |
+
print(f" UNRATE - No data available")
|
121 |
+
|
122 |
+
print()
|
123 |
+
print("=== DEBUG COMPLETE ===")
|
124 |
+
|
125 |
+
except Exception as e:
|
126 |
+
print(f"❌ Error during debugging: {e}")
|
127 |
+
import traceback
|
128 |
+
traceback.print_exc()
|
129 |
+
|
130 |
+
if __name__ == "__main__":
|
131 |
+
debug_data_structure()
|
deploy/docker/docker-compose.dev.yml
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
version: '3.8'
|
2 |
+
|
3 |
+
services:
|
4 |
+
fred-ml:
|
5 |
+
build: .
|
6 |
+
ports:
|
7 |
+
- "8000:8000"
|
8 |
+
environment:
|
9 |
+
- FRED_API_KEY=${FRED_API_KEY}
|
10 |
+
- ENVIRONMENT=development
|
11 |
+
volumes:
|
12 |
+
- ./data:/app/data
|
13 |
+
- ./logs:/app/logs
|
14 |
+
depends_on:
|
15 |
+
- redis
|
16 |
+
networks:
|
17 |
+
- fred-ml-network
|
18 |
+
|
19 |
+
redis:
|
20 |
+
image: redis:7-alpine
|
21 |
+
ports:
|
22 |
+
- "6379:6379"
|
23 |
+
volumes:
|
24 |
+
- redis_data:/data
|
25 |
+
networks:
|
26 |
+
- fred-ml-network
|
27 |
+
|
28 |
+
postgres:
|
29 |
+
image: postgres:15-alpine
|
30 |
+
environment:
|
31 |
+
POSTGRES_DB: fred_ml
|
32 |
+
POSTGRES_USER: fred_user
|
33 |
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
|
34 |
+
ports:
|
35 |
+
- "5432:5432"
|
36 |
+
volumes:
|
37 |
+
- postgres_data:/var/lib/postgresql/data
|
38 |
+
networks:
|
39 |
+
- fred-ml-network
|
40 |
+
|
41 |
+
volumes:
|
42 |
+
redis_data:
|
43 |
+
postgres_data:
|
44 |
+
|
45 |
+
networks:
|
46 |
+
fred-ml-network:
|
47 |
+
driver: bridge
|
deploy/docker/docker-compose.prod.yml
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
version: '3.8'
|
2 |
+
|
3 |
+
services:
|
4 |
+
fred-ml:
|
5 |
+
image: ghcr.io/eaname/fredml:latest
|
6 |
+
ports:
|
7 |
+
- "8000:8000"
|
8 |
+
environment:
|
9 |
+
- FRED_API_KEY=${FRED_API_KEY}
|
10 |
+
- ENVIRONMENT=production
|
11 |
+
- LOG_LEVEL=INFO
|
12 |
+
volumes:
|
13 |
+
- ./data:/app/data
|
14 |
+
- ./logs:/app/logs
|
15 |
+
depends_on:
|
16 |
+
- redis
|
17 |
+
- postgres
|
18 |
+
networks:
|
19 |
+
- fred-ml-network
|
20 |
+
restart: unless-stopped
|
21 |
+
|
22 |
+
redis:
|
23 |
+
image: redis:7-alpine
|
24 |
+
ports:
|
25 |
+
- "6379:6379"
|
26 |
+
volumes:
|
27 |
+
- redis_data:/data
|
28 |
+
networks:
|
29 |
+
- fred-ml-network
|
30 |
+
restart: unless-stopped
|
31 |
+
|
32 |
+
postgres:
|
33 |
+
image: postgres:15-alpine
|
34 |
+
environment:
|
35 |
+
POSTGRES_DB: fred_ml
|
36 |
+
POSTGRES_USER: fred_user
|
37 |
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
38 |
+
ports:
|
39 |
+
- "5432:5432"
|
40 |
+
volumes:
|
41 |
+
- postgres_data:/var/lib/postgresql/data
|
42 |
+
networks:
|
43 |
+
- fred-ml-network
|
44 |
+
restart: unless-stopped
|
45 |
+
|
46 |
+
nginx:
|
47 |
+
image: nginx:alpine
|
48 |
+
ports:
|
49 |
+
- "80:80"
|
50 |
+
- "443:443"
|
51 |
+
volumes:
|
52 |
+
- ./nginx.conf:/etc/nginx/nginx.conf
|
53 |
+
depends_on:
|
54 |
+
- fred-ml
|
55 |
+
networks:
|
56 |
+
- fred-ml-network
|
57 |
+
restart: unless-stopped
|
58 |
+
|
59 |
+
volumes:
|
60 |
+
redis_data:
|
61 |
+
postgres_data:
|
62 |
+
|
63 |
+
networks:
|
64 |
+
fred-ml-network:
|
65 |
+
driver: bridge
|
deploy/kubernetes/deployment.yaml
ADDED
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
apiVersion: apps/v1
|
2 |
+
kind: Deployment
|
3 |
+
metadata:
|
4 |
+
name: fred-ml
|
5 |
+
labels:
|
6 |
+
app: fred-ml
|
7 |
+
version: v1.0.0
|
8 |
+
spec:
|
9 |
+
replicas: 3
|
10 |
+
selector:
|
11 |
+
matchLabels:
|
12 |
+
app: fred-ml
|
13 |
+
template:
|
14 |
+
metadata:
|
15 |
+
labels:
|
16 |
+
app: fred-ml
|
17 |
+
version: v1.0.0
|
18 |
+
spec:
|
19 |
+
containers:
|
20 |
+
- name: fred-ml
|
21 |
+
image: ghcr.io/eaname/fredml:latest
|
22 |
+
ports:
|
23 |
+
- containerPort: 8000
|
24 |
+
name: http
|
25 |
+
env:
|
26 |
+
- name: FRED_API_KEY
|
27 |
+
valueFrom:
|
28 |
+
secretKeyRef:
|
29 |
+
name: fred-ml-secrets
|
30 |
+
key: fred-api-key
|
31 |
+
- name: ENVIRONMENT
|
32 |
+
value: "production"
|
33 |
+
- name: LOG_LEVEL
|
34 |
+
value: "INFO"
|
35 |
+
resources:
|
36 |
+
requests:
|
37 |
+
memory: "256Mi"
|
38 |
+
cpu: "250m"
|
39 |
+
limits:
|
40 |
+
memory: "512Mi"
|
41 |
+
cpu: "500m"
|
42 |
+
livenessProbe:
|
43 |
+
httpGet:
|
44 |
+
path: /health
|
45 |
+
port: 8000
|
46 |
+
initialDelaySeconds: 30
|
47 |
+
periodSeconds: 10
|
48 |
+
timeoutSeconds: 5
|
49 |
+
failureThreshold: 3
|
50 |
+
readinessProbe:
|
51 |
+
httpGet:
|
52 |
+
path: /ready
|
53 |
+
port: 8000
|
54 |
+
initialDelaySeconds: 5
|
55 |
+
periodSeconds: 5
|
56 |
+
timeoutSeconds: 3
|
57 |
+
failureThreshold: 3
|
58 |
+
volumeMounts:
|
59 |
+
- name: data-volume
|
60 |
+
mountPath: /app/data
|
61 |
+
- name: logs-volume
|
62 |
+
mountPath: /app/logs
|
63 |
+
volumes:
|
64 |
+
- name: data-volume
|
65 |
+
persistentVolumeClaim:
|
66 |
+
claimName: fred-ml-data-pvc
|
67 |
+
- name: logs-volume
|
68 |
+
persistentVolumeClaim:
|
69 |
+
claimName: fred-ml-logs-pvc
|
70 |
+
---
|
71 |
+
apiVersion: v1
|
72 |
+
kind: Service
|
73 |
+
metadata:
|
74 |
+
name: fred-ml-service
|
75 |
+
labels:
|
76 |
+
app: fred-ml
|
77 |
+
spec:
|
78 |
+
selector:
|
79 |
+
app: fred-ml
|
80 |
+
ports:
|
81 |
+
- protocol: TCP
|
82 |
+
port: 80
|
83 |
+
targetPort: 8000
|
84 |
+
name: http
|
85 |
+
type: LoadBalancer
|
86 |
+
---
|
87 |
+
apiVersion: v1
|
88 |
+
kind: PersistentVolumeClaim
|
89 |
+
metadata:
|
90 |
+
name: fred-ml-data-pvc
|
91 |
+
spec:
|
92 |
+
accessModes:
|
93 |
+
- ReadWriteOnce
|
94 |
+
resources:
|
95 |
+
requests:
|
96 |
+
storage: 10Gi
|
97 |
+
---
|
98 |
+
apiVersion: v1
|
99 |
+
kind: PersistentVolumeClaim
|
100 |
+
metadata:
|
101 |
+
name: fred-ml-logs-pvc
|
102 |
+
spec:
|
103 |
+
accessModes:
|
104 |
+
- ReadWriteOnce
|
105 |
+
resources:
|
106 |
+
requests:
|
107 |
+
storage: 5Gi
|
docs/ADVANCED_ANALYTICS_SUMMARY.md
ADDED
@@ -0,0 +1,232 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Advanced Analytics Implementation Summary
|
2 |
+
|
3 |
+
## Overview
|
4 |
+
|
5 |
+
This document summarizes the comprehensive improvements made to the FRED ML repository, transforming it from a basic economic data analysis system into a sophisticated advanced analytics platform with forecasting, segmentation, and statistical modeling capabilities.
|
6 |
+
|
7 |
+
## 🎯 Key Improvements
|
8 |
+
|
9 |
+
### 1. Cron Job Optimization ✅
|
10 |
+
**Issue**: Cron job was running daily instead of quarterly
|
11 |
+
**Solution**: Updated scheduling configuration
|
12 |
+
- **Files Modified**:
|
13 |
+
- `config/pipeline.yaml`: Changed schedule from daily to quarterly (`"0 0 1 */3 *"`)
|
14 |
+
- `.github/workflows/scheduled.yml`: Updated GitHub Actions schedule to quarterly
|
15 |
+
- **Impact**: Reduced unnecessary processing and aligned with economic data update cycles
|
16 |
+
|
17 |
+
### 2. Enhanced Data Collection ✅
|
18 |
+
**New Module**: `src/core/enhanced_fred_client.py`
|
19 |
+
- **Comprehensive Economic Indicators**: Support for all major economic indicators
|
20 |
+
- Output & Activity: GDPC1, INDPRO, RSAFS, TCU, PAYEMS
|
21 |
+
- Prices & Inflation: CPIAUCSL, PCE
|
22 |
+
- Financial & Monetary: FEDFUNDS, DGS10, M2SL
|
23 |
+
- International: DEXUSEU
|
24 |
+
- Labor: UNRATE
|
25 |
+
- **Frequency Handling**: Automatic frequency detection and standardization
|
26 |
+
- **Data Quality Assessment**: Comprehensive validation and quality metrics
|
27 |
+
- **Error Handling**: Robust error handling and logging
|
28 |
+
|
29 |
+
### 3. Advanced Time Series Forecasting ✅
|
30 |
+
**New Module**: `src/analysis/economic_forecasting.py`
|
31 |
+
- **ARIMA Models**: Automatic order selection using AIC minimization
|
32 |
+
- **ETS Models**: Exponential Smoothing with trend and seasonality
|
33 |
+
- **Stationarity Testing**: ADF test for stationarity assessment
|
34 |
+
- **Time Series Decomposition**: Trend, seasonal, and residual components
|
35 |
+
- **Backtesting**: Comprehensive performance evaluation with MAE, RMSE, MAPE
|
36 |
+
- **Confidence Intervals**: Uncertainty quantification for forecasts
|
37 |
+
- **Auto-Model Selection**: Automatic selection between ARIMA and ETS based on AIC
|
38 |
+
|
39 |
+
### 4. Economic Segmentation ✅
|
40 |
+
**New Module**: `src/analysis/economic_segmentation.py`
|
41 |
+
- **Time Period Clustering**: Identify economic regimes and periods
|
42 |
+
- **Series Clustering**: Group economic indicators by behavioral patterns
|
43 |
+
- **Multiple Algorithms**: K-means and hierarchical clustering
|
44 |
+
- **Optimal Cluster Detection**: Elbow method and silhouette analysis
|
45 |
+
- **Feature Engineering**: Rolling statistics and time series features
|
46 |
+
- **Dimensionality Reduction**: PCA and t-SNE for visualization
|
47 |
+
- **Comprehensive Analysis**: Detailed cluster characteristics and insights
|
48 |
+
|
49 |
+
### 5. Advanced Statistical Modeling ✅
|
50 |
+
**New Module**: `src/analysis/statistical_modeling.py`
|
51 |
+
- **Linear Regression**: With lagged variables and interaction terms
|
52 |
+
- **Correlation Analysis**: Pearson, Spearman, and Kendall correlations
|
53 |
+
- **Granger Causality**: Test for causal relationships between variables
|
54 |
+
- **Comprehensive Diagnostics**:
|
55 |
+
- Normality testing (Shapiro-Wilk)
|
56 |
+
- Homoscedasticity testing (Breusch-Pagan)
|
57 |
+
- Autocorrelation testing (Durbin-Watson)
|
58 |
+
- Multicollinearity testing (VIF)
|
59 |
+
- Stationarity testing (ADF, KPSS)
|
60 |
+
- **Principal Component Analysis**: Dimensionality reduction and feature analysis
|
61 |
+
|
62 |
+
### 6. Comprehensive Analytics Pipeline ✅
|
63 |
+
**New Module**: `src/analysis/comprehensive_analytics.py`
|
64 |
+
- **Orchestration**: Coordinates all analytics modules
|
65 |
+
- **Data Quality Assessment**: Comprehensive validation
|
66 |
+
- **Statistical Analysis**: Correlation, regression, and causality
|
67 |
+
- **Forecasting**: Multi-indicator forecasting with backtesting
|
68 |
+
- **Segmentation**: Time period and series clustering
|
69 |
+
- **Insights Extraction**: Automated insights generation
|
70 |
+
- **Visualization Generation**: Comprehensive plotting capabilities
|
71 |
+
- **Report Generation**: Detailed analysis reports
|
72 |
+
|
73 |
+
### 7. Enhanced Scripts ✅
|
74 |
+
**New Scripts**:
|
75 |
+
- `scripts/run_advanced_analytics.py`: Command-line interface for advanced analytics
|
76 |
+
- `scripts/comprehensive_demo.py`: Comprehensive demo showcasing all capabilities
|
77 |
+
- **Features**:
|
78 |
+
- Command-line argument parsing
|
79 |
+
- Configurable parameters
|
80 |
+
- Comprehensive logging
|
81 |
+
- Error handling
|
82 |
+
- Progress reporting
|
83 |
+
|
84 |
+
### 8. Updated Dependencies ✅
|
85 |
+
**Enhanced Requirements**: Added advanced analytics dependencies
|
86 |
+
- `scikit-learn`: Machine learning algorithms
|
87 |
+
- `scipy`: Statistical functions
|
88 |
+
- `statsmodels`: Time series analysis
|
89 |
+
- **Impact**: Enables all advanced analytics capabilities
|
90 |
+
|
91 |
+
### 9. Documentation Updates ✅
|
92 |
+
**Enhanced README**: Comprehensive documentation of new capabilities
|
93 |
+
- **Feature Descriptions**: Detailed explanation of advanced analytics
|
94 |
+
- **Usage Examples**: Command-line examples for all new features
|
95 |
+
- **Architecture Overview**: Updated system architecture
|
96 |
+
- **Demo Instructions**: Clear instructions for running demos
|
97 |
+
|
98 |
+
## 🔧 Technical Implementation Details
|
99 |
+
|
100 |
+
### Data Flow Architecture
|
101 |
+
```
|
102 |
+
FRED API → Enhanced Client → Data Quality Assessment → Analytics Pipeline
|
103 |
+
↓
|
104 |
+
Statistical Modeling → Forecasting → Segmentation
|
105 |
+
↓
|
106 |
+
Insights Extraction → Visualization → Reporting
|
107 |
+
```
|
108 |
+
|
109 |
+
### Key Analytics Capabilities
|
110 |
+
|
111 |
+
#### 1. Forecasting Pipeline
|
112 |
+
- **Data Preparation**: Growth rate calculation and frequency standardization
|
113 |
+
- **Model Selection**: Automatic ARIMA/ETS selection based on AIC
|
114 |
+
- **Performance Evaluation**: Backtesting with multiple metrics
|
115 |
+
- **Uncertainty Quantification**: Confidence intervals for all forecasts
|
116 |
+
|
117 |
+
#### 2. Segmentation Pipeline
|
118 |
+
- **Feature Engineering**: Rolling statistics and time series features
|
119 |
+
- **Cluster Analysis**: K-means and hierarchical clustering
|
120 |
+
- **Optimal Detection**: Automated cluster number selection
|
121 |
+
- **Visualization**: PCA and t-SNE projections
|
122 |
+
|
123 |
+
#### 3. Statistical Modeling Pipeline
|
124 |
+
- **Regression Analysis**: Linear models with lagged variables
|
125 |
+
- **Diagnostic Testing**: Comprehensive model validation
|
126 |
+
- **Correlation Analysis**: Multiple correlation methods
|
127 |
+
- **Causality Testing**: Granger causality analysis
|
128 |
+
|
129 |
+
### Performance Optimizations
|
130 |
+
- **Efficient Data Processing**: Vectorized operations for large datasets
|
131 |
+
- **Memory Management**: Optimized data structures and caching
|
132 |
+
- **Parallel Processing**: Where applicable for independent operations
|
133 |
+
- **Error Recovery**: Robust error handling and recovery mechanisms
|
134 |
+
|
135 |
+
## 📊 Economic Indicators Supported
|
136 |
+
|
137 |
+
### Core Indicators (Focus Areas)
|
138 |
+
1. **GDPC1**: Real Gross Domestic Product (quarterly)
|
139 |
+
2. **INDPRO**: Industrial Production Index (monthly)
|
140 |
+
3. **RSAFS**: Retail Sales (monthly)
|
141 |
+
|
142 |
+
### Additional Indicators
|
143 |
+
4. **CPIAUCSL**: Consumer Price Index
|
144 |
+
5. **FEDFUNDS**: Federal Funds Rate
|
145 |
+
6. **DGS10**: 10-Year Treasury Rate
|
146 |
+
7. **TCU**: Capacity Utilization
|
147 |
+
8. **PAYEMS**: Total Nonfarm Payrolls
|
148 |
+
9. **PCE**: Personal Consumption Expenditures
|
149 |
+
10. **M2SL**: M2 Money Stock
|
150 |
+
11. **DEXUSEU**: US/Euro Exchange Rate
|
151 |
+
12. **UNRATE**: Unemployment Rate
|
152 |
+
|
153 |
+
## 🎯 Use Cases and Applications
|
154 |
+
|
155 |
+
### 1. Economic Forecasting
|
156 |
+
- **GDP Growth Forecasting**: Predict quarterly GDP growth rates
|
157 |
+
- **Industrial Production Forecasting**: Forecast manufacturing activity
|
158 |
+
- **Retail Sales Forecasting**: Predict consumer spending patterns
|
159 |
+
- **Backtesting**: Validate forecast accuracy with historical data
|
160 |
+
|
161 |
+
### 2. Economic Regime Analysis
|
162 |
+
- **Time Period Clustering**: Identify distinct economic periods
|
163 |
+
- **Regime Classification**: Classify periods as expansion, recession, etc.
|
164 |
+
- **Pattern Recognition**: Identify recurring economic patterns
|
165 |
+
|
166 |
+
### 3. Statistical Analysis
|
167 |
+
- **Correlation Analysis**: Understand relationships between indicators
|
168 |
+
- **Causality Testing**: Determine lead-lag relationships
|
169 |
+
- **Regression Modeling**: Model economic relationships
|
170 |
+
- **Diagnostic Testing**: Validate model assumptions
|
171 |
+
|
172 |
+
### 4. Risk Assessment
|
173 |
+
- **Volatility Analysis**: Measure economic uncertainty
|
174 |
+
- **Regime Risk**: Assess risk in different economic regimes
|
175 |
+
- **Forecast Uncertainty**: Quantify forecast uncertainty
|
176 |
+
|
177 |
+
## 📈 Expected Outcomes
|
178 |
+
|
179 |
+
### 1. Improved Forecasting Accuracy
|
180 |
+
- **ARIMA/ETS Models**: Advanced time series forecasting
|
181 |
+
- **Backtesting**: Comprehensive performance validation
|
182 |
+
- **Confidence Intervals**: Uncertainty quantification
|
183 |
+
|
184 |
+
### 2. Enhanced Economic Insights
|
185 |
+
- **Segmentation**: Identify economic regimes and patterns
|
186 |
+
- **Correlation Analysis**: Understand indicator relationships
|
187 |
+
- **Causality Testing**: Determine lead-lag relationships
|
188 |
+
|
189 |
+
### 3. Comprehensive Reporting
|
190 |
+
- **Automated Reports**: Detailed analysis reports
|
191 |
+
- **Visualizations**: Interactive charts and graphs
|
192 |
+
- **Insights Extraction**: Automated key findings identification
|
193 |
+
|
194 |
+
### 4. Operational Efficiency
|
195 |
+
- **Quarterly Scheduling**: Aligned with economic data cycles
|
196 |
+
- **Automated Processing**: Reduced manual intervention
|
197 |
+
- **Quality Assurance**: Comprehensive data validation
|
198 |
+
|
199 |
+
## 🚀 Next Steps
|
200 |
+
|
201 |
+
### 1. Immediate Actions
|
202 |
+
- [ ] Test the new analytics pipeline with real data
|
203 |
+
- [ ] Validate forecasting accuracy against historical data
|
204 |
+
- [ ] Review and refine segmentation algorithms
|
205 |
+
- [ ] Optimize performance for large datasets
|
206 |
+
|
207 |
+
### 2. Future Enhancements
|
208 |
+
- [ ] Add more advanced ML models (Random Forest, Neural Networks)
|
209 |
+
- [ ] Implement ensemble forecasting methods
|
210 |
+
- [ ] Add real-time data streaming capabilities
|
211 |
+
- [ ] Develop interactive dashboard for results
|
212 |
+
|
213 |
+
### 3. Monitoring and Maintenance
|
214 |
+
- [ ] Set up monitoring for forecast accuracy
|
215 |
+
- [ ] Implement automated model retraining
|
216 |
+
- [ ] Establish alerting for data quality issues
|
217 |
+
- [ ] Create maintenance schedules for model updates
|
218 |
+
|
219 |
+
## 📋 Summary
|
220 |
+
|
221 |
+
The FRED ML repository has been significantly enhanced with advanced analytics capabilities:
|
222 |
+
|
223 |
+
1. **✅ Cron Job Fixed**: Now runs quarterly instead of daily
|
224 |
+
2. **✅ Enhanced Data Collection**: Comprehensive economic indicators
|
225 |
+
3. **✅ Advanced Forecasting**: ARIMA/ETS with backtesting
|
226 |
+
4. **✅ Economic Segmentation**: Time period and series clustering
|
227 |
+
5. **✅ Statistical Modeling**: Comprehensive analysis and diagnostics
|
228 |
+
6. **✅ Comprehensive Pipeline**: Orchestrated analytics workflow
|
229 |
+
7. **✅ Enhanced Scripts**: Command-line interfaces and demos
|
230 |
+
8. **✅ Updated Documentation**: Comprehensive usage instructions
|
231 |
+
|
232 |
+
The system now provides enterprise-grade economic analytics with forecasting, segmentation, and statistical modeling capabilities, making it suitable for serious economic research and analysis applications.
|
docs/CI_CD_STATUS.md
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# CI/CD Pipeline Status
|
2 |
+
|
3 |
+
## 🚀 **GitHub Push Successful**
|
4 |
+
|
5 |
+
**Repository**: `https://github.com/EAName/FREDML`
|
6 |
+
**Branch**: `main`
|
7 |
+
**Commit**: `25a6fd4` - "feat: Complete project cleanup and professional structure"
|
8 |
+
**Status**: ✅ **PUSHED SUCCESSFULLY**
|
9 |
+
|
10 |
+
## 📋 **What Was Pushed**
|
11 |
+
|
12 |
+
### 🧹 **Project Cleanup**
|
13 |
+
- ✅ Removed clutter files (`.coverage`, `__pycache__`, etc.)
|
14 |
+
- ✅ Moved demo HTML files to `data/exports/demo/`
|
15 |
+
- ✅ Reorganized scripts directory
|
16 |
+
- ✅ Updated `.gitignore` with comprehensive rules
|
17 |
+
|
18 |
+
### 📁 **Professional Structure**
|
19 |
+
- ✅ Clean root directory
|
20 |
+
- ✅ Logical file organization
|
21 |
+
- ✅ Professional documentation
|
22 |
+
- ✅ Enterprise-grade structure
|
23 |
+
|
24 |
+
### 🔄 **CI/CD Workflows Added**
|
25 |
+
- ✅ **Main CI/CD Pipeline** (`.github/workflows/ci-cd.yml`)
|
26 |
+
- ✅ **Pull Request Checks** (`.github/workflows/pull-request.yml`)
|
27 |
+
- ✅ **Release Management** (`.github/workflows/release.yml`)
|
28 |
+
- ✅ **Scheduled Maintenance** (`.github/workflows/scheduled.yml`)
|
29 |
+
|
30 |
+
### 🧪 **Testing Infrastructure**
|
31 |
+
- ✅ Comprehensive test suite
|
32 |
+
- ✅ Unit, integration, and E2E tests
|
33 |
+
- ✅ Automated test runners
|
34 |
+
- ✅ Development testing tools
|
35 |
+
|
36 |
+
### 📚 **Documentation**
|
37 |
+
- ✅ Professional README
|
38 |
+
- ✅ Conversation summary
|
39 |
+
- ✅ Deployment guides
|
40 |
+
- ✅ Architecture documentation
|
41 |
+
|
42 |
+
## 🔍 **Expected CI/CD Pipeline Actions**
|
43 |
+
|
44 |
+
### 1. **Main CI/CD Pipeline** (Triggered on push to main)
|
45 |
+
- [ ] **Code Quality Checks**
|
46 |
+
- Linting with flake8
|
47 |
+
- Type checking with mypy
|
48 |
+
- Security scanning with bandit
|
49 |
+
- Code formatting with black
|
50 |
+
|
51 |
+
- [ ] **Testing**
|
52 |
+
- Unit tests execution
|
53 |
+
- Integration tests
|
54 |
+
- End-to-end tests
|
55 |
+
- Coverage reporting
|
56 |
+
|
57 |
+
- [ ] **Build & Deploy**
|
58 |
+
- Docker image building
|
59 |
+
- AWS infrastructure deployment
|
60 |
+
- Lambda function updates
|
61 |
+
- S3 bucket configuration
|
62 |
+
|
63 |
+
### 2. **Quality Gates**
|
64 |
+
- [ ] **Automated Testing**: All tests must pass
|
65 |
+
- [ ] **Code Quality**: Linting and formatting checks
|
66 |
+
- [ ] **Security**: Vulnerability scanning
|
67 |
+
- [ ] **Documentation**: Automated doc generation
|
68 |
+
|
69 |
+
### 3. **Deployment Steps**
|
70 |
+
- [ ] **Infrastructure**: AWS resources deployment
|
71 |
+
- [ ] **Application**: Lambda function updates
|
72 |
+
- [ ] **Frontend**: Streamlit app deployment
|
73 |
+
- [ ] **Monitoring**: CloudWatch setup
|
74 |
+
|
75 |
+
## 📊 **Monitoring the Pipeline**
|
76 |
+
|
77 |
+
### GitHub Actions Dashboard
|
78 |
+
**URL**: `https://github.com/EAName/FREDML/actions`
|
79 |
+
|
80 |
+
### Expected Workflow Names:
|
81 |
+
1. **CI/CD Pipeline** - Main deployment workflow
|
82 |
+
2. **Pull Request Checks** - Code quality validation
|
83 |
+
3. **Scheduled Maintenance** - Automated updates
|
84 |
+
4. **Release Deployment** - Version management
|
85 |
+
|
86 |
+
### Status Indicators:
|
87 |
+
- 🟢 **Green**: All checks passed
|
88 |
+
- 🟡 **Yellow**: Some checks in progress
|
89 |
+
- 🔴 **Red**: Failed checks (requires attention)
|
90 |
+
|
91 |
+
## 🎯 **Next Steps**
|
92 |
+
|
93 |
+
### 1. **Monitor Pipeline**
|
94 |
+
- Check GitHub Actions dashboard
|
95 |
+
- Review any failed checks
|
96 |
+
- Address any issues found
|
97 |
+
|
98 |
+
### 2. **Verify Deployment**
|
99 |
+
- Confirm AWS resources created
|
100 |
+
- Test Lambda functions
|
101 |
+
- Validate Streamlit app
|
102 |
+
|
103 |
+
### 3. **Production Readiness**
|
104 |
+
- Security review
|
105 |
+
- Performance testing
|
106 |
+
- Documentation updates
|
107 |
+
|
108 |
+
## 📈 **Success Metrics**
|
109 |
+
|
110 |
+
### ✅ **Completed**
|
111 |
+
- [x] Professional project structure
|
112 |
+
- [x] Comprehensive CI/CD setup
|
113 |
+
- [x] Complete testing infrastructure
|
114 |
+
- [x] Professional documentation
|
115 |
+
- [x] GitHub push successful
|
116 |
+
|
117 |
+
### 🔄 **In Progress**
|
118 |
+
- [ ] CI/CD pipeline execution
|
119 |
+
- [ ] Automated testing
|
120 |
+
- [ ] Infrastructure deployment
|
121 |
+
- [ ] Quality gate validation
|
122 |
+
|
123 |
+
### 📋 **Next**
|
124 |
+
- [ ] Pipeline monitoring
|
125 |
+
- [ ] Deployment verification
|
126 |
+
- [ ] Production readiness
|
127 |
+
- [ ] Performance optimization
|
128 |
+
|
129 |
+
---
|
130 |
+
|
131 |
+
**Status**: 🚀 **DEPLOYED TO GITHUB**
|
132 |
+
**Next**: 📊 **MONITORING CI/CD PIPELINE**
|
133 |
+
**Goal**: 🎯 **PRODUCTION-READY SYSTEM**
|
docs/CONVERSATION_SUMMARY.md
ADDED
@@ -0,0 +1,274 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# FRED ML Project - Complete Conversation Summary
|
2 |
+
|
3 |
+
## Overview
|
4 |
+
This document summarizes the complete development journey of the FRED ML (Federal Reserve Economic Data Machine Learning) system, from initial setup through comprehensive testing, CI/CD implementation, and development environment configuration.
|
5 |
+
|
6 |
+
## Project Timeline & Major Accomplishments
|
7 |
+
|
8 |
+
### Phase 1: Initial Setup & Core Development
|
9 |
+
- **Project Structure**: Established a comprehensive ML pipeline for economic data analysis
|
10 |
+
- **Core Components**:
|
11 |
+
- FRED API integration (`src/core/fred_client.py`)
|
12 |
+
- Data pipeline (`src/core/fred_pipeline.py`)
|
13 |
+
- Economic analysis modules (`src/analysis/`)
|
14 |
+
- Visualization components (`src/visualization/`)
|
15 |
+
|
16 |
+
### Phase 2: Testing Infrastructure Development
|
17 |
+
- **Unit Tests**: Created comprehensive test suite for all core components
|
18 |
+
- **Integration Tests**: Built tests for API interactions and data processing
|
19 |
+
- **End-to-End Tests**: Developed full system testing capabilities
|
20 |
+
- **Test Runner**: Created automated test execution scripts
|
21 |
+
|
22 |
+
### Phase 3: CI/CD Pipeline Implementation
|
23 |
+
- **GitHub Actions**: Implemented complete CI/CD workflow
|
24 |
+
- Main pipeline for production deployments
|
25 |
+
- Pull request validation
|
26 |
+
- Scheduled maintenance tasks
|
27 |
+
- Release management
|
28 |
+
- **Quality Gates**: Automated testing, linting, and security checks
|
29 |
+
- **Deployment Automation**: Streamlined production deployment process
|
30 |
+
|
31 |
+
### Phase 4: Development Environment & Demo System
|
32 |
+
- **Development Testing Suite**: Created comprehensive dev testing framework
|
33 |
+
- **Interactive Demo**: Built Streamlit-based demonstration application
|
34 |
+
- **Environment Management**: Configured AWS and FRED API integration
|
35 |
+
- **Simplified Dev Setup**: Streamlined development workflow
|
36 |
+
|
37 |
+
## Key Technical Achievements
|
38 |
+
|
39 |
+
### 1. FRED ML Core System
|
40 |
+
```
|
41 |
+
src/
|
42 |
+
├── core/
|
43 |
+
│ ├── fred_client.py # FRED API integration
|
44 |
+
│ ├── fred_pipeline.py # Data processing pipeline
|
45 |
+
│ └── base_pipeline.py # Base pipeline architecture
|
46 |
+
├── analysis/
|
47 |
+
│ ├── economic_analyzer.py # Economic data analysis
|
48 |
+
│ └── advanced_analytics.py # Advanced ML analytics
|
49 |
+
└── visualization/ # Data visualization components
|
50 |
+
```
|
51 |
+
|
52 |
+
### 2. Comprehensive Testing Infrastructure
|
53 |
+
- **Unit Tests**: 100% coverage of core components
|
54 |
+
- **Integration Tests**: API and data processing validation
|
55 |
+
- **E2E Tests**: Full system workflow testing
|
56 |
+
- **Automated Test Runner**: `scripts/run_tests.py`
|
57 |
+
|
58 |
+
### 3. Production-Ready CI/CD Pipeline
|
59 |
+
```yaml
|
60 |
+
# GitHub Actions Workflows
|
61 |
+
.github/workflows/
|
62 |
+
├── ci-cd.yml # Main CI/CD pipeline
|
63 |
+
├── pr-checks.yml # Pull request validation
|
64 |
+
├── scheduled-maintenance.yml # Automated maintenance
|
65 |
+
└── release.yml # Release deployment
|
66 |
+
```
|
67 |
+
|
68 |
+
### 4. Development Environment
|
69 |
+
- **Streamlit Demo**: Interactive data exploration interface
|
70 |
+
- **Dev Testing Suite**: Comprehensive development validation
|
71 |
+
- **Environment Management**: AWS and FRED API configuration
|
72 |
+
- **Simplified Workflow**: Easy development and testing
|
73 |
+
|
74 |
+
## Environment Configuration
|
75 |
+
|
76 |
+
### Required Environment Variables
|
77 |
+
```bash
|
78 |
+
# AWS Configuration
|
79 |
+
export AWS_ACCESS_KEY_ID="your_access_key"
|
80 |
+
export AWS_SECRET_ACCESS_KEY="your_secret_key"
|
81 |
+
export AWS_DEFAULT_REGION="us-east-1"
|
82 |
+
|
83 |
+
# FRED API Configuration
|
84 |
+
export FRED_API_KEY="your_fred_api_key"
|
85 |
+
```
|
86 |
+
|
87 |
+
### Development Setup Commands
|
88 |
+
```bash
|
89 |
+
# Install dependencies
|
90 |
+
pip install -r requirements.txt
|
91 |
+
|
92 |
+
# Run development tests
|
93 |
+
python scripts/run_dev_tests.py
|
94 |
+
|
95 |
+
# Start Streamlit demo
|
96 |
+
streamlit run scripts/streamlit_demo.py
|
97 |
+
|
98 |
+
# Run full test suite
|
99 |
+
python scripts/run_tests.py
|
100 |
+
```
|
101 |
+
|
102 |
+
## Testing Strategy
|
103 |
+
|
104 |
+
### 1. Unit Testing
|
105 |
+
- **Coverage**: All core functions and classes
|
106 |
+
- **Mocking**: External API dependencies
|
107 |
+
- **Validation**: Data processing and transformation logic
|
108 |
+
|
109 |
+
### 2. Integration Testing
|
110 |
+
- **API Integration**: FRED API connectivity
|
111 |
+
- **Data Pipeline**: End-to-end data flow
|
112 |
+
- **Error Handling**: Graceful failure scenarios
|
113 |
+
|
114 |
+
### 3. End-to-End Testing
|
115 |
+
- **Full Workflow**: Complete system execution
|
116 |
+
- **Data Validation**: Output quality assurance
|
117 |
+
- **Performance**: System performance under load
|
118 |
+
|
119 |
+
## CI/CD Pipeline Features
|
120 |
+
|
121 |
+
### 1. Automated Quality Gates
|
122 |
+
- **Code Quality**: Linting and formatting checks
|
123 |
+
- **Security**: Vulnerability scanning
|
124 |
+
- **Testing**: Automated test execution
|
125 |
+
- **Documentation**: Automated documentation generation
|
126 |
+
|
127 |
+
### 2. Deployment Automation
|
128 |
+
- **Staging**: Automated staging environment deployment
|
129 |
+
- **Production**: Controlled production releases
|
130 |
+
- **Rollback**: Automated rollback capabilities
|
131 |
+
- **Monitoring**: Post-deployment monitoring
|
132 |
+
|
133 |
+
### 3. Maintenance Tasks
|
134 |
+
- **Dependency Updates**: Automated security updates
|
135 |
+
- **Data Refresh**: Scheduled data pipeline execution
|
136 |
+
- **Health Checks**: System health monitoring
|
137 |
+
- **Backup**: Automated backup procedures
|
138 |
+
|
139 |
+
## Development Workflow
|
140 |
+
|
141 |
+
### 1. Local Development
|
142 |
+
```bash
|
143 |
+
# Set up environment
|
144 |
+
source .env
|
145 |
+
|
146 |
+
# Run development tests
|
147 |
+
python scripts/run_dev_tests.py
|
148 |
+
|
149 |
+
# Start demo application
|
150 |
+
streamlit run scripts/streamlit_demo.py
|
151 |
+
```
|
152 |
+
|
153 |
+
### 2. Testing Process
|
154 |
+
```bash
|
155 |
+
# Run unit tests
|
156 |
+
python -m pytest tests/unit/
|
157 |
+
|
158 |
+
# Run integration tests
|
159 |
+
python -m pytest tests/integration/
|
160 |
+
|
161 |
+
# Run full test suite
|
162 |
+
python scripts/run_tests.py
|
163 |
+
```
|
164 |
+
|
165 |
+
### 3. Deployment Process
|
166 |
+
```bash
|
167 |
+
# Create feature branch
|
168 |
+
git checkout -b feature/new-feature
|
169 |
+
|
170 |
+
# Make changes and test
|
171 |
+
python scripts/run_dev_tests.py
|
172 |
+
|
173 |
+
# Commit and push
|
174 |
+
git add .
|
175 |
+
git commit -m "Add new feature"
|
176 |
+
git push origin feature/new-feature
|
177 |
+
|
178 |
+
# Create pull request (automated CI/CD)
|
179 |
+
```
|
180 |
+
|
181 |
+
## Key Learnings & Best Practices
|
182 |
+
|
183 |
+
### 1. Testing Strategy
|
184 |
+
- **Comprehensive Coverage**: Unit, integration, and E2E tests
|
185 |
+
- **Automated Execution**: CI/CD integration
|
186 |
+
- **Mock Dependencies**: Isolated testing
|
187 |
+
- **Data Validation**: Quality assurance
|
188 |
+
|
189 |
+
### 2. CI/CD Implementation
|
190 |
+
- **Quality Gates**: Automated quality checks
|
191 |
+
- **Security**: Vulnerability scanning
|
192 |
+
- **Deployment**: Controlled releases
|
193 |
+
- **Monitoring**: Post-deployment validation
|
194 |
+
|
195 |
+
### 3. Development Environment
|
196 |
+
- **Environment Management**: Proper configuration
|
197 |
+
- **Interactive Tools**: Streamlit for data exploration
|
198 |
+
- **Simplified Workflow**: Easy development process
|
199 |
+
- **Documentation**: Comprehensive guides
|
200 |
+
|
201 |
+
## Current System Status
|
202 |
+
|
203 |
+
### ✅ Completed Components
|
204 |
+
- [x] Core FRED ML pipeline
|
205 |
+
- [x] Comprehensive testing infrastructure
|
206 |
+
- [x] CI/CD pipeline with GitHub Actions
|
207 |
+
- [x] Development environment setup
|
208 |
+
- [x] Interactive demo application
|
209 |
+
- [x] Environment configuration
|
210 |
+
- [x] Documentation and guides
|
211 |
+
|
212 |
+
### 🔄 Active Components
|
213 |
+
- [x] Development testing suite
|
214 |
+
- [x] Streamlit demo application
|
215 |
+
- [x] AWS and FRED API integration
|
216 |
+
- [x] Automated test execution
|
217 |
+
|
218 |
+
### 📋 Next Steps (Optional)
|
219 |
+
- [ ] Production deployment
|
220 |
+
- [ ] Advanced analytics features
|
221 |
+
- [ ] Additional data sources
|
222 |
+
- [ ] Performance optimization
|
223 |
+
- [ ] Advanced visualization features
|
224 |
+
|
225 |
+
## File Structure Summary
|
226 |
+
|
227 |
+
```
|
228 |
+
FRED_ML/
|
229 |
+
├── src/ # Core application code
|
230 |
+
├── tests/ # Comprehensive test suite
|
231 |
+
├── scripts/ # Utility and demo scripts
|
232 |
+
├── docs/ # Documentation
|
233 |
+
├── .github/workflows/ # CI/CD pipelines
|
234 |
+
├── config/ # Configuration files
|
235 |
+
├── data/ # Data storage
|
236 |
+
├── deploy/ # Deployment configurations
|
237 |
+
└── infrastructure/ # Infrastructure as code
|
238 |
+
```
|
239 |
+
|
240 |
+
## Environment Setup Summary
|
241 |
+
|
242 |
+
### Required Tools
|
243 |
+
- Python 3.8+
|
244 |
+
- pip (Python package manager)
|
245 |
+
- Git (version control)
|
246 |
+
- AWS CLI (optional, for advanced features)
|
247 |
+
|
248 |
+
### Required Services
|
249 |
+
- AWS Account (for S3 and other AWS services)
|
250 |
+
- FRED API Key (for economic data access)
|
251 |
+
- GitHub Account (for CI/CD pipeline)
|
252 |
+
|
253 |
+
### Configuration Steps
|
254 |
+
1. **Clone Repository**: `git clone <repository-url>`
|
255 |
+
2. **Install Dependencies**: `pip install -r requirements.txt`
|
256 |
+
3. **Set Environment Variables**: Configure AWS and FRED API keys
|
257 |
+
4. **Run Development Tests**: `python scripts/run_dev_tests.py`
|
258 |
+
5. **Start Demo**: `streamlit run scripts/streamlit_demo.py`
|
259 |
+
|
260 |
+
## Conclusion
|
261 |
+
|
262 |
+
This project represents a comprehensive ML system for economic data analysis, featuring:
|
263 |
+
|
264 |
+
- **Robust Architecture**: Modular, testable, and maintainable code
|
265 |
+
- **Comprehensive Testing**: Unit, integration, and E2E test coverage
|
266 |
+
- **Production-Ready CI/CD**: Automated quality gates and deployment
|
267 |
+
- **Developer-Friendly**: Interactive demos and simplified workflows
|
268 |
+
- **Scalable Design**: Ready for production deployment and expansion
|
269 |
+
|
270 |
+
The system is now ready for development, testing, and eventual production deployment with full confidence in its reliability and maintainability.
|
271 |
+
|
272 |
+
---
|
273 |
+
|
274 |
+
*This summary covers the complete development journey from initial setup through comprehensive testing, CI/CD implementation, and development environment configuration. The system is production-ready with robust testing, automated deployment, and developer-friendly tools.*
|
docs/DEPLOYMENT_SUMMARY.md
ADDED
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Deployment Summary
|
2 |
+
|
3 |
+
## 🚀 **Multi-Repository Deployment Complete**
|
4 |
+
|
5 |
+
### ✅ **Successfully Pushed to Multiple Repositories**
|
6 |
+
|
7 |
+
#### 1. **ParallelLLC/FREDML**
|
8 |
+
- **URL**: `https://github.com/ParallelLLC/FREDML`
|
9 |
+
- **Status**: ✅ **DEPLOYED**
|
10 |
+
- **Latest Commit**: `2e1ea38` - "docs: Add CI/CD pipeline status tracking"
|
11 |
+
- **Branch**: `main`
|
12 |
+
|
13 |
+
#### 2. **EAName/FREDML**
|
14 |
+
- **URL**: `https://github.com/EAName/FREDML`
|
15 |
+
- **Status**: ✅ **DEPLOYED**
|
16 |
+
- **Latest Commit**: `2e1ea38` - "docs: Add CI/CD pipeline status tracking"
|
17 |
+
- **Branch**: `main`
|
18 |
+
|
19 |
+
## 📋 **What Was Deployed**
|
20 |
+
|
21 |
+
### 🧹 **Project Cleanup & Professional Structure**
|
22 |
+
- ✅ Removed clutter files and organized directory structure
|
23 |
+
- ✅ Moved demo files to appropriate locations
|
24 |
+
- ✅ Updated `.gitignore` with comprehensive rules
|
25 |
+
- ✅ Enhanced README with professional documentation
|
26 |
+
|
27 |
+
### 🔄 **CI/CD Infrastructure**
|
28 |
+
- ✅ Complete GitHub Actions workflows
|
29 |
+
- ✅ Automated testing and quality gates
|
30 |
+
- ✅ Deployment automation
|
31 |
+
- ✅ Security scanning and code quality checks
|
32 |
+
|
33 |
+
### 🧪 **Testing Framework**
|
34 |
+
- ✅ Comprehensive test suite (unit, integration, E2E)
|
35 |
+
- ✅ Automated test runners
|
36 |
+
- ✅ Development testing tools
|
37 |
+
- ✅ Quality assurance processes
|
38 |
+
|
39 |
+
### 📚 **Documentation**
|
40 |
+
- ✅ Professional README with clear structure
|
41 |
+
- ✅ Conversation summary and project history
|
42 |
+
- ✅ CI/CD status tracking
|
43 |
+
- ✅ Deployment guides and architecture docs
|
44 |
+
|
45 |
+
## 🔍 **Repository Status**
|
46 |
+
|
47 |
+
### ParallelLLC/FREDML
|
48 |
+
- **CI/CD Pipeline**: Should be triggered on push
|
49 |
+
- **Actions URL**: `https://github.com/ParallelLLC/FREDML/actions`
|
50 |
+
- **Expected Workflows**: Main CI/CD, PR checks, scheduled maintenance
|
51 |
+
|
52 |
+
### EAName/FREDML
|
53 |
+
- **CI/CD Pipeline**: Should be triggered on push
|
54 |
+
- **Actions URL**: `https://github.com/EAName/FREDML/actions`
|
55 |
+
- **Expected Workflows**: Main CI/CD, PR checks, scheduled maintenance
|
56 |
+
|
57 |
+
## 📊 **Deployment Metrics**
|
58 |
+
|
59 |
+
### ✅ **Completed**
|
60 |
+
- [x] Professional project structure
|
61 |
+
- [x] Comprehensive CI/CD setup
|
62 |
+
- [x] Complete testing infrastructure
|
63 |
+
- [x] Professional documentation
|
64 |
+
- [x] Multi-repository deployment
|
65 |
+
- [x] Status tracking documentation
|
66 |
+
|
67 |
+
### 🔄 **In Progress**
|
68 |
+
- [ ] CI/CD pipeline execution monitoring
|
69 |
+
- [ ] Automated testing validation
|
70 |
+
- [ ] Infrastructure deployment verification
|
71 |
+
- [ ] Quality gate validation
|
72 |
+
|
73 |
+
### 📋 **Next Steps**
|
74 |
+
- [ ] Monitor pipeline execution in both repositories
|
75 |
+
- [ ] Verify deployment success
|
76 |
+
- [ ] Test system functionality
|
77 |
+
- [ ] Production readiness assessment
|
78 |
+
|
79 |
+
## 🎯 **Monitoring Instructions**
|
80 |
+
|
81 |
+
### 1. **Check GitHub Actions**
|
82 |
+
- Visit each repository's Actions tab
|
83 |
+
- Monitor workflow execution status
|
84 |
+
- Review any failed checks
|
85 |
+
|
86 |
+
### 2. **Verify Deployment**
|
87 |
+
- Confirm AWS resources creation
|
88 |
+
- Test Lambda functions
|
89 |
+
- Validate Streamlit applications
|
90 |
+
|
91 |
+
### 3. **Quality Assurance**
|
92 |
+
- Run local tests to verify functionality
|
93 |
+
- Check documentation accuracy
|
94 |
+
- Validate security configurations
|
95 |
+
|
96 |
+
## 🏆 **Success Indicators**
|
97 |
+
|
98 |
+
### 🟢 **Green Status**
|
99 |
+
- All CI/CD checks passing
|
100 |
+
- Tests executing successfully
|
101 |
+
- Documentation up to date
|
102 |
+
- Professional structure maintained
|
103 |
+
|
104 |
+
### 🟡 **Yellow Status**
|
105 |
+
- Some checks in progress
|
106 |
+
- Minor issues to address
|
107 |
+
- Documentation updates needed
|
108 |
+
|
109 |
+
### 🔴 **Red Status**
|
110 |
+
- Failed checks requiring attention
|
111 |
+
- Critical issues to resolve
|
112 |
+
- Deployment problems
|
113 |
+
|
114 |
+
## 📈 **Repository Comparison**
|
115 |
+
|
116 |
+
| Repository | Status | Latest Commit | CI/CD Status |
|
117 |
+
|------------|--------|---------------|--------------|
|
118 |
+
| ParallelLLC/FREDML | ✅ Deployed | 2e1ea38 | 🔄 Running |
|
119 |
+
| EAName/FREDML | ✅ Deployed | 2e1ea38 | 🔄 Running |
|
120 |
+
|
121 |
+
## 🎉 **Achievement Summary**
|
122 |
+
|
123 |
+
### 🚀 **What We've Accomplished**
|
124 |
+
1. **Professional Project Structure**: Clean, organized, enterprise-grade
|
125 |
+
2. **Comprehensive CI/CD**: Automated testing, deployment, quality gates
|
126 |
+
3. **Multi-Repository Deployment**: Successfully pushed to multiple GitHub repos
|
127 |
+
4. **Complete Documentation**: Professional README, guides, and status tracking
|
128 |
+
5. **Testing Infrastructure**: Unit, integration, and E2E test coverage
|
129 |
+
6. **Development Tools**: Interactive demos and development utilities
|
130 |
+
|
131 |
+
### 🎯 **Production Ready**
|
132 |
+
- ✅ Professional codebase structure
|
133 |
+
- ✅ Automated quality assurance
|
134 |
+
- ✅ Comprehensive testing
|
135 |
+
- ✅ Professional documentation
|
136 |
+
- ✅ Multi-environment deployment
|
137 |
+
- ✅ CI/CD pipeline automation
|
138 |
+
|
139 |
+
---
|
140 |
+
|
141 |
+
**Status**: 🎉 **MULTI-REPOSITORY DEPLOYMENT COMPLETE**
|
142 |
+
**Next**: 📊 **MONITOR PIPELINE EXECUTION**
|
143 |
+
**Goal**: 🏆 **PRODUCTION-READY SYSTEM**
|
docs/INTEGRATION_SUMMARY.md
ADDED
@@ -0,0 +1,292 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# FRED ML - Integration Summary
|
2 |
+
|
3 |
+
## Overview
|
4 |
+
|
5 |
+
This document summarizes the comprehensive integration and improvements made to the FRED ML system, transforming it from a basic economic data pipeline into an enterprise-grade analytics platform with advanced capabilities.
|
6 |
+
|
7 |
+
## 🎯 Key Improvements
|
8 |
+
|
9 |
+
### 1. Cron Job Schedule Update
|
10 |
+
- **Before**: Daily execution (`0 0 * * *`)
|
11 |
+
- **After**: Quarterly execution (`0 0 1 */3 *`)
|
12 |
+
- **Files Updated**:
|
13 |
+
- `config/pipeline.yaml`
|
14 |
+
- `.github/workflows/scheduled.yml`
|
15 |
+
|
16 |
+
### 2. Enterprise-Grade Streamlit UI
|
17 |
+
|
18 |
+
#### Design Philosophy
|
19 |
+
- **Think Tank Aesthetic**: Professional, research-oriented interface
|
20 |
+
- **Enterprise Styling**: Modern gradients, cards, and professional color scheme
|
21 |
+
- **Comprehensive Navigation**: Executive dashboard, advanced analytics, indicators, reports, and configuration
|
22 |
+
|
23 |
+
#### Key Features
|
24 |
+
- **Executive Dashboard**: High-level metrics and KPIs
|
25 |
+
- **Advanced Analytics**: Comprehensive economic modeling and forecasting
|
26 |
+
- **Economic Indicators**: Real-time data visualization
|
27 |
+
- **Reports & Insights**: Comprehensive analysis reports
|
28 |
+
- **Configuration**: System settings and monitoring
|
29 |
+
|
30 |
+
#### Technical Implementation
|
31 |
+
- **Custom CSS**: Professional styling with gradients and cards
|
32 |
+
- **Responsive Design**: Adaptive layouts for different screen sizes
|
33 |
+
- **Interactive Charts**: Plotly-based visualizations with hover effects
|
34 |
+
- **Real-time Data**: Live integration with FRED API
|
35 |
+
- **Error Handling**: Graceful degradation and user feedback
|
36 |
+
|
37 |
+
### 3. Advanced Analytics Pipeline
|
38 |
+
|
39 |
+
#### New Modules Created
|
40 |
+
|
41 |
+
##### `src/core/enhanced_fred_client.py`
|
42 |
+
- **Comprehensive Economic Indicators**: Support for 20+ key indicators
|
43 |
+
- **Automatic Frequency Handling**: Quarterly and monthly data processing
|
44 |
+
- **Data Quality Assessment**: Missing data detection and handling
|
45 |
+
- **Error Recovery**: Robust error handling and retry logic
|
46 |
+
|
47 |
+
##### `src/analysis/economic_forecasting.py`
|
48 |
+
- **ARIMA Models**: Automatic order selection and parameter optimization
|
49 |
+
- **ETS Models**: Exponential smoothing with trend and seasonality
|
50 |
+
- **Stationarity Testing**: Augmented Dickey-Fuller tests
|
51 |
+
- **Time Series Decomposition**: Trend, seasonal, and residual analysis
|
52 |
+
- **Backtesting**: Historical performance validation
|
53 |
+
- **Confidence Intervals**: Uncertainty quantification
|
54 |
+
|
55 |
+
##### `src/analysis/economic_segmentation.py`
|
56 |
+
- **K-means Clustering**: Optimal cluster detection using elbow method
|
57 |
+
- **Hierarchical Clustering**: Dendrogram analysis for time periods
|
58 |
+
- **Dimensionality Reduction**: PCA and t-SNE for visualization
|
59 |
+
- **Time Period Clustering**: Economic regime identification
|
60 |
+
- **Series Clustering**: Indicator grouping by behavior patterns
|
61 |
+
|
62 |
+
##### `src/analysis/statistical_modeling.py`
|
63 |
+
- **Regression Analysis**: Multiple regression with lagged variables
|
64 |
+
- **Correlation Analysis**: Pearson and Spearman correlations
|
65 |
+
- **Granger Causality**: Time series causality testing
|
66 |
+
- **Diagnostic Tests**: Normality, homoscedasticity, autocorrelation
|
67 |
+
- **Multicollinearity Detection**: VIF analysis
|
68 |
+
|
69 |
+
##### `src/analysis/comprehensive_analytics.py`
|
70 |
+
- **Orchestration Engine**: Coordinates all analytics components
|
71 |
+
- **Data Pipeline**: Collection, processing, and quality assessment
|
72 |
+
- **Insights Extraction**: Automated pattern recognition
|
73 |
+
- **Visualization Generation**: Charts, plots, and dashboards
|
74 |
+
- **Report Generation**: Comprehensive analysis reports
|
75 |
+
|
76 |
+
### 4. Scripts and Automation
|
77 |
+
|
78 |
+
#### New Scripts Created
|
79 |
+
|
80 |
+
##### `scripts/run_advanced_analytics.py`
|
81 |
+
- **Command-line Interface**: Easy-to-use CLI for analytics
|
82 |
+
- **Configurable Parameters**: Flexible analysis options
|
83 |
+
- **Logging**: Comprehensive logging and progress tracking
|
84 |
+
- **Error Handling**: Robust error management
|
85 |
+
|
86 |
+
##### `scripts/comprehensive_demo.py`
|
87 |
+
- **End-to-End Demo**: Complete workflow demonstration
|
88 |
+
- **Sample Data**: Real economic indicators
|
89 |
+
- **Visualization**: Charts and plots
|
90 |
+
- **Insights**: Automated analysis results
|
91 |
+
|
92 |
+
##### `scripts/integrate_and_test.py`
|
93 |
+
- **Integration Testing**: Comprehensive system validation
|
94 |
+
- **Directory Structure**: Validation and organization
|
95 |
+
- **Dependencies**: Package and configuration checking
|
96 |
+
- **Code Quality**: Syntax and import validation
|
97 |
+
- **GitHub Preparation**: Git status and commit suggestions
|
98 |
+
|
99 |
+
##### `scripts/test_complete_system.py`
|
100 |
+
- **System Testing**: Complete functionality validation
|
101 |
+
- **Performance Testing**: Module performance assessment
|
102 |
+
- **Integration Testing**: Component interaction validation
|
103 |
+
- **Report Generation**: Detailed test reports
|
104 |
+
|
105 |
+
##### `scripts/test_streamlit_ui.py`
|
106 |
+
- **UI Testing**: Component and styling validation
|
107 |
+
- **Syntax Testing**: Code validation
|
108 |
+
- **Launch Testing**: Streamlit capability verification
|
109 |
+
|
110 |
+
### 5. Documentation and Configuration
|
111 |
+
|
112 |
+
#### Updated Files
|
113 |
+
- **README.md**: Comprehensive documentation with usage examples
|
114 |
+
- **requirements.txt**: Updated dependencies for advanced analytics
|
115 |
+
- **docs/ADVANCED_ANALYTICS_SUMMARY.md**: Detailed analytics documentation
|
116 |
+
|
117 |
+
#### New Documentation
|
118 |
+
- **docs/INTEGRATION_SUMMARY.md**: This comprehensive summary
|
119 |
+
- **Integration Reports**: JSON-based test and integration reports
|
120 |
+
|
121 |
+
## 🏗️ Architecture Improvements
|
122 |
+
|
123 |
+
### Directory Structure
|
124 |
+
```
|
125 |
+
FRED_ML/
|
126 |
+
├── src/
|
127 |
+
│ ├── analysis/ # Advanced analytics modules
|
128 |
+
│ ├── core/ # Enhanced core functionality
|
129 |
+
│ ├── visualization/ # Charting and plotting
|
130 |
+
│ └── lambda/ # AWS Lambda functions
|
131 |
+
├── frontend/ # Enterprise Streamlit UI
|
132 |
+
├── scripts/ # Automation and testing scripts
|
133 |
+
├── tests/ # Comprehensive test suite
|
134 |
+
├── docs/ # Documentation
|
135 |
+
├── config/ # Configuration files
|
136 |
+
└── data/ # Data storage and exports
|
137 |
+
```
|
138 |
+
|
139 |
+
### Technology Stack
|
140 |
+
- **Backend**: Python 3.9+, pandas, numpy, scikit-learn, statsmodels
|
141 |
+
- **Frontend**: Streamlit, Plotly, custom CSS
|
142 |
+
- **Analytics**: ARIMA, ETS, clustering, regression, causality
|
143 |
+
- **Infrastructure**: AWS Lambda, S3, GitHub Actions
|
144 |
+
- **Testing**: pytest, custom test suites
|
145 |
+
|
146 |
+
## 📊 Supported Economic Indicators
|
147 |
+
|
148 |
+
### Core Indicators
|
149 |
+
- **GDPC1**: Real Gross Domestic Product (Quarterly)
|
150 |
+
- **INDPRO**: Industrial Production Index (Monthly)
|
151 |
+
- **RSAFS**: Retail Sales (Monthly)
|
152 |
+
- **CPIAUCSL**: Consumer Price Index (Monthly)
|
153 |
+
- **FEDFUNDS**: Federal Funds Rate (Daily)
|
154 |
+
- **DGS10**: 10-Year Treasury Rate (Daily)
|
155 |
+
|
156 |
+
### Additional Indicators
|
157 |
+
- **TCU**: Capacity Utilization (Monthly)
|
158 |
+
- **PAYEMS**: Total Nonfarm Payrolls (Monthly)
|
159 |
+
- **PCE**: Personal Consumption Expenditures (Monthly)
|
160 |
+
- **M2SL**: M2 Money Stock (Monthly)
|
161 |
+
- **DEXUSEU**: US/Euro Exchange Rate (Daily)
|
162 |
+
- **UNRATE**: Unemployment Rate (Monthly)
|
163 |
+
|
164 |
+
## 🔮 Advanced Analytics Capabilities
|
165 |
+
|
166 |
+
### Forecasting
|
167 |
+
- **GDP Growth**: Quarterly GDP growth forecasting
|
168 |
+
- **Industrial Production**: Monthly IP growth forecasting
|
169 |
+
- **Retail Sales**: Monthly retail sales forecasting
|
170 |
+
- **Confidence Intervals**: Uncertainty quantification
|
171 |
+
- **Backtesting**: Historical performance validation
|
172 |
+
|
173 |
+
### Segmentation
|
174 |
+
- **Economic Regimes**: Time period clustering
|
175 |
+
- **Indicator Groups**: Series behavior clustering
|
176 |
+
- **Optimal Clusters**: Automatic cluster detection
|
177 |
+
- **Visualization**: PCA and t-SNE plots
|
178 |
+
|
179 |
+
### Statistical Modeling
|
180 |
+
- **Correlation Analysis**: Pearson and Spearman correlations
|
181 |
+
- **Granger Causality**: Time series causality
|
182 |
+
- **Regression Models**: Multiple regression with lags
|
183 |
+
- **Diagnostic Tests**: Comprehensive model validation
|
184 |
+
|
185 |
+
## 🎨 UI/UX Improvements
|
186 |
+
|
187 |
+
### Design Principles
|
188 |
+
- **Think Tank Aesthetic**: Professional, research-oriented
|
189 |
+
- **Enterprise Grade**: Modern, scalable design
|
190 |
+
- **User-Centric**: Intuitive navigation and feedback
|
191 |
+
- **Responsive**: Adaptive to different screen sizes
|
192 |
+
|
193 |
+
### Key Features
|
194 |
+
- **Executive Dashboard**: High-level KPIs and metrics
|
195 |
+
- **Advanced Analytics**: Comprehensive analysis interface
|
196 |
+
- **Real-time Data**: Live economic indicators
|
197 |
+
- **Interactive Charts**: Plotly-based visualizations
|
198 |
+
- **Professional Styling**: Custom CSS with gradients
|
199 |
+
|
200 |
+
## 🧪 Testing and Quality Assurance
|
201 |
+
|
202 |
+
### Test Coverage
|
203 |
+
- **Unit Tests**: Individual module testing
|
204 |
+
- **Integration Tests**: Component interaction testing
|
205 |
+
- **System Tests**: End-to-end workflow testing
|
206 |
+
- **UI Tests**: Streamlit interface validation
|
207 |
+
- **Performance Tests**: Module performance assessment
|
208 |
+
|
209 |
+
### Quality Metrics
|
210 |
+
- **Code Quality**: Syntax validation and error checking
|
211 |
+
- **Dependencies**: Package availability and compatibility
|
212 |
+
- **Configuration**: Settings and environment validation
|
213 |
+
- **Documentation**: Comprehensive documentation coverage
|
214 |
+
|
215 |
+
## 🚀 Deployment and Operations
|
216 |
+
|
217 |
+
### CI/CD Pipeline
|
218 |
+
- **GitHub Actions**: Automated testing and deployment
|
219 |
+
- **Quarterly Scheduling**: Automated analysis execution
|
220 |
+
- **Error Monitoring**: Comprehensive error tracking
|
221 |
+
- **Performance Monitoring**: System performance metrics
|
222 |
+
|
223 |
+
### Infrastructure
|
224 |
+
- **AWS Lambda**: Serverless function execution
|
225 |
+
- **S3 Storage**: Data and report storage
|
226 |
+
- **CloudWatch**: Monitoring and alerting
|
227 |
+
- **IAM**: Secure access management
|
228 |
+
|
229 |
+
## 📈 Expected Outcomes
|
230 |
+
|
231 |
+
### Business Value
|
232 |
+
- **Enhanced Insights**: Advanced economic analysis capabilities
|
233 |
+
- **Professional Presentation**: Enterprise-grade UI for stakeholders
|
234 |
+
- **Automated Analysis**: Quarterly automated reporting
|
235 |
+
- **Scalable Architecture**: Cloud-native, scalable design
|
236 |
+
|
237 |
+
### Technical Benefits
|
238 |
+
- **Modular Design**: Reusable, maintainable code
|
239 |
+
- **Comprehensive Testing**: Robust quality assurance
|
240 |
+
- **Documentation**: Clear, comprehensive documentation
|
241 |
+
- **Performance**: Optimized for large datasets
|
242 |
+
|
243 |
+
## 🔄 Next Steps
|
244 |
+
|
245 |
+
### Immediate Actions
|
246 |
+
1. **GitHub Submission**: Create feature branch and submit PR
|
247 |
+
2. **Testing**: Run comprehensive test suite
|
248 |
+
3. **Documentation**: Review and update documentation
|
249 |
+
4. **Deployment**: Deploy to production environment
|
250 |
+
|
251 |
+
### Future Enhancements
|
252 |
+
1. **Additional Indicators**: Expand economic indicator coverage
|
253 |
+
2. **Machine Learning**: Implement ML-based forecasting
|
254 |
+
3. **Real-time Alerts**: Automated alerting system
|
255 |
+
4. **API Development**: RESTful API for external access
|
256 |
+
5. **Mobile Support**: Responsive mobile interface
|
257 |
+
|
258 |
+
## 📋 Integration Checklist
|
259 |
+
|
260 |
+
### ✅ Completed
|
261 |
+
- [x] Cron job schedule updated to quarterly
|
262 |
+
- [x] Enterprise Streamlit UI implemented
|
263 |
+
- [x] Advanced analytics modules created
|
264 |
+
- [x] Comprehensive testing framework
|
265 |
+
- [x] Documentation updated
|
266 |
+
- [x] Dependencies updated
|
267 |
+
- [x] Directory structure organized
|
268 |
+
- [x] Integration scripts created
|
269 |
+
|
270 |
+
### 🔄 In Progress
|
271 |
+
- [ ] GitHub feature branch creation
|
272 |
+
- [ ] Pull request submission
|
273 |
+
- [ ] Code review and approval
|
274 |
+
- [ ] Production deployment
|
275 |
+
|
276 |
+
### 📋 Pending
|
277 |
+
- [ ] User acceptance testing
|
278 |
+
- [ ] Performance optimization
|
279 |
+
- [ ] Additional feature development
|
280 |
+
- [ ] Monitoring and alerting setup
|
281 |
+
|
282 |
+
## 🎉 Conclusion
|
283 |
+
|
284 |
+
The FRED ML system has been successfully transformed into an enterprise-grade economic analytics platform with:
|
285 |
+
|
286 |
+
- **Professional UI**: Think tank aesthetic with enterprise styling
|
287 |
+
- **Advanced Analytics**: Comprehensive forecasting, segmentation, and modeling
|
288 |
+
- **Robust Architecture**: Scalable, maintainable, and well-tested
|
289 |
+
- **Comprehensive Documentation**: Clear usage and technical documentation
|
290 |
+
- **Automated Operations**: Quarterly scheduling and CI/CD pipeline
|
291 |
+
|
292 |
+
The system is now ready for production deployment and provides significant value for economic analysis and research applications.
|
docs/ci-cd/README.md
ADDED
@@ -0,0 +1,290 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# CI/CD Pipeline Documentation
|
2 |
+
|
3 |
+
## Overview
|
4 |
+
|
5 |
+
The FRED ML project uses GitHub Actions for comprehensive CI/CD automation. The pipeline includes multiple workflows for different purposes:
|
6 |
+
|
7 |
+
- **Main CI/CD Pipeline** (`ci-cd.yml`): Full deployment pipeline for main branch
|
8 |
+
- **Pull Request Checks** (`pull-request.yml`): Quality checks for PRs and development
|
9 |
+
- **Scheduled Maintenance** (`scheduled.yml`): Automated maintenance tasks
|
10 |
+
- **Release Deployment** (`release.yml`): Versioned releases and production deployments
|
11 |
+
|
12 |
+
## Workflow Overview
|
13 |
+
|
14 |
+
### 🚀 Main CI/CD Pipeline (`ci-cd.yml`)
|
15 |
+
|
16 |
+
**Triggers:**
|
17 |
+
- Push to `main` or `develop` branches
|
18 |
+
- Pull requests to `main` branch
|
19 |
+
- Daily scheduled runs at 2 AM UTC
|
20 |
+
|
21 |
+
**Jobs:**
|
22 |
+
1. **🧪 Test & Quality**: Linting, type checking, unit tests
|
23 |
+
2. **🔗 Integration Tests**: AWS integration testing
|
24 |
+
3. **🚀 End-to-End Tests**: Complete system testing
|
25 |
+
4. **🔒 Security Scan**: Security vulnerability scanning
|
26 |
+
5. **⚡ Deploy Lambda**: AWS Lambda function deployment
|
27 |
+
6. **🏗️ Deploy Infrastructure**: AWS infrastructure deployment
|
28 |
+
7. **🎨 Deploy Streamlit**: Streamlit Cloud deployment preparation
|
29 |
+
8. **📢 Notifications**: Deployment status notifications
|
30 |
+
|
31 |
+
### 🔍 Pull Request Checks (`pull-request.yml`)
|
32 |
+
|
33 |
+
**Triggers:**
|
34 |
+
- Pull requests to `main` or `develop` branches
|
35 |
+
- Push to `develop` branch
|
36 |
+
|
37 |
+
**Jobs:**
|
38 |
+
1. **🔍 Code Quality**: Formatting, linting, type checking
|
39 |
+
2. **🧪 Unit Tests**: Unit test execution with coverage
|
40 |
+
3. **🔒 Security Scan**: Security vulnerability scanning
|
41 |
+
4. **📦 Dependency Check**: Outdated dependencies and security
|
42 |
+
5. **📚 Documentation Check**: README and deployment docs validation
|
43 |
+
6. **🏗️ Build Test**: Lambda package and Streamlit app testing
|
44 |
+
7. **💬 Comment Results**: Automated PR comments with results
|
45 |
+
|
46 |
+
### ⏰ Scheduled Maintenance (`scheduled.yml`)
|
47 |
+
|
48 |
+
**Triggers:**
|
49 |
+
- Daily at 6 AM UTC: Health checks
|
50 |
+
- Weekly on Sundays at 8 AM UTC: Dependency updates
|
51 |
+
- Monthly on 1st at 10 AM UTC: Performance testing
|
52 |
+
|
53 |
+
**Jobs:**
|
54 |
+
1. **🏥 Daily Health Check**: AWS service status monitoring
|
55 |
+
2. **📦 Weekly Dependency Check**: Dependency updates and security
|
56 |
+
3. **⚡ Monthly Performance Test**: Performance benchmarking
|
57 |
+
4. **🧹 Cleanup Old Artifacts**: S3 cleanup and maintenance
|
58 |
+
|
59 |
+
### 🎯 Release Deployment (`release.yml`)
|
60 |
+
|
61 |
+
**Triggers:**
|
62 |
+
- GitHub releases (published)
|
63 |
+
|
64 |
+
**Jobs:**
|
65 |
+
1. **📦 Create Release Assets**: Lambda packages, docs, test results
|
66 |
+
2. **🚀 Deploy to Production**: Production deployment
|
67 |
+
3. **🧪 Production Tests**: Post-deployment testing
|
68 |
+
4. **📢 Notify Stakeholders**: Release notifications
|
69 |
+
|
70 |
+
## Required Secrets
|
71 |
+
|
72 |
+
Configure these secrets in your GitHub repository settings:
|
73 |
+
|
74 |
+
### AWS Credentials
|
75 |
+
```bash
|
76 |
+
AWS_ACCESS_KEY_ID=your_aws_access_key
|
77 |
+
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
|
78 |
+
```
|
79 |
+
|
80 |
+
### FRED API
|
81 |
+
```bash
|
82 |
+
FRED_API_KEY=your_fred_api_key
|
83 |
+
```
|
84 |
+
|
85 |
+
## Environment Variables
|
86 |
+
|
87 |
+
The workflows use these environment variables:
|
88 |
+
|
89 |
+
```yaml
|
90 |
+
AWS_REGION: us-west-2
|
91 |
+
S3_BUCKET: fredmlv1
|
92 |
+
LAMBDA_FUNCTION: fred-ml-processor
|
93 |
+
PYTHON_VERSION: '3.9'
|
94 |
+
```
|
95 |
+
|
96 |
+
## Workflow Features
|
97 |
+
|
98 |
+
### 🔄 Automated Testing
|
99 |
+
- **Unit Tests**: pytest with coverage reporting
|
100 |
+
- **Integration Tests**: AWS service integration
|
101 |
+
- **End-to-End Tests**: Complete system validation
|
102 |
+
- **Security Scans**: Bandit security scanning
|
103 |
+
- **Performance Tests**: Load and performance testing
|
104 |
+
|
105 |
+
### 🏗️ Infrastructure as Code
|
106 |
+
- **S3 Bucket**: Automated bucket creation and configuration
|
107 |
+
- **Lambda Function**: Automated deployment and configuration
|
108 |
+
- **EventBridge Rules**: Quarterly scheduling automation
|
109 |
+
- **SSM Parameters**: Secure parameter storage
|
110 |
+
|
111 |
+
### 📊 Monitoring & Reporting
|
112 |
+
- **Code Coverage**: Automated coverage reporting to Codecov
|
113 |
+
- **Test Results**: Detailed test result artifacts
|
114 |
+
- **Security Reports**: Vulnerability scanning reports
|
115 |
+
- **Performance Metrics**: Performance benchmarking
|
116 |
+
|
117 |
+
### 🔒 Security
|
118 |
+
- **Secret Management**: Secure handling of API keys
|
119 |
+
- **Vulnerability Scanning**: Automated security checks
|
120 |
+
- **Access Control**: Environment-based deployment controls
|
121 |
+
- **Audit Trail**: Complete deployment logging
|
122 |
+
|
123 |
+
## Deployment Process
|
124 |
+
|
125 |
+
### Development Workflow
|
126 |
+
1. Create feature branch from `develop`
|
127 |
+
2. Make changes and push to branch
|
128 |
+
3. Create pull request to `develop`
|
129 |
+
4. Automated checks run on PR
|
130 |
+
5. Merge to `develop` after approval
|
131 |
+
6. Automated testing on `develop` branch
|
132 |
+
|
133 |
+
### Production Deployment
|
134 |
+
1. Create pull request from `develop` to `main`
|
135 |
+
2. Automated checks and testing
|
136 |
+
3. Merge to `main` triggers production deployment
|
137 |
+
4. Lambda function updated
|
138 |
+
5. Infrastructure deployed
|
139 |
+
6. Production tests run
|
140 |
+
7. Notification sent
|
141 |
+
|
142 |
+
### Release Process
|
143 |
+
1. Create GitHub release with version tag
|
144 |
+
2. Automated release asset creation
|
145 |
+
3. Production deployment
|
146 |
+
4. Post-deployment testing
|
147 |
+
5. Stakeholder notification
|
148 |
+
|
149 |
+
## Monitoring & Alerts
|
150 |
+
|
151 |
+
### Health Checks
|
152 |
+
- Daily AWS service status monitoring
|
153 |
+
- Lambda function availability
|
154 |
+
- S3 bucket accessibility
|
155 |
+
- EventBridge rule status
|
156 |
+
|
157 |
+
### Performance Monitoring
|
158 |
+
- Monthly performance benchmarking
|
159 |
+
- Response time tracking
|
160 |
+
- Resource utilization monitoring
|
161 |
+
- Error rate tracking
|
162 |
+
|
163 |
+
### Security Monitoring
|
164 |
+
- Weekly dependency vulnerability scans
|
165 |
+
- Security best practice compliance
|
166 |
+
- Access control monitoring
|
167 |
+
- Audit log review
|
168 |
+
|
169 |
+
## Troubleshooting
|
170 |
+
|
171 |
+
### Common Issues
|
172 |
+
|
173 |
+
#### Lambda Deployment Failures
|
174 |
+
```bash
|
175 |
+
# Check Lambda function status
|
176 |
+
aws lambda get-function --function-name fred-ml-processor --region us-west-2
|
177 |
+
|
178 |
+
# Check CloudWatch logs
|
179 |
+
aws logs describe-log-groups --log-group-name-prefix /aws/lambda/fred-ml-processor
|
180 |
+
```
|
181 |
+
|
182 |
+
#### S3 Access Issues
|
183 |
+
```bash
|
184 |
+
# Check S3 bucket permissions
|
185 |
+
aws s3 ls s3://fredmlv1 --region us-west-2
|
186 |
+
|
187 |
+
# Test bucket access
|
188 |
+
aws s3 cp test.txt s3://fredmlv1/test.txt
|
189 |
+
```
|
190 |
+
|
191 |
+
#### EventBridge Rule Issues
|
192 |
+
```bash
|
193 |
+
# Check EventBridge rules
|
194 |
+
aws events list-rules --name-prefix "fred-ml" --region us-west-2
|
195 |
+
|
196 |
+
# Test rule execution
|
197 |
+
aws events test-event-pattern --event-pattern file://event-pattern.json
|
198 |
+
```
|
199 |
+
|
200 |
+
### Debug Workflows
|
201 |
+
|
202 |
+
#### Enable Debug Logging
|
203 |
+
Add to workflow:
|
204 |
+
```yaml
|
205 |
+
env:
|
206 |
+
ACTIONS_STEP_DEBUG: true
|
207 |
+
ACTIONS_RUNNER_DEBUG: true
|
208 |
+
```
|
209 |
+
|
210 |
+
#### Check Workflow Logs
|
211 |
+
1. Go to GitHub repository
|
212 |
+
2. Click "Actions" tab
|
213 |
+
3. Select workflow run
|
214 |
+
4. View detailed logs for each job
|
215 |
+
|
216 |
+
## Best Practices
|
217 |
+
|
218 |
+
### Code Quality
|
219 |
+
- Use pre-commit hooks for local checks
|
220 |
+
- Maintain high test coverage (>80%)
|
221 |
+
- Follow PEP 8 style guidelines
|
222 |
+
- Use type hints throughout codebase
|
223 |
+
|
224 |
+
### Security
|
225 |
+
- Never commit secrets to repository
|
226 |
+
- Use least privilege AWS IAM policies
|
227 |
+
- Regularly update dependencies
|
228 |
+
- Monitor security advisories
|
229 |
+
|
230 |
+
### Performance
|
231 |
+
- Optimize Lambda function cold starts
|
232 |
+
- Use S3 lifecycle policies for cleanup
|
233 |
+
- Monitor AWS service quotas
|
234 |
+
- Implement proper error handling
|
235 |
+
|
236 |
+
### Documentation
|
237 |
+
- Keep README updated
|
238 |
+
- Document deployment procedures
|
239 |
+
- Maintain architecture diagrams
|
240 |
+
- Update troubleshooting guides
|
241 |
+
|
242 |
+
## Advanced Configuration
|
243 |
+
|
244 |
+
### Custom Workflow Triggers
|
245 |
+
```yaml
|
246 |
+
on:
|
247 |
+
push:
|
248 |
+
branches: [ main, develop ]
|
249 |
+
paths: [ 'lambda/**', 'frontend/**' ]
|
250 |
+
pull_request:
|
251 |
+
branches: [ main ]
|
252 |
+
paths-ignore: [ 'docs/**' ]
|
253 |
+
```
|
254 |
+
|
255 |
+
### Environment-Specific Deployments
|
256 |
+
```yaml
|
257 |
+
jobs:
|
258 |
+
deploy:
|
259 |
+
environment:
|
260 |
+
name: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
|
261 |
+
url: ${{ steps.deploy.outputs.url }}
|
262 |
+
```
|
263 |
+
|
264 |
+
### Conditional Job Execution
|
265 |
+
```yaml
|
266 |
+
jobs:
|
267 |
+
deploy:
|
268 |
+
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
|
269 |
+
runs-on: ubuntu-latest
|
270 |
+
```
|
271 |
+
|
272 |
+
## Support
|
273 |
+
|
274 |
+
For issues with the CI/CD pipeline:
|
275 |
+
|
276 |
+
1. Check workflow logs in GitHub Actions
|
277 |
+
2. Review this documentation
|
278 |
+
3. Check AWS CloudWatch logs
|
279 |
+
4. Contact the development team
|
280 |
+
|
281 |
+
## Contributing
|
282 |
+
|
283 |
+
To contribute to the CI/CD pipeline:
|
284 |
+
|
285 |
+
1. Create feature branch
|
286 |
+
2. Make changes to workflow files
|
287 |
+
3. Test locally with `act` (GitHub Actions local runner)
|
288 |
+
4. Create pull request
|
289 |
+
5. Ensure all checks pass
|
290 |
+
6. Get approval from maintainers
|
docs/deployment/streamlit-cloud.md
ADDED
@@ -0,0 +1,252 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Streamlit Cloud Deployment Guide
|
2 |
+
|
3 |
+
This guide explains how to deploy the FRED ML frontend to Streamlit Cloud.
|
4 |
+
|
5 |
+
## Prerequisites
|
6 |
+
|
7 |
+
1. **GitHub Account**: Your code must be in a GitHub repository
|
8 |
+
2. **Streamlit Cloud Account**: Sign up at [streamlit.io/cloud](https://streamlit.io/cloud)
|
9 |
+
3. **AWS Credentials**: Configured for S3 and Lambda access
|
10 |
+
|
11 |
+
## Step 1: Prepare Your Repository
|
12 |
+
|
13 |
+
### Repository Structure
|
14 |
+
|
15 |
+
Ensure your repository has the following structure:
|
16 |
+
|
17 |
+
```
|
18 |
+
FRED_ML/
|
19 |
+
├── frontend/
|
20 |
+
│ ├── app.py
|
21 |
+
│ └── .streamlit/
|
22 |
+
│ └── config.toml
|
23 |
+
├── requirements.txt
|
24 |
+
└── README.md
|
25 |
+
```
|
26 |
+
|
27 |
+
### Update requirements.txt
|
28 |
+
|
29 |
+
Make sure your `requirements.txt` includes Streamlit dependencies:
|
30 |
+
|
31 |
+
```txt
|
32 |
+
streamlit==1.28.1
|
33 |
+
plotly==5.17.0
|
34 |
+
altair==5.1.2
|
35 |
+
boto3==1.34.0
|
36 |
+
pandas==2.1.4
|
37 |
+
numpy==1.24.3
|
38 |
+
```
|
39 |
+
|
40 |
+
## Step 2: Configure Streamlit App
|
41 |
+
|
42 |
+
### Main App File
|
43 |
+
|
44 |
+
Your `frontend/app.py` should be the main entry point. Streamlit Cloud will automatically detect and run this file.
|
45 |
+
|
46 |
+
### Streamlit Configuration
|
47 |
+
|
48 |
+
The `.streamlit/config.toml` file should be configured for production:
|
49 |
+
|
50 |
+
```toml
|
51 |
+
[global]
|
52 |
+
developmentMode = false
|
53 |
+
|
54 |
+
[server]
|
55 |
+
headless = true
|
56 |
+
port = 8501
|
57 |
+
enableCORS = false
|
58 |
+
enableXsrfProtection = false
|
59 |
+
|
60 |
+
[browser]
|
61 |
+
gatherUsageStats = false
|
62 |
+
```
|
63 |
+
|
64 |
+
## Step 3: Deploy to Streamlit Cloud
|
65 |
+
|
66 |
+
### 1. Connect Repository
|
67 |
+
|
68 |
+
1. Go to [share.streamlit.io](https://share.streamlit.io)
|
69 |
+
2. Sign in with your GitHub account
|
70 |
+
3. Click "New app"
|
71 |
+
4. Select your repository
|
72 |
+
5. Set the main file path to `frontend/app.py`
|
73 |
+
|
74 |
+
### 2. Configure Environment Variables
|
75 |
+
|
76 |
+
In the Streamlit Cloud dashboard, add these environment variables:
|
77 |
+
|
78 |
+
```bash
|
79 |
+
# AWS Configuration
|
80 |
+
AWS_ACCESS_KEY_ID=your_aws_access_key
|
81 |
+
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
|
82 |
+
AWS_DEFAULT_REGION=us-west-2
|
83 |
+
|
84 |
+
# Application Configuration
|
85 |
+
S3_BUCKET=fredmlv1
|
86 |
+
LAMBDA_FUNCTION=fred-ml-processor
|
87 |
+
```
|
88 |
+
|
89 |
+
### 3. Advanced Settings
|
90 |
+
|
91 |
+
- **Python version**: 3.9 or higher
|
92 |
+
- **Dependencies**: Use `requirements.txt` from root directory
|
93 |
+
- **Main file path**: `frontend/app.py`
|
94 |
+
|
95 |
+
## Step 4: Environment Variables Setup
|
96 |
+
|
97 |
+
### AWS Credentials
|
98 |
+
|
99 |
+
Create an IAM user with minimal permissions:
|
100 |
+
|
101 |
+
```json
|
102 |
+
{
|
103 |
+
"Version": "2012-10-17",
|
104 |
+
"Statement": [
|
105 |
+
{
|
106 |
+
"Effect": "Allow",
|
107 |
+
"Action": [
|
108 |
+
"s3:GetObject",
|
109 |
+
"s3:ListBucket"
|
110 |
+
],
|
111 |
+
"Resource": [
|
112 |
+
"arn:aws:s3:::fredmlv1",
|
113 |
+
"arn:aws:s3:::fredmlv1/*"
|
114 |
+
]
|
115 |
+
},
|
116 |
+
{
|
117 |
+
"Effect": "Allow",
|
118 |
+
"Action": [
|
119 |
+
"lambda:InvokeFunction"
|
120 |
+
],
|
121 |
+
"Resource": "arn:aws:lambda:us-east-1:*:function:fred-ml-processor"
|
122 |
+
}
|
123 |
+
]
|
124 |
+
}
|
125 |
+
```
|
126 |
+
|
127 |
+
### Application Variables
|
128 |
+
|
129 |
+
| Variable | Description | Example |
|
130 |
+
|----------|-------------|---------|
|
131 |
+
| `S3_BUCKET` | S3 bucket name | `fredmlv1` |
|
132 |
+
| `LAMBDA_FUNCTION` | Lambda function name | `fred-ml-processor` |
|
133 |
+
| `AWS_ACCESS_KEY_ID` | AWS access key | `AKIA...` |
|
134 |
+
| `AWS_SECRET_ACCESS_KEY` | AWS secret key | `...` |
|
135 |
+
| `AWS_DEFAULT_REGION` | AWS region | `us-east-1` |
|
136 |
+
|
137 |
+
## Step 5: Deploy and Test
|
138 |
+
|
139 |
+
### 1. Deploy
|
140 |
+
|
141 |
+
1. Click "Deploy" in Streamlit Cloud
|
142 |
+
2. Wait for the build to complete
|
143 |
+
3. Check the deployment logs for any errors
|
144 |
+
|
145 |
+
### 2. Test the Application
|
146 |
+
|
147 |
+
1. Open the provided Streamlit URL
|
148 |
+
2. Navigate to the "Analysis" page
|
149 |
+
3. Select indicators and run a test analysis
|
150 |
+
4. Check the "Reports" page for results
|
151 |
+
|
152 |
+
### 3. Monitor Logs
|
153 |
+
|
154 |
+
- Check Streamlit Cloud logs for frontend issues
|
155 |
+
- Monitor AWS CloudWatch logs for Lambda function issues
|
156 |
+
- Verify S3 bucket for generated reports
|
157 |
+
|
158 |
+
## Troubleshooting
|
159 |
+
|
160 |
+
### Common Issues
|
161 |
+
|
162 |
+
#### 1. Import Errors
|
163 |
+
|
164 |
+
**Problem**: Module not found errors
|
165 |
+
**Solution**: Ensure all dependencies are in `requirements.txt`
|
166 |
+
|
167 |
+
#### 2. AWS Credentials
|
168 |
+
|
169 |
+
**Problem**: Access denied errors
|
170 |
+
**Solution**: Verify IAM permissions and credentials
|
171 |
+
|
172 |
+
#### 3. S3 Access
|
173 |
+
|
174 |
+
**Problem**: Cannot access S3 bucket
|
175 |
+
**Solution**: Check bucket name and IAM permissions
|
176 |
+
|
177 |
+
#### 4. Lambda Invocation
|
178 |
+
|
179 |
+
**Problem**: Lambda function not responding
|
180 |
+
**Solution**: Verify function name and permissions
|
181 |
+
|
182 |
+
### Debug Commands
|
183 |
+
|
184 |
+
```bash
|
185 |
+
# Test AWS credentials
|
186 |
+
aws sts get-caller-identity
|
187 |
+
|
188 |
+
# Test S3 access
|
189 |
+
aws s3 ls s3://fredmlv1/
|
190 |
+
|
191 |
+
# Test Lambda function
|
192 |
+
aws lambda invoke --function-name fred-ml-processor --payload '{}' response.json
|
193 |
+
```
|
194 |
+
|
195 |
+
## Production Considerations
|
196 |
+
|
197 |
+
### Security
|
198 |
+
|
199 |
+
1. **Use IAM Roles**: Instead of access keys when possible
|
200 |
+
2. **Rotate Credentials**: Regularly update AWS credentials
|
201 |
+
3. **Monitor Access**: Use CloudTrail to monitor API calls
|
202 |
+
|
203 |
+
### Performance
|
204 |
+
|
205 |
+
1. **Caching**: Use Streamlit caching for expensive operations
|
206 |
+
2. **Connection Pooling**: Reuse AWS connections
|
207 |
+
3. **Error Handling**: Implement proper error handling
|
208 |
+
|
209 |
+
### Monitoring
|
210 |
+
|
211 |
+
1. **Streamlit Cloud Metrics**: Monitor app performance
|
212 |
+
2. **AWS CloudWatch**: Monitor Lambda and S3 usage
|
213 |
+
3. **Custom Alerts**: Set up alerts for failures
|
214 |
+
|
215 |
+
## Custom Domain (Optional)
|
216 |
+
|
217 |
+
If you want to use a custom domain:
|
218 |
+
|
219 |
+
1. **Domain Setup**: Configure your domain in Streamlit Cloud
|
220 |
+
2. **SSL Certificate**: Streamlit Cloud handles SSL automatically
|
221 |
+
3. **DNS Configuration**: Update your DNS records
|
222 |
+
|
223 |
+
## Cost Optimization
|
224 |
+
|
225 |
+
### Streamlit Cloud
|
226 |
+
|
227 |
+
- **Free Tier**: 1 app, limited usage
|
228 |
+
- **Team Plan**: Multiple apps, more resources
|
229 |
+
- **Enterprise**: Custom pricing
|
230 |
+
|
231 |
+
### AWS Costs
|
232 |
+
|
233 |
+
- **Lambda**: Pay per invocation
|
234 |
+
- **S3**: Pay per storage and requests
|
235 |
+
- **EventBridge**: Minimal cost for scheduling
|
236 |
+
|
237 |
+
## Support
|
238 |
+
|
239 |
+
### Streamlit Cloud Support
|
240 |
+
|
241 |
+
- **Documentation**: [docs.streamlit.io](https://docs.streamlit.io)
|
242 |
+
- **Community**: [discuss.streamlit.io](https://discuss.streamlit.io)
|
243 |
+
- **GitHub**: [github.com/streamlit/streamlit](https://github.com/streamlit/streamlit)
|
244 |
+
|
245 |
+
### AWS Support
|
246 |
+
|
247 |
+
- **Documentation**: [docs.aws.amazon.com](https://docs.aws.amazon.com)
|
248 |
+
- **Support Center**: [aws.amazon.com/support](https://aws.amazon.com/support)
|
249 |
+
|
250 |
+
---
|
251 |
+
|
252 |
+
**Next Steps**: After deployment, test the complete workflow and monitor for any issues.
|
frontend/.streamlit/config.toml
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[global]
|
2 |
+
developmentMode = false
|
3 |
+
|
4 |
+
[server]
|
5 |
+
headless = true
|
6 |
+
port = 8501
|
7 |
+
enableCORS = false
|
8 |
+
enableXsrfProtection = false
|
9 |
+
|
10 |
+
[browser]
|
11 |
+
gatherUsageStats = false
|
12 |
+
|
13 |
+
[theme]
|
14 |
+
primaryColor = "#FF6B6B"
|
15 |
+
backgroundColor = "#FFFFFF"
|
16 |
+
secondaryBackgroundColor = "#F0F2F6"
|
17 |
+
textColor = "#262730"
|
18 |
+
font = "sans serif"
|
frontend/app.py
ADDED
The diff for this file is too large to render.
See raw diff
|
|
frontend/config.py
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
FRED ML - Configuration Settings
|
3 |
+
Configuration for FRED API and application settings
|
4 |
+
"""
|
5 |
+
|
6 |
+
import os
|
7 |
+
from typing import Optional
|
8 |
+
|
9 |
+
class Config:
|
10 |
+
"""Configuration class for FRED ML application"""
|
11 |
+
|
12 |
+
# FRED API Configuration
|
13 |
+
FRED_API_KEY: Optional[str] = os.getenv('FRED_API_KEY')
|
14 |
+
|
15 |
+
# Application Settings
|
16 |
+
APP_TITLE = "FRED ML - Economic Analytics Platform"
|
17 |
+
APP_DESCRIPTION = "Enterprise-grade economic analytics and forecasting platform"
|
18 |
+
|
19 |
+
# Data Settings
|
20 |
+
DEFAULT_START_DATE = "2020-01-01"
|
21 |
+
DEFAULT_END_DATE = "2024-12-31"
|
22 |
+
|
23 |
+
# Analysis Settings
|
24 |
+
FORECAST_PERIODS = 12
|
25 |
+
CONFIDENCE_LEVEL = 0.95
|
26 |
+
|
27 |
+
# UI Settings
|
28 |
+
THEME_COLOR = "#1f77b4"
|
29 |
+
SUCCESS_COLOR = "#2ca02c"
|
30 |
+
WARNING_COLOR = "#ff7f0e"
|
31 |
+
ERROR_COLOR = "#d62728"
|
32 |
+
|
33 |
+
@classmethod
|
34 |
+
def validate_fred_api_key(cls) -> bool:
|
35 |
+
"""Validate if FRED API key is properly configured"""
|
36 |
+
if not cls.FRED_API_KEY:
|
37 |
+
return False
|
38 |
+
if cls.FRED_API_KEY == 'your-fred-api-key-here':
|
39 |
+
return False
|
40 |
+
return True
|
41 |
+
|
42 |
+
@classmethod
|
43 |
+
def get_fred_api_key(cls) -> Optional[str]:
|
44 |
+
"""Get FRED API key with validation"""
|
45 |
+
if cls.validate_fred_api_key():
|
46 |
+
return cls.FRED_API_KEY
|
47 |
+
return None
|
48 |
+
|
49 |
+
def setup_fred_api_key():
|
50 |
+
"""Helper function to guide users in setting up FRED API key"""
|
51 |
+
print("=" * 60)
|
52 |
+
print("FRED ML - API Key Setup")
|
53 |
+
print("=" * 60)
|
54 |
+
print()
|
55 |
+
print("To use real FRED data, you need to:")
|
56 |
+
print("1. Get a free API key from: https://fred.stlouisfed.org/docs/api/api_key.html")
|
57 |
+
print("2. Set the environment variable:")
|
58 |
+
print(" export FRED_API_KEY='your-api-key-here'")
|
59 |
+
print()
|
60 |
+
print("Or create a .env file in the project root with:")
|
61 |
+
print("FRED_API_KEY=your-api-key-here")
|
62 |
+
print()
|
63 |
+
print("The application will work with demo data if no API key is provided.")
|
64 |
+
print("=" * 60)
|
65 |
+
|
66 |
+
if __name__ == "__main__":
|
67 |
+
setup_fred_api_key()
|
frontend/debug_fred_api.py
ADDED
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
"""
|
3 |
+
FRED ML - Debug FRED API Issues
|
4 |
+
Debug specific series that are failing
|
5 |
+
"""
|
6 |
+
|
7 |
+
import os
|
8 |
+
import requests
|
9 |
+
import json
|
10 |
+
|
11 |
+
def debug_series(series_id: str, api_key: str):
|
12 |
+
"""Debug a specific series to see what's happening"""
|
13 |
+
print(f"\n🔍 Debugging {series_id}...")
|
14 |
+
|
15 |
+
try:
|
16 |
+
# Test with a simple series request
|
17 |
+
url = "https://api.stlouisfed.org/fred/series/observations"
|
18 |
+
params = {
|
19 |
+
'series_id': series_id,
|
20 |
+
'api_key': api_key,
|
21 |
+
'file_type': 'json',
|
22 |
+
'limit': 5
|
23 |
+
}
|
24 |
+
|
25 |
+
print(f"URL: {url}")
|
26 |
+
print(f"Params: {params}")
|
27 |
+
|
28 |
+
response = requests.get(url, params=params)
|
29 |
+
|
30 |
+
print(f"Status Code: {response.status_code}")
|
31 |
+
print(f"Response Headers: {dict(response.headers)}")
|
32 |
+
|
33 |
+
if response.status_code == 200:
|
34 |
+
data = response.json()
|
35 |
+
print(f"Response Data: {json.dumps(data, indent=2)}")
|
36 |
+
|
37 |
+
if 'observations' in data:
|
38 |
+
print(f"Number of observations: {len(data['observations'])}")
|
39 |
+
if len(data['observations']) > 0:
|
40 |
+
print(f"First observation: {data['observations'][0]}")
|
41 |
+
else:
|
42 |
+
print("No observations found")
|
43 |
+
else:
|
44 |
+
print("No 'observations' key in response")
|
45 |
+
else:
|
46 |
+
print(f"Error Response: {response.text}")
|
47 |
+
|
48 |
+
except Exception as e:
|
49 |
+
print(f"Exception: {e}")
|
50 |
+
|
51 |
+
def test_series_info(series_id: str, api_key: str):
|
52 |
+
"""Test series info endpoint"""
|
53 |
+
print(f"\n📊 Testing series info for {series_id}...")
|
54 |
+
|
55 |
+
try:
|
56 |
+
url = "https://api.stlouisfed.org/fred/series"
|
57 |
+
params = {
|
58 |
+
'series_id': series_id,
|
59 |
+
'api_key': api_key,
|
60 |
+
'file_type': 'json'
|
61 |
+
}
|
62 |
+
|
63 |
+
response = requests.get(url, params=params)
|
64 |
+
|
65 |
+
print(f"Status Code: {response.status_code}")
|
66 |
+
|
67 |
+
if response.status_code == 200:
|
68 |
+
data = response.json()
|
69 |
+
print(f"Series Info: {json.dumps(data, indent=2)}")
|
70 |
+
else:
|
71 |
+
print(f"Error Response: {response.text}")
|
72 |
+
|
73 |
+
except Exception as e:
|
74 |
+
print(f"Exception: {e}")
|
75 |
+
|
76 |
+
def main():
|
77 |
+
"""Main debug function"""
|
78 |
+
print("=" * 60)
|
79 |
+
print("FRED ML - API Debug Tool")
|
80 |
+
print("=" * 60)
|
81 |
+
|
82 |
+
# Get API key from environment
|
83 |
+
api_key = os.getenv('FRED_API_KEY')
|
84 |
+
|
85 |
+
if not api_key:
|
86 |
+
print("❌ FRED_API_KEY environment variable not set")
|
87 |
+
return
|
88 |
+
|
89 |
+
# Test problematic series
|
90 |
+
problematic_series = ['FEDFUNDS', 'INDPRO']
|
91 |
+
|
92 |
+
for series_id in problematic_series:
|
93 |
+
debug_series(series_id, api_key)
|
94 |
+
test_series_info(series_id, api_key)
|
95 |
+
|
96 |
+
# Test with different parameters
|
97 |
+
print("\n🔧 Testing with different parameters...")
|
98 |
+
|
99 |
+
for series_id in problematic_series:
|
100 |
+
print(f"\nTesting {series_id} with different limits...")
|
101 |
+
|
102 |
+
for limit in [1, 5, 10]:
|
103 |
+
try:
|
104 |
+
url = "https://api.stlouisfed.org/fred/series/observations"
|
105 |
+
params = {
|
106 |
+
'series_id': series_id,
|
107 |
+
'api_key': api_key,
|
108 |
+
'file_type': 'json',
|
109 |
+
'limit': limit
|
110 |
+
}
|
111 |
+
|
112 |
+
response = requests.get(url, params=params)
|
113 |
+
|
114 |
+
if response.status_code == 200:
|
115 |
+
data = response.json()
|
116 |
+
obs_count = len(data.get('observations', []))
|
117 |
+
print(f" Limit {limit}: {obs_count} observations")
|
118 |
+
else:
|
119 |
+
print(f" Limit {limit}: Failed with status {response.status_code}")
|
120 |
+
|
121 |
+
except Exception as e:
|
122 |
+
print(f" Limit {limit}: Exception - {e}")
|
123 |
+
|
124 |
+
if __name__ == "__main__":
|
125 |
+
main()
|