Spaces:
Sleeping
Sleeping
GitHub Actions commited on
Commit ·
e4f4b02
0
Parent(s):
🚀 Deploying to Hugging Face Space: TurnoverForecasting
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +37 -0
- README.md +108 -0
- app.py +244 -0
- app_old.py +160 -0
- data/Top_12_German_Companies_Financial_Data.csv +385 -0
- data/naics_names_2012.xls +0 -0
- data/nberces5818v1_n2012.csv +0 -0
- data/processed_data.csv +0 -0
- data/processed_data_336111.csv +62 -0
- dev_notebooks/.gradio/certificate.pem +31 -0
- dev_notebooks/12_company_analysis/12_company_BMW_neural_forecasting_scaled_version.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_Daimler_neural_forecasting_scaled_version1.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_SAP_Basic_univariate.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_SAP_Basic_univariate_all.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled.ipynb +746 -0
- dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled_version.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled_version1.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled_version2.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_SAP_simple_univariate.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_Volkswagen_neural_forecasting_scaled_version1.ipynb +0 -0
- dev_notebooks/12_company_analysis/12_company_basic.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/12_company_basic.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/Allianz_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/BASF_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/BMW_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/Bayer_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/Daimler_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/Deutsche_Bank_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/Deutsche_Telekom_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/Merck_KGaA_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/Porsche_AG_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/SAP_SE_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/SAP_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/Siemens_AG_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/Sarimax/Volkswagen_AG_find_bestconfig.ipynb +0 -0
- dev_notebooks/12_company_analysis/gradio_app_BASF.ipynb +0 -0
- dev_notebooks/12_company_analysis/gradio_app_Deutsche_Telekom.ipynb +0 -0
- dev_notebooks/12_company_analysis/gradio_app_Siemens.ipynb +0 -0
- dev_notebooks/12_company_analysis/neural_forecast.ipynb +276 -0
- dev_notebooks/12_company_analysis/one_by_one_univariate_12_company copy.ipynb +1226 -0
- dev_notebooks/12_company_analysis/one_by_one_univariate_12_company.ipynb +2223 -0
- dev_notebooks/12_company_analysis/simple_test.ipynb +394 -0
- dev_notebooks/12_company_analysis/walk_forward_validation_main_Merck KGaA.ipynb +0 -0
- dev_notebooks/12_company_analysis/walk_forward_validation_main_Merck_KGaA_TCN.ipynb +0 -0
- dev_notebooks/12_company_analysis/xgb.ipynb +0 -0
- dev_notebooks/gradio_trials/SAP_SE_find_bestconfig.ipynb +0 -0
- dev_notebooks/gradio_trials/gradio_app.py +112 -0
- dev_notebooks/gradio_trials/gradio_app_SAP.ipynb +0 -0
- dev_notebooks/naics/Dataset_overview.md +90 -0
.gitattributes
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*.pdf filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
PortfolioWebsite/hugo_extended_withdeploy_0.139.2_Linux-64bit.tar.gz filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: TurnoverForecasting
|
| 3 |
+
emoji: 📊
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: red
|
| 6 |
+
sdk: gradio
|
| 7 |
+
sdk_version: 5.22.0
|
| 8 |
+
app_file: app.py
|
| 9 |
+
pinned: false
|
| 10 |
+
license: mit
|
| 11 |
+
short_description: Forecasting SAP SE Revenue with AI
|
| 12 |
+
---
|
| 13 |
+
|
| 14 |
+
# 📊 AI-Powered Turnover Forecasting for SAP SE
|
| 15 |
+
|
| 16 |
+
## 🚀 Project Overview
|
| 17 |
+
|
| 18 |
+
This project delivers **AI-driven revenue forecasting** for **SAP SE** using a **univariate SARIMA model**. The focus is to demonstrate how reliable forecasts can be achieved with **minimal data** — only historical turnover — making this approach powerful for both large enterprises and **resource-constrained settings**.
|
| 19 |
+
|
| 20 |
+
---
|
| 21 |
+
|
| 22 |
+
## 📌 Why Univariate Forecasting?
|
| 23 |
+
|
| 24 |
+
- 🔎 **Focus on one key variable — Revenue**
|
| 25 |
+
- ✅ Ideal when limited data is available
|
| 26 |
+
- 🧠 Easier to interpret and communicate results
|
| 27 |
+
- 🚀 Fast to train, test, and deploy
|
| 28 |
+
- 💡 Great for early-stage AI adoption and small business analytics
|
| 29 |
+
|
| 30 |
+
---
|
| 31 |
+
|
| 32 |
+
## 🏢 Why SAP SE?
|
| 33 |
+
|
| 34 |
+
- SAP SE is a **global leader in enterprise software**
|
| 35 |
+
- Accurate revenue forecasts support **strategic planning, risk management, and growth**
|
| 36 |
+
- As a digital-first company, SAP is ideal for showcasing **AI integration in financial operations**
|
| 37 |
+
|
| 38 |
+
---
|
| 39 |
+
|
| 40 |
+
## 🛠️ Technical Approach
|
| 41 |
+
|
| 42 |
+
- **SARIMA** model (Seasonal ARIMA) for time-series forecasting
|
| 43 |
+
- Forecast horizon: **1 to 6 quarters**
|
| 44 |
+
- Built-in **walk-forward validation**
|
| 45 |
+
- **Gradio UI** for interactive forecasting
|
| 46 |
+
- Visuals powered by **Plotly**
|
| 47 |
+
|
| 48 |
+
---
|
| 49 |
+
|
| 50 |
+
## 📊 Dataset
|
| 51 |
+
|
| 52 |
+
- Source: [Top 12 German Companies Financial Data (Kaggle)](https://www.kaggle.com/datasets/heidarmirhajisadati/top-12-german-companies-financial-data)
|
| 53 |
+
- Focused subset: **SAP SE revenue over time**
|
| 54 |
+
- Realistic industry dataset for enterprise-level modeling
|
| 55 |
+
|
| 56 |
+
---
|
| 57 |
+
|
| 58 |
+
## 🎯 Features
|
| 59 |
+
|
| 60 |
+
- Predict revenue trends with confidence intervals
|
| 61 |
+
- Dynamic forecasting by adjusting horizon and confidence level
|
| 62 |
+
- Interactive and mobile-friendly layout (single-column Gradio)
|
| 63 |
+
- Insightful visual comparisons: Training, Validation, Test & Future Forecasts
|
| 64 |
+
|
| 65 |
+
---
|
| 66 |
+
|
| 67 |
+
## ⚙️ How to Run
|
| 68 |
+
|
| 69 |
+
```bash
|
| 70 |
+
git clone https://github.com/Sharma-Pranav/Portfolio.git
|
| 71 |
+
cd projects/TurnoverForecasting
|
| 72 |
+
pip install -r requirements.txt
|
| 73 |
+
python app.py
|
| 74 |
+
|
| 75 |
+
---
|
| 76 |
+
|
| 77 |
+
## **📌 Results**
|
| 78 |
+
- **Accurate Accurate revenue forecasting for SAP SE for better financial planning. **
|
| 79 |
+
- **Optimized financial planning & business strategy insights.**
|
| 80 |
+
- **Walk-Forward Validation ensures model reliability over time.**.
|
| 81 |
+
```
|
| 82 |
+
|
| 83 |
+
---
|
| 84 |
+
|
| 85 |
+
## 🌐 Try It Live on Hugging Face
|
| 86 |
+
|
| 87 |
+
Experience the project **without installing anything**!
|
| 88 |
+
|
| 89 |
+
🚀 Just head to the hosted interactive demo:
|
| 90 |
+
|
| 91 |
+
👉 **[Launch the Forecasting App](https://huggingface.co/spaces/PranavSharma/TurnoverForecasting)**
|
| 92 |
+
|
| 93 |
+
[](https://huggingface.co/spaces/PranavSharma/TurnoverForecasting)
|
| 94 |
+
|
| 95 |
+
---
|
| 96 |
+
|
| 97 |
+
### 🔍 What You Can Do:
|
| 98 |
+
|
| 99 |
+
- 📅 **Select Forecast Horizon** – Choose how many future quarters (1–6) to predict
|
| 100 |
+
- 🎯 **Adjust Confidence Level** – See uncertainty intervals dynamically
|
| 101 |
+
- 📈 **Visualize Forecasts** – Instantly view training vs. validation vs. future forecasts
|
| 102 |
+
- 📲 **Use on Any Device** – Mobile-optimized for fast access anywhere
|
| 103 |
+
|
| 104 |
+
---
|
| 105 |
+
|
| 106 |
+
📌 **Developed by:** Pranav Sharma
|
| 107 |
+
📆 **Project Start Date:** February 2025
|
| 108 |
+
📁 **Repository:** https://github.com/Sharma-Pranav/Portfolio/
|
app.py
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
import pandas as pd
|
| 3 |
+
from tqdm import tqdm
|
| 4 |
+
import itertools
|
| 5 |
+
import plotly.graph_objects as go
|
| 6 |
+
from statsmodels.tsa.statespace.sarimax import SARIMAX
|
| 7 |
+
from sklearn.metrics import mean_absolute_error
|
| 8 |
+
import gradio as gr
|
| 9 |
+
from skops import hub_utils
|
| 10 |
+
from tempfile import mkdtemp
|
| 11 |
+
from pathlib import Path
|
| 12 |
+
import pickle
|
| 13 |
+
import os
|
| 14 |
+
import warnings
|
| 15 |
+
warnings.filterwarnings("ignore")
|
| 16 |
+
|
| 17 |
+
# Set random seed
|
| 18 |
+
np.random.seed(42)
|
| 19 |
+
|
| 20 |
+
# Get token from environment variable
|
| 21 |
+
token = os.getenv("HF_TOKEN")
|
| 22 |
+
|
| 23 |
+
# Load the dataset
|
| 24 |
+
df = pd.read_csv("data/Top_12_German_Companies_Financial_Data.csv")
|
| 25 |
+
companies = np.unique(df.Company)
|
| 26 |
+
company = companies[9]
|
| 27 |
+
print(f"Company: {company}")
|
| 28 |
+
|
| 29 |
+
# Filter for the selected company
|
| 30 |
+
df = df[df["Company"] == company].copy()
|
| 31 |
+
df["Period"] = pd.to_datetime(df["Period"], format="%m/%d/%Y")
|
| 32 |
+
df = df.sort_values(by="Period")
|
| 33 |
+
df.set_index("Period", inplace=True)
|
| 34 |
+
df["Revenue"] = pd.to_numeric(df["Revenue"], errors="coerce")
|
| 35 |
+
series = df['Revenue']
|
| 36 |
+
|
| 37 |
+
# Train-validation-test split
|
| 38 |
+
train_idx = int(len(series) * 0.8)
|
| 39 |
+
val_idx = int(len(series) * 0.9)
|
| 40 |
+
train, val, test = series[:train_idx], series[train_idx:val_idx], series[val_idx:]
|
| 41 |
+
|
| 42 |
+
# Define parameter ranges for SARIMA tuning
|
| 43 |
+
p_values, d_values, q_values = range(0, 6), range(0, 3), range(0, 6)
|
| 44 |
+
P_values, D_values, Q_values = range(0, 3), range(0, 2), range(0, 3)
|
| 45 |
+
S = 12 # Quarterly seasonality
|
| 46 |
+
|
| 47 |
+
best_score, best_cfg = float("inf"), None
|
| 48 |
+
|
| 49 |
+
# Grid search over SARIMA parameter combinations
|
| 50 |
+
for p, d, q, P, D, Q in tqdm(itertools.product(p_values, d_values, q_values, P_values, D_values, Q_values)):
|
| 51 |
+
try:
|
| 52 |
+
model = SARIMAX(train, order=(p, d, q), seasonal_order=(P, D, Q, S), enforce_stationarity=False, enforce_invertibility=False)
|
| 53 |
+
model_fit = model.fit(disp=False)
|
| 54 |
+
predictions = model_fit.forecast(steps=len(val))
|
| 55 |
+
error = mean_absolute_error(val, predictions)
|
| 56 |
+
if error < best_score:
|
| 57 |
+
best_score, best_cfg = error, (p, d, q, P, D, Q)
|
| 58 |
+
except:
|
| 59 |
+
continue
|
| 60 |
+
|
| 61 |
+
# Train best SARIMA model
|
| 62 |
+
best_p, best_d, best_q, best_P, best_D, best_Q = best_cfg
|
| 63 |
+
final_model = SARIMAX(pd.concat([train, val]), order=(best_p, best_d, best_q), seasonal_order=(best_P, best_D, best_Q, S), enforce_stationarity=False, enforce_invertibility=False, initialization="approximate_diffuse")
|
| 64 |
+
final_model_fit = final_model.fit(disp=False)
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
# Train on full dataset for next year prediction
|
| 68 |
+
full_model = SARIMAX(series, order=(best_p, best_d, best_q), seasonal_order=(best_P, best_D, best_Q, S), enforce_stationarity=False, enforce_invertibility=False, initialization="approximate_diffuse")
|
| 69 |
+
full_model_fit = full_model.fit(disp=False)
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
def forecast_turnover(horizon, confidence_level):
|
| 74 |
+
try:
|
| 75 |
+
horizon = int(horizon)
|
| 76 |
+
alpha_value = 1 - (confidence_level / 100) # Convert % to alpha
|
| 77 |
+
predictions_result = final_model_fit.get_forecast(steps=horizon)
|
| 78 |
+
final_predictions = predictions_result.predicted_mean
|
| 79 |
+
conf_int = predictions_result.conf_int(alpha=alpha_value)
|
| 80 |
+
|
| 81 |
+
last_date = test.index.min()
|
| 82 |
+
future_dates = pd.date_range(start=last_date, periods=horizon, freq="Q")
|
| 83 |
+
|
| 84 |
+
# Create interactive Plotly plot
|
| 85 |
+
fig1 = go.Figure()
|
| 86 |
+
fig1.add_trace(go.Scatter(x=train.index, y=train, mode='lines', name='Training Data', line=dict(color='blue')))
|
| 87 |
+
fig1.add_trace(go.Scatter(x=val.index, y=val, mode='lines', name='Validation Data', line=dict(color='orange')))
|
| 88 |
+
fig1.add_trace(go.Scatter(x=test.index, y=test, mode='lines+markers', name='Test Data', line=dict(color='green')))
|
| 89 |
+
fig1.add_trace(go.Scatter(x=future_dates, y=final_predictions, mode='lines+markers', name=f'Forecast ({confidence_level}%)', line=dict(color='red', dash='dash')))
|
| 90 |
+
|
| 91 |
+
# Confidence interval fill
|
| 92 |
+
fig1.add_trace(go.Scatter(
|
| 93 |
+
x=future_dates.tolist() + future_dates[::-1].tolist(),
|
| 94 |
+
y=conf_int.iloc[:, 0].tolist() + conf_int.iloc[:, 1].tolist()[::-1],
|
| 95 |
+
fill='toself',
|
| 96 |
+
fillcolor='rgba(255, 0, 0, 0.2)',
|
| 97 |
+
line=dict(color='rgba(255,255,255,0)'),
|
| 98 |
+
showlegend=True,
|
| 99 |
+
name=f'Confidence Interval ({confidence_level}%)'
|
| 100 |
+
))
|
| 101 |
+
|
| 102 |
+
fig1.update_layout(title=f"SARIMA Forecast for {company} Revenue", xaxis_title="Year", yaxis_title="Revenue", hovermode='x')
|
| 103 |
+
|
| 104 |
+
# Predict next year using full model
|
| 105 |
+
next_year_result = full_model_fit.get_forecast(steps=4)
|
| 106 |
+
next_year_predictions = next_year_result.predicted_mean
|
| 107 |
+
next_year_conf_int = next_year_result.conf_int(alpha=alpha_value)
|
| 108 |
+
next_year_dates = pd.date_range(start=series.index.max(), periods=4, freq="Q")
|
| 109 |
+
|
| 110 |
+
fig2 = go.Figure()
|
| 111 |
+
fig2.add_trace(go.Scatter(x=series.index, y=series, mode='lines', name='Full Data', line=dict(color='blue')))
|
| 112 |
+
fig2.add_trace(go.Scatter(x=next_year_dates, y=next_year_predictions, mode='lines+markers', name='Next Year Forecast', line=dict(color='red', dash='dash')))
|
| 113 |
+
fig2.add_trace(go.Scatter(
|
| 114 |
+
x=next_year_dates.tolist() + next_year_dates[::-1].tolist(),
|
| 115 |
+
y=next_year_conf_int.iloc[:, 0].tolist() + next_year_conf_int.iloc[:, 1].tolist()[::-1],
|
| 116 |
+
fill='toself',
|
| 117 |
+
fillcolor='rgba(255, 0, 0, 0.2)',
|
| 118 |
+
line=dict(color='rgba(255,255,255,0)'),
|
| 119 |
+
showlegend=True,
|
| 120 |
+
name=f'Confidence Interval ({confidence_level}%)'
|
| 121 |
+
))
|
| 122 |
+
|
| 123 |
+
fig2.update_layout(title=f"SARIMA Forecast for {company} Revenue for 2025", xaxis_title="Year", yaxis_title="Revenue", hovermode='x')
|
| 124 |
+
|
| 125 |
+
return fig1, fig2
|
| 126 |
+
except Exception as e:
|
| 127 |
+
return None, f"❌ Error: {str(e)}"
|
| 128 |
+
|
| 129 |
+
|
| 130 |
+
# Save model to a temporary path
|
| 131 |
+
model_path = "sarima_sap_model.pkl"
|
| 132 |
+
with open(model_path, "wb") as f:
|
| 133 |
+
pickle.dump(full_model_fit, f)
|
| 134 |
+
|
| 135 |
+
# Hugging Face push (moved up to run before Gradio launch)
|
| 136 |
+
base_temp_dir = Path(mkdtemp(prefix="sarima-sap-hf-"))
|
| 137 |
+
hf_repo_path = base_temp_dir / "hf_repo"
|
| 138 |
+
hf_repo_path.mkdir(parents=True, exist_ok=True)
|
| 139 |
+
|
| 140 |
+
data = df.reset_index()
|
| 141 |
+
data["Period"] = data["Period"].astype(str)
|
| 142 |
+
|
| 143 |
+
hub_utils.init(
|
| 144 |
+
model=Path(model_path),
|
| 145 |
+
requirements=["pandas", "statsmodels", "scikit-learn"],
|
| 146 |
+
dst=hf_repo_path,
|
| 147 |
+
task="tabular-regression",
|
| 148 |
+
data=data
|
| 149 |
+
)
|
| 150 |
+
|
| 151 |
+
readme_path = hf_repo_path / "README.md"
|
| 152 |
+
readme_content = f"""---
|
| 153 |
+
title: TurnoverForecasting
|
| 154 |
+
emoji: 📊
|
| 155 |
+
colorFrom: blue
|
| 156 |
+
colorTo: red
|
| 157 |
+
sdk: gradio
|
| 158 |
+
sdk_version: 5.22.0
|
| 159 |
+
app_file: app.py
|
| 160 |
+
pinned: false
|
| 161 |
+
license: mit
|
| 162 |
+
short_description: Forecasting SAP SE Revenue with AI
|
| 163 |
+
---
|
| 164 |
+
|
| 165 |
+
# 📊 AI-Powered Turnover Forecasting for SAP SE
|
| 166 |
+
|
| 167 |
+
## 🚀 Project Overview
|
| 168 |
+
|
| 169 |
+
This project delivers **AI-driven revenue forecasting** for **SAP SE** using a **univariate SARIMA model**.
|
| 170 |
+
It shows how accurate forecasts can be built from limited data (just historical turnover).
|
| 171 |
+
|
| 172 |
+
---
|
| 173 |
+
|
| 174 |
+
## 🏢 Why SAP SE?
|
| 175 |
+
|
| 176 |
+
- SAP SE is a **global leader in enterprise software**
|
| 177 |
+
- Revenue forecasts support **strategic planning & growth**
|
| 178 |
+
- Perfect case for **AI-powered financial forecasting**
|
| 179 |
+
|
| 180 |
+
---
|
| 181 |
+
|
| 182 |
+
## 🧠 Model Details
|
| 183 |
+
|
| 184 |
+
- **Model type**: SARIMA (Seasonal ARIMA)
|
| 185 |
+
- **Trained on**: SAP SE revenue from Top 12 German Companies Dataset (Kaggle)
|
| 186 |
+
- **SARIMA Order**: ({best_p}, {best_d}, {best_q})
|
| 187 |
+
- **Seasonal Order**: ({best_P}, {best_D}, {best_Q}, {S})
|
| 188 |
+
- **Evaluation Metric**: MAE (Mean Absolute Error)
|
| 189 |
+
- **Validation**: Walk-forward validation with test set (last 10%)
|
| 190 |
+
|
| 191 |
+
---
|
| 192 |
+
|
| 193 |
+
## ⚙️ How to Use
|
| 194 |
+
|
| 195 |
+
```python
|
| 196 |
+
import pickle
|
| 197 |
+
|
| 198 |
+
with open("sarima_sap_model.pkl", "rb") as f:
|
| 199 |
+
model = pickle.load(f)
|
| 200 |
+
|
| 201 |
+
forecast = model.forecast(steps=4)
|
| 202 |
+
print(forecast)
|
| 203 |
+
```
|
| 204 |
+
|
| 205 |
+
## 📌 Intended Use & Limitations
|
| 206 |
+
👍 Forecast SAP SE revenue for next 1–6 quarters
|
| 207 |
+
📈 Great for univariate, seasonal time series
|
| 208 |
+
🚫 Not suitable for multivariate or non-seasonal data
|
| 209 |
+
⚠️ Requires careful preprocessing (e.g., stationarity)
|
| 210 |
+
|
| 211 |
+
👨💻 Author: Pranav Sharma
|
| 212 |
+
"""
|
| 213 |
+
|
| 214 |
+
with open(readme_path, "w") as f:
|
| 215 |
+
f.write(readme_content)
|
| 216 |
+
|
| 217 |
+
hub_utils.push(
|
| 218 |
+
repo_id="PranavSharma/turnover-forecasting-model",
|
| 219 |
+
source=hf_repo_path,
|
| 220 |
+
commit_message="📈 Pushed SARIMA model and card for SAP SE",
|
| 221 |
+
create_remote=True,
|
| 222 |
+
token=token # Pass the token for authentication
|
| 223 |
+
)
|
| 224 |
+
|
| 225 |
+
print("pushed to HF Hub")
|
| 226 |
+
|
| 227 |
+
with gr.Blocks() as demo:
|
| 228 |
+
gr.Markdown(f"# {company} Revenue Forecast")
|
| 229 |
+
gr.Markdown("📈 Select the forecast horizon (in quarters) and confidence level for revenue predictions.")
|
| 230 |
+
|
| 231 |
+
with gr.Column():
|
| 232 |
+
horizon = gr.Slider(minimum=1, maximum=6, step=1, label="Forecast Horizon (Quarters)")
|
| 233 |
+
confidence = gr.Slider(minimum=50, maximum=99, step=1, label="Confidence Level (%)")
|
| 234 |
+
submit = gr.Button("📊 Forecast")
|
| 235 |
+
|
| 236 |
+
plot1 = gr.Plot(label="Validation & Forecast")
|
| 237 |
+
plot2 = gr.Plot(label="Full Data & 2025 Forecast")
|
| 238 |
+
|
| 239 |
+
def wrapped_forecast(h, c):
|
| 240 |
+
return forecast_turnover(h, c)
|
| 241 |
+
|
| 242 |
+
submit.click(fn=wrapped_forecast, inputs=[horizon, confidence], outputs=[plot1, plot2])
|
| 243 |
+
|
| 244 |
+
demo.launch(debug=True)
|
app_old.py
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import itertools
|
| 4 |
+
import plotly.graph_objects as go
|
| 5 |
+
from statsmodels.tsa.statespace.sarimax import SARIMAX
|
| 6 |
+
from sklearn.metrics import mean_absolute_error
|
| 7 |
+
import gradio as gr
|
| 8 |
+
from huggingface_hub import HfApi
|
| 9 |
+
from skops import hub_utils
|
| 10 |
+
from skops.card import Card, ModelIndex, DatasetCardData
|
| 11 |
+
from tempfile import mkdtemp
|
| 12 |
+
from pathlib import Path
|
| 13 |
+
import pickle
|
| 14 |
+
import pandas as pd
|
| 15 |
+
import warnings
|
| 16 |
+
warnings.filterwarnings("ignore")
|
| 17 |
+
# Set random seed for reproducibility
|
| 18 |
+
np.random.seed(42)
|
| 19 |
+
|
| 20 |
+
# Load the dataset
|
| 21 |
+
df = pd.read_csv("data/Top_12_German_Companies_Financial_Data.csv")
|
| 22 |
+
companies = np.unique(df.Company)
|
| 23 |
+
company = companies[9]
|
| 24 |
+
print(f"Company: {company}")
|
| 25 |
+
|
| 26 |
+
# Filter for the selected company
|
| 27 |
+
df = df[df["Company"] == company].copy()
|
| 28 |
+
df["Period"] = pd.to_datetime(df["Period"], format="%m/%d/%Y")
|
| 29 |
+
df = df.sort_values(by="Period")
|
| 30 |
+
df.set_index("Period", inplace=True)
|
| 31 |
+
df["Revenue"] = pd.to_numeric(df["Revenue"], errors="coerce")
|
| 32 |
+
series = df['Revenue']
|
| 33 |
+
|
| 34 |
+
# Train-validation-test split
|
| 35 |
+
train_idx = int(len(series) * 0.8)
|
| 36 |
+
val_idx = int(len(series) * 0.9)
|
| 37 |
+
train, val, test = series[:train_idx], series[train_idx:val_idx], series[val_idx:]
|
| 38 |
+
|
| 39 |
+
# Define parameter ranges for SARIMA tuning
|
| 40 |
+
p_values, d_values, q_values = range(0, 6), range(0, 3), range(0, 6)
|
| 41 |
+
P_values, D_values, Q_values = range(0, 3), range(0, 2), range(0, 3)
|
| 42 |
+
S = 12 # Quarterly seasonality
|
| 43 |
+
|
| 44 |
+
best_score, best_cfg = float("inf"), None
|
| 45 |
+
|
| 46 |
+
# Grid search over SARIMA parameter combinations
|
| 47 |
+
for p, d, q, P, D, Q in itertools.product(p_values, d_values, q_values, P_values, D_values, Q_values):
|
| 48 |
+
try:
|
| 49 |
+
model = SARIMAX(train, order=(p, d, q), seasonal_order=(P, D, Q, S), enforce_stationarity=False, enforce_invertibility=False)
|
| 50 |
+
model_fit = model.fit(disp=False)
|
| 51 |
+
predictions = model_fit.forecast(steps=len(val))
|
| 52 |
+
error = mean_absolute_error(val, predictions)
|
| 53 |
+
if error < best_score:
|
| 54 |
+
best_score, best_cfg = error, (p, d, q, P, D, Q)
|
| 55 |
+
except:
|
| 56 |
+
continue
|
| 57 |
+
|
| 58 |
+
# Train best SARIMA model
|
| 59 |
+
best_p, best_d, best_q, best_P, best_D, best_Q = best_cfg
|
| 60 |
+
final_model = SARIMAX(pd.concat([train, val]), order=(best_p, best_d, best_q), seasonal_order=(best_P, best_D, best_Q, S), enforce_stationarity=False, enforce_invertibility=False, initialization="approximate_diffuse")
|
| 61 |
+
final_model_fit = final_model.fit(disp=False)
|
| 62 |
+
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
# Train on full dataset for next year prediction
|
| 66 |
+
full_model = SARIMAX(series, order=(best_p, best_d, best_q), seasonal_order=(best_P, best_D, best_Q, S), enforce_stationarity=False, enforce_invertibility=False, initialization="approximate_diffuse")
|
| 67 |
+
full_model_fit = full_model.fit(disp=False)
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
def forecast_turnover(horizon, confidence_level):
|
| 72 |
+
try:
|
| 73 |
+
horizon = int(horizon)
|
| 74 |
+
alpha_value = 1 - (confidence_level / 100) # Convert % to alpha
|
| 75 |
+
predictions_result = final_model_fit.get_forecast(steps=horizon)
|
| 76 |
+
final_predictions = predictions_result.predicted_mean
|
| 77 |
+
conf_int = predictions_result.conf_int(alpha=alpha_value)
|
| 78 |
+
|
| 79 |
+
last_date = test.index.min()
|
| 80 |
+
future_dates = pd.date_range(start=last_date, periods=horizon, freq="Q")
|
| 81 |
+
|
| 82 |
+
# Create interactive Plotly plot
|
| 83 |
+
fig1 = go.Figure()
|
| 84 |
+
fig1.add_trace(go.Scatter(x=train.index, y=train, mode='lines', name='Training Data', line=dict(color='blue')))
|
| 85 |
+
fig1.add_trace(go.Scatter(x=val.index, y=val, mode='lines', name='Validation Data', line=dict(color='orange')))
|
| 86 |
+
fig1.add_trace(go.Scatter(x=test.index, y=test, mode='lines+markers', name='Test Data', line=dict(color='green')))
|
| 87 |
+
fig1.add_trace(go.Scatter(x=future_dates, y=final_predictions, mode='lines+markers', name=f'Forecast ({confidence_level}%)', line=dict(color='red', dash='dash')))
|
| 88 |
+
|
| 89 |
+
# Confidence interval fill
|
| 90 |
+
fig1.add_trace(go.Scatter(
|
| 91 |
+
x=future_dates.tolist() + future_dates[::-1].tolist(),
|
| 92 |
+
y=conf_int.iloc[:, 0].tolist() + conf_int.iloc[:, 1].tolist()[::-1],
|
| 93 |
+
fill='toself',
|
| 94 |
+
fillcolor='rgba(255, 0, 0, 0.2)',
|
| 95 |
+
line=dict(color='rgba(255,255,255,0)'),
|
| 96 |
+
showlegend=True,
|
| 97 |
+
name=f'Confidence Interval ({confidence_level}%)'
|
| 98 |
+
))
|
| 99 |
+
|
| 100 |
+
fig1.update_layout(title=f"SARIMA Forecast for {company} Revenue", xaxis_title="Year", yaxis_title="Revenue", hovermode='x')
|
| 101 |
+
|
| 102 |
+
# Predict next year using full model
|
| 103 |
+
next_year_result = full_model_fit.get_forecast(steps=4)
|
| 104 |
+
next_year_predictions = next_year_result.predicted_mean
|
| 105 |
+
next_year_conf_int = next_year_result.conf_int(alpha=alpha_value)
|
| 106 |
+
next_year_dates = pd.date_range(start=series.index.max(), periods=4, freq="Q")
|
| 107 |
+
|
| 108 |
+
fig2 = go.Figure()
|
| 109 |
+
fig2.add_trace(go.Scatter(x=series.index, y=series, mode='lines', name='Full Data', line=dict(color='blue')))
|
| 110 |
+
fig2.add_trace(go.Scatter(x=next_year_dates, y=next_year_predictions, mode='lines+markers', name='Next Year Forecast', line=dict(color='red', dash='dash')))
|
| 111 |
+
fig2.add_trace(go.Scatter(
|
| 112 |
+
x=next_year_dates.tolist() + next_year_dates[::-1].tolist(),
|
| 113 |
+
y=next_year_conf_int.iloc[:, 0].tolist() + next_year_conf_int.iloc[:, 1].tolist()[::-1],
|
| 114 |
+
fill='toself',
|
| 115 |
+
fillcolor='rgba(255, 0, 0, 0.2)',
|
| 116 |
+
line=dict(color='rgba(255,255,255,0)'),
|
| 117 |
+
showlegend=True,
|
| 118 |
+
name=f'Confidence Interval ({confidence_level}%)'
|
| 119 |
+
))
|
| 120 |
+
|
| 121 |
+
fig2.update_layout(title=f"SARIMA Forecast for {company} Revenue for 2025", xaxis_title="Year", yaxis_title="Revenue", hovermode='x')
|
| 122 |
+
|
| 123 |
+
return fig1, fig2
|
| 124 |
+
except Exception as e:
|
| 125 |
+
return None, f"❌ Error: {str(e)}"
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
# # Launch Gradio Interface
|
| 129 |
+
# iface = gr.Interface(
|
| 130 |
+
# fn=forecast_turnover,
|
| 131 |
+
# inputs=[
|
| 132 |
+
# gr.Slider(minimum=1, maximum=6, step=1, label="Forecast Horizon (Quarters)"),
|
| 133 |
+
# gr.Slider(minimum=50, maximum=99, step=1, label="Confidence Level (%)")
|
| 134 |
+
# ],
|
| 135 |
+
# outputs=[gr.Plot(), gr.Plot()],
|
| 136 |
+
# title=f"{company} Revenue Forecast",
|
| 137 |
+
# description="Select the forecast horizon (in quarters) and confidence level for revenue predictions.",
|
| 138 |
+
# )
|
| 139 |
+
|
| 140 |
+
# iface.launch(debug=True)
|
| 141 |
+
|
| 142 |
+
|
| 143 |
+
with gr.Blocks() as demo:
|
| 144 |
+
gr.Markdown(f"# {company} Revenue Forecast")
|
| 145 |
+
gr.Markdown("📈 Select the forecast horizon (in quarters) and confidence level for revenue predictions.")
|
| 146 |
+
|
| 147 |
+
with gr.Column():
|
| 148 |
+
horizon = gr.Slider(minimum=1, maximum=6, step=1, label="Forecast Horizon (Quarters)")
|
| 149 |
+
confidence = gr.Slider(minimum=50, maximum=99, step=1, label="Confidence Level (%)")
|
| 150 |
+
submit = gr.Button("📊 Forecast")
|
| 151 |
+
|
| 152 |
+
plot1 = gr.Plot(label="Validation & Forecast")
|
| 153 |
+
plot2 = gr.Plot(label="Full Data & 2025 Forecast")
|
| 154 |
+
|
| 155 |
+
def wrapped_forecast(h, c):
|
| 156 |
+
return forecast_turnover(h, c)
|
| 157 |
+
|
| 158 |
+
submit.click(fn=wrapped_forecast, inputs=[horizon, confidence], outputs=[plot1, plot2])
|
| 159 |
+
|
| 160 |
+
demo.launch(debug=True)
|
data/Top_12_German_Companies_Financial_Data.csv
ADDED
|
@@ -0,0 +1,385 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Company,Period,Revenue,Net Income,Liabilities,Assets,Equity,ROA (%),ROE (%),Debt to Equity
|
| 2 |
+
Volkswagen AG,3/31/2017,19695988685,1329397719,24520605687,58120450678,33599844991,2.287314883,3.956559082,0.729783298
|
| 3 |
+
Volkswagen AG,6/30/2017,7201825633,722080990.6,27556950386,53860356064,26303405678,1.340653949,2.745199612,1.047657126
|
| 4 |
+
Volkswagen AG,9/30/2017,15706422457,2263166301,11556351337,26096752248,14540400911,8.672214379,15.56467607,0.794775289
|
| 5 |
+
Volkswagen AG,12/31/2017,9750496618,516889818.4,21354201295,54861302788,33507101493,0.942175618,1.542627668,0.637303746
|
| 6 |
+
Volkswagen AG,3/31/2018,15989256775,1291419013,42659096630,53863933584,11204836955,2.397557934,11.52554935,3.807203693
|
| 7 |
+
Volkswagen AG,6/30/2018,6601886883,674015397.4,48397997453,95156833814,46758836361,0.708320538,1.441471709,1.035055643
|
| 8 |
+
Volkswagen AG,9/30/2018,11494666314,1658196131,14924498356,62462464157,47537965801,2.654708156,3.488151213,0.313949032
|
| 9 |
+
Volkswagen AG,12/31/2018,15132692627,1296423798,22603216585,52612061095,30008844510,2.464119008,4.32013901,0.753218491
|
| 10 |
+
Volkswagen AG,3/31/2019,14907937768,1438598483,20854112480,54405171112,33551058632,2.644231152,4.287788646,0.621563472
|
| 11 |
+
Volkswagen AG,6/30/2019,8797334817,1311084923,25365853191,40151924792,14786071601,3.265310268,8.867026743,1.715523492
|
| 12 |
+
Volkswagen AG,9/30/2019,10142417014,1306294910,21657205056,33344564963,11687359907,3.917564711,11.17698882,1.853045104
|
| 13 |
+
Volkswagen AG,12/31/2019,15448794996,1760261975,43856467673,93429721556,49573253883,1.884049257,3.550830008,0.884680029
|
| 14 |
+
Volkswagen AG,3/31/2020,15933280023,1743770422,44490184859,59864740520,15374555661,2.912850548,11.34192402,2.89375419
|
| 15 |
+
Volkswagen AG,6/30/2020,7895384436,511149178.9,17592686846,61107816340,43515129494,0.836471027,1.174647036,0.404288969
|
| 16 |
+
Volkswagen AG,9/30/2020,12436929028,1654939942,49496396884,90362459109,40866062225,1.831446331,4.049668237,1.211185864
|
| 17 |
+
Volkswagen AG,12/31/2020,6074909806,875656602.5,42262965768,80569106208,38306140440,1.086839167,2.285943174,1.103294806
|
| 18 |
+
Volkswagen AG,3/31/2021,19710269369,1137314233,36066540496,64427162211,28360621715,1.765271344,4.010187943,1.271711913
|
| 19 |
+
Volkswagen AG,6/30/2021,12858026662,1124878943,17059669622,65938237159,48878567538,1.705958471,2.301374609,0.349021473
|
| 20 |
+
Volkswagen AG,9/30/2021,10294096366,1404729444,27027656894,48359524775,21331867881,2.904762713,6.58512162,1.267008452
|
| 21 |
+
Volkswagen AG,12/31/2021,11544833810,1709962819,14660160673,40260511363,25600350690,4.247245654,6.679450762,0.572654682
|
| 22 |
+
Volkswagen AG,3/31/2022,17383281301,2467286454,26847350661,44033610784,17186260123,5.603189041,14.35615681,1.562140365
|
| 23 |
+
Volkswagen AG,6/30/2022,12314464977,1478784803,25112871815,44050938495,18938066680,3.356988191,7.808530977,1.326052561
|
| 24 |
+
Volkswagen AG,9/30/2022,10260879440,889227522,10690275300,28159139854,17468864554,3.157864646,5.090356727,0.611961657
|
| 25 |
+
Volkswagen AG,12/31/2022,11168902003,587168043.4,20072750684,67464272122,47391521437,0.870339255,1.238972765,0.423551515
|
| 26 |
+
Volkswagen AG,3/31/2023,13460197722,1122578628,37590881745,71858135493,34267253748,1.562215079,3.275951543,1.096991373
|
| 27 |
+
Volkswagen AG,6/30/2023,12729418594,1662688493,39022576433,81451183390,42428606957,2.041331291,3.918791148,0.919723254
|
| 28 |
+
Volkswagen AG,9/30/2023,11664866018,1677667162,15998323030,33372541902,17374218871,5.027088338,9.65607245,0.92080819
|
| 29 |
+
Volkswagen AG,12/31/2023,16782030250,1481049554,32384571623,78417189252,46032617629,1.888679725,3.217391559,0.70351358
|
| 30 |
+
Volkswagen AG,3/31/2024,7309084994,1039334580,30910642675,64531416585,33620773909,1.61058696,3.091346389,0.91939117
|
| 31 |
+
Volkswagen AG,6/30/2024,13076152982,1526410746,24545656357,68124372355,43578715998,2.240623573,3.502651951,0.563248728
|
| 32 |
+
Volkswagen AG,9/30/2024,9752432683,970590418.5,31255665329,70790020629,39534355300,1.371083678,2.455055637,0.790595043
|
| 33 |
+
Volkswagen AG,12/31/2024,14186610709,2107123762,14632441063,32642980976,18010539913,6.455059247,11.69939253,0.812437669
|
| 34 |
+
Siemens AG,3/31/2017,19833452617,1519697640,16063730954,53272532961,37208802008,2.852685156,4.084242325,0.431718574
|
| 35 |
+
Siemens AG,6/30/2017,9065572324,736570414.4,47957169639,95650487131,47693317491,0.770064468,1.544389137,1.005532267
|
| 36 |
+
Siemens AG,9/30/2017,5703877749,588622371.4,24982736979,39727077870,14744340891,1.481665411,3.992191823,1.694394966
|
| 37 |
+
Siemens AG,12/31/2017,19716237464,1276840007,45009303223,75268101508,30258798286,1.696389282,4.219731382,1.487478214
|
| 38 |
+
Siemens AG,3/31/2018,10138254767,1262116952,45296373926,72972094010,27675720085,1.729588508,4.5603762,1.63668276
|
| 39 |
+
Siemens AG,6/30/2018,11314535587,1340341283,33163887180,56794362553,23630475373,2.359990011,5.672087683,1.403437157
|
| 40 |
+
Siemens AG,9/30/2018,12634974138,741274735,28126694879,40432233302,12305538423,1.833375687,6.023911425,2.285693962
|
| 41 |
+
Siemens AG,12/31/2018,9738110535,1128540207,47796930083,86681431720,38884501637,1.301939971,2.902287954,1.229202589
|
| 42 |
+
Siemens AG,3/31/2019,11643264079,1453293868,35825693285,75665486452,39839793167,1.920682647,3.647844912,0.899243958
|
| 43 |
+
Siemens AG,6/30/2019,6550073893,733627118.4,19919552350,37424903073,17505350723,1.960264578,4.190873579,1.137912211
|
| 44 |
+
Siemens AG,9/30/2019,16654538457,1322270205,29781715108,63506323345,33724608237,2.082107947,3.920787444,0.883085577
|
| 45 |
+
Siemens AG,12/31/2019,12841952642,1411970100,29126693633,55130546327,26003852694,2.561139322,5.429849634,1.120091472
|
| 46 |
+
Siemens AG,3/31/2020,15947068708,835207323,19623471264,54178518349,34555047086,1.541583913,2.41703425,0.567890161
|
| 47 |
+
Siemens AG,6/30/2020,7571178877,527700192,14328955584,29444881442,15115925857,1.792162733,3.491021304,0.947937673
|
| 48 |
+
Siemens AG,9/30/2020,11686522494,980715243.5,33647832225,72644583109,38996750884,1.350018407,2.514863985,0.862836812
|
| 49 |
+
Siemens AG,12/31/2020,17731550761,1893885668,10137976567,39067986912,28930010345,4.847666382,6.546439648,0.350431142
|
| 50 |
+
Siemens AG,3/31/2021,18942636889,1771268697,15918566390,49830943520,33912377129,3.554555808,5.223074426,0.469402848
|
| 51 |
+
Siemens AG,6/30/2021,6387462404,911547751.1,43580496165,59758020643,16177524478,1.525398166,5.634655366,2.69389153
|
| 52 |
+
Siemens AG,9/30/2021,19026792698,2073416725,23713313938,47556455590,23843141652,4.359905925,8.696071832,0.994554924
|
| 53 |
+
Siemens AG,12/31/2021,15389996263,923394181.6,21808491986,40095375980,18286883994,2.302994196,5.049488923,1.192575618
|
| 54 |
+
Siemens AG,3/31/2022,7786480387,484400549.7,33021752886,60040484961,27018732075,0.806789869,1.792832278,1.22217996
|
| 55 |
+
Siemens AG,6/30/2022,17737880122,2592267899,23358323946,38107807520,14749483574,6.802458781,17.57531297,1.58367063
|
| 56 |
+
Siemens AG,9/30/2022,12664949131,649372783.1,35555990358,69522102895,33966112537,0.934052274,1.911825448,1.046807765
|
| 57 |
+
Siemens AG,12/31/2022,16861000234,918419211.5,32873432607,81487723152,48614290545,1.127064515,1.889195957,0.676209243
|
| 58 |
+
Siemens AG,3/31/2023,13888922534,1095226689,47947497289,70943083888,22995586599,1.543810374,4.762769081,2.085073894
|
| 59 |
+
Siemens AG,6/30/2023,14327627383,1625286889,41679203694,52235242339,10556038645,3.111475732,15.39675009,3.948375437
|
| 60 |
+
Siemens AG,9/30/2023,10185412162,754846740.3,24373958388,59331553465,34957595076,1.272251772,2.159321139,0.69724357
|
| 61 |
+
Siemens AG,12/31/2023,8282175431,459390813.5,28551545477,64407150986,35855605509,0.713260572,1.281224531,0.796292381
|
| 62 |
+
Siemens AG,3/31/2024,15785741204,1106822544,13225063565,51661794785,38436731220,2.142439202,2.87959592,0.344073576
|
| 63 |
+
Siemens AG,6/30/2024,9018099865,963180373.7,36993263217,49531602468,12538339252,1.944577453,7.681881582,2.950411731
|
| 64 |
+
Siemens AG,9/30/2024,11691964631,1345578064,24477801438,72482874961,48005073523,1.856408241,2.802991363,0.509900301
|
| 65 |
+
Siemens AG,12/31/2024,8451674463,530013312.6,43381572844,83248031989,39866459145,0.636667678,1.329471751,1.088172207
|
| 66 |
+
Allianz SE,3/31/2017,9164246774,981041952.6,19407851173,43999960378,24592109205,2.229642809,3.989255027,0.789190183
|
| 67 |
+
Allianz SE,6/30/2017,14340884258,1865680236,22448503705,35401436947,12952933241,5.270069233,14.40353472,1.733082637
|
| 68 |
+
Allianz SE,9/30/2017,7168009253,373428560.2,15187122059,38651159578,23464037519,0.966150988,1.591493194,0.647251013
|
| 69 |
+
Allianz SE,12/31/2017,19458831198,1600107100,48538978480,69583711255,21044732775,2.299542624,7.603361452,2.306466848
|
| 70 |
+
Allianz SE,3/31/2018,17610247426,2015329868,40259793264,68504291957,28244498693,2.94190307,7.135300541,1.425403003
|
| 71 |
+
Allianz SE,6/30/2018,11661846976,1354192659,23626577882,54731462963,31104885082,2.47424897,4.353633376,0.759577726
|
| 72 |
+
Allianz SE,9/30/2018,10545031789,1010594241,33534009371,63852779536,30318770165,1.582694204,3.333229664,1.106047811
|
| 73 |
+
Allianz SE,12/31/2018,11358222175,1091045445,25112465464,47584136480,22471671016,2.29287642,4.855203888,1.117516603
|
| 74 |
+
Allianz SE,3/31/2019,11744716344,1284599881,31388781794,60735397643,29346615849,2.115076103,4.377335663,1.069587783
|
| 75 |
+
Allianz SE,6/30/2019,9612688482,1071424359,26052899280,55802879567,29749980287,1.920016257,3.601428805,0.875728287
|
| 76 |
+
Allianz SE,9/30/2019,13700664809,892851810.7,14820437742,51140549989,36320112247,1.74587839,2.458284833,0.408050439
|
| 77 |
+
Allianz SE,12/31/2019,15508664175,1417702229,18132341778,46620472331,28488130553,3.040943514,4.976466345,0.636487598
|
| 78 |
+
Allianz SE,3/31/2020,9263668849,635671166.8,12187372783,46576570031,34389197248,1.364787416,1.848461778,0.354395385
|
| 79 |
+
Allianz SE,6/30/2020,13787621203,1605393739,33743352626,56826390011,23083037385,2.825084858,6.95486349,1.461824632
|
| 80 |
+
Allianz SE,9/30/2020,18005946710,2292027552,30114206666,72398006770,42283800104,3.16587107,5.420580804,0.712192532
|
| 81 |
+
Allianz SE,12/31/2020,10098889889,1161225924,39497490703,77791788915,38294298213,1.492735853,3.032372908,1.031419625
|
| 82 |
+
Allianz SE,3/31/2021,8226780982,522858114.5,39148815906,54906293986,15757478080,0.952273549,3.318158603,2.484459487
|
| 83 |
+
Allianz SE,6/30/2021,17019949886,2402780363,10477167725,40916062724,30438894999,5.872462313,7.893783146,0.344203287
|
| 84 |
+
Allianz SE,9/30/2021,11073630310,912822455.7,49692687138,70778247625,21085560486,1.289693495,4.329135364,2.356716444
|
| 85 |
+
Allianz SE,12/31/2021,9380555380,1350100953,41223028779,68933524997,27710496218,1.95855493,4.872164475,1.487632284
|
| 86 |
+
Allianz SE,3/31/2022,16640634818,2400803163,16356578486,32583061956,16226483469,7.368255218,14.79558505,1.00801745
|
| 87 |
+
Allianz SE,6/30/2022,8089768870,488084935.3,45657380068,93604660446,47947280377,0.521432302,1.017961668,0.952241289
|
| 88 |
+
Allianz SE,9/30/2022,16931011156,2086994153,18754849198,52873275455,34118426257,3.947162597,6.116912125,0.549698543
|
| 89 |
+
Allianz SE,12/31/2022,16472180169,2043609431,34718393733,62464433746,27746040013,3.271636847,7.36540937,1.25129185
|
| 90 |
+
Allianz SE,3/31/2023,14581130415,1529637744,32236390204,47068791910,14832401705,3.249791809,10.31281228,2.173376291
|
| 91 |
+
Allianz SE,6/30/2023,5318114486,431100966,42312531626,58725506361,16412974734,0.734094932,2.626586423,2.577992857
|
| 92 |
+
Allianz SE,9/30/2023,19814938566,1836312727,18499451286,30329911272,11830459986,6.054461257,15.52190472,1.563713609
|
| 93 |
+
Allianz SE,12/31/2023,13941085692,1722322782,32850325731,66248470463,33398144732,2.599792523,5.156941487,0.983597322
|
| 94 |
+
Allianz SE,3/31/2024,18801502624,1006058196,48264388990,86904149774,38639760784,1.157664161,2.603686398,1.249086123
|
| 95 |
+
Allianz SE,6/30/2024,13059939771,864826440.5,21561018412,57150274352,35589255939,1.513249849,2.430021133,0.605829424
|
| 96 |
+
Allianz SE,9/30/2024,16908879786,1197174003,48008203569,67570965703,19562762134,1.77172842,6.11965731,2.454060589
|
| 97 |
+
Allianz SE,12/31/2024,7203400075,631684017.9,23852825717,41830939577,17978113860,1.510088046,3.513627863,1.3267702
|
| 98 |
+
BMW AG,3/31/2017,18765462866,1081539894,34543581067,80126669599,45583088532,1.349787655,2.372677959,0.75781572
|
| 99 |
+
BMW AG,6/30/2017,10211703797,526461438.3,13575717212,61177654063,47601936851,0.860545319,1.105966423,0.285192539
|
| 100 |
+
BMW AG,9/30/2017,14824260103,1856672009,49769403556,87097998229,37328594673,2.13170457,4.973859919,1.333278255
|
| 101 |
+
BMW AG,12/31/2017,18808147150,960184349.6,35382107627,67327482638,31945375011,1.42614028,3.005706927,1.107581539
|
| 102 |
+
BMW AG,3/31/2018,7335760537,743322627.7,48776154787,95122657900,46346503113,0.781435931,1.603837566,1.052423624
|
| 103 |
+
BMW AG,6/30/2018,17315578796,1167741135,16852576890,50991540077,34138963187,2.290068378,3.42055243,0.493646418
|
| 104 |
+
BMW AG,9/30/2018,5647276212,430192893.6,49486716701,66912699732,17425983031,0.642916659,2.468686517,2.839823533
|
| 105 |
+
BMW AG,12/31/2018,6557505339,618883604.9,33315961378,60538144207,27222182829,1.022303562,2.273453267,1.223853414
|
| 106 |
+
BMW AG,3/31/2019,15132523755,1022601951,38023980809,86825852703,48801871894,1.177762059,2.095415424,0.779150048
|
| 107 |
+
BMW AG,6/30/2019,13411319092,782523298.9,19531535755,37657712776,18126177021,2.077989451,4.317089577,1.077531999
|
| 108 |
+
BMW AG,9/30/2019,8103350227,738019784.6,20380748219,31832927467,11452179248,2.318416317,6.444361101,1.779639296
|
| 109 |
+
BMW AG,12/31/2019,8859340166,1144565565,40538252302,78168514026,37630261724,1.464228377,3.041609365,1.077277979
|
| 110 |
+
BMW AG,3/31/2020,12864732630,1045458883,40800355871,78928197945,38127842074,1.324569559,2.741982831,1.070093497
|
| 111 |
+
BMW AG,6/30/2020,19909637251,2732548048,15058770523,36892503606,21833733082,7.406783982,12.5152581,0.689702053
|
| 112 |
+
BMW AG,9/30/2020,9482010377,803442750.4,46174948427,92567055368,46392106941,0.867957555,1.731852256,0.995319063
|
| 113 |
+
BMW AG,12/31/2020,6940311223,962499322.1,29150494667,41331347093,12180852427,2.328739298,7.901740276,2.393140779
|
| 114 |
+
BMW AG,3/31/2021,8417325544,742678238,36333752143,50307101979,13973349836,1.47628905,5.314962029,2.600217741
|
| 115 |
+
BMW AG,6/30/2021,12011483364,1571388192,16704351188,36319540470,19615189283,4.326564081,8.011078402,0.851602855
|
| 116 |
+
BMW AG,9/30/2021,14132310152,1250503703,34109472155,60179867780,26070395624,2.077943587,4.796642602,1.308360358
|
| 117 |
+
BMW AG,12/31/2021,18321682480,1436804767,33230894855,73659285546,40428390691,1.950609154,3.55394994,0.821969272
|
| 118 |
+
BMW AG,3/31/2022,11652663475,1123917078,30713910663,55316480279,24602569617,2.031794272,4.568291423,1.248402551
|
| 119 |
+
BMW AG,6/30/2022,11584036388,1399147461,22546412228,53277235987,30730823758,2.626163755,4.55291232,0.73367419
|
| 120 |
+
BMW AG,9/30/2022,18782382394,1614997271,25317192992,38617124033,13299931041,4.18207547,12.14289959,1.903558215
|
| 121 |
+
BMW AG,12/31/2022,7382434260,1093800017,35338248318,45898916976,10560668658,2.383062802,10.35729888,3.346213148
|
| 122 |
+
BMW AG,3/31/2023,19456335114,2009563555,47081333393,64537094762,17455761369,3.113811618,11.51232256,2.697180169
|
| 123 |
+
BMW AG,6/30/2023,14368618381,1533626886,42361743521,64353154119,21991410599,2.383141754,6.973754044,1.926285871
|
| 124 |
+
BMW AG,9/30/2023,12729885504,1804875257,10865997336,56007965536,45141968200,3.222533152,3.998220124,0.240707213
|
| 125 |
+
BMW AG,12/31/2023,8469619625,602960048.5,32716601950,78863289364,46146687414,0.764563656,1.306616103,0.708969674
|
| 126 |
+
BMW AG,3/31/2024,15848632086,2129654605,38842203399,87315704066,48473500667,2.439028154,4.393440901,0.80130799
|
| 127 |
+
BMW AG,6/30/2024,17928146832,2182113657,12109060417,56333682316,44224621899,3.873550543,4.934160121,0.273808116
|
| 128 |
+
BMW AG,9/30/2024,17989542164,2639441820,33643521649,69399402463,35755880815,3.803263035,7.381839743,0.940922748
|
| 129 |
+
BMW AG,12/31/2024,6152045684,707968936.5,29243056689,57427208762,28184152074,1.232810982,2.511939811,1.037570923
|
| 130 |
+
BASF SE,3/31/2017,16836243798,2100216671,19360624506,64506392372,45145767866,3.255827204,4.652078745,0.428846942
|
| 131 |
+
BASF SE,6/30/2017,16139422505,1276985447,16542748372,53339154988,36796406616,2.394086384,3.470408021,0.449575105
|
| 132 |
+
BASF SE,9/30/2017,9548006554,1237046329,27483087953,52090363015,24607275062,2.374808425,5.027156913,1.116868401
|
| 133 |
+
BASF SE,12/31/2017,16895580815,1797081911,28309420014,68036567115,39727147101,2.641347127,4.523561449,0.71259635
|
| 134 |
+
BASF SE,3/31/2018,16240083291,1330285061,20620789244,35863861269,15243072025,3.709263346,8.72714541,1.352797468
|
| 135 |
+
BASF SE,6/30/2018,11432373323,902833070.5,15796422658,55141147698,39344725041,1.637312802,2.294673732,0.401487687
|
| 136 |
+
BASF SE,9/30/2018,19846387618,2884007106,11017913220,31498369926,20480456706,9.156051924,14.08175192,0.537972047
|
| 137 |
+
BASF SE,12/31/2018,10270182691,708863277.1,42708053991,57050114588,14342060597,1.24252735,4.942548334,2.977818543
|
| 138 |
+
BASF SE,3/31/2019,13827496449,1133835190,46117811894,82240340578,36122528684,1.378684939,3.138858853,1.27670497
|
| 139 |
+
BASF SE,6/30/2019,11534207296,1513985001,19270767207,53405386175,34134618968,2.834891963,4.435335874,0.564551994
|
| 140 |
+
BASF SE,9/30/2019,7430177132,551583106,33765326378,50383426520,16618100141,1.094770928,3.319170671,2.031840348
|
| 141 |
+
BASF SE,12/31/2019,17877114298,1224635136,31860731568,65500282723,33639551155,1.869663892,3.640462175,0.947121185
|
| 142 |
+
BASF SE,3/31/2020,9927936838,1197785480,37635556954,86394249061,48758692107,1.38641807,2.456557854,0.7718738
|
| 143 |
+
BASF SE,6/30/2020,11914158554,1054111676,43298236595,83113769380,39815532785,1.268275622,2.647488561,1.087470983
|
| 144 |
+
BASF SE,9/30/2020,18130200876,2418330284,49603599758,91937242355,42333642596,2.630414207,5.712549489,1.171730017
|
| 145 |
+
BASF SE,12/31/2020,11583572658,1407524593,37122614462,82673694404,45551079942,1.702505982,3.089991707,0.814966725
|
| 146 |
+
BASF SE,3/31/2021,6644620233,990744714.5,21424039042,52878014917,31453975875,1.873642035,3.14982347,0.681123402
|
| 147 |
+
BASF SE,6/30/2021,18768998808,1373518726,31667361119,58519002305,26851641187,2.347132848,5.115213316,1.17934546
|
| 148 |
+
BASF SE,9/30/2021,10808670566,658653438.1,37937729306,85517814001,47580084695,0.770194428,1.384304888,0.79734472
|
| 149 |
+
BASF SE,12/31/2021,18793891125,2702710428,12423193661,54396450621,41973256961,4.968541876,6.439124871,0.295978787
|
| 150 |
+
BASF SE,3/31/2022,7020216669,504888024.6,19566830326,62928514411,43361684085,0.802319949,1.164364427,0.451247011
|
| 151 |
+
BASF SE,6/30/2022,11227593925,1221025867,27001572213,45570891422,18569319208,2.679398689,6.575501522,1.454095969
|
| 152 |
+
BASF SE,9/30/2022,8861717408,569761713.3,46662383110,69619249891,22956866781,0.8183968,2.481879251,2.032611138
|
| 153 |
+
BASF SE,12/31/2022,13018762765,1704211990,11167034881,30031637051,18864602170,5.67472225,9.033914282,0.591957083
|
| 154 |
+
BASF SE,3/31/2023,9496852852,691692392.2,36704020555,77712763784,41008743229,0.890062788,1.686694928,0.895029149
|
| 155 |
+
BASF SE,6/30/2023,14800185962,1295428284,11911955269,57692706612,45780751343,2.245393499,2.829635264,0.260195714
|
| 156 |
+
BASF SE,9/30/2023,8416753062,980336277,46036015495,95477772055,49441756560,1.026769117,1.982810372,0.931116099
|
| 157 |
+
BASF SE,12/31/2023,12852011317,684110085.9,18179739764,53040583203,34860843439,1.289786131,1.962402565,0.521494547
|
| 158 |
+
BASF SE,3/31/2024,19756965859,1431835601,10848294146,60234434421,49386140275,2.377104749,2.899266055,0.219662725
|
| 159 |
+
BASF SE,6/30/2024,11122911230,1144594204,29846781652,60313552592,30466770941,1.897739653,3.756860897,0.979650312
|
| 160 |
+
BASF SE,9/30/2024,16485330446,1727330520,41199120058,58775396940,17576276882,2.938866617,9.827624651,2.344018607
|
| 161 |
+
BASF SE,12/31/2024,15113132584,1914494156,43259483243,88221659272,44962176029,2.170095385,4.258010455,0.962130552
|
| 162 |
+
Deutsche Telekom AG,3/31/2017,13951553720,1348710564,21828517855,62780698314,40952180459,2.148288567,3.293379129,0.533024557
|
| 163 |
+
Deutsche Telekom AG,6/30/2017,15409119271,924345905.8,44651352138,77649206644,32997854506,1.190412556,2.801230321,1.353159252
|
| 164 |
+
Deutsche Telekom AG,9/30/2017,14110556301,1163491999,16591763093,32355610354,15763847262,3.595951325,7.380761688,1.052519909
|
| 165 |
+
Deutsche Telekom AG,12/31/2017,11505351408,1425682028,36680109736,61941763399,25261653663,2.301649081,5.643660732,1.452007467
|
| 166 |
+
Deutsche Telekom AG,3/31/2018,17427808963,1967928248,36127253691,72733202053,36605948363,2.705680752,5.375979415,0.986923036
|
| 167 |
+
Deutsche Telekom AG,6/30/2018,10561657912,1025524147,18824834094,53785357297,34960523204,1.906697655,2.933377572,0.538459736
|
| 168 |
+
Deutsche Telekom AG,9/30/2018,10796012246,986280250.6,18030445293,66154405096,48123959803,1.490876154,2.049457806,0.374666702
|
| 169 |
+
Deutsche Telekom AG,12/31/2018,15273880507,1698666925,35514608139,56589637247,21075029108,3.001727892,8.060092903,1.685151084
|
| 170 |
+
Deutsche Telekom AG,3/31/2019,17933328881,1112803764,47538352610,96220600130,48682247520,1.156513016,2.285851252,0.976502833
|
| 171 |
+
Deutsche Telekom AG,6/30/2019,9246129285,1035650167,29184989731,52641709425,23456719694,1.967356642,4.415153442,1.24420593
|
| 172 |
+
Deutsche Telekom AG,9/30/2019,11461718687,1380378045,27344331892,73302995160,45958663267,1.883112746,3.003520875,0.594976658
|
| 173 |
+
Deutsche Telekom AG,12/31/2019,15796654133,805016265.8,11494162751,47776069193,36281906442,1.684978022,2.218781604,0.31680151
|
| 174 |
+
Deutsche Telekom AG,3/31/2020,17673360637,1501884164,32122639453,73938353262,41815713810,2.031265369,3.591674104,0.768195411
|
| 175 |
+
Deutsche Telekom AG,6/30/2020,16609605942,2209253956,40969123319,78858492215,37889368896,2.801542223,5.830801675,1.081282811
|
| 176 |
+
Deutsche Telekom AG,9/30/2020,15589999588,1310559971,40139408421,54633825763,14494417343,2.39880688,9.041825831,2.769301274
|
| 177 |
+
Deutsche Telekom AG,12/31/2020,19614896783,1231038198,45625478678,94598230353,48972751675,1.301333221,2.513720704,0.931650298
|
| 178 |
+
Deutsche Telekom AG,3/31/2021,6356573780,831921707.3,22622163266,70081083207,47458919941,1.187084544,1.752930131,0.476668312
|
| 179 |
+
Deutsche Telekom AG,6/30/2021,5509568002,378951538.1,36585800973,54397521144,17811720171,0.696633836,2.127540375,2.054029629
|
| 180 |
+
Deutsche Telekom AG,9/30/2021,14468035363,1480956904,34748500389,83063430789,48314930400,1.78292287,3.065215849,0.71920833
|
| 181 |
+
Deutsche Telekom AG,12/31/2021,18588737724,2116759905,15557689149,64787149652,49229460503,3.267252713,4.29978286,0.316023962
|
| 182 |
+
Deutsche Telekom AG,3/31/2022,6523953565,440649540.1,18792941935,60677034815,41884092879,0.726221282,1.052068959,0.448689243
|
| 183 |
+
Deutsche Telekom AG,6/30/2022,8444063288,1187007039,47810647914,69756044623,21945396709,1.701654739,5.408911286,2.17861853
|
| 184 |
+
Deutsche Telekom AG,9/30/2022,14873007184,1613587509,33957807568,82298368793,48340561225,1.960655518,3.337957748,0.70247028
|
| 185 |
+
Deutsche Telekom AG,12/31/2022,9420241101,990420474.4,12931047199,34081834188,21150786988,2.906006963,4.682664881,0.611374282
|
| 186 |
+
Deutsche Telekom AG,3/31/2023,10942719196,1439735669,35021279445,51489159430,16467879985,2.79619183,8.742689833,2.126641649
|
| 187 |
+
Deutsche Telekom AG,6/30/2023,10399408221,561732001.5,38426371195,68448568389,30022197194,0.820662893,1.871055599,1.27993201
|
| 188 |
+
Deutsche Telekom AG,9/30/2023,5149849693,750613275.1,17312068995,55772071679,38460002684,1.345858693,1.951672446,0.450131768
|
| 189 |
+
Deutsche Telekom AG,12/31/2023,12752580163,884167446.6,28470052842,53978751141,25508698298,1.637991669,3.466140986,1.116091951
|
| 190 |
+
Deutsche Telekom AG,3/31/2024,16377852382,1007117429,43228375752,78855235024,35626859272,1.277172567,2.826848759,1.213364766
|
| 191 |
+
Deutsche Telekom AG,6/30/2024,15923641671,1238976660,29108930053,40292182768,11183252715,3.074980245,11.07885775,2.602903716
|
| 192 |
+
Deutsche Telekom AG,9/30/2024,6531276814,872767531.7,15526905086,49404344791,33877439705,1.766580521,2.576249974,0.458325813
|
| 193 |
+
Deutsche Telekom AG,12/31/2024,19139621006,2834016899,18313729720,41643539977,23329810257,6.805417841,12.14762087,0.784992656
|
| 194 |
+
Daimler AG,3/31/2017,7142318181,980884827.4,33400146455,69867319792,36467173338,1.403925083,2.689774769,0.915896227
|
| 195 |
+
Daimler AG,6/30/2017,10611576433,1197653535,31728621908,65800353827,34071731919,1.820132363,3.515094384,0.931230088
|
| 196 |
+
Daimler AG,9/30/2017,7323507123,793777927.1,27624534772,70422660411,42798125639,1.127162653,1.854702549,0.645461322
|
| 197 |
+
Daimler AG,12/31/2017,17133317238,1743084807,19707492188,56381587968,36674095780,3.09158516,4.752904659,0.537368182
|
| 198 |
+
Daimler AG,3/31/2018,8641226117,983139976.9,36665610699,59016046453,22350435755,1.665885867,4.398750824,1.64048751
|
| 199 |
+
Daimler AG,6/30/2018,18960217812,2711256442,20217118393,63441922522,43224804128,4.273603847,6.272455125,0.467720301
|
| 200 |
+
Daimler AG,9/30/2018,5152922484,599573691.4,24935989828,36383148668,11447158840,1.647943384,5.237751129,2.178356235
|
| 201 |
+
Daimler AG,12/31/2018,14737735881,1726421482,41539802392,60496305967,18956503575,2.853763473,9.107278014,2.191321951
|
| 202 |
+
Daimler AG,3/31/2019,11018589464,1097018126,21597719176,57241727973,35644008796,1.916465776,3.077706922,0.605928455
|
| 203 |
+
Daimler AG,6/30/2019,12504841895,639354361.8,41871491156,82039997300,40168506143,0.779320311,1.591680705,1.042396026
|
| 204 |
+
Daimler AG,9/30/2019,9545803943,1253796606,34864875291,53486270610,18621395319,2.344146622,6.733096979,1.872301978
|
| 205 |
+
Daimler AG,12/31/2019,10937481164,1145842379,19578678306,31178454239,11599775933,3.675109647,9.878142355,1.687849698
|
| 206 |
+
Daimler AG,3/31/2020,17781237366,1179606125,18447303156,42728183777,24280880621,2.760721427,4.858168628,0.759746051
|
| 207 |
+
Daimler AG,6/30/2020,14075946856,1786382228,42169052107,79023797685,36854745578,2.260562362,4.847088752,1.14419599
|
| 208 |
+
Daimler AG,9/30/2020,17815073829,1375991001,34457237297,48064706274,13607468976,2.862788745,10.11202747,2.532229716
|
| 209 |
+
Daimler AG,12/31/2020,8582626126,482111535,40109942612,86478204177,46368261566,0.55749485,1.039744685,0.865030115
|
| 210 |
+
Daimler AG,3/31/2021,17838709007,1559286116,42906482998,53748741344,10842258346,2.901065359,14.38156209,3.957338188
|
| 211 |
+
Daimler AG,6/30/2021,15648054896,1066739844,40442076671,75441053988,34998977318,1.414004428,3.047917184,1.155521669
|
| 212 |
+
Daimler AG,9/30/2021,15893645982,2170220695,43221215972,62906987078,19685771106,3.449888154,11.02431133,2.195556158
|
| 213 |
+
Daimler AG,12/31/2021,19604996789,2406144332,39627936994,77954949919,38327012925,3.086583128,6.277933363,1.033942746
|
| 214 |
+
Daimler AG,3/31/2022,13358841713,1013271417,43437924866,86840936189,43403011323,1.166813097,2.334564784,1.000804404
|
| 215 |
+
Daimler AG,6/30/2022,16579977460,877145067,30509379123,76296463396,45787084273,1.149653638,1.915704136,0.666331556
|
| 216 |
+
Daimler AG,9/30/2022,18430272465,1278461027,44184049308,54843099546,10659050238,2.331124677,11.99413642,4.145214472
|
| 217 |
+
Daimler AG,12/31/2022,9363037363,704852259.1,34778269496,54701473950,19923204453,1.288543449,3.537845836,1.745616253
|
| 218 |
+
Daimler AG,3/31/2023,13197347212,691428622,43343894473,57721074868,14377180395,1.197878979,4.809208781,3.014770162
|
| 219 |
+
Daimler AG,6/30/2023,6677625789,440969634.7,45505367856,68668748604,23163380748,0.642169318,1.903736072,1.96453913
|
| 220 |
+
Daimler AG,9/30/2023,13104191262,1856279741,29165603027,45413408789,16247805762,4.087514659,11.42480264,1.795048726
|
| 221 |
+
Daimler AG,12/31/2023,5161220914,527374446.2,15838145692,51630867307,35792721615,1.021432476,1.473412533,0.442496267
|
| 222 |
+
Daimler AG,3/31/2024,17637310202,1618745275,24936555962,37936073156,12999517193,4.267034357,12.4523492,1.918267855
|
| 223 |
+
Daimler AG,6/30/2024,9897018704,888471372.7,33856303197,55117754937,21261451739,1.61195131,4.178789781,1.592379656
|
| 224 |
+
Daimler AG,9/30/2024,14640665936,2101927829,10787737144,51913035226,41125298082,4.048940347,5.111033662,0.262313896
|
| 225 |
+
Daimler AG,12/31/2024,16456922307,1492220093,48085311015,79618978403,31533667388,1.874201507,4.732148895,1.524888001
|
| 226 |
+
SAP SE,3/31/2017,6568715630,719090971.2,18570025227,65782612977,47212587750,1.093132271,1.523091628,0.393327841
|
| 227 |
+
SAP SE,6/30/2017,6644029236,744873003.7,11294935497,23437806831,12142871334,3.17808321,6.134241097,0.930170072
|
| 228 |
+
SAP SE,9/30/2017,18227487487,1997618536,40486058249,55383211771,14897153522,3.606902655,13.40939753,2.717704304
|
| 229 |
+
SAP SE,12/31/2017,17560385805,2276360916,40828269592,73785136305,32956866713,3.085121245,6.907091429,1.23883954
|
| 230 |
+
SAP SE,3/31/2018,19774628627,1421900578,42095348780,63447988091,21352639311,2.24104912,6.659132662,1.971435389
|
| 231 |
+
SAP SE,6/30/2018,5282345417,541864195.9,34968772981,55603015081,20634242100,0.974523045,2.626043609,1.694696263
|
| 232 |
+
SAP SE,9/30/2018,8133295785,750601103.2,12010781130,31029999758,19019218627,2.418952978,3.94654017,0.631507601
|
| 233 |
+
SAP SE,12/31/2018,10184334320,1365996842,44932510908,90595603440,45663092533,1.507795953,2.99146809,0.98400061
|
| 234 |
+
SAP SE,3/31/2019,18300753695,989934361.3,24181084351,42408075770,18226991420,2.334306245,5.431145154,1.326663507
|
| 235 |
+
SAP SE,6/30/2019,13878289168,932271478.5,29658734145,62964273740,33305539595,1.480635642,2.799148399,0.890504538
|
| 236 |
+
SAP SE,9/30/2019,13973147193,1079900966,48121419304,75654119930,27532700626,1.427418583,3.922248606,1.74779147
|
| 237 |
+
SAP SE,12/31/2019,8046709255,662165230.7,39424977655,89177961232,49752983577,0.742521158,1.330905572,0.79241434
|
| 238 |
+
SAP SE,3/31/2020,9236017256,529982877.3,48081211472,96574017987,48492806515,0.548784123,1.0929103,0.991512245
|
| 239 |
+
SAP SE,6/30/2020,6413035553,941195826.2,19793091472,35210598357,15417506885,2.673046952,6.104721296,1.283806235
|
| 240 |
+
SAP SE,9/30/2020,15986728775,2071404633,24329632573,49270478198,24940845625,4.204149643,8.305270255,0.975493491
|
| 241 |
+
SAP SE,12/31/2020,9687560178,1027662516,40817136100,65594337613,24777201513,1.566693946,4.147613343,1.647366676
|
| 242 |
+
SAP SE,3/31/2021,6588278496,731216298.1,11461577968,53638409260,42176831292,1.363232632,1.733691877,0.271750571
|
| 243 |
+
SAP SE,6/30/2021,11199189899,719949867.5,45007114334,92397807990,47390693656,0.779185008,1.519179847,0.949703641
|
| 244 |
+
SAP SE,9/30/2021,9000667547,1079598533,20844606335,48683375624,27838769289,2.217591773,3.878039728,0.748761776
|
| 245 |
+
SAP SE,12/31/2021,12465229611,800983300.4,28257880783,51866957482,23609076699,1.544303617,3.392692186,1.196907492
|
| 246 |
+
SAP SE,3/31/2022,14896500404,1471513321,30918779103,51643572423,20724793320,2.849363924,7.100255712,1.491873942
|
| 247 |
+
SAP SE,6/30/2022,14799049316,1792143630,35425741218,52933352519,17507611301,3.385660542,10.23636862,2.023448008
|
| 248 |
+
SAP SE,9/30/2022,18713092617,1701020228,36355439326,47077977464,10722538138,3.613197338,15.86396995,3.390562837
|
| 249 |
+
SAP SE,12/31/2022,16805465254,1837934274,10102113588,37939001132,27836887544,4.844445609,6.602513558,0.362903847
|
| 250 |
+
SAP SE,3/31/2023,14505450248,863046066.9,22921333603,46384701674,23463368071,1.860626534,3.678270163,0.976898693
|
| 251 |
+
SAP SE,6/30/2023,10806122549,698788622.5,46400326109,56419077430,10018751320,1.238567971,6.97480754,4.631348222
|
| 252 |
+
SAP SE,9/30/2023,17167661800,1338393789,26063953489,52362126677,26298173188,2.556034053,5.089303273,0.991093689
|
| 253 |
+
SAP SE,12/31/2023,13414872686,1069408471,35679098743,80239095201,44559996459,1.332777331,2.399929435,0.800697971
|
| 254 |
+
SAP SE,3/31/2024,13351789947,761306516.2,45369290420,94052696634,48683406213,0.809446771,1.563790571,0.931925146
|
| 255 |
+
SAP SE,6/30/2024,8144018454,529257365.4,31360696540,57876694077,26515997537,0.914456801,1.995992663,1.182708533
|
| 256 |
+
SAP SE,9/30/2024,10824151396,830279996.2,42369695133,72342104340,29972409208,1.14771336,2.770147673,1.413623271
|
| 257 |
+
SAP SE,12/31/2024,16754700510,923006607.2,49206362475,96053458782,46847096308,0.96093011,1.970253612,1.05036099
|
| 258 |
+
Bayer AG,3/31/2017,13027840283,1127343336,48157761467,85094142147,36936380680,1.324818968,3.052121825,1.303802933
|
| 259 |
+
Bayer AG,6/30/2017,8439918128,854234127.5,26356391355,61242421820,34886030465,1.39484054,2.448642382,0.755499866
|
| 260 |
+
Bayer AG,9/30/2017,12670837136,1282915745,20339721000,55136777973,34797056973,2.326787657,3.686851292,0.584524174
|
| 261 |
+
Bayer AG,12/31/2017,18251254610,2670535587,16524775630,29169852309,12645076680,9.15512207,21.11917274,1.30681498
|
| 262 |
+
Bayer AG,3/31/2018,6560227745,884011217.4,46074070728,59231903754,13157833026,1.492457884,6.718516763,3.501645798
|
| 263 |
+
Bayer AG,6/30/2018,14443060707,1684483053,37340600075,64364816177,27024216101,2.617086715,6.233235581,1.38174591
|
| 264 |
+
Bayer AG,9/30/2018,8605806470,524552249.3,34919186753,46399878511,11480691758,1.130503497,4.568995147,3.041557729
|
| 265 |
+
Bayer AG,12/31/2018,18541451915,2242441772,28896911499,58238408654,29341497155,3.850451659,7.642560842,0.984847888
|
| 266 |
+
Bayer AG,3/31/2019,15790567330,951709509,15068249757,54818573513,39750323756,1.736107761,2.394218258,0.379072378
|
| 267 |
+
Bayer AG,6/30/2019,13365845309,1437180604,30394456127,61175428677,30780972550,2.349277536,4.669055214,0.987443008
|
| 268 |
+
Bayer AG,9/30/2019,11417678713,984493632.9,43202192055,87180029468,43977837414,1.129265084,2.238613108,0.982362813
|
| 269 |
+
Bayer AG,12/31/2019,17402979577,1387637302,31887265220,61548783018,29661517798,2.254532476,4.67824105,1.075038217
|
| 270 |
+
Bayer AG,3/31/2020,14107423353,1367599932,13615077246,27849556029,14234478784,4.910670497,9.607657241,0.956485829
|
| 271 |
+
Bayer AG,6/30/2020,12664152205,953498605.8,14551986231,38961279021,24409292791,2.447298009,3.906293451,0.596165827
|
| 272 |
+
Bayer AG,9/30/2020,7778215290,1028179890,32630440063,51398528756,18768088693,2.000407238,5.478340957,1.738612844
|
| 273 |
+
Bayer AG,12/31/2020,14954913916,1086100755,49223539015,87910824435,38687285420,1.235457365,2.807384243,1.272344091
|
| 274 |
+
Bayer AG,3/31/2021,15481381698,1813221637,20090535950,39516175321,19425639371,4.588555503,9.33416709,1.034227784
|
| 275 |
+
Bayer AG,6/30/2021,11712522838,1191464502,39707273398,77463236730,37755963332,1.538103173,3.155698855,1.051682169
|
| 276 |
+
Bayer AG,9/30/2021,13756386408,721617987.5,44559907041,88194004126,43634097086,0.818216606,1.653793789,1.02121758
|
| 277 |
+
Bayer AG,12/31/2021,13009192330,1451167596,31049801948,49482603845,18432801897,2.932682364,7.872745579,1.684486283
|
| 278 |
+
Bayer AG,3/31/2022,9090799678,904181650.9,49055627276,76658563614,27602936339,1.179492034,3.275671979,1.777188726
|
| 279 |
+
Bayer AG,6/30/2022,7918029220,810924591.5,42824962792,91140421051,48315458259,0.889752957,1.678395737,0.886361515
|
| 280 |
+
Bayer AG,9/30/2022,10642582906,1154447670,44364932131,75643621464,31278689333,1.526166579,3.690844131,1.418375676
|
| 281 |
+
Bayer AG,12/31/2022,19647577142,1826544478,10046371516,37513857859,27467486343,4.868985975,6.649842126,0.365755038
|
| 282 |
+
Bayer AG,3/31/2023,15711957620,2201969781,29454258021,71356904907,41902646886,3.085853826,5.254965841,0.702921181
|
| 283 |
+
Bayer AG,6/30/2023,10038837028,1319011419,42095419645,52756441711,10661022066,2.500190263,12.37227923,3.948535083
|
| 284 |
+
Bayer AG,9/30/2023,9457609977,1131311165,40856047831,77252438398,36396390567,1.464434247,3.108305926,1.122530207
|
| 285 |
+
Bayer AG,12/31/2023,15851738346,905684923,42371799830,52389418748,10017618918,1.728755433,9.040920106,4.22972766
|
| 286 |
+
Bayer AG,3/31/2024,10194351917,1512864021,26311852797,62689824382,36377971585,2.413252926,4.158736606,0.723290817
|
| 287 |
+
Bayer AG,6/30/2024,7369565272,1064148244,20591206981,42904241960,22313034979,2.480286785,4.7691775,0.922833088
|
| 288 |
+
Bayer AG,9/30/2024,9332023907,746667545.1,23673143006,42677324477,19004181470,1.749565031,3.928964508,1.245680749
|
| 289 |
+
Bayer AG,12/31/2024,5728072323,604515777.3,34398569588,80121015584,45722445996,0.754503388,1.322142252,0.752334413
|
| 290 |
+
Deutsche Bank AG,3/31/2017,14843015558,1680873545,14840428879,46770654578,31930225699,3.593863632,5.264208155,0.464776824
|
| 291 |
+
Deutsche Bank AG,6/30/2017,19544012256,2752792674,13706520368,55551723268,41845202900,4.955368641,6.578514343,0.327552967
|
| 292 |
+
Deutsche Bank AG,9/30/2017,19868905162,1429630591,12720436994,42183197053,29462760059,3.389099666,4.852330833,0.431746278
|
| 293 |
+
Deutsche Bank AG,12/31/2017,9318303083,958508333.7,11123712659,49692010679,38568298020,1.928898269,2.485223313,0.288415959
|
| 294 |
+
Deutsche Bank AG,3/31/2018,13740924616,1900766775,46035800087,57764409125,11728609038,3.290550018,16.20624209,3.925086081
|
| 295 |
+
Deutsche Bank AG,6/30/2018,7788761208,663079894,30096796442,49497014532,19400218090,1.339636138,3.417899175,1.55136382
|
| 296 |
+
Deutsche Bank AG,9/30/2018,17771922214,1082288023,48317236409,88972406897,40655170488,1.216431095,2.662116553,1.188464735
|
| 297 |
+
Deutsche Bank AG,12/31/2018,8808021584,1274941171,36770248755,55390246152,18619997397,2.301743104,6.847160844,1.97477196
|
| 298 |
+
Deutsche Bank AG,3/31/2019,11192425819,1563079220,10546244209,38688850201,28142605992,4.040128387,5.554138164,0.374742986
|
| 299 |
+
Deutsche Bank AG,6/30/2019,9538166828,766520233.9,38799826104,70810004871,32010178767,1.082502727,2.394614037,1.21210901
|
| 300 |
+
Deutsche Bank AG,9/30/2019,6824564419,375695945.9,12634199326,28137106192,15502906866,1.335233067,2.42339033,0.814956797
|
| 301 |
+
Deutsche Bank AG,12/31/2019,9814156310,576451352.5,25131659304,46301105258,21169445954,1.245005598,2.723034669,1.187166606
|
| 302 |
+
Deutsche Bank AG,3/31/2020,11812773682,980285159.4,44322011186,92083567435,47761556249,1.064560363,2.052456487,0.927985071
|
| 303 |
+
Deutsche Bank AG,6/30/2020,16087302422,1326310547,32589277601,54693171121,22103893521,2.425002097,6.000348063,1.474368195
|
| 304 |
+
Deutsche Bank AG,9/30/2020,11268644278,1309520126,44147215219,66843792777,22696577557,1.959075139,5.769681015,1.945104503
|
| 305 |
+
Deutsche Bank AG,12/31/2020,16454038855,1761523797,29090502114,64555499757,35464997643,2.728696708,4.966936173,0.820259525
|
| 306 |
+
Deutsche Bank AG,3/31/2021,8720665039,1028066418,14173153454,61397948008,47224794554,1.674431233,2.176963241,0.300121019
|
| 307 |
+
Deutsche Bank AG,6/30/2021,5220250485,460458002.1,44926554184,91889065168,46962510984,0.501102064,0.980479945,0.95664719
|
| 308 |
+
Deutsche Bank AG,9/30/2021,12533912164,782840180.3,42843256371,86694386780,43851130409,0.902988313,1.785222349,0.977016008
|
| 309 |
+
Deutsche Bank AG,12/31/2021,10414516344,1120888368,33962234582,80244374780,46282140198,1.396843544,2.421859412,0.733808645
|
| 310 |
+
Deutsche Bank AG,3/31/2022,15495522952,1232326295,38566723026,72355738353,33789015327,1.703149361,3.647121064,1.141398252
|
| 311 |
+
Deutsche Bank AG,6/30/2022,13527313706,1369609294,47047722396,76309903159,29262180763,1.794798889,4.680475816,1.607799596
|
| 312 |
+
Deutsche Bank AG,9/30/2022,11924228778,1074208571,47986876748,85149075647,37162198900,1.261562223,2.890594752,1.291281952
|
| 313 |
+
Deutsche Bank AG,12/31/2022,7252204354,949551701.2,44858188981,86269206025,41411017045,1.10068441,2.29299295,1.083242871
|
| 314 |
+
Deutsche Bank AG,3/31/2023,7317098693,887813882.3,23138553563,72645962598,49507409035,1.222110425,1.793294983,0.467375571
|
| 315 |
+
Deutsche Bank AG,6/30/2023,7129233268,804182359.4,37136074738,74971932150,37835857412,1.07264457,2.125450338,0.981504776
|
| 316 |
+
Deutsche Bank AG,9/30/2023,17914537947,1449472284,20633879462,43019367872,22385488410,3.369348169,6.475053201,0.92175248
|
| 317 |
+
Deutsche Bank AG,12/31/2023,12421650351,967097057.5,33786415736,79888234351,46101818615,1.210562563,2.097741665,0.73286514
|
| 318 |
+
Deutsche Bank AG,3/31/2024,19417487313,2333015849,28301209342,55585382174,27284172832,4.197175153,8.550802927,1.037275695
|
| 319 |
+
Deutsche Bank AG,6/30/2024,9306050327,729847876.9,23854663266,48476616703,24621953437,1.505566862,2.964215974,0.968837153
|
| 320 |
+
Deutsche Bank AG,9/30/2024,18549946525,2323022170,49199711543,64461554635,15261843092,3.603732773,15.22111161,3.223707074
|
| 321 |
+
Deutsche Bank AG,12/31/2024,19852203756,2223753463,36451064643,76222443508,39771378864,2.917452342,5.591341126,0.916514983
|
| 322 |
+
Porsche AG,3/31/2017,5883512064,440184439.5,47041623953,76926443805,29884819852,0.572214726,1.472936567,1.574097625
|
| 323 |
+
Porsche AG,6/30/2017,11523447744,1069672005,31531931981,51328720570,19796788588,2.083963896,5.403260231,1.592780154
|
| 324 |
+
Porsche AG,9/30/2017,9631040999,1113020766,22993549681,72046513305,49052963625,1.544864164,2.26901839,0.468749449
|
| 325 |
+
Porsche AG,12/31/2017,12119018742,894091080.3,28361763209,73909302825,45547539617,1.20971386,1.962984363,0.622684857
|
| 326 |
+
Porsche AG,3/31/2018,17555661518,1335299860,46994742351,88007178782,41012436432,1.517262431,3.255841341,1.145865655
|
| 327 |
+
Porsche AG,6/30/2018,9586227654,1382170553,40862854527,89907869527,49045015000,1.537318769,2.818167256,0.833170395
|
| 328 |
+
Porsche AG,9/30/2018,17963578177,2139702451,49106113898,95043652065,45937538167,2.251283915,4.657851806,1.068975741
|
| 329 |
+
Porsche AG,12/31/2018,7955302121,939711762.4,35954156213,65117507958,29163351745,1.443101543,3.222235121,1.232854047
|
| 330 |
+
Porsche AG,3/31/2019,12923331618,1676027156,26939537534,57056948432,30117410898,2.937463714,5.564977554,0.894483846
|
| 331 |
+
Porsche AG,6/30/2019,16367236342,1857704381,11368621660,21773242219,10404620558,8.532052149,17.85460959,1.09265125
|
| 332 |
+
Porsche AG,9/30/2019,10956259576,738896491.2,30918840712,77968242093,47049401381,0.947689048,1.570469484,0.657156942
|
| 333 |
+
Porsche AG,12/31/2019,15806884536,845076735.9,34376508276,55201546863,20825038587,1.530893216,4.05798401,1.650729632
|
| 334 |
+
Porsche AG,3/31/2020,10779438774,1358943185,33525281805,71745524050,38220242245,1.89411563,3.555558796,0.877160369
|
| 335 |
+
Porsche AG,6/30/2020,7764718758,920211365.8,34970670581,72558969348,37588298767,1.268225519,2.44813252,0.930360557
|
| 336 |
+
Porsche AG,9/30/2020,6912391322,945409918.5,38735572223,68605740345,29870168123,1.378033257,3.165063935,1.296797931
|
| 337 |
+
Porsche AG,12/31/2020,14994514428,1118453310,13089516203,26894911034,13805394830,4.158605723,8.101566983,0.948145009
|
| 338 |
+
Porsche AG,3/31/2021,7884337935,1152213820,19342832660,61176556532,41833723872,1.883423791,2.754270272,0.462374153
|
| 339 |
+
Porsche AG,6/30/2021,12452147525,908357933.3,42131566815,76799130880,34667564065,1.182771111,2.620195442,1.215302198
|
| 340 |
+
Porsche AG,9/30/2021,7245971264,1033867668,43655777728,59462856760,15807079033,1.7386781,6.540535831,2.761786516
|
| 341 |
+
Porsche AG,12/31/2021,14047287806,1489899027,14851641486,42561319258,27709677772,3.500594092,5.376818307,0.535973085
|
| 342 |
+
Porsche AG,3/31/2022,10774855240,975556879.2,15417730087,40879706571,25461976485,2.386408712,3.831426362,0.605519768
|
| 343 |
+
Porsche AG,6/30/2022,9602996001,1224040111,42066934650,86789124292,44722189642,1.410361172,2.736986092,0.940627795
|
| 344 |
+
Porsche AG,9/30/2022,8621455856,1229669587,32376788972,47679877246,15303088274,2.579011647,8.03543419,2.115702948
|
| 345 |
+
Porsche AG,12/31/2022,5536870879,298030924.1,19445445005,30265348449,10819903444,0.984726558,2.75446935,1.797192101
|
| 346 |
+
Porsche AG,3/31/2023,8880891013,668545569.7,40027402595,66992846031,26965443436,0.997935764,2.47926785,1.484396231
|
| 347 |
+
Porsche AG,6/30/2023,16477351074,1226392611,42857529033,61495517042,18637988008,1.994279698,6.580069753,2.299471864
|
| 348 |
+
Porsche AG,9/30/2023,12920254885,1147104411,35348848744,85266963912,49918115168,1.345309318,2.297972203,0.708136688
|
| 349 |
+
Porsche AG,12/31/2023,16438581863,1419961878,19415830018,36726316966,17310486949,3.86633345,8.202899676,1.121622406
|
| 350 |
+
Porsche AG,3/31/2024,12668426079,744579528.3,33183980227,53340703796,20156723569,1.395893708,3.693951181,1.646298324
|
| 351 |
+
Porsche AG,6/30/2024,16413767338,1074145603,25161220888,52217608876,27056387988,2.057056282,3.970025873,0.929954911
|
| 352 |
+
Porsche AG,9/30/2024,15911174550,1241693861,36125130235,84583217359,48458087124,1.468014459,2.562407917,0.745492288
|
| 353 |
+
Porsche AG,12/31/2024,13056746207,1500333956,33698449632,62560115073,28861665442,2.398227615,5.19836237,1.167585069
|
| 354 |
+
Merck KGaA,3/31/2017,6974057939,389688114,31405828053,49969368014,18563539961,0.779853997,2.099212299,1.691801678
|
| 355 |
+
Merck KGaA,6/30/2017,11003803134,1050945998,30579291828,50859030282,20279738454,2.066390162,5.182246312,1.507874073
|
| 356 |
+
Merck KGaA,9/30/2017,17552142118,1316005049,28846310799,40791728305,11945417506,3.226156634,11.0168192,2.414843247
|
| 357 |
+
Merck KGaA,12/31/2017,11760953647,812341476,29296072481,51828662312,22532589831,1.567359526,3.605184677,1.30016446
|
| 358 |
+
Merck KGaA,3/31/2018,9318197850,641817429.8,48172882387,65628926423,17456044036,0.977949,3.676763352,2.759667785
|
| 359 |
+
Merck KGaA,6/30/2018,7868422908,477697388.2,36789908510,81877040048,45087131537,0.583432655,1.059498291,0.815973588
|
| 360 |
+
Merck KGaA,9/30/2018,17415152986,1617758811,46995232198,95054854077,48059621879,1.701921302,3.366149685,0.977852725
|
| 361 |
+
Merck KGaA,12/31/2018,14241334382,1165009578,37401670447,71252783664,33851113217,1.635037283,3.441569472,1.104887458
|
| 362 |
+
Merck KGaA,3/31/2019,19217681417,2238884002,12733925598,36970270841,24236345242,6.055903707,9.237712947,0.525406181
|
| 363 |
+
Merck KGaA,6/30/2019,16209619277,1894725317,17305347324,45432894647,28127547323,4.170382124,6.73619102,0.615245514
|
| 364 |
+
Merck KGaA,9/30/2019,12097020632,1236164244,27900854055,42173393478,14272539423,2.931147205,8.661137359,1.954862637
|
| 365 |
+
Merck KGaA,12/31/2019,17666094987,1547381835,47717175754,76466035769,28748860015,2.023619793,5.382411109,1.659793666
|
| 366 |
+
Merck KGaA,3/31/2020,15236467952,894574066,36909348765,72030787429,35121438664,1.241932926,2.547088331,1.050906517
|
| 367 |
+
Merck KGaA,6/30/2020,17048403140,1779998241,31894204894,69469086501,37574881608,2.562288251,4.737202528,0.848817176
|
| 368 |
+
Merck KGaA,9/30/2020,8081970522,678443942.4,46360819152,75700966235,29340147083,0.896215697,2.31233995,1.580115431
|
| 369 |
+
Merck KGaA,12/31/2020,5897253747,625948791.2,38506883950,51548729961,13041846011,1.214285573,4.799541343,2.952563918
|
| 370 |
+
Merck KGaA,3/31/2021,14786170161,1680074258,26820455279,61714717112,34894261833,2.722323518,4.814757986,0.768620795
|
| 371 |
+
Merck KGaA,6/30/2021,14025754117,1636333354,16839994355,60072011589,43232017234,2.723952986,3.785003473,0.389525991
|
| 372 |
+
Merck KGaA,9/30/2021,14686380695,2175890454,36499903384,85610397087,49110493703,2.541619392,4.430601873,0.743220046
|
| 373 |
+
Merck KGaA,12/31/2021,12917187369,1708731611,17319486583,43037893850,25718407267,3.970295613,6.64400246,0.673427651
|
| 374 |
+
Merck KGaA,3/31/2022,7570645554,419794972.7,36325434183,64924945929,28599511746,0.646585017,1.467839648,1.27014176
|
| 375 |
+
Merck KGaA,6/30/2022,19175705351,1921123977,39424400695,70149764250,30725363554,2.738603611,6.252567113,1.28312235
|
| 376 |
+
Merck KGaA,9/30/2022,7888146905,698353200.2,33355799273,53175544683,19819745411,1.31329769,3.523522556,1.682958009
|
| 377 |
+
Merck KGaA,12/31/2022,7610452133,536310750.1,48688712492,88688270941,39999558449,0.604714405,1.340791676,1.217231249
|
| 378 |
+
Merck KGaA,3/31/2023,18085416710,2126765225,44629946816,61554558843,16924612027,3.455089704,12.56610918,2.636984927
|
| 379 |
+
Merck KGaA,6/30/2023,9146296754,868361702.9,43413456694,56455610934,13042154240,1.538131797,6.658115576,3.328702904
|
| 380 |
+
Merck KGaA,9/30/2023,9297896247,1145109250,49354599469,67631473649,18276874181,1.693160283,6.265345152,2.700385141
|
| 381 |
+
Merck KGaA,12/31/2023,17637490503,2103890014,44486109206,61628452463,17142343256,3.413829051,12.27305965,2.59510083
|
| 382 |
+
Merck KGaA,3/31/2024,18818295502,2691544192,27944602045,74405164472,46460562427,3.617415823,5.793180392,0.601469302
|
| 383 |
+
Merck KGaA,6/30/2024,16561793827,2435933937,19456844175,52664090849,33207246674,4.625417238,7.335549257,0.585921632
|
| 384 |
+
Merck KGaA,9/30/2024,15036344926,1704097607,30603212259,59444780752,28841568494,2.866690036,5.908477575,1.061080026
|
| 385 |
+
Merck KGaA,12/31/2024,18915504026,2413914962,30820597362,65357495789,34536898427,3.693401855,6.989379684,0.892396213
|
data/naics_names_2012.xls
ADDED
|
Binary file (212 kB). View file
|
|
|
data/nberces5818v1_n2012.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/processed_data.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/processed_data_336111.csv
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
year,naics,emp,pay,prode,prodh,prodw,vship,matcost,vadd,invest,invent,energy,cap,equip,plant,piship,pimat,piinv,pien,dtfp5,tfp5,dtfp4,tfp4
|
| 2 |
+
1958,336111,146.1,868.4,116.2,229.7,650.6,5007.9,3411.3,1563.8,80.3,428.0,59.9,15010.0,3291.1,11718.8,0.314000010490417,0.238000005483627,0.180000007152557,0.146999999880791,,0.552999973297119,,0.550000011920929
|
| 3 |
+
1959,336111,160.6,1072.6,131.0,283.2,827.2,6422.2,4306.7,2143.4,93.0,521.7,64.1,14873.2,3457.5,11415.6,0.321999996900558,0.243000000715256,0.184000000357628,0.144999995827675,0.0520000010728836,0.583000004291534,0.0529999993741512,0.579999983310699
|
| 4 |
+
1960,336111,176.1,1183.7,144.7,302.8,925.7,7239.0,4883.5,2336.2,111.2,495.6,68.4,15048.0,3673.0,11375.1,0.317999988794327,0.24099999666214,0.189999997615814,0.150000005960464,0.0299999993294477,0.601000010967255,0.0299999993294477,0.59799998998642
|
| 5 |
+
1961,336111,152.4,1035.7,123.2,252.9,789.5,6214.2,4134.9,2053.6,91.8,495.8,72.7,14974.0,3794.2,11179.9,0.31700000166893,0.241999998688698,0.189999997615814,0.145999997854233,-0.0070000002160668,0.596000015735626,-0.0089999996125698,0.592000007629395
|
| 6 |
+
1962,336111,168.2,1223.6,138.4,297.1,954.7,7855.3,5187.9,2671.2,118.3,543.7,77.1,15049.2,3908.1,11141.2,0.314999997615814,0.24600000679493,0.193000003695488,0.146999999880791,0.0769999995827675,0.643999993801117,0.0780000016093254,0.640999972820282
|
| 7 |
+
1963,336111,160.6,1231.7,132.2,293.9,972.0,8254.4,5518.5,2748.9,144.9,557.5,80.6,15181.0,4169.6,11011.5,0.312999993562698,0.245000004768372,0.194999992847443,0.146999999880791,0.0140000004321337,0.652999997138977,0.0140000004321337,0.648999989032745
|
| 8 |
+
1964,336111,182.4,1454.1,150.5,328.2,1141.3,9006.7,5920.9,3142.6,211.3,709.0,78.3,15642.8,4532.5,11110.4,0.312999993562698,0.248999997973442,0.199000000953674,0.145999997854233,0.028999999165535,0.671999990940094,0.0299999993294477,0.669000029563904
|
| 9 |
+
1965,336111,207.6,1739.1,172.9,381.9,1383.5,11129.6,7354.7,3815.1,296.3,792.5,75.7,16791.3,5085.9,11705.3,0.312999993562698,0.254000008106232,0.202999994158745,0.14300000667572,0.0439999997615814,0.703000009059906,0.046000000089407,0.699999988079071
|
| 10 |
+
1966,336111,214.2,1795.4,178.7,378.1,1415.8,11003.3,7324.6,3728.3,268.9,832.2,73.0,17277.7,5788.4,11489.3,0.312000006437302,0.257999986410141,0.209000006318092,0.143999993801117,0.0010000000474974,0.703999996185303,0.0020000000949949,0.700999975204468
|
| 11 |
+
1967,336111,183.6,1531.8,150.6,303.3,1190.0,9357.0,6228.7,3141.2,200.8,786.3,70.1,17495.3,6215.2,11280.0,0.314999997615814,0.263000011444092,0.216999992728233,0.140000000596046,-0.0199999995529652,0.689999997615814,-0.0219999998807907,0.685999989509583
|
| 12 |
+
1968,336111,193.1,1863.5,159.4,349.7,1474.7,11507.1,7528.7,3985.1,187.2,863.0,67.1,17495.6,6454.1,11041.5,0.323000013828278,0.275000005960464,0.226999998092651,0.140000000596046,0.0649999976158142,0.736000001430511,0.0659999996423721,0.732999980449677
|
| 13 |
+
1969,336111,202.4,1937.5,168.8,344.7,1522.1,11814.9,7742.7,4068.7,241.5,902.8,63.8,17779.2,6688.2,11090.8,0.328000009059906,0.284000009298325,0.236000001430511,0.140000000596046,0.0120000001043081,0.745000004768372,0.0120000001043081,0.741999983787537
|
| 14 |
+
1970,336111,176.1,1749.4,142.0,284.0,1328.8,9911.9,6569.5,3380.5,213.5,939.9,60.5,17794.2,6983.0,10811.2,0.340000003576279,0.293999999761581,0.250999987125397,0.149000003933907,-0.0540000014007092,0.705999970436096,-0.0540000014007092,0.703000009059906
|
| 15 |
+
1971,336111,194.0,2142.8,159.1,321.4,1679.0,13540.0,8775.2,4746.7,178.2,929.3,57.0,17490.8,6927.0,10563.9,0.358000010251999,0.308999985456467,0.263999998569489,0.159999996423721,0.0860000029206276,0.768999993801117,0.0869999974966049,0.767000019550323
|
| 16 |
+
1972,336111,161.4,2094.1,135.1,279.7,1658.7,18336.2,13320.7,5035.4,392.0,933.3,64.7,17621.0,7224.9,10396.1,0.367000013589859,0.321999996900558,0.272000014781952,0.172000005841255,0.0410000011324883,0.800999999046326,0.0419999994337559,0.800000011920929
|
| 17 |
+
1973,336111,175.4,2506.8,147.0,312.7,1995.3,21465.4,15674.3,5840.3,344.4,1082.0,73.8,18129.4,7842.1,10287.3,0.368000000715256,0.333999991416931,0.277999997138977,0.185000002384186,0.0450000017881393,0.837999999523163,0.046000000089407,0.837999999523163
|
| 18 |
+
1974,336111,152.3,2240.9,124.7,244.9,1737.9,18747.7,14174.4,4636.6,445.7,1238.9,92.4,18672.1,8392.0,10280.1,0.391999989748001,0.381000012159348,0.303999990224838,0.243000000715256,-0.006000000052154,0.833000004291534,-0.0070000002160668,0.832000017166138
|
| 19 |
+
1975,336111,134.4,2113.8,111.8,212.7,1658.2,19376.7,14870.2,4462.1,280.2,1128.1,113.6,18662.9,8696.0,9967.0,0.430000007152557,0.442999988794327,0.354999989271164,0.308999985456467,0.0370000004768372,0.864000022411346,0.0370000004768372,0.862999975681305
|
| 20 |
+
1976,336111,154.3,2862.2,130.3,266.3,2304.7,26803.1,20167.3,6771.0,447.4,1444.5,140.6,18419.2,8691.6,9727.6,0.458000004291534,0.469999998807907,0.379999995231628,0.33500000834465,0.0549999997019768,0.912999987602234,0.0549999997019768,0.912000000476837
|
| 21 |
+
1977,336111,163.5,3447.3,137.9,295.1,2788.4,32700.8,24843.3,8001.8,729.1,1714.1,167.0,19231.7,9333.1,9898.5,0.488000005483627,0.501999974250793,0.412999987602234,0.388000011444092,0.0109999999403954,0.922999978065491,0.0109999999403954,0.921999990940094
|
| 22 |
+
1978,336111,170.8,3821.4,144.4,298.9,3096.9,36283.5,27613.9,8756.9,802.1,1884.8,183.8,19971.8,10161.1,9810.8,0.522000014781952,0.537000000476837,0.444999992847443,0.423000007867813,0.003000000026077,0.925999999046326,0.003000000026077,0.925000011920929
|
| 23 |
+
1979,336111,165.8,3969.3,138.9,281.1,3164.4,36388.8,27448.1,8868.9,814.4,1919.6,194.5,20575.7,10799.7,9776.2,0.564000010490417,0.584999978542328,0.488999992609024,0.474999994039536,-0.0049999998882412,0.921999990940094,-0.0049999998882412,0.921000003814697
|
| 24 |
+
1980,336111,130.4,3362.7,104.9,203.3,2630.0,28315.9,22349.9,5905.0,978.8,1762.1,193.8,21080.1,11299.2,9780.8,0.616999983787537,0.646000027656555,0.546999990940094,0.584999978542328,-0.0790000036358833,0.851999998092651,-0.0790000036358833,0.851000010967255
|
| 25 |
+
1981,336111,129.4,3701.6,106.3,204.9,2926.1,31741.5,24926.5,6675.7,2007.4,1529.3,221.4,22014.2,12394.7,9619.5,0.679000020027161,0.726999998092651,0.597000002861023,0.630999982357025,0.0230000000447035,0.871999979019165,0.0230000000447035,0.870999991893768
|
| 26 |
+
1982,336111,114.2,3322.7,92.1,173.3,2562.7,30231.5,23727.2,6605.2,1012.1,1547.6,233.7,22965.0,13363.5,9601.5,0.717000007629395,0.763999998569489,0.620000004768372,0.669000029563904,-0.0120000001043081,0.861000001430511,-0.0120000001043081,0.860000014305115
|
| 27 |
+
1983,336111,124.0,4026.4,103.0,212.3,3206.7,40997.2,31547.1,9661.8,472.8,1948.2,267.5,22571.0,13212.0,9358.9,0.734000027179718,0.776000022888184,0.624000012874603,0.688000023365021,0.0579999983310699,0.912000000476837,0.0579999983310699,0.91100001335144
|
| 28 |
+
1984,336111,140.9,4964.3,117.8,268.5,3974.3,50457.0,38648.5,11824.3,1034.6,2172.6,299.4,22445.5,13174.7,9270.8,0.750999987125397,0.791999995708466,0.624000012874603,0.704999983310699,0.025000000372529,0.935000002384186,0.025000000372529,0.934000015258789
|
| 29 |
+
1985,336111,140.7,5197.1,118.8,248.5,4249.2,52278.1,40266.3,11992.3,1241.4,2111.9,301.0,23149.3,13791.8,9357.5,0.765999972820282,0.801999986171722,0.630999982357025,0.703999996185303,-0.003000000026077,0.933000028133392,-0.003000000026077,0.931999981403351
|
| 30 |
+
1986,336111,133.4,4998.1,111.2,228.1,4021.8,53791.9,40157.1,13609.8,1672.2,1881.6,291.7,23747.0,14208.2,9538.8,0.795000016689301,0.800999999046326,0.657999992370605,0.663999974727631,-0.0049999998882412,0.927999973297119,-0.0049999998882412,0.927999973297119
|
| 31 |
+
1987,336111,133.8,4974.8,112.0,224.9,3990.2,56986.9,41676.6,15435.3,1761.3,1975.1,287.0,24428.8,14952.9,9475.9,0.809000015258789,0.814999997615814,0.683000028133392,0.648000001907349,0.0209999997168779,0.948000013828278,0.0209999997168779,0.948000013828278
|
| 32 |
+
1988,336111,119.1,4929.7,101.6,213.2,4078.5,60710.9,43746.9,16992.9,485.7,1818.8,273.5,25525.7,15888.0,9637.7,0.823000013828278,0.833999991416931,0.708999991416931,0.635999977588654,0.0270000007003546,0.973999977111816,0.0270000007003546,0.97299998998642
|
| 33 |
+
1989,336111,118.9,5061.1,101.1,209.4,4160.1,63811.7,43738.5,20031.9,1014.5,1759.3,284.0,24488.3,15022.1,9466.1,0.84799998998642,0.852999985218048,0.728999972343445,0.667999982833862,0.0450000017881393,1.01900005340576,0.0450000017881393,1.01900005340576
|
| 34 |
+
1990,336111,113.9,4899.9,95.1,190.1,3954.2,60008.9,43219.5,16882.7,1284.0,1935.1,289.2,24253.2,14888.6,9364.7,0.861000001430511,0.869000017642975,0.757000029087067,0.703000009059906,-0.0480000004172325,0.972000002861023,-0.0480000004172325,0.971000015735626
|
| 35 |
+
1991,336111,103.8,4774.5,84.9,175.0,3819.5,57207.2,37780.2,19294.1,1394.0,1797.9,262.6,24347.4,14930.8,9416.6,0.898000001907349,0.878000020980835,0.779999971389771,0.717000007629395,0.0140000004321337,0.986000001430511,0.0140000004321337,0.985000014305115
|
| 36 |
+
1992,336111,108.7,5084.4,92.0,189.0,4192.1,65364.4,45999.8,19343.4,1277.6,1752.7,265.0,24514.2,15201.1,9313.1,0.931999981403351,0.879000008106232,0.794000029563904,0.717000007629395,-0.0410000011324883,0.945999979972839,-0.0410000011324883,0.944999992847443
|
| 37 |
+
1993,336111,106.7,5432.8,90.9,194.9,4511.5,71722.4,51479.6,20202.3,1723.9,1817.7,290.2,24494.7,15164.7,9330.0,0.96399998664856,0.883000016212463,0.809000015258789,0.727999985218048,-0.0189999993890524,0.927999973297119,-0.0189999993890524,0.927999973297119
|
| 38 |
+
1994,336111,111.3,6055.3,96.3,212.8,5097.1,84410.0,61869.3,22613.6,1814.8,1946.5,297.7,25046.5,15736.2,9310.4,0.998000025749207,0.889999985694885,0.828000009059906,0.717000007629395,-0.0089999996125698,0.920000016689301,-0.0089999996125698,0.920000016689301
|
| 39 |
+
1995,336111,113.2,6310.4,99.1,213.6,5355.8,85972.9,62029.0,23901.2,1932.1,1932.6,289.7,25658.6,16396.2,9262.6,1.00600004196167,0.898000001907349,0.855000019073486,0.714999973773956,0.0109999999403954,0.930000007152557,0.0109999999403954,0.930000007152557
|
| 40 |
+
1996,336111,107.1,5996.2,93.4,199.2,5018.8,85773.5,62024.9,23662.7,1872.6,1839.5,293.6,26385.2,17164.7,9220.3,1.01499998569489,0.897000014781952,0.866999983787537,0.762000024318695,-0.0140000004321337,0.916999995708466,-0.0140000004321337,0.916999995708466
|
| 41 |
+
1997,336111,113.8,6404.4,97.9,197.3,5190.9,95365.7,66543.8,28937.3,3187.6,2185.4,350.4,27006.4,17837.7,9168.8,1.00499999523163,0.889999985694885,0.865000009536743,0.776000022888184,0.0540000014007092,0.967999994754791,0.0540000014007092,0.967999994754791
|
| 42 |
+
1998,336111,109.2,6054.3,92.5,180.1,4827.1,96707.9,69454.3,27124.9,2882.5,2202.9,343.8,29120.0,19829.8,9290.1,0.99099999666214,0.874000012874603,0.85699999332428,0.750999987125397,-0.0270000007003546,0.941999971866608,-0.0270000007003546,0.941999971866608
|
| 43 |
+
1999,336111,96.7,5861.2,84.1,170.9,4934.4,99802.5,69514.4,30302.7,1613.1,1790.4,314.3,30731.6,21387.5,9344.1,0.998000025749207,0.866999983787537,0.852999985218048,0.765999972820282,0.0109999999403954,0.952000021934509,0.0109999999403954,0.952000021934509
|
| 44 |
+
2000,336111,94.7,6013.1,82.2,168.4,5063.1,98759.9,69748.7,29035.2,1807.5,1841.8,317.6,30607.3,21158.3,9449.0,1.00499999523163,0.86599999666214,0.853999972343445,0.829999983310699,-0.0199999995529652,0.934000015258789,-0.0199999995529652,0.934000015258789
|
| 45 |
+
2001,336111,87.7,5206.2,76.0,154.0,4414.4,86511.9,60927.1,25528.6,2051.2,1872.8,334.0,30751.7,21291.9,9459.8,0.995000004768372,0.859000027179718,0.850000023841858,0.925999999046326,-0.0280000008642673,0.907999992370605,-0.0280000008642673,0.907999992370605
|
| 46 |
+
2002,336111,85.8,5495.2,75.1,143.1,4743.1,90713.3,61556.2,29200.0,1880.6,1583.3,301.1,31214.0,21817.8,9396.2,0.973999977111816,0.857999980449677,0.84799998998642,0.827000021934509,0.0610000006854534,0.966000020503998,0.0610000006854534,0.964999973773956
|
| 47 |
+
2003,336111,76.1,5226.8,65.8,126.2,4412.0,86236.0,63971.1,22313.8,1920.1,1708.0,325.9,31316.0,21805.5,9510.5,0.973999977111816,0.857999980449677,0.848999977111816,0.958999991416931,-0.0719999969005585,0.898999989032745,-0.0719999969005585,0.898000001907349
|
| 48 |
+
2004,336111,74.4,5307.6,64.1,120.9,4477.4,86847.5,63794.6,23186.8,2177.7,1809.2,307.3,31499.1,22059.5,9439.6,0.986999988555908,0.869000017642975,0.864000022411346,1.00499999523163,0.0070000002160668,0.904999971389771,0.0070000002160668,0.903999984264374
|
| 49 |
+
2005,336111,69.6,5221.7,59.6,121.9,4426.4,86760.6,62824.0,23866.2,2135.9,1808.0,357.5,31901.4,22450.3,9451.2,0.98199999332428,0.885999977588654,0.890999972820282,1.12699997425079,0.0260000005364418,0.929000020027161,0.0270000007003546,0.929000020027161
|
| 50 |
+
2006,336111,74.3,5352.1,64.0,126.3,4534.6,94229.4,68898.0,25261.8,1631.7,2211.8,387.4,32205.8,22810.2,9395.5,0.953999996185303,0.904999971389771,0.904999971389771,1.22099995613098,0.0560000017285347,0.98199999332428,0.0560000017285347,0.98199999332428
|
| 51 |
+
2007,336111,65.4,5110.1,56.4,114.0,4449.9,84727.6,63392.2,21378.1,1765.2,1943.0,376.0,31620.0,22299.1,9320.8,0.944999992847443,0.916000008583069,0.917999982833862,1.21800005435944,-0.0160000007599592,0.967000007629395,-0.0160000007599592,0.966000020503998
|
| 52 |
+
2008,336111,61.4,4484.0,53.0,106.3,3780.3,80841.5,62468.2,18282.6,2168.6,1703.8,380.1,31012.6,21769.3,9243.2,0.962999999523163,0.935999989509583,0.944000005722046,1.36699998378754,-0.0309999994933605,0.936999976634979,-0.0309999994933605,0.936999976634979
|
| 53 |
+
2009,336111,51.8,3367.9,44.2,88.3,2770.2,51022.2,38395.1,12785.4,1565.5,1777.6,292.9,30709.9,21540.4,9169.6,0.980000019073486,0.933000028133392,0.958999991416931,1.17999994754791,-0.0970000028610229,0.850000023841858,-0.0970000028610229,0.850000023841858
|
| 54 |
+
2010,336111,59.3,3968.0,49.6,96.6,3185.0,71997.5,51458.6,20473.4,3066.2,2100.4,326.3,29822.7,20753.9,9068.8,0.968999981880188,0.953999996185303,0.958999991416931,1.10699999332428,0.156000003218651,0.994000017642975,0.156000003218651,0.994000017642975
|
| 55 |
+
2011,336111,58.4,3972.2,49.1,96.4,3066.3,82074.2,60581.5,21581.2,4896.7,2467.1,334.9,30185.1,20689.5,9495.6,0.976000010967255,0.990000009536743,0.98199999332428,1.03199994564056,0.0299999993294477,1.02400004863739,0.0299999993294477,1.02400004863739
|
| 56 |
+
2012,336111,69.3,5056.5,59.5,125.9,4120.8,108781.8,85878.2,23199.5,5255.2,3352.8,308.9,32143.9,22232.1,9911.8,1.0,1.0,1.0,1.0,-0.0240000002086163,1.0,-0.0240000002086163,1.0
|
| 57 |
+
2013,336111,74.1,5471.3,64.0,134.7,4452.0,115122.9,91162.2,23722.4,4983.8,3878.6,348.7,34273.1,23833.1,10439.9,1.0110000371933,1.00300002098084,1.00699996948242,1.13800001144409,-0.0120000001043081,0.987999975681305,-0.0120000001043081,0.987999975681305
|
| 58 |
+
2014,336111,75.4,5713.8,64.2,130.7,4460.5,124061.4,98320.1,26044.6,5724.0,4349.6,396.4,35942.8,24935.6,11007.2,1.02900004386902,1.00800001621246,1.01800000667572,1.2150000333786,-0.006000000052154,0.98199999332428,-0.006000000052154,0.98199999332428
|
| 59 |
+
2015,336111,78.2,6091.3,67.2,140.0,4795.8,124761.4,100587.8,24187.1,5695.5,4443.4,387.4,38344.4,27070.7,11273.6,1.05299997329712,1.0110000371933,1.01699995994568,1.13300001621246,-0.0469999983906746,0.936999976634979,-0.0469999983906746,0.936999976634979
|
| 60 |
+
2016,336111,82.4,6382.8,71.1,144.5,5089.4,129996.2,102697.8,26941.9,3340.8,3581.1,384.9,40624.6,28998.7,11625.9,1.06200003623962,1.00300002098084,1.01499998569489,1.12600004673004,0.0,0.936999976634979,0.0,0.936999976634979
|
| 61 |
+
2017,336111,80.8,6564.1,63.1,119.6,4596.1,99360.9,79653.3,19730.2,1448.9,3435.2,290.5,,,,1.07599997520447,1.00899994373322,,1.25100004673004,,,,
|
| 62 |
+
2018,336111,81.9,6672.1,63.1,124.2,4640.8,104986.8,85576.6,19488.4,,4041.0,318.3,,,,1.08399999141693,1.02499997615814,,1.27400004863739,,,,
|
dev_notebooks/.gradio/certificate.pem
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
-----BEGIN CERTIFICATE-----
|
| 2 |
+
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
|
| 31 |
+
-----END CERTIFICATE-----
|
dev_notebooks/12_company_analysis/12_company_BMW_neural_forecasting_scaled_version.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_Daimler_neural_forecasting_scaled_version1.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_SAP_Basic_univariate.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_SAP_Basic_univariate_all.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled.ipynb
ADDED
|
@@ -0,0 +1,746 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [],
|
| 8 |
+
"source": [
|
| 9 |
+
"import pandas as pd\n",
|
| 10 |
+
"import time\n",
|
| 11 |
+
"import numpy as np\n",
|
| 12 |
+
"import matplotlib.pyplot as plt\n",
|
| 13 |
+
"from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error, r2_score\n",
|
| 14 |
+
"from sklearn.preprocessing import MinMaxScaler\n",
|
| 15 |
+
"from statsmodels.tools.eval_measures import mse as sm_mse, rmse as sm_rmse, meanabs as sm_mae\n",
|
| 16 |
+
"from neuralforecast import NeuralForecast\n",
|
| 17 |
+
"from neuralforecast.models import NBEATS, NHITS, TFT, PatchTST, TCN, DLinear, RNN, LSTM, Autoformer, BiTCN, DeepAR, DeepNPTS, DilatedRNN, FEDformer, GRU, HINT, Informer, iTransformer, KAN, MLP, MLPMultivariate, NBEATSx, NLinear, RMoK, SOFTS, StemGNN, TiDE, TimeMixer, TimeLLM, TimesNet, TSMixer, TSMixerx, VanillaTransformer\n",
|
| 18 |
+
"from neuralforecast.losses.pytorch import MQLoss, MAE\n",
|
| 19 |
+
"\n",
|
| 20 |
+
"from neuralforecast.utils import AirPassengersDF\n",
|
| 21 |
+
"import time\n",
|
| 22 |
+
"import torch\n",
|
| 23 |
+
"torch.set_float32_matmul_precision('high') # or 'medium' for more precision\n",
|
| 24 |
+
"import plotly.express as px\n",
|
| 25 |
+
"import plotly.graph_objects as go\n",
|
| 26 |
+
"from sklearn.utils import check_random_state\n",
|
| 27 |
+
"import logging\n",
|
| 28 |
+
"logging.basicConfig(level=logging.INFO)\n",
|
| 29 |
+
"# Set seed for reproducibility\n",
|
| 30 |
+
"seed = 42\n",
|
| 31 |
+
"np.random.seed(seed)\n",
|
| 32 |
+
"random_state = check_random_state(seed)"
|
| 33 |
+
]
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
"cell_type": "code",
|
| 37 |
+
"execution_count": 2,
|
| 38 |
+
"metadata": {},
|
| 39 |
+
"outputs": [],
|
| 40 |
+
"source": [
|
| 41 |
+
"# Re-load the dataset (user needs to re-upload the file)\n",
|
| 42 |
+
"df = pd.read_csv(f\"../data/Top_12_German_Companies_Financial_Data.csv\") # Load the dataset\n",
|
| 43 |
+
"\n",
|
| 44 |
+
"# Filter dataset for SAP SE only\n",
|
| 45 |
+
"sap_df = df[df[\"Company\"] == \"SAP SE\"].copy()\n",
|
| 46 |
+
"\n",
|
| 47 |
+
"# Convert Period column to datetime format\n",
|
| 48 |
+
"sap_df[\"Period\"] = pd.to_datetime(sap_df[\"Period\"], format=\"%m/%d/%Y\")\n",
|
| 49 |
+
"\n",
|
| 50 |
+
"# Sort data by Period for proper time-series analysis\n",
|
| 51 |
+
"sap_df = sap_df.sort_values(by=\"Period\")\n",
|
| 52 |
+
"\n",
|
| 53 |
+
"# Convert revenue to numeric\n",
|
| 54 |
+
"sap_df[\"Revenue\"] = pd.to_numeric(sap_df[\"Revenue\"], errors=\"coerce\")\n",
|
| 55 |
+
"sap_df= sap_df[[\"Revenue\", 'Period']]"
|
| 56 |
+
]
|
| 57 |
+
},
|
| 58 |
+
{
|
| 59 |
+
"cell_type": "code",
|
| 60 |
+
"execution_count": 3,
|
| 61 |
+
"metadata": {},
|
| 62 |
+
"outputs": [],
|
| 63 |
+
"source": [
|
| 64 |
+
"# Convert 'Year' column to datetime if it's not already\n",
|
| 65 |
+
"sap_df['ds'] = pd.to_datetime(sap_df['Period'], format='%Y')\n",
|
| 66 |
+
"sap_df['unique_id'] = \"all\"\n",
|
| 67 |
+
"sap_df = sap_df.rename(columns={\"Revenue\": \"y\"}) \n",
|
| 68 |
+
"sap_df = sap_df[[\"unique_id\", \"ds\", \"y\"]] "
|
| 69 |
+
]
|
| 70 |
+
},
|
| 71 |
+
{
|
| 72 |
+
"cell_type": "code",
|
| 73 |
+
"execution_count": 4,
|
| 74 |
+
"metadata": {},
|
| 75 |
+
"outputs": [
|
| 76 |
+
{
|
| 77 |
+
"data": {
|
| 78 |
+
"text/plain": [
|
| 79 |
+
"<Axes: title={'center': 'SAP SE Revenue Over Time'}>"
|
| 80 |
+
]
|
| 81 |
+
},
|
| 82 |
+
"execution_count": 4,
|
| 83 |
+
"metadata": {},
|
| 84 |
+
"output_type": "execute_result"
|
| 85 |
+
},
|
| 86 |
+
{
|
| 87 |
+
"data": {
|
| 88 |
+
"image/png": "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TZswODiIK6+8Et/5znfw4Ycf4v7778eDDz6IQ4cO4Zprrhn1Z/jYY4/hsssug81mw1/+8hc8+eSTyMnJwerVqxlYExFpnbqJciIi0rquri7xggsuEAGIAESj0Sied9554j333CMODg6Ouf2PfvQjEYD42muviaIolWoLgiB++ctfHnU7uSz7F7/4hej1ekWXyyXu3LlTXLJkiQhAfOWVVyY91yuvvCLm5eUp58rNzRW/+MUvii+++OK4jzPRx/vvvz/p48jl31u3bhW9Xq84ODgovvbaa2JRUZF44YUXjiqLnzNnjrho0aIxpfKf/exnxeLiYqUs/fe//70IQPzkk0+U2/T09Ihms1n8zne+o3xu9erVYllZmdjf3z/q633jG98QLRaL2NPTI4qiKL7zzjsiAPGKK64Ydbsnn3xSBCBu2bJF+dysWbPE9evXj/k+L7roIvGiiy5Sfn3PPfeIOp1uTNn7008/LQIQX3311Qn/zP7+97+LAMQHHnhgwtuIoigWFhaKc+fOVX59zjnniOedd96o2/zhD38QAYj79+8XRVEUGxsbRYPBIN5xxx2jbjc4OCgWFRWJ1157rfK59evXR1yiP1n59/r168VZs2aN+hwAsaioSBwaGlI+9/zzz4sAxIULF4qBQED5/G9/+1sRgLhv3z5RFKWS9JycHHHNmjWjvqbf7xcXLFggLl26NOzzExFR/CRUpnrz5s1Ys2YNSkpKIAgCnn/++bDu73K5cPPNN2P+/PkwGAz43Oc+N+7t3nvvPZx77rmwWCyorq5Wht0QEaWi3NxcvP/++9i+fTt+/vOf46qrrsLRo0exYcMGzJ8/H11dXcptRVFUSr4//elPAwCqqqqwatUqPPPMM+OW9t59990wGo2wWCw499xz0djYiD/96U9KtnYiV1xxBRobG/Hcc8/hu9/9Ls466yw8//zzWLt2Lb7xjW+Muf03v/lNbN++fczHwoULp/XnsHz5chiNRmRmZuIzn/kMsrOz8cILLyhl8cePH8eRI0dw4403AsCobPgVV1yB1tZWpRT7xhtvhNlsVrLXALBp0ya43W7ccsstAKTXrLfeeguf//znYbVax3w9l8s1ZrjW2rVrR/367LPPBjB5Kf1EXn75ZcybNw8LFy4c9dirV69WpmDPlCiKozLZt9xyCz766KNRJeuPPPIIlixZgnnz5gEA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8+fPx/Lly/HYY4/hF7/4xYzONHv2bNx11114++238cILL6CzsxNGoxGnnXYafvKTn+Cuu+4as6v6vvvuw3333Tfma91444147LHHIjrHHXfcgfvvvx8/+tGPcP311+Piiy/Gxx9/jJ/+9Kf41re+hd7eXuTm5uLMM8/EtddeO+b+t9xyC+655x50dnaOCR4B4Mwzz8SuXbvw4x//GP/1X/+Fjo4OZGVl4bTTTptykNtEbrjhBrS0tOCBBx7AI488gnnz5uGPf/zjmEA0PT0d77//Pn7+85/jwQcfRH19PdLS0lBRUYFLL710zJ7mU+l0OmzatAlr167F//3f/2H9+vVwOp0oLS3FZz/7Wfy///f/lN7rU++3bt06/OxnP0N5efm4e6U3bNiAM888E7/73e+UAW9FRUVYsmQJbrvttoj+XNR20003oaKiAr/85S9x6623YnBwEAUFBVi4cOG4e8WJiEg7BFGcZNGkhgmCgOeee0558/bEE0/gxhtvxMGDB6HX60fdNiMjA0VFRaM+d/PNN6Ovr2/MBPELL7wQixYtwu9+9zvlc88995wyZIfl30RERERERCRLmkz1okWL4Pf70dHRgZUrV0b8dVasWIGXXnpp1Odef/11LF68mAE1ERERERERjZJQQfXQ0BCOHz+u/Lq+vh579uxBTk4OTj/9dNx4441Yt24dfvWrX2HRokXo6urC22+/jfnz5ytlcocOHYLH40FPTw8GBwexZ88eAFD2lN522224//77cdddd+Ff//VfsWXLFjz00EPjroEhIiIiIiKi1JZQ5d/vvvsuLr744jGfX79+PTZu3Aiv14uf/OQnePTRR9Hc3Izc3FysWLECP/zhDzF//nwA0oCTEydOjPkaI/8Y3nvvPXz729/GwYMHUVJSgrvvvjthe7SIiIiIiIgodhIqqCYiIiIiIiLSEt3UNyEiIiIiIiKi8TCoJiIiIiIiIopQQgwqCwQCaGlpQWZmJndFExERERERUcyJoojBwUGUlJRAp5s4H50QQXVLSwvKy8vVPgYRERERERGlmJMnT6KsrGzC30+IoDozMxOA9M3YbDaVT0NERERERETJbmBgAOXl5Uo8OpGECKrlkm+bzcagmoiIiIiIiOJmqhZkDiojIiIiIiIiihCDaiIiIiIiIqIIMagmIiIiIiIiihCDaiIiIiIiIqIIMagmIiIiIiIiihCDaiIiIiIiIqIIMagmIiIiIiIiilBYQfU999yDJUuWIDMzEwUFBfjc5z6HTz75ZMr7vffeezj33HNhsVhQXV2NBx54IOIDExEREREREWlFWEH1e++9h9tvvx1bt27FG2+8AZ/Ph8suuwwOh2PC+9TX1+OKK67AypUrsXv3bnzve9/DnXfeiWeeeWbGhyciIiIiIiJSkyCKohjpnTs7O1FQUID33nsPF1544bi3ufvuu/Hiiy/i8OHDyuduu+027N27F1u2bJnW4wwMDMBut6O/vx82my3S4xIRERERERFNy3Tj0Bn1VPf39wMAcnJyJrzNli1bcNlll4363OrVq7Fjxw54vd6ZPDwRERERERGRqgyR3lEURdx111244IILMG/evAlv19bWhsLCwlGfKywshM/nQ1dXF4qLi8fcx+12w+12K78eGBiI9JhEREREREREMRNxpvob3/gG9u3bh02bNk15W0EQRv1arjg/9fOye+65B3a7XfkoLy+P9JhEREREREREMRNRUH3HHXfgxRdfxDvvvIOysrJJb1tUVIS2trZRn+vo6IDBYEBubu6499mwYQP6+/uVj5MnT0ZyTCIiIiIiIqKYCqv8WxRF3HHHHXjuuefw7rvvoqqqasr7rFixAi+99NKoz73++utYvHgxjEbjuPcxm80wm83hHI2IiIiIiIgo7sLKVN9+++147LHH8Le//Q2ZmZloa2tDW1sbhoeHldts2LAB69atU35922234cSJE7jrrrtw+PBhPPzww3jooYfw3e9+N3rfBREREREREZEKwgqq//jHP6K/vx+rVq1CcXGx8vHEE08ot2ltbUVjY6Py66qqKrz66qt49913sXDhQvz4xz/G73//e1xzzTXR+y6IiIiIiIiIVDCjPdXxwj3VFCsv7m3Bltou/PiqeTDoZ7RhjoiIiIiIkkhc9lQTJbL+YS/ufnofNn18Eh/X96h9HCIiIiIiSkAMqillPbXjJIa9fgBAr9Or8mmIiIiIiCgRMaimlBQIiPjr1hPKr/uHGVQTEREREVH4GFRTSnr3aAdOdDuVXw+4GFQTEREREVH4GFRTStr4kZSl1usEAMxUExERERFRZBhUU8qp6xzC5qOdEATgqoUlABhUExERERFRZBhUU8p5dIuUpb7kjALML7UDAAYYVBMRERERUQQYVFNKGXL7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",
|
| 89 |
+
"text/plain": [
|
| 90 |
+
"<Figure size 1200x600 with 1 Axes>"
|
| 91 |
+
]
|
| 92 |
+
},
|
| 93 |
+
"metadata": {},
|
| 94 |
+
"output_type": "display_data"
|
| 95 |
+
}
|
| 96 |
+
],
|
| 97 |
+
"source": [
|
| 98 |
+
"sap_df[\"y\"].plot(figsize=(12, 6), title=\"SAP SE Revenue Over Time\")"
|
| 99 |
+
]
|
| 100 |
+
},
|
| 101 |
+
{
|
| 102 |
+
"cell_type": "code",
|
| 103 |
+
"execution_count": 5,
|
| 104 |
+
"metadata": {},
|
| 105 |
+
"outputs": [
|
| 106 |
+
{
|
| 107 |
+
"data": {
|
| 108 |
+
"text/html": [
|
| 109 |
+
"<div>\n",
|
| 110 |
+
"<style scoped>\n",
|
| 111 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 112 |
+
" vertical-align: middle;\n",
|
| 113 |
+
" }\n",
|
| 114 |
+
"\n",
|
| 115 |
+
" .dataframe tbody tr th {\n",
|
| 116 |
+
" vertical-align: top;\n",
|
| 117 |
+
" }\n",
|
| 118 |
+
"\n",
|
| 119 |
+
" .dataframe thead th {\n",
|
| 120 |
+
" text-align: right;\n",
|
| 121 |
+
" }\n",
|
| 122 |
+
"</style>\n",
|
| 123 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 124 |
+
" <thead>\n",
|
| 125 |
+
" <tr style=\"text-align: right;\">\n",
|
| 126 |
+
" <th></th>\n",
|
| 127 |
+
" <th>unique_id</th>\n",
|
| 128 |
+
" <th>ds</th>\n",
|
| 129 |
+
" <th>y</th>\n",
|
| 130 |
+
" </tr>\n",
|
| 131 |
+
" </thead>\n",
|
| 132 |
+
" <tbody>\n",
|
| 133 |
+
" <tr>\n",
|
| 134 |
+
" <th>224</th>\n",
|
| 135 |
+
" <td>all</td>\n",
|
| 136 |
+
" <td>2017-03-31</td>\n",
|
| 137 |
+
" <td>6568715630</td>\n",
|
| 138 |
+
" </tr>\n",
|
| 139 |
+
" <tr>\n",
|
| 140 |
+
" <th>225</th>\n",
|
| 141 |
+
" <td>all</td>\n",
|
| 142 |
+
" <td>2017-06-30</td>\n",
|
| 143 |
+
" <td>6644029236</td>\n",
|
| 144 |
+
" </tr>\n",
|
| 145 |
+
" <tr>\n",
|
| 146 |
+
" <th>226</th>\n",
|
| 147 |
+
" <td>all</td>\n",
|
| 148 |
+
" <td>2017-09-30</td>\n",
|
| 149 |
+
" <td>18227487487</td>\n",
|
| 150 |
+
" </tr>\n",
|
| 151 |
+
" <tr>\n",
|
| 152 |
+
" <th>227</th>\n",
|
| 153 |
+
" <td>all</td>\n",
|
| 154 |
+
" <td>2017-12-31</td>\n",
|
| 155 |
+
" <td>17560385805</td>\n",
|
| 156 |
+
" </tr>\n",
|
| 157 |
+
" <tr>\n",
|
| 158 |
+
" <th>228</th>\n",
|
| 159 |
+
" <td>all</td>\n",
|
| 160 |
+
" <td>2018-03-31</td>\n",
|
| 161 |
+
" <td>19774628627</td>\n",
|
| 162 |
+
" </tr>\n",
|
| 163 |
+
" </tbody>\n",
|
| 164 |
+
"</table>\n",
|
| 165 |
+
"</div>"
|
| 166 |
+
],
|
| 167 |
+
"text/plain": [
|
| 168 |
+
" unique_id ds y\n",
|
| 169 |
+
"224 all 2017-03-31 6568715630\n",
|
| 170 |
+
"225 all 2017-06-30 6644029236\n",
|
| 171 |
+
"226 all 2017-09-30 18227487487\n",
|
| 172 |
+
"227 all 2017-12-31 17560385805\n",
|
| 173 |
+
"228 all 2018-03-31 19774628627"
|
| 174 |
+
]
|
| 175 |
+
},
|
| 176 |
+
"execution_count": 5,
|
| 177 |
+
"metadata": {},
|
| 178 |
+
"output_type": "execute_result"
|
| 179 |
+
}
|
| 180 |
+
],
|
| 181 |
+
"source": [
|
| 182 |
+
"sap_df.head()"
|
| 183 |
+
]
|
| 184 |
+
},
|
| 185 |
+
{
|
| 186 |
+
"cell_type": "code",
|
| 187 |
+
"execution_count": 6,
|
| 188 |
+
"metadata": {},
|
| 189 |
+
"outputs": [],
|
| 190 |
+
"source": [
|
| 191 |
+
"# Initialize Scaler\n",
|
| 192 |
+
"scaler = MinMaxScaler()"
|
| 193 |
+
]
|
| 194 |
+
},
|
| 195 |
+
{
|
| 196 |
+
"cell_type": "code",
|
| 197 |
+
"execution_count": 7,
|
| 198 |
+
"metadata": {},
|
| 199 |
+
"outputs": [],
|
| 200 |
+
"source": [
|
| 201 |
+
"# Train-test split\n",
|
| 202 |
+
"test_size = int(len(sap_df) * 0.2)\n",
|
| 203 |
+
"train = sap_df[:len(sap_df) - test_size]\n",
|
| 204 |
+
"val = sap_df[len(sap_df) - test_size:]"
|
| 205 |
+
]
|
| 206 |
+
},
|
| 207 |
+
{
|
| 208 |
+
"cell_type": "code",
|
| 209 |
+
"execution_count": 8,
|
| 210 |
+
"metadata": {},
|
| 211 |
+
"outputs": [],
|
| 212 |
+
"source": [
|
| 213 |
+
"# Fit on Training Data & Transform Both Train & Test\n",
|
| 214 |
+
"df_train_scaled = train.copy()\n",
|
| 215 |
+
"df_test_scaled = val.copy()\n",
|
| 216 |
+
"\n",
|
| 217 |
+
"df_train_scaled['y'] = scaler.fit_transform(train[['y']])\n",
|
| 218 |
+
"df_test_scaled['y'] = scaler.transform(val[['y']]) # Apply same transformation to test set"
|
| 219 |
+
]
|
| 220 |
+
},
|
| 221 |
+
{
|
| 222 |
+
"cell_type": "code",
|
| 223 |
+
"execution_count": 9,
|
| 224 |
+
"metadata": {},
|
| 225 |
+
"outputs": [
|
| 226 |
+
{
|
| 227 |
+
"name": "stdout",
|
| 228 |
+
"output_type": "stream",
|
| 229 |
+
"text": [
|
| 230 |
+
"Data split: Total: 32, Train: 26, Test: 6\n",
|
| 231 |
+
"Training set date range: 2017-03-31 00:00:00 to 2023-06-30 00:00:00\n",
|
| 232 |
+
"Testing set date range: 2023-09-30 00:00:00 to 2024-12-31 00:00:00\n"
|
| 233 |
+
]
|
| 234 |
+
},
|
| 235 |
+
{
|
| 236 |
+
"data": {
|
| 237 |
+
"text/html": [
|
| 238 |
+
"<div>\n",
|
| 239 |
+
"<style scoped>\n",
|
| 240 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 241 |
+
" vertical-align: middle;\n",
|
| 242 |
+
" }\n",
|
| 243 |
+
"\n",
|
| 244 |
+
" .dataframe tbody tr th {\n",
|
| 245 |
+
" vertical-align: top;\n",
|
| 246 |
+
" }\n",
|
| 247 |
+
"\n",
|
| 248 |
+
" .dataframe thead th {\n",
|
| 249 |
+
" text-align: right;\n",
|
| 250 |
+
" }\n",
|
| 251 |
+
"</style>\n",
|
| 252 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 253 |
+
" <thead>\n",
|
| 254 |
+
" <tr style=\"text-align: right;\">\n",
|
| 255 |
+
" <th></th>\n",
|
| 256 |
+
" <th>unique_id</th>\n",
|
| 257 |
+
" <th>y</th>\n",
|
| 258 |
+
" </tr>\n",
|
| 259 |
+
" <tr>\n",
|
| 260 |
+
" <th>ds</th>\n",
|
| 261 |
+
" <th></th>\n",
|
| 262 |
+
" <th></th>\n",
|
| 263 |
+
" </tr>\n",
|
| 264 |
+
" </thead>\n",
|
| 265 |
+
" <tbody>\n",
|
| 266 |
+
" <tr>\n",
|
| 267 |
+
" <th>2023-09-30</th>\n",
|
| 268 |
+
" <td>all</td>\n",
|
| 269 |
+
" <td>17167661800</td>\n",
|
| 270 |
+
" </tr>\n",
|
| 271 |
+
" <tr>\n",
|
| 272 |
+
" <th>2023-12-31</th>\n",
|
| 273 |
+
" <td>all</td>\n",
|
| 274 |
+
" <td>13414872686</td>\n",
|
| 275 |
+
" </tr>\n",
|
| 276 |
+
" <tr>\n",
|
| 277 |
+
" <th>2024-03-31</th>\n",
|
| 278 |
+
" <td>all</td>\n",
|
| 279 |
+
" <td>13351789947</td>\n",
|
| 280 |
+
" </tr>\n",
|
| 281 |
+
" <tr>\n",
|
| 282 |
+
" <th>2024-06-30</th>\n",
|
| 283 |
+
" <td>all</td>\n",
|
| 284 |
+
" <td>8144018454</td>\n",
|
| 285 |
+
" </tr>\n",
|
| 286 |
+
" <tr>\n",
|
| 287 |
+
" <th>2024-09-30</th>\n",
|
| 288 |
+
" <td>all</td>\n",
|
| 289 |
+
" <td>10824151396</td>\n",
|
| 290 |
+
" </tr>\n",
|
| 291 |
+
" <tr>\n",
|
| 292 |
+
" <th>2024-12-31</th>\n",
|
| 293 |
+
" <td>all</td>\n",
|
| 294 |
+
" <td>16754700510</td>\n",
|
| 295 |
+
" </tr>\n",
|
| 296 |
+
" </tbody>\n",
|
| 297 |
+
"</table>\n",
|
| 298 |
+
"</div>"
|
| 299 |
+
],
|
| 300 |
+
"text/plain": [
|
| 301 |
+
" unique_id y\n",
|
| 302 |
+
"ds \n",
|
| 303 |
+
"2023-09-30 all 17167661800\n",
|
| 304 |
+
"2023-12-31 all 13414872686\n",
|
| 305 |
+
"2024-03-31 all 13351789947\n",
|
| 306 |
+
"2024-06-30 all 8144018454\n",
|
| 307 |
+
"2024-09-30 all 10824151396\n",
|
| 308 |
+
"2024-12-31 all 16754700510"
|
| 309 |
+
]
|
| 310 |
+
},
|
| 311 |
+
"execution_count": 9,
|
| 312 |
+
"metadata": {},
|
| 313 |
+
"output_type": "execute_result"
|
| 314 |
+
}
|
| 315 |
+
],
|
| 316 |
+
"source": [
|
| 317 |
+
"# Confirm split integrity\n",
|
| 318 |
+
"print(f\"Data split: Total: {len(sap_df)}, Train: {len(train)}, Test: {len(val)}\")\n",
|
| 319 |
+
"print(\"Training set date range:\", train['ds'].min(), \"to\", train['ds'].max())\n",
|
| 320 |
+
"print(\"Testing set date range:\", val['ds'].min(), \"to\", val['ds'].max())\n",
|
| 321 |
+
"train.set_index('ds', inplace=False)\n",
|
| 322 |
+
"val.set_index('ds', inplace=False)"
|
| 323 |
+
]
|
| 324 |
+
},
|
| 325 |
+
{
|
| 326 |
+
"cell_type": "code",
|
| 327 |
+
"execution_count": 10,
|
| 328 |
+
"metadata": {},
|
| 329 |
+
"outputs": [
|
| 330 |
+
{
|
| 331 |
+
"data": {
|
| 332 |
+
"text/html": [
|
| 333 |
+
"<div>\n",
|
| 334 |
+
"<style scoped>\n",
|
| 335 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 336 |
+
" vertical-align: middle;\n",
|
| 337 |
+
" }\n",
|
| 338 |
+
"\n",
|
| 339 |
+
" .dataframe tbody tr th {\n",
|
| 340 |
+
" vertical-align: top;\n",
|
| 341 |
+
" }\n",
|
| 342 |
+
"\n",
|
| 343 |
+
" .dataframe thead th {\n",
|
| 344 |
+
" text-align: right;\n",
|
| 345 |
+
" }\n",
|
| 346 |
+
"</style>\n",
|
| 347 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 348 |
+
" <thead>\n",
|
| 349 |
+
" <tr style=\"text-align: right;\">\n",
|
| 350 |
+
" <th></th>\n",
|
| 351 |
+
" <th>unique_id</th>\n",
|
| 352 |
+
" <th>ds</th>\n",
|
| 353 |
+
" <th>y</th>\n",
|
| 354 |
+
" </tr>\n",
|
| 355 |
+
" </thead>\n",
|
| 356 |
+
" <tbody>\n",
|
| 357 |
+
" <tr>\n",
|
| 358 |
+
" <th>224</th>\n",
|
| 359 |
+
" <td>all</td>\n",
|
| 360 |
+
" <td>2017-03-31</td>\n",
|
| 361 |
+
" <td>6568715630</td>\n",
|
| 362 |
+
" </tr>\n",
|
| 363 |
+
" <tr>\n",
|
| 364 |
+
" <th>225</th>\n",
|
| 365 |
+
" <td>all</td>\n",
|
| 366 |
+
" <td>2017-06-30</td>\n",
|
| 367 |
+
" <td>6644029236</td>\n",
|
| 368 |
+
" </tr>\n",
|
| 369 |
+
" <tr>\n",
|
| 370 |
+
" <th>226</th>\n",
|
| 371 |
+
" <td>all</td>\n",
|
| 372 |
+
" <td>2017-09-30</td>\n",
|
| 373 |
+
" <td>18227487487</td>\n",
|
| 374 |
+
" </tr>\n",
|
| 375 |
+
" <tr>\n",
|
| 376 |
+
" <th>227</th>\n",
|
| 377 |
+
" <td>all</td>\n",
|
| 378 |
+
" <td>2017-12-31</td>\n",
|
| 379 |
+
" <td>17560385805</td>\n",
|
| 380 |
+
" </tr>\n",
|
| 381 |
+
" <tr>\n",
|
| 382 |
+
" <th>228</th>\n",
|
| 383 |
+
" <td>all</td>\n",
|
| 384 |
+
" <td>2018-03-31</td>\n",
|
| 385 |
+
" <td>19774628627</td>\n",
|
| 386 |
+
" </tr>\n",
|
| 387 |
+
" </tbody>\n",
|
| 388 |
+
"</table>\n",
|
| 389 |
+
"</div>"
|
| 390 |
+
],
|
| 391 |
+
"text/plain": [
|
| 392 |
+
" unique_id ds y\n",
|
| 393 |
+
"224 all 2017-03-31 6568715630\n",
|
| 394 |
+
"225 all 2017-06-30 6644029236\n",
|
| 395 |
+
"226 all 2017-09-30 18227487487\n",
|
| 396 |
+
"227 all 2017-12-31 17560385805\n",
|
| 397 |
+
"228 all 2018-03-31 19774628627"
|
| 398 |
+
]
|
| 399 |
+
},
|
| 400 |
+
"execution_count": 10,
|
| 401 |
+
"metadata": {},
|
| 402 |
+
"output_type": "execute_result"
|
| 403 |
+
}
|
| 404 |
+
],
|
| 405 |
+
"source": [
|
| 406 |
+
"sap_df.head()"
|
| 407 |
+
]
|
| 408 |
+
},
|
| 409 |
+
{
|
| 410 |
+
"cell_type": "code",
|
| 411 |
+
"execution_count": 11,
|
| 412 |
+
"metadata": {},
|
| 413 |
+
"outputs": [],
|
| 414 |
+
"source": [
|
| 415 |
+
"\n",
|
| 416 |
+
"# Custom SMAPE function\n",
|
| 417 |
+
"def smape_loss(y_true, y_pred):\n",
|
| 418 |
+
" y_true = y_true.values\n",
|
| 419 |
+
" y_pred = y_pred.values\n",
|
| 420 |
+
" return 100 * np.mean(2 * np.abs(y_pred - y_true) / (np.abs(y_true) + np.abs(y_pred)))\n",
|
| 421 |
+
"\n",
|
| 422 |
+
"# Function to evaluate models (Now includes MASE from statsmodels)\n",
|
| 423 |
+
"def evaluate_model(y_true, y_pred, y_train, model_name, start_time):\n",
|
| 424 |
+
" mse = mean_squared_error(y_true, y_pred)\n",
|
| 425 |
+
" mae = mean_absolute_error(y_true, y_pred)\n",
|
| 426 |
+
" mape = mean_absolute_percentage_error(y_true, y_pred)\n",
|
| 427 |
+
" smape = smape_loss(y_true, y_pred)\n",
|
| 428 |
+
" r2 = r2_score(y_true, y_pred)\n",
|
| 429 |
+
" \n",
|
| 430 |
+
" # Compute MASE using statsmodels mean absolute error\n",
|
| 431 |
+
" naive_forecast_errors = np.abs(y_train.diff()).dropna()\n",
|
| 432 |
+
" mae_naive = sm_mae(naive_forecast_errors, np.zeros_like(naive_forecast_errors)) # Naïve MAE\n",
|
| 433 |
+
" mase = sm_mae(y_true, y_pred) / mae_naive if mae_naive != 0 else np.nan # Avoid division by zero\n",
|
| 434 |
+
"\n",
|
| 435 |
+
" runtime = time.time() - start_time\n",
|
| 436 |
+
"\n",
|
| 437 |
+
" return {\n",
|
| 438 |
+
" \"Model\": model_name,\n",
|
| 439 |
+
" \"MSE\": mse,\n",
|
| 440 |
+
" \"MAE\": mae,\n",
|
| 441 |
+
" \"MAPE\": mape,\n",
|
| 442 |
+
" \"SMAPE\": smape,\n",
|
| 443 |
+
" \"MASE\": mase, # Now using established library\n",
|
| 444 |
+
" \"R2 Score\": r2,\n",
|
| 445 |
+
" \"Time (s)\": runtime\n",
|
| 446 |
+
" }\n"
|
| 447 |
+
]
|
| 448 |
+
},
|
| 449 |
+
{
|
| 450 |
+
"cell_type": "code",
|
| 451 |
+
"execution_count": 12,
|
| 452 |
+
"metadata": {},
|
| 453 |
+
"outputs": [
|
| 454 |
+
{
|
| 455 |
+
"name": "stderr",
|
| 456 |
+
"output_type": "stream",
|
| 457 |
+
"text": [
|
| 458 |
+
"Global seed set to 1\n",
|
| 459 |
+
"Global seed set to 1\n",
|
| 460 |
+
"Global seed set to 1\n",
|
| 461 |
+
"Global seed set to 1\n",
|
| 462 |
+
"Global seed set to 1\n",
|
| 463 |
+
"Global seed set to 1\n",
|
| 464 |
+
"Global seed set to 1\n"
|
| 465 |
+
]
|
| 466 |
+
}
|
| 467 |
+
],
|
| 468 |
+
"source": [
|
| 469 |
+
"results = []\n",
|
| 470 |
+
"input_size=12\n",
|
| 471 |
+
"models = [\n",
|
| 472 |
+
" # ✅ Best models for univariate forecasting\n",
|
| 473 |
+
" NBEATS(h=12, input_size=input_size, loss=MAE(), alias='NBEATS_12'), # Strong for univariate\n",
|
| 474 |
+
" NHITS(h=12, input_size=input_size, loss=MAE(), alias='NHITS_12'), # Successor to NBEATS, efficient\n",
|
| 475 |
+
" DLinear(h=12, input_size=input_size, loss=MAE(), alias='DLinear_12'), # Simple & effective for univariate\n",
|
| 476 |
+
" #RNN(h=12, input_size=input_size, loss=MAE(), alias='RNN_12'), # Baseline RNN model\n",
|
| 477 |
+
" #LSTM(h=12, input_size=input_size, loss=MAE(), alias='LSTM_12'), # More expressive than RNN\n",
|
| 478 |
+
" TCN(h=12, input_size=input_size, loss=MAE(), alias='TCN_12'), # Captures long-range dependencies\n",
|
| 479 |
+
" BiTCN(h=12, input_size=input_size, loss=MAE(), alias='BiTCN_12'), # Bidirectional TCN for better sequence modeling\n",
|
| 480 |
+
"\n",
|
| 481 |
+
" # 🔶 Can be used for univariate, but primarily optimized for multivariate\n",
|
| 482 |
+
" #TFT(h=12, input_size=input_size, loss=MAE(), alias='TFT_12'), # Designed for multivariate but works for univariate\n",
|
| 483 |
+
" PatchTST(h=12, input_size=input_size, loss=MAE(), alias='PatchTST_12'), # Transformer-based, supports univariate\n",
|
| 484 |
+
" Autoformer(h=12, input_size=input_size, loss=MQLoss(), alias='Autoformer_12'), # Autocorrelation-based Transformer\n",
|
| 485 |
+
"]\n"
|
| 486 |
+
]
|
| 487 |
+
},
|
| 488 |
+
{
|
| 489 |
+
"cell_type": "code",
|
| 490 |
+
"execution_count": null,
|
| 491 |
+
"metadata": {},
|
| 492 |
+
"outputs": [
|
| 493 |
+
{
|
| 494 |
+
"name": "stderr",
|
| 495 |
+
"output_type": "stream",
|
| 496 |
+
"text": [
|
| 497 |
+
"GPU available: False, used: False\n",
|
| 498 |
+
"TPU available: False, using: 0 TPU cores\n",
|
| 499 |
+
"IPU available: False, using: 0 IPUs\n",
|
| 500 |
+
"HPU available: False, using: 0 HPUs\n",
|
| 501 |
+
"\n",
|
| 502 |
+
" | Name | Type | Params\n",
|
| 503 |
+
"-----------------------------------------------\n",
|
| 504 |
+
"0 | loss | MAE | 0 \n",
|
| 505 |
+
"1 | padder_train | ConstantPad1d | 0 \n",
|
| 506 |
+
"2 | scaler | TemporalNorm | 0 \n",
|
| 507 |
+
"3 | blocks | ModuleList | 2.4 M \n",
|
| 508 |
+
"-----------------------------------------------\n",
|
| 509 |
+
"2.4 M Trainable params\n",
|
| 510 |
+
"600 Non-trainable params\n",
|
| 511 |
+
"2.4 M Total params\n",
|
| 512 |
+
"9.690 Total estimated model params size (MB)\n"
|
| 513 |
+
]
|
| 514 |
+
},
|
| 515 |
+
{
|
| 516 |
+
"data": {
|
| 517 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 518 |
+
"model_id": "106e8fb7f2c147ee9e157d2d24ff9afb",
|
| 519 |
+
"version_major": 2,
|
| 520 |
+
"version_minor": 0
|
| 521 |
+
},
|
| 522 |
+
"text/plain": [
|
| 523 |
+
"Sanity Checking: 0it [00:00, ?it/s]"
|
| 524 |
+
]
|
| 525 |
+
},
|
| 526 |
+
"metadata": {},
|
| 527 |
+
"output_type": "display_data"
|
| 528 |
+
},
|
| 529 |
+
{
|
| 530 |
+
"data": {
|
| 531 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 532 |
+
"model_id": "8cbfda12bdfa440590bd51f174d2bbe2",
|
| 533 |
+
"version_major": 2,
|
| 534 |
+
"version_minor": 0
|
| 535 |
+
},
|
| 536 |
+
"text/plain": [
|
| 537 |
+
"Training: 0it [00:00, ?it/s]"
|
| 538 |
+
]
|
| 539 |
+
},
|
| 540 |
+
"metadata": {},
|
| 541 |
+
"output_type": "display_data"
|
| 542 |
+
},
|
| 543 |
+
{
|
| 544 |
+
"data": {
|
| 545 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 546 |
+
"model_id": "618e280ffb0e4a7e87471cb5b74acc7b",
|
| 547 |
+
"version_major": 2,
|
| 548 |
+
"version_minor": 0
|
| 549 |
+
},
|
| 550 |
+
"text/plain": [
|
| 551 |
+
"Validation: 0it [00:00, ?it/s]"
|
| 552 |
+
]
|
| 553 |
+
},
|
| 554 |
+
"metadata": {},
|
| 555 |
+
"output_type": "display_data"
|
| 556 |
+
},
|
| 557 |
+
{
|
| 558 |
+
"data": {
|
| 559 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 560 |
+
"model_id": "f4209e5e4cfd4890821e2bd7d680b193",
|
| 561 |
+
"version_major": 2,
|
| 562 |
+
"version_minor": 0
|
| 563 |
+
},
|
| 564 |
+
"text/plain": [
|
| 565 |
+
"Validation: 0it [00:00, ?it/s]"
|
| 566 |
+
]
|
| 567 |
+
},
|
| 568 |
+
"metadata": {},
|
| 569 |
+
"output_type": "display_data"
|
| 570 |
+
},
|
| 571 |
+
{
|
| 572 |
+
"data": {
|
| 573 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 574 |
+
"model_id": "7b68ca85aaf0484e81571076a227cab1",
|
| 575 |
+
"version_major": 2,
|
| 576 |
+
"version_minor": 0
|
| 577 |
+
},
|
| 578 |
+
"text/plain": [
|
| 579 |
+
"Validation: 0it [00:00, ?it/s]"
|
| 580 |
+
]
|
| 581 |
+
},
|
| 582 |
+
"metadata": {},
|
| 583 |
+
"output_type": "display_data"
|
| 584 |
+
}
|
| 585 |
+
],
|
| 586 |
+
"source": [
|
| 587 |
+
"# Initialize NeuralForecast\n",
|
| 588 |
+
"start_time = time.time()\n",
|
| 589 |
+
"nf = NeuralForecast(models=models, freq='M')\n",
|
| 590 |
+
"nf.fit(df_train_scaled)\n",
|
| 591 |
+
"forecast_df = nf.predict()\n",
|
| 592 |
+
"\n",
|
| 593 |
+
"# Evaluate models\n",
|
| 594 |
+
"for model_name in forecast_df.columns:\n",
|
| 595 |
+
" if model_name == \"ds\" or model_name == \"unique_id\":\n",
|
| 596 |
+
" continue\n",
|
| 597 |
+
" y_pred = forecast_df[model_name]#.astype(float) # Ensure numeric type\n",
|
| 598 |
+
" #print(y_pred)\n",
|
| 599 |
+
" #results.append(evaluate_model(val[\"y\"].astype(float), y_pred, f\"{model_name} (NeuralForecast)\", start_time))\n",
|
| 600 |
+
" y_pred = y_pred[:df_test_scaled[\"y\"].shape[0]]\n",
|
| 601 |
+
" results.append(evaluate_model(df_test_scaled[\"y\"].astype(float), y_pred, df_train_scaled[\"y\"], f\"{model_name} (NeuralForecast)\", start_time))\n",
|
| 602 |
+
"\n",
|
| 603 |
+
"# Convert results to DataFrame and sort by MAPE\n",
|
| 604 |
+
"df_results = pd.DataFrame(results).sort_values(by=\"MAPE\")\n",
|
| 605 |
+
"\n",
|
| 606 |
+
"print(df_results)"
|
| 607 |
+
]
|
| 608 |
+
},
|
| 609 |
+
{
|
| 610 |
+
"cell_type": "code",
|
| 611 |
+
"execution_count": null,
|
| 612 |
+
"metadata": {},
|
| 613 |
+
"outputs": [],
|
| 614 |
+
"source": [
|
| 615 |
+
"df_results.head()"
|
| 616 |
+
]
|
| 617 |
+
},
|
| 618 |
+
{
|
| 619 |
+
"cell_type": "code",
|
| 620 |
+
"execution_count": null,
|
| 621 |
+
"metadata": {},
|
| 622 |
+
"outputs": [],
|
| 623 |
+
"source": [
|
| 624 |
+
"\n",
|
| 625 |
+
"df_results =df_results.head(5).reset_index()\n",
|
| 626 |
+
"\n",
|
| 627 |
+
"# Plotting the data using Plotly\n",
|
| 628 |
+
"fig = px.bar(df_results, y='MAPE', text='Model')\n",
|
| 629 |
+
"\n",
|
| 630 |
+
"fig.update_layout(\n",
|
| 631 |
+
" title='Bar Plot of MAPE Value with Best Model Labels',\n",
|
| 632 |
+
" yaxis_title='MAPE Value'\n",
|
| 633 |
+
")\n",
|
| 634 |
+
"\n",
|
| 635 |
+
"fig.show()"
|
| 636 |
+
]
|
| 637 |
+
},
|
| 638 |
+
{
|
| 639 |
+
"cell_type": "code",
|
| 640 |
+
"execution_count": null,
|
| 641 |
+
"metadata": {},
|
| 642 |
+
"outputs": [],
|
| 643 |
+
"source": [
|
| 644 |
+
"# Assuming df_results contains columns 'R2', 'MAPE', and 'Model'\n",
|
| 645 |
+
"fig = px.bar(df_results, y='R2 Score', text='Model')\n",
|
| 646 |
+
"\n",
|
| 647 |
+
"fig.update_layout(\n",
|
| 648 |
+
" title='Bar Plot of R² vs MAPE Values with Model Labels',\n",
|
| 649 |
+
" xaxis_title='index',\n",
|
| 650 |
+
" yaxis_title='R2 Value'\n",
|
| 651 |
+
")\n",
|
| 652 |
+
"\n",
|
| 653 |
+
"fig.show()"
|
| 654 |
+
]
|
| 655 |
+
},
|
| 656 |
+
{
|
| 657 |
+
"cell_type": "code",
|
| 658 |
+
"execution_count": null,
|
| 659 |
+
"metadata": {},
|
| 660 |
+
"outputs": [],
|
| 661 |
+
"source": [
|
| 662 |
+
"forecast_df.columns"
|
| 663 |
+
]
|
| 664 |
+
},
|
| 665 |
+
{
|
| 666 |
+
"cell_type": "code",
|
| 667 |
+
"execution_count": null,
|
| 668 |
+
"metadata": {},
|
| 669 |
+
"outputs": [],
|
| 670 |
+
"source": [
|
| 671 |
+
"forecast_df[\"NHITS_12-hi-90\"]"
|
| 672 |
+
]
|
| 673 |
+
},
|
| 674 |
+
{
|
| 675 |
+
"cell_type": "code",
|
| 676 |
+
"execution_count": null,
|
| 677 |
+
"metadata": {},
|
| 678 |
+
"outputs": [],
|
| 679 |
+
"source": [
|
| 680 |
+
"\n",
|
| 681 |
+
"# Plot Predictions vs Actual\n",
|
| 682 |
+
"plt.figure(figsize=(10, 4))\n",
|
| 683 |
+
"plt.plot(train[\"ds\"], train[\"y\"].astype(float), label=\"Training Data\")\n",
|
| 684 |
+
"plt.plot(val[\"ds\"], val[\"y\"].astype(float), label=\"Actual Holdout Data\", color=\"red\")\n",
|
| 685 |
+
"plt.plot(val[\"ds\"], forecast_df[\"NHITS_12-hi-90\"].values[:val[\"y\"].shape[0]], label=\"Holdout Forecast\", linestyle=\"dashed\", color=\"green\")\n",
|
| 686 |
+
"plt.title(\"Final Model Evaluation on Holdout Data\")\n",
|
| 687 |
+
"plt.legend()\n",
|
| 688 |
+
"plt.show()"
|
| 689 |
+
]
|
| 690 |
+
},
|
| 691 |
+
{
|
| 692 |
+
"cell_type": "code",
|
| 693 |
+
"execution_count": null,
|
| 694 |
+
"metadata": {},
|
| 695 |
+
"outputs": [],
|
| 696 |
+
"source": [
|
| 697 |
+
"# Plot optimized forecast vs actual\n",
|
| 698 |
+
"plt.figure(figsize=(12, 6))\n",
|
| 699 |
+
"plt.plot(val[\"ds\"], val[\"y\"].astype(float), label=\"Actual Revenue\", marker=\"o\")\n",
|
| 700 |
+
"plt.plot(val[\"ds\"], forecast_df[\"NHITS_12-hi-90\"][:len(val[\"y\"])], label=\"Optimized SARIMA Forecast\", linestyle=\"dashed\", marker=\"x\")\n",
|
| 701 |
+
"plt.xlabel(\"Year\")\n",
|
| 702 |
+
"plt.ylabel(\"Revenue\")\n",
|
| 703 |
+
"#plt.title(f\"Optimized SARIMA ({best_p}, {best_d}, {best_q}) x ({best_P}, {best_D}, {best_Q}, {S}) Forecast - SAP SE Revenue\")\n",
|
| 704 |
+
"plt.legend()\n",
|
| 705 |
+
"plt.show()"
|
| 706 |
+
]
|
| 707 |
+
},
|
| 708 |
+
{
|
| 709 |
+
"cell_type": "code",
|
| 710 |
+
"execution_count": null,
|
| 711 |
+
"metadata": {},
|
| 712 |
+
"outputs": [],
|
| 713 |
+
"source": [
|
| 714 |
+
"val.shape"
|
| 715 |
+
]
|
| 716 |
+
},
|
| 717 |
+
{
|
| 718 |
+
"cell_type": "code",
|
| 719 |
+
"execution_count": null,
|
| 720 |
+
"metadata": {},
|
| 721 |
+
"outputs": [],
|
| 722 |
+
"source": []
|
| 723 |
+
}
|
| 724 |
+
],
|
| 725 |
+
"metadata": {
|
| 726 |
+
"kernelspec": {
|
| 727 |
+
"display_name": "ai_env",
|
| 728 |
+
"language": "python",
|
| 729 |
+
"name": "python3"
|
| 730 |
+
},
|
| 731 |
+
"language_info": {
|
| 732 |
+
"codemirror_mode": {
|
| 733 |
+
"name": "ipython",
|
| 734 |
+
"version": 3
|
| 735 |
+
},
|
| 736 |
+
"file_extension": ".py",
|
| 737 |
+
"mimetype": "text/x-python",
|
| 738 |
+
"name": "python",
|
| 739 |
+
"nbconvert_exporter": "python",
|
| 740 |
+
"pygments_lexer": "ipython3",
|
| 741 |
+
"version": "3.10.16"
|
| 742 |
+
}
|
| 743 |
+
},
|
| 744 |
+
"nbformat": 4,
|
| 745 |
+
"nbformat_minor": 2
|
| 746 |
+
}
|
dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled_version.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled_version1.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled_version2.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_SAP_simple_univariate.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_Volkswagen_neural_forecasting_scaled_version1.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/12_company_basic.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/12_company_basic.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/Allianz_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/BASF_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/BMW_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/Bayer_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/Daimler_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/Deutsche_Bank_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/Deutsche_Telekom_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/Merck_KGaA_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/Porsche_AG_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/SAP_SE_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/SAP_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/Siemens_AG_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/Sarimax/Volkswagen_AG_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/gradio_app_BASF.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/gradio_app_Deutsche_Telekom.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/gradio_app_Siemens.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/neural_forecast.ipynb
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [
|
| 8 |
+
{
|
| 9 |
+
"name": "stderr",
|
| 10 |
+
"output_type": "stream",
|
| 11 |
+
"text": [
|
| 12 |
+
"Seed set to 1\n",
|
| 13 |
+
"Seed set to 1\n",
|
| 14 |
+
"Seed set to 1\n"
|
| 15 |
+
]
|
| 16 |
+
},
|
| 17 |
+
{
|
| 18 |
+
"name": "stdout",
|
| 19 |
+
"output_type": "stream",
|
| 20 |
+
"text": [
|
| 21 |
+
"Company: SAP SE\n",
|
| 22 |
+
"Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 5.87it/s, v_num=37, train_loss_step=2.49e+7, train_loss_epoch=2.49e+7]\n",
|
| 23 |
+
"Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 5.87it/s, v_num=38, train_loss_step=3.64e+7, train_loss_epoch=3.64e+7]\n",
|
| 24 |
+
"Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 14.15it/s, v_num=39, train_loss_step=4.3e+8, train_loss_epoch=4.3e+8] \n"
|
| 25 |
+
]
|
| 26 |
+
}
|
| 27 |
+
],
|
| 28 |
+
"source": [
|
| 29 |
+
"# %%\n",
|
| 30 |
+
"import numpy as np\n",
|
| 31 |
+
"import pandas as pd\n",
|
| 32 |
+
"import matplotlib.pyplot as plt\n",
|
| 33 |
+
"from neuralforecast import NeuralForecast\n",
|
| 34 |
+
"from neuralforecast.models import NBEATSx, NHITS, PatchTST\n",
|
| 35 |
+
"from neuralforecast.losses.pytorch import MAE\n",
|
| 36 |
+
"from neuralforecast.utils import AirPassengersDF\n",
|
| 37 |
+
"from sklearn.metrics import mean_absolute_error\n",
|
| 38 |
+
"\n",
|
| 39 |
+
"# Set random seed\n",
|
| 40 |
+
"np.random.seed(42)\n",
|
| 41 |
+
"\n",
|
| 42 |
+
"# %%\n",
|
| 43 |
+
"# Load dataset\n",
|
| 44 |
+
"df = pd.read_csv(\"data/Top_12_German_Companies_Financial_Data.csv\")\n",
|
| 45 |
+
"companies = np.unique(df.Company)\n",
|
| 46 |
+
"company = companies[9]\n",
|
| 47 |
+
"print(f\"Company: {company}\")\n",
|
| 48 |
+
"\n",
|
| 49 |
+
"# Filter for selected company\n",
|
| 50 |
+
"df = df[df[\"Company\"] == company].copy()\n",
|
| 51 |
+
"df[\"Period\"] = pd.to_datetime(df[\"Period\"], format=\"%m/%d/%Y\")\n",
|
| 52 |
+
"df = df.sort_values(by=\"Period\")\n",
|
| 53 |
+
"df[\"Revenue\"] = pd.to_numeric(df[\"Revenue\"], errors=\"coerce\")\n",
|
| 54 |
+
"\n",
|
| 55 |
+
"# Convert to NeuralForecast format (column names: [\"unique_id\", \"ds\", \"y\"])\n",
|
| 56 |
+
"df_nf = df.rename(columns={\"Company\": \"unique_id\", \"Period\": \"ds\", \"Revenue\": \"y\"})\n",
|
| 57 |
+
"df_nf = df_nf[[\"unique_id\", \"ds\", \"y\"]]\n",
|
| 58 |
+
"\n",
|
| 59 |
+
"# Fill missing values (if any)\n",
|
| 60 |
+
"df_nf = df_nf.fillna(method=\"ffill\")\n",
|
| 61 |
+
"\n",
|
| 62 |
+
"# %%\n",
|
| 63 |
+
"# Train-validation-test split\n",
|
| 64 |
+
"train_size = int(len(df_nf) * 0.8)\n",
|
| 65 |
+
"val_size = int(len(df_nf) * 0.9)\n",
|
| 66 |
+
"\n",
|
| 67 |
+
"train_df = df_nf.iloc[:train_size]\n",
|
| 68 |
+
"val_df = df_nf.iloc[train_size:val_size]\n",
|
| 69 |
+
"test_df = df_nf.iloc[val_size:]\n",
|
| 70 |
+
"\n",
|
| 71 |
+
"# Forecast horizon (quarters)\n",
|
| 72 |
+
"H = 4\n",
|
| 73 |
+
"max_steps = 1000\n",
|
| 74 |
+
"# %%\n",
|
| 75 |
+
"# Define models with hyperparameters\n",
|
| 76 |
+
"models = [\n",
|
| 77 |
+
" NBEATSx(h=2*H, input_size=3*H, loss=MAE(), max_steps=max_steps),\n",
|
| 78 |
+
" NHITS(h=2*H, input_size=3*H, loss=MAE(), max_steps=max_steps),\n",
|
| 79 |
+
" PatchTST(h=2*H, input_size=3*H, loss=MAE(), max_steps=max_steps)\n",
|
| 80 |
+
"]\n",
|
| 81 |
+
"\n",
|
| 82 |
+
"# Train models using NeuralForecast\n",
|
| 83 |
+
"nf = NeuralForecast(models=models, freq='Q')\n",
|
| 84 |
+
"nf.fit(train_df)\n"
|
| 85 |
+
]
|
| 86 |
+
},
|
| 87 |
+
{
|
| 88 |
+
"cell_type": "code",
|
| 89 |
+
"execution_count": 2,
|
| 90 |
+
"metadata": {},
|
| 91 |
+
"outputs": [
|
| 92 |
+
{
|
| 93 |
+
"name": "stdout",
|
| 94 |
+
"output_type": "stream",
|
| 95 |
+
"text": [
|
| 96 |
+
"Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 61.41it/s]"
|
| 97 |
+
]
|
| 98 |
+
},
|
| 99 |
+
{
|
| 100 |
+
"name": "stdout",
|
| 101 |
+
"output_type": "stream",
|
| 102 |
+
"text": [
|
| 103 |
+
"\n",
|
| 104 |
+
"Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 204.54it/s]\n",
|
| 105 |
+
"Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 218.77it/s]\n",
|
| 106 |
+
" ds NBEATSx NHITS PatchTST\n",
|
| 107 |
+
"unique_id \n",
|
| 108 |
+
"SAP SE 2023-06-30 1.566195e+10 1.620627e+10 1.489384e+10\n",
|
| 109 |
+
"SAP SE 2023-09-30 1.530134e+10 1.493543e+10 1.298696e+10\n",
|
| 110 |
+
"SAP SE 2023-12-31 1.739223e+10 1.613981e+10 1.138139e+10\n",
|
| 111 |
+
"SAP SE 2024-03-31 1.781236e+10 1.575556e+10 8.567087e+09\n",
|
| 112 |
+
"SAP SE 2024-06-30 1.757185e+10 1.563337e+10 6.857025e+09\n",
|
| 113 |
+
"SAP SE 2024-09-30 1.819738e+10 1.703983e+10 7.295098e+09\n",
|
| 114 |
+
"SAP SE 2024-12-31 1.836473e+10 1.695560e+10 7.750687e+09\n",
|
| 115 |
+
"SAP SE 2025-03-31 1.914220e+10 1.765210e+10 9.533727e+09\n",
|
| 116 |
+
"[10806122549 17167661800 13414872686]\n",
|
| 117 |
+
"\n",
|
| 118 |
+
"🔹 Model Validation Performance:\n",
|
| 119 |
+
"ds: MAE = 1696031986203781120.00\n",
|
| 120 |
+
"NBEATSx: MAE = 3566502252.33\n",
|
| 121 |
+
"NHITS: MAE = 3452436503.00\n",
|
| 122 |
+
"PatchTST: MAE = 3433968053.67\n",
|
| 123 |
+
"\n",
|
| 124 |
+
"✅ Best Model Selected: PatchTST\n"
|
| 125 |
+
]
|
| 126 |
+
}
|
| 127 |
+
],
|
| 128 |
+
"source": [
|
| 129 |
+
"\n",
|
| 130 |
+
"# Validate models on validation set\n",
|
| 131 |
+
"val_predictions = nf.predict()\n",
|
| 132 |
+
"print(val_predictions)\n",
|
| 133 |
+
"# Compare with the first H points of the validation set (not the last)\n",
|
| 134 |
+
"val_actuals = val_df[\"y\"].values # First H validation points\n",
|
| 135 |
+
"print(val_actuals)\n",
|
| 136 |
+
"# Compute MAE for each model using the first H validation points\n",
|
| 137 |
+
"val_mae_scores = {model: mean_absolute_error(val_actuals, val_predictions[model].values[:len(val_actuals)]) for model in val_predictions.columns}\n",
|
| 138 |
+
"best_model_name = min(val_mae_scores, key=val_mae_scores.get)\n",
|
| 139 |
+
"\n",
|
| 140 |
+
"print(\"\\n🔹 Model Validation Performance:\")\n",
|
| 141 |
+
"for model, mae in val_mae_scores.items():\n",
|
| 142 |
+
" print(f\"{model}: MAE = {mae:.2f}\")\n",
|
| 143 |
+
"\n",
|
| 144 |
+
"print(f\"\\n✅ Best Model Selected: {best_model_name}\")\n",
|
| 145 |
+
"\n",
|
| 146 |
+
"\n"
|
| 147 |
+
]
|
| 148 |
+
},
|
| 149 |
+
{
|
| 150 |
+
"cell_type": "code",
|
| 151 |
+
"execution_count": 4,
|
| 152 |
+
"metadata": {},
|
| 153 |
+
"outputs": [
|
| 154 |
+
{
|
| 155 |
+
"name": "stdout",
|
| 156 |
+
"output_type": "stream",
|
| 157 |
+
"text": [
|
| 158 |
+
"Epoch 0: 0%| | 0/1 [00:00<?, ?it/s] "
|
| 159 |
+
]
|
| 160 |
+
},
|
| 161 |
+
{
|
| 162 |
+
"name": "stdout",
|
| 163 |
+
"output_type": "stream",
|
| 164 |
+
"text": [
|
| 165 |
+
"Epoch 999: 100%|██████████| 1/1 [00:00<00:00, 14.83it/s, v_num=45, train_loss_step=4.63e+8, train_loss_epoch=4.63e+8]\n"
|
| 166 |
+
]
|
| 167 |
+
}
|
| 168 |
+
],
|
| 169 |
+
"source": [
|
| 170 |
+
"# %%\n",
|
| 171 |
+
"# Use best model for test forecasting\n",
|
| 172 |
+
"best_model = [m for m in models if m.__class__.__name__ == best_model_name][0]\n",
|
| 173 |
+
"nf = NeuralForecast(models=[best_model], freq='Q')\n",
|
| 174 |
+
"nf.fit(pd.concat([train_df, val_df]))\n",
|
| 175 |
+
"\n"
|
| 176 |
+
]
|
| 177 |
+
},
|
| 178 |
+
{
|
| 179 |
+
"cell_type": "code",
|
| 180 |
+
"execution_count": 6,
|
| 181 |
+
"metadata": {},
|
| 182 |
+
"outputs": [
|
| 183 |
+
{
|
| 184 |
+
"name": "stdout",
|
| 185 |
+
"output_type": "stream",
|
| 186 |
+
"text": [
|
| 187 |
+
"Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 218.23it/s]"
|
| 188 |
+
]
|
| 189 |
+
},
|
| 190 |
+
{
|
| 191 |
+
"name": "stdout",
|
| 192 |
+
"output_type": "stream",
|
| 193 |
+
"text": [
|
| 194 |
+
"\n"
|
| 195 |
+
]
|
| 196 |
+
},
|
| 197 |
+
{
|
| 198 |
+
"data": {
|
| 199 |
+
"image/png": "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YRAREREREZGNuX79OoKDgwvdx+aSdE9PTwDixfHy8lI4GiIiIiIiIirtkpOTUbFiRU0+WhibS9LlFncvLy8m6URERERERGQ2+gy55sRxRERERERERBaCSToRERERERGRhWCSTkRERERERGQhbG5MOhERERERmZckScjOzkZOTo7SoRCZjKOjI+zt7Ut8HCbpRERERERkMpmZmYiPj0d6errSoRCZlEqlQnBwMDw8PEp0HCbpRERERERkEmq1GrGxsbC3t0dQUBCcnJz0mt2ayNpIkoR79+7hxo0bqF69eokq6kzSiYiIiIjIJDIzM6FWq1GxYkW4ubkpHQ6RSfn5+eHq1avIysoqUZKu6MRxs2bNQtOmTeHp6Ql/f3+89NJLuHDhQpGP27t3Lxo3bgwXFxdUqVIFS5cuNUO0RERERERkCDs7zldNpZ+xukQU/W3Zu3cvRo4ciSNHjmDnzp3Izs7G888/j7S0tAIfExsbi27duqFNmzY4ceIEPvnkE4wePRq//fabGSMnIiIiIiIiMj5F2923bdum8/WKFSvg7++Pf//9F23bts33MUuXLkVISAgWLFgAAKhduzaOHz+OuXPn4pVXXjF1yEREREREREQmY1F9J0lJSQCAcuXKFbjP4cOH8fzzz+vc1rlzZxw/fhxZWVl59s/IyEBycrLOhYiIiIiIyJzCw8PxwQcfKB0GWQGLSdIlScLYsWPRunVr1K1bt8D9bt++jfLly+vcVr58eWRnZyMhISHP/rNmzYK3t7fmUrFiRaPHTkREREREpYNKpSr0MmjQIIOOu2HDBsyYMaNEsQ0aNEgTh6OjI8qXL4/nnnsOy5cvh1qtLtaxIiMjUaZMmRLFQ6ZhMUn6qFGjcOrUKaxZs6bIfZ8ekC9JUr63A8DEiRORlJSkuVy/ft04ARMRERERUakTHx+vuSxYsABeXl46ty1cuFBn//y6efNTrlw5eHp6lji+Ll26ID4+HlevXsX//vc/tG/fHu+//z66d++O7OzsEh+flGcRSfp7772H33//Hbt370ZwcHCh+wYEBOD27ds6t929excODg7w8fHJs7+zszO8vLx0LkREREREpAxJAtLSzH95UtcrUkBAgObi7e0NlUql+frx48coU6YM1q1bh/DwcLi4uOCnn35CYmIiXn/9dQQHB8PNzQ316tXLU3x8ut09NDQUn3/+OYYMGQJPT0+EhITgu+++KzI+Z2dnBAQEoEKFCmjUqBE++eQTbN68Gf/73/8QGRmp2e+rr75CvXr14O7ujooVK2LEiBFITU0FAOzZsweDBw9GUlKSpjI/depUAMBPP/2EJk2awNPTEwEBAejXrx/u3r2r34tHRqFoki5JEkaNGoUNGzZg165dqFy5cpGPadGiBXbu3Klz244dO9CkSRM4OjqaKlQiIiIiIjKC9HTAw8P8l/R04z2HCRMmYPTo0YiOjkbnzp3x+PFjNG7cGFu2bMGZM2fwzjvvoH///jh69Gihx5k3bx6aNGmCEydOYMSIEXj33Xdx/vz5YsfToUMHNGjQABs2bNDcZmdnh0WLFuHMmTP48ccfsWvXLnz00UcAgJYtW+bpEhg/fjwAsbb9jBkzcPLkSWzatAmxsbEGt/iTYRSd3X3kyJH4+eefsXnzZnh6emoq5N7e3nB1dQUg2tVv3ryJlStXAgCGDx+Or7/+GmPHjsXbb7+Nw4cPY9myZXq1yRMREREREZXUBx98gF69euncJie5gOgU3rZtG3799Vc0b968wON069YNI0aMACAS//nz52PPnj2oVatWsWOqVasWTp06pROjrHLlypgxYwbeffddLFmyBE5OTjpdAtqGDBmi2a5SpQoWLVqEZs2aITU1FR4eHsWOi4pP0ST9m2++ASBaP7StWLFC82lNfHw84uLiNPdVrlwZf/75J8aMGYPFixcjKCgIixYt4vJrZBFOnABq1ADc3ZWOhIiIiMgyubkBT7quzX5eY2nSpInO1zk5Ofjiiy+wdu1a3Lx5ExkZGcjIyIB7EW8K69evr9mWE2ZDW8slSdKZo2v37t34/PPPce7cOSQnJyM7OxuPHz9GWlpaoXGdOHECU6dORVRUFO7fv6+ZkC4uLg516tQxKDYqHkWTdEmPgSHa4ypk7dq1w3///WeCiIgMt2oVMGAAMHo08NR8IkRERET0hEpl/QWNp5PcefPmYf78+ViwYIFmHPgHH3yAzMzMQo/z9HBdlUpV7FnaZdHR0Zrhw9euXUO3bt0wfPhwzJgxA+XKlcOBAwcwdOjQQie6S0tLw/PPP4/nn38eP/30E/z8/BAXF4fOnTsX+VzIeBRN0olKC0kC5s4V22fPKhsLEREREZnX/v370bNnT7z55psAALVajUuXLqF27dpmOf+uXbtw+vRpjBkzBgBw/PhxZGdnY968ebCzE9OQrVu3TucxTk5OyMnJ0bnt/PnzSEhIwBdffKFZuvr48eNmeAakzSJmdyeydgcOAPIQoIcPFQ2FiIiIiMysWrVq2LlzJw4dOoTo6GgMGzYsz4pUxpKRkYHbt2/j5s2b+O+///D555+jZ8+e6N69OwYMGAAAqFq1KrKzs/F///d/uHLlClatWoWlS5fqHCc0NBSpqan4+++/kZCQgPT0dISEhMDJyUnzuN9//73Ea7tT8TFJJzKCxYtztx88UC4OIiIiIjK/iIgINGrUCJ07d0Z4eDgCAgLw0ksvmeRc27ZtQ2BgIEJDQ9GlSxfs3r0bixYtwubNm2Fvbw8ACAsLw1dffYXZs2ejbt26WL16NWbNmqVznJYtW2L48OHo06cP/Pz8MGfOHPj5+SEyMhK//vor6tSpgy+++AJz5XZRMhuVpM/A8FIkOTkZ3t7eSEpK4prpZBTx8UBICJCdLb4uVw5ITFQ2JiIiIiJL8PjxY8TGxqJy5cpwcXFROhwikyrs5704eSgr6UQl9P33IkGvVk18/fAhYOB8H0REREREZOOYpBOVQFYW8O23YnviRHGtVgMpKcrFRERERERE1otJOlEJbN4M3LoFlC8PvPkm4OwsbufkcUREREREZAgm6UQl8PXX4vrttwEnJ6BsWfE1J48jIiIiIiJDMEknMtCZM8DevYC9PTBsmLitTBlxzUo6EREREREZgkk6kYGWLBHXPXsCwcFim5V0IiIiIiIqCSbpRAZITgZWrRLbI0fm3s5KOhERERERlQSTdCIDrFwJpKYCtWsD7dvn3s5KOhERERERlQSTdKJikiRg8WKxPXIkoFLl3sdKOhERERERlQSTdKJi2rULOH8e8PAA+vfXvY+VdCIiIiICgPDwcHzwwQear0NDQ7FgwYJCH6NSqbBp06YSn9tYxyFlMEknKia5ij5gAODlpXufXElnkk5ERERknXr06IFOnTrle9/hw4ehUqnw33//Ffu4x44dwzvvvFPS8HRMnToVYWFheW6Pj49H165djXqup0VGRkKlUkGlUsHe3h5ly5ZF8+bNMX36dCQlJRXrWFevXoVKpUJUVJRpgrUyTNKJiuH6dWDzZrE9YkTe++VKOtvdiYiIiKzT0KFDsWvXLly7di3PfcuXL0dYWBgaNWpU7OP6+fnBzc3NGCEWKSAgAM7OziY/j5eXF+Lj43Hjxg0cOnQI77zzDlauXImwsDDcunXL5OcvrZikExXDt98CajUQHg4880ze+9nuTkRERFQESQKy08x/kSS9wuvevTv8/f0RGRmpc3t6ejrWrl2LoUOHIjExEa+//jqCg4Ph5uaGevXqYc2aNYUe9+l290uXLqFt27ZwcXFBnTp1sHPnzjyPmTBhAmrUqAE3NzdUqVIFERERyMrKAiAq2dOmTcPJkyc1FW055qfb3U+fPo0OHTrA1dUVPj4+eOedd5Camqq5f9CgQXjppZcwd+5cBAYGwsfHByNHjtScqyAqlQoBAQEIDAxE7dq1MXToUBw6dAipqan46KOPNPtt27YNrVu3RpkyZeDj44Pu3bsjJiZGc3/lypUBAA0bNoRKpUJ4eDgA0X3w3HPPwdfXF97e3mjXrp1BXQzWxkHpAIisRUYG8P33YnvUqPz34cRxREREREXISQfWeZj/vL1TAQf3IndzcHDAgAEDEBkZicmTJ0P1ZJbgX3/9FZmZmXjjjTeQnp6Oxo0bY8KECfDy8sLWrVvRv39/VKlSBc2bNy/yHGq1Gr169YKvry+OHDmC5ORknfHrMk9PT0RGRiIoKAinT5/G22+/DU9PT3z00Ufo06cPzpw5g23btuGvv/4CAHh7e+c5Rnp6Orp06YJnn30Wx44dw927d/HWW29h1KhROh9E7N69G4GBgdi9ezcuX76MPn36ICwsDG+//XaRz0ebv78/3njjDSxfvhw5OTmwt7dHWloaxo4di3r16iEtLQ2TJ0/Gyy+/jKioKNjZ2eGff/5Bs2bN8Ndff+GZZ56Bk5MTACAlJQUDBw7EokWLAADz5s1Dt27dcOnSJXh6ehYrLmvCJJ1IT+vXA3fvAhUqAD175r8PK+lERERE1m/IkCH48ssvsWfPHrR/st7u8uXL0atXL5QtWxZly5bF+PHjNfu/99572LZtG3799Ve9kvS//voL0dHRuHr1KoKDgwEAn3/+eZ5x5JMmTdJsh4aGYty4cVi7di0++ugjuLq6wsPDAw4ODggICCjwXKtXr8ajR4+wcuVKuLuLDym+/vpr9OjRA7Nnz0b58uUBAGXLlsXXX38Ne3t71KpVCy+88AL+/vvvYifpAFCrVi2kpKQgMTER/v7+eOWVV3TuX7ZsGfz9/XHu3DnUrVsXfn5+AAAfHx+d59KhQwedx3377bcoW7Ys9u7di+7duxc7LmvBJJ1IT/KEccOGAQ4F/Oawkk5ERERUBHs3UdVW4rx6qlWrFlq2bInly5ejffv2iImJwf79+7Fjxw4AQE5ODr744gusXbsWN2/eREZGBjIyMjRJcFGio6MREhKiSdABoEWLFnn2W79+PRYsWIDLly8jNTUV2dnZ8Hp65mI9ztWgQQOd2Fq1agW1Wo0LFy5okvRnnnkG9vb2mn0CAwNx+vTpYp1LJj0ZWiB3IcTExCAiIgJHjhxBQkIC1Go1ACAuLg5169Yt8Dh3797F5MmTsWvXLty5cwc5OTlIT09HXFycQXFZCybpRHo4cQI4fBhwdAQK+zBRrqQ/eiTa480wXwcRERGRdVGp9Go7V9rQoUMxatQoLF68GCtWrEClSpXQsWNHAKLtev78+ViwYAHq1asHd3d3fPDBB8jMzNTr2FI+4+PlhFZ25MgR9O3bF9OmTUPnzp3h7e2NX375BfPmzSvW85AkKc+x8zuno6NjnvvkZLq4oqOj4eXlBR8fHwBixvyKFSvi+++/R1BQENRqNerWrVvk6zVo0CDcu3cPCxYsQKVKleDs7IwWLVro/TpbK04cR6QHuYr+yitAId1E8PIS/3cAtrwTERERWbPevXvD3t4eP//8M3788UcMHjxYk9Tu378fPXv2xJtvvokGDRqgSpUquHTpkt7HrlOnDuLi4nRmQD98+LDOPgcPHkSlSpXw6aefokmTJqhevXqeGeednJyQk5NT5LmioqKQlpamc2w7OzvUqFFD75j1dffuXfz888946aWXYGdnh8TERERHR2PSpEno2LEjateujQdPvVGWx6A//Vz279+P0aNHo1u3bnjmmWfg7OyMhIQEo8dsaZikExXh/n3g55/F9siRhe9rZwfI83Ww5Z2IiIjIenl4eKBPnz745JNPcOvWLQwaNEhzX7Vq1bBz504cOnQI0dHRGDZsGG7fvq33sTt16oSaNWtiwIABOHnyJPbv349PP/1UZ59q1aohLi4Ov/zyC2JiYrBo0SJs3LhRZ5/Q0FDExsYiKioKCQkJyMjIyHOuN954Ay4uLhg4cCDOnDmD3bt347333kP//v01re6GkiQJt2/fRnx8PKKjo7F8+XK0bNkS3t7e+OKLLwCIse4+Pj747rvvcPnyZezatQtjx47VOY6/vz9cXV2xbds23LlzR7POerVq1bBq1SpER0fj6NGjeOONN+Dq6lqimK0Bk3SiIqxYIdrXGzQAWrUqen9OHkdERERUOgwdOhQPHjxAp06dEBISork9IiICjRo1QufOnREeHo6AgAC89NJLeh/Xzs4OGzduREZGBpo1a4a33noLn332mc4+PXv2xJgxYzBq1CiEhYXh0KFDiIiI0NnnlVdeQZcuXdC+fXv4+fnluwycm5sbtm/fjvv376Np06Z49dVX0bFjR3z99dfFezHykZycjMDAQFSoUAEtWrTAt99+i4EDB+LEiRMIDAzUPNdffvkF//77L+rWrYsxY8bgyy+/1DmOg4MDFi1ahG+//RZBQUHo+WSW5uXLl+PBgwdo2LAh+vfvj9GjR8Pf37/EcVs6lZTfgIhSLDk5Gd7e3khKSir2pAtke9RqoEYNICYG+O67wsejyxo1EmPY//wTeGqCTiIiIiKb8vjxY8TGxqJy5cpwcXFROhwikyrs5704eSgr6USF2L5dJOje3kC/fvo9hpV0IiIiIiIyFJN0okLIE8YNHgzouaIGl2EjIiIiIiKDMUknKkBsrGhZB4ARI/R/HCvpRERERERkKCbpRAX45htAkoDnnweqV9f/caykExERERGRoZikE+Xj0SNg2TKxPWpU8R7LSjoREZFlunULmDsXSElROhIiooIxSSfKxy+/iPXRK1UCunUr3mPlSjqTdCIiIssycSLw4YfAU0s0ExFZFCbpRE+RpNwJ4959F7C3L97j5Uo6292JiIgshyQBu3aJ7chI4OpVJaMhIioYk3Sip/zzD/Dvv4CzMzB0aPEfz3Z3IiIiy3PtGnDjhtjOzgZmzVI2HiKigjBJJ3qKXEXv0wfw9S3+4zlxHBERkeXZt09c+/mJ6xUrgLg45eIhIioIk3QiLXfvAmvXiu3iThgnYyWdiIjI8shJ+pAhQIcOQFYWq+nWJEedgz1X92DN6TXYc3UPctQ5SodEZDJM0om0LFsGZGYCTZuKiyHkSnpSEqBWGy00IiIiKgE5SW/bFpgyRWwvWwZcv65cTKSfDdEbELowFO1/bI9+G/qh/Y/tEbowFBuiN5jkfCqVqtDLoEGDDD52aGgoFixYoNd+8vlcXV0RGhqK3r17Y5c8sUIxDBo0CC+99FLxgyXFMEkneiInB1i6VGyPHGn4ceQkXZKA5OQSh0VEREQlFB8PXLoEqFRAq1YiUQ8PZzXdGmyI3oBX172KG8k3dG6/mXwTr6571SSJenx8vOayYMECeHl56dy2cOFCo58zP9OnT0d8fDwuXLiAlStXokyZMujUqRM+++wzs5yflMMkneiJLVvE2DQfHzEe3VAuLuICcFw6ERGRJdi/X1yHhQHe3mJbu5p+40a+DyMTS8tMK/DyOPsxctQ5eH/b+5Ag5XmsfNv7/3sfqRmpRR63OAICAjQXb29vqFQqndv27duHxo0bw8XFBVWqVMG0adOQnZ2tefzUqVMREhICZ2dnBAUFYfTo0QCA8PBwXLt2DWPGjNFUyQvj6emJgIAAhISEoG3btvjuu+8QERGByZMn48KFCwCAnJwcDB06FJUrV4arqytq1qyp8yHC1KlT8eOPP2Lz5s2ac+7ZswcAMGHCBNSoUQNubm6oUqUKIiIikJWVVazXikzDQekAiCyFPGHc0KG5SbahypYVn9o/eACEhpY4NCIiIioB7VZ3WXg40K4dsHcv8MUXwNdfKxKaTfOY5VHgfd2qd8OHLT/MU0HXJkHCjZQbaL2iNaKGR2luD10YioT0BN19p+RN9A2xfft2vPnmm1i0aBHatGmDmJgYvPPOOwCAKVOmYP369Zg/fz5++eUXPPPMM7h9+zZOnjwJANiwYQMaNGiAd955B2+//bZB53///fcxY8YMbN68GR999BHUajWCg4Oxbt06+Pr64tChQ3jnnXcQGBiI3r17Y/z48YiOjkZycjJWrFgBAChXrhwA8SFAZGQkgoKCcPr0abz99tvw9PTERx99ZIRXikqCSToRgAsXgJ07RRvc8OElP16ZMrlJOhERESkrvyQdENX0Dh2A778HJk4EKlQwf2xUsPiUeL32y8zJNHEkuT777DN8/PHHGDhwIACgSpUqmDFjBj766CNMmTIFcXFxCAgIQKdOneDo6IiQkBA0a9YMgEiO7e3tNRVyQ5QrVw7+/v64evUqAMDR0RHTpk3T3F+5cmUcOnQI69atQ+/eveHh4QFXV1dkZGTkOeekSZM026GhoRg3bhzWrl3LJN0CMEknArBkibju3h2oXLnkx5NneGe7OxERkbLu3wdOnxbbbdro3hceLm7bvx+YPRtYtMjs4dm01ImpBd5nb2ePIzeO6HWc+Z3n63x99f2rJQmrUP/++y+OHTumMy48JycHjx8/Rnp6Ol577TUsWLAAVapUQZcuXdCtWzf06NEDDg7GS7skSdJplV+6dCl++OEHXLt2DY8ePUJmZibCwsKKPM769euxYMECXL58GampqcjOzoaXl5fR4iTDcUw62bzUVCAyUmyXZMI4bVyGzTo8eABERIhOCiIiKp0OHBDXtWvnrpEuU6lyx6Z/9x1w65Z5Y7N17k7uBV5cHFzQJqQNgr2CoUL+Y7dVUKGiV0V0qtKpyOMai1qtxrRp0xAVFaW5nD59GpcuXYKLiwsqVqyICxcuYPHixXB1dcWIESPQtm1bo431TkxMxL1791D5SVVp3bp1GDNmDIYMGYIdO3YgKioKgwcPRmZm4d0FR44cQd++fdG1a1ds2bIFJ06cwKefflrk48g8WEknm7d6tZiFvVo14LnnjHNMeYZ3VtIt28qVwMyZwLlzwG+/KR0NERGZQkGt7rIOHcSM7wcPimq6mSbuJj3Y29ljYZeFeHXdq1BBpTOBnJy4L+iyAPZ29maLqVGjRrhw4QKqVatW4D6urq548cUX8eKLL2LkyJGoVasWTp8+jUaNGsHJyQk5OYav8b5w4ULY2dlpllTbv38/WrZsiREjRmj2iYmJ0XlMfuc8ePAgKlWqhE8//VRz27Vr1wyOi4yLlXQyu9hYYPlyID1d6UjEMmnyhHEjRgB2RvqNYCXdOly5Iq6P6NdNR0REVqioJP3panq8fsOgyUx61e6F9b3Xo4KX7oQBwV7BWN97PXrV7mXWeCZPnoyVK1di6tSpOHv2LKKjo7F27VrN+O7IyEgsW7YMZ86cwZUrV7Bq1Sq4urqiUqVKAMTY73379uHmzZtISEgo7FRISUnB7du3cf36dezbtw/vvPMOZs6cic8++0zzIUG1atVw/PhxbN++HRcvXkRERASOHTumc5zQ0FCcOnUKFy5cQEJCArKyslCtWjXExcXhl19+QUxMDBYtWoSNGzea4BUjQzBJJ7P74AMxg3rjxsB//ykby4EDYpyaqyswaJDxjstKunWIixPXt24BN28qGwsRERlfSkrue42nx6Nr69QJaNkSePwYmDPHPLGR/nrV7oWr71/F7oG78XOvn7F74G7Evh9r9gQdADp37owtW7Zg586daNq0KZ599ll89dVXmiS8TJky+P7779GqVSvUr18ff//9N/744w/4+PgAEGufX716FVWrVoXf0+MvnjJ58mQEBgaiWrVq6N+/P5KSkvD3339jwoQJmn2GDx+OXr16oU+fPmjevDkSExN1quoA8Pbbb6NmzZpo0qQJ/Pz8cPDgQfTs2RNjxozBqFGjEBYWhkOHDiEiIsLIrxYZSiVJknHWI7ASycnJ8Pb2RlJSEidGUEiDBsCpU2LbwQGYMQP48EPA3nydShp9+gDr1gFvvSVmdjWWr74Cxo0D+vUT7fRkmZo0Af79V2z/9hvQy/z/64mIyIR27AA6dxaTwsrdU0Xt6+Iiuv4MnHybnvL48WPExsaicuXKcCnpGrdEFq6wn/fi5KGspJPZ3bsnrps3B7KzxZInHToA5h4GEx8PbNggto01YZxMrqSz3d2yXb+eu/3PP8rFQUREplFUq7u2554Dnn2W1XQiUp6iSfq+ffvQo0cPBAUFQaVSYdOmTUU+ZvXq1WjQoAHc3NwQGBiIwYMHIzEx0fTBklFIEiAPv/n1V2DFCsDDQ/wTrV9fVJ3N1dvx3XfiQ4JWrQA9VqkoFi7BZvkePwbu3s39mkk6EVHpU5wkXXts+tKlwJ07pouLiKgwiibpaWlpaNCgAb7++mu99j9w4AAGDBiAoUOH4uzZs/j1119x7NgxvPXWWyaOlIwlKQmQV6Dw8xPjwKOigBYtxAzrb74pWsRNXYHOygK+/VZsG7uKDnDiOGtw44bu18ePAyWYbJWIiCzM48fA0aNiW58kHRDt7s2aAY8eAV9+abrYiIgKo2iS3rVrV8ycORO99BwIeuTIEYSGhmL06NGoXLkyWrdujWHDhuH48eMmjpSMRW519/AQY74AoGpV8Un39OliXPovv4hx67t3my6OTZtEu3v58sArrxj/+Jw4zvLJre5VqwLu7mJyofPnlY2JiIiM559/gMxMIDBQ/K3Xh0oFTJ0qtpcs0e24IiIyF6sak96yZUvcuHEDf/75JyRJwp07d7B+/Xq88MILBT4mIyMDycnJOhdSjpykPz2ZpYMDEBEh1iitVk0kUB07Ah99BGRkGD8Oedm1t98GnJyMf3xW0i2fnKSHhoqVBgC2vBMRlSbare4qlf6P69IFaNpUVNPnzjVNbEREhbG6JH316tXo06cPnJycEBAQgDJlyuD//u//CnzMrFmz4O3trblUrFjRjBHT0wpK0mXNmwMnTojkWZJEq1nz5sDZs8aL4fRpYO9eUbUfNsx4x9UmV9IzMkS7HVkeOUkPCRE/YwCTdCKi0qQ449G1aY9NX7w4970LEZG5WFWSfu7cOYwePRqTJ0/Gv//+i23btiE2NhbDhw8v8DETJ05EUlKS5nJdezpnMruiknRAtMJ/951oSff1BU6eFJXORYsAtbrkMSxZIq5fegkIDi758fLj6QnYPfntYjXdMslrpFesKMYfArljF4mIyLplZQGHDont4ibpANCtm1imMz2d1XQiMj+rStJnzZqFVq1a4cMPP0T9+vXRuXNnLFmyBMuXL0d8fHy+j3F2doaXl5fOhZQjJ+m+vkXv27OnqHp37Soq0u+/L/5pFvCt1ktSErBqldg2xYRxMjs7wNtbbHNcumWSP6/TTtJPnRLtjUREZN1OnADS0oBy5YA6dYr/eJUKmDxZbC9enLsyDRGROVhVkp6eng47O92Q7e3tAQCSudbtohLRp5KuLSAA2LpV/IN0cQG2bwfq1QM2bjTs/CtXin/adeoA4eGGHUNfHJdu2bST9IoVxSSCOTnijR0REVk3udW9devczrbi6t4daNRIvG+YN894sRERFUXRJD01NRVRUVGIiooCAMTGxiIqKgpxT/pQJ06ciAEDBmj279GjBzZs2IBvvvkGV65cwcGDBzF69Gg0a9YMQUFBSjwFKqbiJumA+DR7xAjgv/+Ahg2BxESgVy9g6FAxI7e+JCl3wrgRI4o3iYwh5HHpTNItk/aYdJWK49KJiEoTQ8eja9Mem/711+L9B5Etadu2LX7++WdFY4iMjEQZ+U21wsaPH4/Ro0eb5VyKJunHjx9Hw4YN0bBhQwDA2LFj0bBhQ0x+0l8UHx+vSdgBYNCgQfjqq6/w9ddfo27dunjttddQs2ZNbNiwQZH4qfgMSdJltWsDR44AH38s/nEuXy6S9iNH9Hv8338DFy6IMe/9+xf//MUlV9LZ7m55kpPF0AdAVNEBjksnIiot1Gpg/36xXZIkHQB69BDvNVJTga++KnlsZICpU4EZM/K/b8aM3DXzjGzQoEFQqVR5LpcvXzbJ+cyhOAnvli1bcPv2bfTt21dzW2hoqOZ1cHNzQ926dfHtt9/qff6pU6ciLCysmFEXTjum/C7hT1pnT5w4ge7du8Pf3x8uLi4IDQ1Fnz59kJCQgKlTpxZ6DJVKhatXr+Kjjz7CihUrEBsba9TnkB9Fk/Tw8HBIkpTnEhkZCUD8IO3Zs0fnMe+99x7Onj2L9PR03Lp1Cz/99BMqVKhg/uDJICVJ0gGxXNqsWWIN9ZAQICZGtLJNnQpkZxf+WLmKPnAgYI6pCdjubrnkKnqZMuJDGyA3SWclnYjIup05Iz4gd3cXCXZJaI9NX7SI1XRF2NuLb8LTifqMGeL2J0NfTaFLly6Ij4/XuVSuXNmgY2VmZho5OtNatGgRBg8enGeo8fTp0xEfH49Tp07hpZdewvDhw7F27VqFogSOHTum+d789ttvAIALFy5obtuwYQPu3r2LTp06wdfXF9u3b0d0dDSWL1+OwMBApKenY/z48Trf4+DgYM3zlC8VK1aEv78/nn/+eSxdutTkz8uqxqST9Stpki5r107M+v7GG2Ic8bRpIlkv6MPNuDjg99/F9ogRJTu3vuQPKllJtzza49FlTZuK6ytXOEEQEZE1k1vdW7UCHBxKfryePYEGDUQ1ff78kh+PtKSlFXyR17CNiACmTxcJeUSEuC8iQnw9aRIwdmzeWV/zO54BnJ2dERAQoHOR58Pau3cvmjVrBmdnZwQGBuLjjz9GtlbFKDw8HKNGjcLYsWPh6+uL5557DoBYrapbt27w8PBA+fLl0b9/fyRovfFQq9WYPXs2qlWrBmdnZ4SEhOCzzz7T3D9hwgTUqFEDbm5uqFKlCiIiIpCVlaW5/+TJk2jfvj08PT3h5eWFxo0b4/jx49izZw8GDx6MpKQkTXV4agFdCAkJCfjrr7/w4osv5rnP09MTAQEBqFatGmbOnInq1atj06ZNRcYWGRmJadOm4eTJk5rzy4XZhw8f4p133kH58uXh4uKCunXrYsuWLTrn3b59O2rXrg0PDw/NhycA4Ofnp/nelCtXDgDg7++vc9uhQ4eQnJyMH374AQ0bNkTlypXRoUMHLFiwACEhIfDw8MjzPZaf59Pf9xdffBFr1qwp/AfHCJikk9lIkvGSdEAkwT/9BPz8s5hJ/ehRICwM+OEHcS5t334r2t/atzdslldDsJJuubTHo8vKlAFq1hTbx46ZPSQiIjISY4xH1/Z0Nf3+feMclyDa2Qq6vPJK7n4REYCjIzBzprhv5kxxu/x11666xw0NzXs8I7p58ya6deuGpk2b4uTJk/jmm2+wbNkyzJTjeuLHH3+Eg4MDDh48iG+//Rbx8fFo164dwsLCcPz4cWzbtg137txB7969NY+ZOHEiZs+ejYiICJw7dw4///wzypcvr7nf09MTkZGROHfuHBYuXIjvv/8e87U+PXrjjTcQHByMY8eO4d9//8XHH38MR0dHtGzZEgsWLICXl5emOjx+/Ph8n9+BAwfg5uaG2rVrF/lauLi4aBLxwmLr06cPxo0bh2eeeUZz/j59+kCtVqNr1644dOgQfvrpJ5w7dw5ffPGFJikGxOThc+fOxapVq7Bv3z7ExcUVGHt+AgICkJ2djY0bN5Z4svFmzZrh+vXruHbtWomOUyTJxiQlJUkApKSkJKVDsTkpKZIk0mdJSk427rGvXZOk8PDc47/0kiTduyfue/xYkvz8xO3r1xv3vIX57DNxziFDzHdO0s+kSeJ7M3y47u39+4vbp0xRJCwiIiohtVqSypcXf8v37TPecXNyJKl+fXHciAjjHdcWPHr0SDp37pz06NGjvHfKb9zyu3Trpruvm1vB+7Zrp7uvr2/efYpp4MCBkr29veTu7q65vPrqq5IkSdInn3wi1axZU1Kr1Zr9Fy9eLHl4eEg5OTmSJElSu3btpLCwMJ1jRkRESM8//7zObdevX5cASBcuXJCSk5MlZ2dn6fvvv9c7zjlz5kiNGzfWfO3p6SlFRkbmu++KFSskb2/vIo85f/58qUqVKnlur1SpkjR//nxJkiQpKytLWrFihQRAWrJkiV6xTZkyRWrQoIHOPtu3b5fs7OykCxcuFBgzAOny5cua2xYvXiyVL18+z767d++WAEgPHjzIc98nn3wiOTg4SOXKlZO6dOkizZkzR7p9+3a+59R+nk+Tc8k9e/bke39hP+/FyUNZSSezkavozs5G/0ATISHAX38Bc+aID1o3bRJLtW3bBqxfL85doYJoWTMXVtItV37t7gDHpRMRWbtLl4A7d8R7DXkYkzHY2eVW0xcu5P92o0lNLfjyZHyxxtix4trJSVxPmpS77//+p7vv1at5j2eA9u3ba1aiioqKwqJFiwAA0dHRaNGiBVRaSwW1atUKqampuHHjhua2Jk2a6Bzv33//xe7du+Hh4aG51KpVCwAQExOD6OhoZGRkoGPHjgXGtH79erRu3RoBAQHw8PBARESEzkTbY8eOxVtvvYVOnTrhiy++QExMTLGf96NHj+Di4pLvfRMmTICHhwdcXV0xcuRIfPjhhxg2bJheseUnKioKwcHBqFGjRoH7uLm5oWrVqpqvAwMDcffu3WI9p88++wy3b9/G0qVLUadOHSxduhS1atXC6dOni3UcV1dXAKK6b0pM0sls5OE2fn6mWf7M3h748EORYNWpA9y+Lbqf5JUShg83ztg0fXFMuuUqKEnXXoathN1QRESkALnVvXlzoIAcw2AvvwzUrStWCFm40LjHtlnu7gVftL+BM2aI1vbp04GMDHE9c6aYct/dHXiSOBV6XIPCc0e1atU0l8DAQACAJEk6Cbp8GwCd292fOq9arUaPHj10Ev+oqChcunQJbdu21SSABTly5Aj69u2Lrl27YsuWLThx4gQ+/fRTnUnppk6dirNnz+KFF17Arl27UKdOHWzcuLFYz9vX1xcPCvgk6sMPP0RUVBSuXbuG1NRUzJkzB3Z2dnrFlp+injMAODo66nytUqkMalv38fHBa6+9hnnz5iE6OhpBQUGYO3dusY5x/8l4Fz9jjN0tBJN0MhtjjkcvTFgYcPw48N574uv790V1/e23TXvep7GSbrnyG5MOAPXriw/oExMBM6yuQURERmbs8ejatKvpCxbwQ3izkWdxnz5djE0HdCeTK2h5NhOqU6cODh06pJMoHjp0CJ6enoWuOtWoUSOcPXsWoaGhOsl/tWrV4O7ujurVq8PV1RV///13vo8/ePAgKlWqhE8//RRNmjRB9erV8x0bXaNGDYwZMwY7duxAr169sGLFCgCAk5MTcnJyinx+DRs2xO3bt/NN1H19fVGtWjUEBQXpfCChT2z5nb9+/fq4ceMGLl68WGRcxuTk5ISqVasirZiTCp45cwaOjo545plnTBSZwCSdzMZcSTogPlBdtEh0PzVpIpZo05pzwyzkSjqTdMsiSQVX0p2dxYc8ANdLJyKyRqZM0gExl9kzzwBJSaymm01Ojm6CLpMTdT2STmMbMWIErl+/jvfeew/nz5/H5s2bMWXKFIwdOzbPkmXaRo4cifv37+P111/HP//8gytXrmDHjh0YMmQIcnJy4OLiggkTJuCjjz7CypUrERMTgyNHjmDZsmUAgGrVqiEuLg6//PILYmJisGjRIp0q+aNHjzBq1Cjs2bMH165dw8GDB3Hs2DHNBHChoaFITU3F33//jYSEhAJbths2bAg/Pz8cPHhQ79ekqNjk88fGxiIqKgoJCQnIyMhAu3bt0LZtW7zyyivYuXMnYmNj8b///Q/btm3T+9xF2bJlC958801s2bIFFy9exIULFzB37lz8+eef6FnMsbD79+9HmzZt9OoAKAkm6WQ25kzSZV26iJm6P/nEfOeUyZV0ftJuWRIScld1ye/Dbo5LJyKyTteuiYu9PdCihWnOYWeXmysuWCCSdTKxqVPzJuiyiAhxv5lVqFABf/75J/755x80aNAAw4cPx9ChQzFp0qRCHxcUFISDBw8iJycHnTt3Rt26dfH+++/D29tbk9xHRERg3LhxmDx5MmrXro0+ffpoxl/37NkTY8aMwahRoxAWFoZDhw4hQuu1sbe3R2JiIgYMGIAaNWqgd+/e6Nq1K6ZNmwYAaNmyJYYPH44+ffrAz88Pc+bMyTdOe3t7DBkyBKtXr9b7NSkqNgB45ZVX0KVLF7Rv3x5+fn6apcx+++03NG3aFK+//jrq1KmDjz76SK+Kv77q1KkDNzc3jBs3DmFhYXj22Wexbt06/PDDD+jfv3+xjrVmzRq8bYb2XJVkSEO/FUtOToa3tzeSkpLg5eWldDg2ZcIEMbHbBx/Yxjqjd+/mVu+zs8WbBlLef/8BjRuL783t23nv/+knoH9/oGVLoBgfIBMRkcLkv9/Nmpm2GyonRwyPOncu/wIv6Xr8+DFiY2NRuXLlAicjI8tz584dPPPMM/j3339RqVIlpcOxCFu3bsWHH36IU6dOwaGAia4K+3kvTh7KSjqZjRKVdCXJ7e6AmGSGLENB49FlciX9v/+AJ8t+EhGRFTB1q7vM3j43MZ8/n9V0Kp3Kly+PZcuWFTk7uy1JS0vDihUrCkzQjYlJOpmNrSXpTk6Am5vY5rh0y1HQeHRZtWriA5bHj4FirspBREQKMleSDgCvvQbUqiX+v//f/5n+fERK6NmzJ9q0aaN0GBajd+/eaC4vBWRiTNLJbGwtSQe4DJslkj8QLihJt7PLXVuX49KJiKzDnTvAhQtiidfWrU1/Pu1q+ldfsWOOiIyLSTqZjS0m6VyGzfIUVUkHdNdLJyIiy7d/v7iuVy/3f6+p9ekD1Kwp/sd//bV5zklEtoFJOpmNLSbpXIbN8hQ1Jh3gDO9ERNbGnK3uMu1q+rx5QEqK+c5tjWxsrmqyUcb6OWeSTmaRkZH7z8vXV9lYzInLsFkefSrpcrv7uXNsYSQisgZKJOkA0LcvUKMGcP8+sHixec9tLRwdHQGgwDW5iUqTzMxMAGIZu5Iw/dR0RMitotvb6856Xtqx3d2y5OQAN2+K7cKS9IAAUWmPiwP+/Rdo39488RERUfE9eACcOiW2zT3Hlb09MGkSMGAAMHcuMGoU4OFh3hgsnb29PcqUKaNZ69vNzQ0qlUrhqIiMT61W4969e3BzcyvxDPBM0sks5CTd11dMzGUrOHGcZYmPF4m6g4NIxAvTvLlI0v/5h0k6EZElO3gQkCRR0S7qb7spvP66WC/98mVRTZ8wwfwxWLqAJ98YOVEvlpwMIDsFcCoLqEpWnSQyNTs7O4SEhJT4gygm6WQWtjgeHWAl3dLIre5BQaL6UZhmzYBffwWOHjV9XEREZDilWt1lDg6imj5okKimjxzJavrTVCoVAgMD4e/vj6ysrOI9+Ngo4M5fQNW3gdrjTBMgkZE4OTnBzggVSSbpZBa2mqSzkm5Z9Jk0TsbJ44iIrIPSSToAvPEGMGMGEBMDfPMN8OGHysViyezt7Ys/VjfpEJB5Dbj7O9DwU9MERmRhbKjxmJRkq0k6K+mWpag10rU1biyGZty8mTuOnYiILEtqqpg7BFA2SZer6QDw5ZdAWppysZQq6hwg9bLYvv8vkMXZXMk2MEkns7DVJJ2VdMuiz8zuMnd3oG5dsX3smOliIiIiwx05AmRniw6pSpWUjeXNN4EqVcR7nqVLlY2l1Ei/BqiftMdLOcDdA8rGQ2QmTNLJLGw1SWcl3bIUJ0kHclveOS6diMgyWUKru8zBAfj0STf2nDkAVxwzguQLul/f3aNIGETmxiSdzMJWk3S5ks4k3TIUZ0w6wHHpRESWzpKSdADo3x+oXBm4e5fVdKNIviiu7V3E9Z3dysVCZEZM0sksEhLEta0l6XIl/eFDsTwMKas4Y9IBsQwbINrd1WrTxERERIbJyBDt7oDlJOmOjsAnn4htVtONIOVJkh7SW1w/+A/ITFIuHiIzYZJOZmGrlXQ5Sc/MBB49UjYWW5eRISobgP5Jep06gJsbkJICXLhQ9P5ERGQ+x46Jv+3+/mKNdEsxYAAQGgrcuQN8953S0Vg5OUkv3x7wrA5IauDefmVjIouSo87Bnqt7sOb0Guy5ugc56hylQzIKJulkFraapHt45K7HzcnjlHXjhrh2cQF8fPR7jIODmOUd4Lh0IiJLo93qrlIpG4s2J6fcavrs2fyQvkTkdnfPGoB/uNhmyzs9sSF6A0IXhqL9j+3Rb0M/tP+xPUIXhmJD9AalQysxJulkctnZwP37YtvWknSViuPSLYX2ePTivJnjuHQiIstkaePRtQ0cKP7f3L7NarrBsh8B6U/GqXnWENV0gEk6ARAJ+qvrXsWN5Bs6t99MvolX171q9Yk6k3QyucREca1S6V/BLE24DJtlKO54dJk8Lp1JOhGR5cjOBg4eFNuWmKRrV9PnzAGyspSNxyrJ66M7lQWcfYDy4eLrB1FAJisftixHnYP3t70PCXknfJJv+2DbB1bd+s4knUxObnUvVy639duWcBk2y1Dc5ddkciX95Eng8WPjxkRERIaJigJSU8UH4XXrKh1N/gYPFuPlb90CtmxROhorJC+/5llDVHpcAwGvmgAk4O4+RUMjZe2P25+ngq5NgoTrydexP8565y9gkk4mZ6vj0WWspFsGQ5P0kBDxJis7GzhxwvhxERFR8cmt7q1bW24BwMlJJOoA8O23ysZileRJ47xq5t7mz5Z3AuJT4o26nyVikk4mZ+tJOivplqG4a6TLVCqOSycisjSWPB5d2zvviOvt24ErV5SNxepoTxon04xL32P2cMhyBHoGGnU/S8QknUyOSbq4ZpKuLEPHpAMcl05EZEnUauDAAbFt6Ul6lSrA88+L7e+/VzYWq6OppGsl6f7txPXDk0BGovljIovQJqQNgr2CoUL+MwGroEJFr4poE9LGzJEZD5N0MjlbT9LZ7m4ZDG13B1hJJyKyJNHRYlJaNzegUSOloynasGHievlyIDNT2VisSko+lXTX8oB3HbF9d6/5YyKLYG9nj4VdFgJAnkRd/npBlwWwt7PQsTB6YJJOJicn6b6+ysahFFbSlZeSAiQliW1DkvQmTcT15cu5qxUQEZEy5Fb3li0BR0dlY9FHjx5AQABw9y6webPS0ViJjMTcSrlnNd37NOul7zFnRGRhetXuhfW918PXTTfBCPYKxvre69Grdi+FIjMOJulkcqyki2tW0pUjV9HLlAE8PYv/+HLlgOrVxfaxY0YLi4iIDGAt49Fljo7A0KFimxPI6Snlkrh2CwYc3HXv43rp9ESv2r1QrZz4EGdU01HYPXA3Yt+PtfoEHWCSTmZg60k6K+nKK0mru4zj0omIlCdJ1pekA8Dbb4uJSP/+G7h0SelorID28mtPk8elJ50BHt8zX0xkcSRJwvmE8wCAoY2GIjw03Kpb3LUxSSeTs/UknZV05ZVk0jgZx6UTESnvyhWx7riTU+7fZWtQqRLQtavY/u47ZWOxCvktvyZz8QO864ptjku3aXfT7uLB4wdQQYWaPvn8rFgxJulkcraepLOSrjxjVNLlN4NHj4pKDhERmZ9cRW/WDHB1VTaW4pInkIuMBDIyFA3F8uW3/Jo2trwTgOiEaABAaJlQuDpa2R+EIjBJJ5NSq3Mn2rLVJF2upDNJV46ha6RrCwsT4woTEoCrV40RFRERFZc1trrLunUDKlQQ/0c2bFA6GguX38zu2uQk/e4es4RDlin6nkjSa/vVVjgS42OSTib14AGQkyO2bX1295QUIDtb2VhslTEq6c7OIlEH2PJORKQUa07SHRyAt94S25xArhCSOnfiOK8CknT/tgBUQNI54NEds4VGlkWupNf2ZZJOVCxyq7uXl0hybJFcSQdylwEj8zLGmHRAt+WdiIjM68YNMSbdzk4sv2aN3npLxL93r1jvnfKRfhPIeQSoHAD30Pz3cfYBytQX26ym2ywm6UQGSkgQ17ba6g6IFmn3J6uHcPI485Mk41TSAU4eR0SkpP37xXWjRoYtp2kJgoOB7t3FNieQK4Cm1b0qYOdQ8H6acel7TB4SWaYp7aZgYZeFaBfaTulQjI5JOpmUrU8aJ+PkccpJTAQePxbbwcElO5a8DNt//wFZWSU7FhERFY81t7prkyeQ+/FH4NEjZWOxSIUtv6atfLi4vsvJ42xV65DWGN18tGat9NKESTqZFJN0gcuwKUeuopcvX/IhF9WrA97e4k3V2bMlj42IiPRXWpL0zp3FRKYPHgDr1ysdjQUqatI4mTwuPfkCkH7L5GERmROTdDIpJukCK+nKMdZ4dECMI2zaVGxzXDoRkfncuwecOye2W7dWNpaSsrcH3n5bbHMCuXwkF7JGujanskDZhmKb66XbnBPxJ/DTqZ9wIeGC0qGYBJN0Mikm6QIr6cox1nh0GcelExGZ34ED4rpuXcDHR9lYjGHIEJGsHzwInDmjdDQWRt9KOpDb8s710m3OurPr0H9jfyw8ulDpUEyCSTqZFJN0gZV05Rg7SZfHpTNJJyIyn9LS6i4LCgJefFFss5quJScTSIsV2wUtv6ZNM3kck3RbU5pndgcUTtL37duHHj16ICgoCCqVCps2bSryMRkZGfj0009RqVIlODs7o2rVqli+fLnpgyWDMEkX5Eo6k3Tzk5P0kBDjHE9udz97FkhJMc4xiYiocKUtSQeA4cPF9apVQHq6srFYjNQrYp10Bw/AJaDo/f3aACo7IPUykH7D9PGRxdAk6X5M0o0uLS0NDRo0wNdff633Y3r37o2///4by5Ytw4ULF7BmzRrUqlXLhFFSSTBJF+RKOtvdzc+YY9IBIDBQHEuSgH//Nc4xiYioYElJQFSU2G7TRtFQjKpTJ6BKFfH81q5VOhoLod3qrlIVvb+TN1C2kdjmUmw2IzMnEzH3YwCU3kp6IYsPml7Xrl3RtWtXvffftm0b9u7diytXrqBcuXIAgNDQUBNFR8bAJF1gu7tyjN3uDohx6devi5b38HDjHZeIiPI6dAhQq4Fq1USbeGlhZycmkJs4UbS8Dx6sdEQWQF5+TZ9Wd1n59sD946LlvfKbpomLLMqlxEvIkXLg6eSJIM9S9EdBi1WNSf/999/RpEkTzJkzBxUqVECNGjUwfvx4PCpkkcmMjAwkJyfrXMg8JIlJuowTxykjJwe4eVNsGzNJ57h0MoV794C5c4G7d5WOhMiylMZWd9ngwYCDg1gxRO4WsGnFmTRO5h8uru/uMXY0ZKG0W91V+nRcWCGrStKvXLmCAwcO4MyZM9i4cSMWLFiA9evXY+TIkQU+ZtasWfD29tZcKhrznToVKiUFyMwU27aepLOSrozbt0Wibm8v2tSNhTO8kyksXAh8+CEwb57SkRBZltKcpJcvD7z8stjmBHLITdKLWn5Nm38bQGUvxrOnxZkmLrIo0fdEkl7Lt/QOebaqJF2tVkOlUmH16tVo1qwZunXrhq+++gqRkZEFVtMnTpyIpKQkzeW63PtKJidX0V1dATc3ZWNRGivpypDHo1eoIBJ1Y2ncWLQpXr8OxMcb77hk265cEddcjokoV3o6cOyY2C6NSTqQO4Hc6tVAaqqysSgu2YBKuqMnUK6J2Oa4dJvwduO3sbXfVoxsWnCh1tpZVZIeGBiIChUqwNvbW3Nb7dq1IUkSbtzIf0ZHZ2dneHl56VzIPNjqnouVdGWYYjw6AHh4AHXqiG1W08lY5A98LlxQNg4iS3L0KJCVBQQHA6V1GqL27YHq1UUH4po1SkejoKxk4PFtse1ZvXiPlddLv8ul2GxBgEcAulXvhmYVmikdislYVZLeqlUr3Lp1C6laHzNevHgRdnZ2CA4OVjAyyg+T9FzalXRJUjIS22KqJB3guHQyPjlJj43NHSpEZOu0W91L6dBTqFTAO++IbZtueU+5JK5dyotZ24vDn+ulU+miaJKempqKqKgoRD2ZKSM2NhZRUVGIe9KjOnHiRAwYMECzf79+/eDj44PBgwfj3Llz2LdvHz788EMMGTIErq6uSjwFKgST9FxyJT0ri2uhmpOx10jXxnHpZGy3bolrtRqIiVE2FiJLUZrHo2sbNAhwchJLex4/rnQ0CjGk1V3m1wpQOQBp14DUq0YNiyzL7dTbmLZnGjZGb1Q6FJNSNEk/fvw4GjZsiIYNGwIAxo4di4YNG2Ly5MkAgPj4eE3CDgAeHh7YuXMnHj58iCZNmuCNN95Ajx49sGjRIkXip8IxSc/l7i5mbwXY8m5OpqykayfparXxj0+2JS1NtLrKLl5ULhYiS5GZCRw+LLZLe5Lu6wu88orYttlqumbSOAOSdEcPwKep2GY1vVQ7EX8CU/dORcTuCKVDMSlF10kPDw+HVEjvb2RkZJ7batWqhZ07d5owKjIWJum5VCrR8p6QIFreOTrDPOTP+EyRpNetKyZFTE4WCVWt0jvBKJnB0xMQclw6kagqP3okElhb+Bs7fLgYk75mjVjlweamUZLXSDekkg6I9dITDoskvSoXnS+ttJdfK82sakw6WRcm6bo4eZz5mbKS7uAgZnkH2PJOJSe3ustYSSeyjfHo2tq0AWrXFp01q1crHY0CDFl+TVv5J+PS7+7hBEClmLz8Wm1fJulEBmGSrovLsJlXRgZw547YNsWYdCC35f3oUdMcn2wHK+lEednKeHTZ0xPI2VSeKUklG5MOAL4tATtHIP26WDOdSiVNJZ1JOpFhEhLENZN0gZV087p5U1y7uAA+PqY5ByePI2ORk/Rq1cQ1K+lk63JygAMHxLatJOkAMGAA4OwMnDxpY/9bHt8BslMAlR3gUcWwYzi4AT5Pll7huPRSSZIktrsTlRQr6bpYSTcv7fHopmqTlJdhO3kSePzYNOcg2yC3u7drJ67v3uXfCrJtp06JOT+8vID69ZWOxnzKlQN69xbbS5cqG4tZya3u7qGAvbPhx9FueadS5176Pdx/dB8qqFDDx8COCyvBJJ1Mhkm6LlbSzcuU49FllSqJn++sLJGoExlKrqTXrAkEBoptVtPJlsmt7q1bA/b2ysZibsOGieu1a23ow7qStrrL/MPF9Z3dNjZewDbI49ErlakEN0c3haMxLSbpZBKPHomJTwAm6TK5ks4k3TxMuUa6TKXiuHQyDjlJDwwEajx5j8px6WTLbG08uraWLcUKIo8eAatWKR2NmaQYKUn3bQHYOQGPbgEpl0oeF1mUlhVbInpkNFb3Kv0zKzJJJ5OQq+iOjja4hEgB5Eq6zXwqrjBzVNIBjksn45Db3QMDRTUdYCWdbJck2XaSrlLlVtNtZgI5efk1Q9ZI1+bgCvg+K7bZ8l7qONo7opZvLbSs2FLpUEyOSTqZhHaruy0sm6IPtrublynXSNcmj0tnkk4lIVfSg4JYSSc6f15MPuvqmrvUpa15803x/M+eBQ4dUjoaMzBWJR0A/J+MS+fkcWTFmKSTSXA8el6cOM68zFVJb9pUXF+6BNy/b9pzUen06FHu3wVW0olyq+gtWgBOTsrGopQyZYC+fcV2qZ9ATp0NpMaIbUPXSNcmTx53Z4+NtCHYjvf/9z4+3/857j8q/W+4mKSTSTBJz4uVdPMyx5h0QMzEKy+bdeyYac9FpZNcRXdxAby9cyvpFy8CarVycREpxZZb3bXJLe+//gokJiobi0mlXQPUWYC9C+AWXPLj+TYH7JyBx7dz2+jJ6qVmpmLRP4vw6a5PlQ7FLJikk0kwSc+LlXTzSUnJfZ1NXUkHOC6dSka71V2lAipXBhwcRIX95k1lYyMyN0kC9u4V27aepDdrBoSFARkZwMqVSkdjQppW9+pinfSSsncB/J6MWb7LlvfS4nzCeQCAv7s/yrmWUzga02OSTibBJD0vVtLNR66ie3sDnp6mPx/HpVNJaE8aB4gJN6tUEdscl0625upV8eGUo2Pu31ZbZTMTyBlr+TVt/lot71QqyMuv1fatrXAk5sEknUyCSXpeciU9NRXIzlY0lFLPXOPRZdqV9FL7JopMRnv5NZk8Lp1JOtkaudW9aVPArXQvg6yXfv0Ad3fxt0B+bUodY04aJysfLq7v7uE/5lIiOoFJOlGJyUm6r6+ycVgSOUkH2PJuauZO0sPCRHvy3bvAtWvmOSeVHtrt7jLtcelEtoTj0XV5eYlEHRDV9FLJWMuvafNpBti7Ao/vAknnjHdcUowmSfdjkk5kMFbS83JwADw8xDZb3k3LXJPGyVxcgAYNxDZb3qm4nm53B1hJJ9vFJD0vueV9/frc91eliikq6fbOgF8rsc310ksFud29lm8thSMxDybpZBJM0vMnj0tnJd20zLVGujaOSydD5dfuzko62aJbt4DLl8VY7JYtlY7GcjRuDDRpAmRlAZGRSkdjZNnpQPqTT9aNsfyaNv9wcc310q1etjobVx9eBcB2d6ISYZKeP04eZx7mbncHOMM7GS6/dne5kn71KvD4sdlDIlLE/v3iOixMTPxJueRq+nfflbKlGVMui2uncoCzj3GPLa+XfncPIJWmF832ONg54OHHD3Fq+CkEexlhmT4rwCSdjC4zE0hKEttM0nVxGTbzUDJJ//dfTgxIxZNfu3v58mJlAkkCYmKUiYvI3NjqXrC+fcXfhMuXgd2lqTBsilZ3mU9TwN4NyEgEks4a//hkVi4OLqhXvh5UKpXSoZgFk3QyuoQEcW1nB5Qr/csYFgsr6aYnSeYfkw6IyqeXF5CeDpzlewHSU0YGcP++2NZO0lUqjksn28MkvWAeHsCbb4rtUjWBnJykG3PSOJmdI+DXWmyz5Z2sDJN0Mjq51d3HRyTqlIuVdNNLTAQePRLbwWbsiLKzE0sGAWx5J/3dvi2unZzyfqjJcelkSxITgTNnxHabNsrGYqnklveNG3P/dlg9U6yRrk1ueWeSbtVm7J2BoZuH4uiNo0qHYjZMocjo5Eo6W93zYiXd9OQqur8/4Oxs3nNzXDoVl3ar+9MdfKykky05cEBc167N9w8FadBATFKanQ2sWKF0NEZiiuXXtGnWS9/LcelWbNOFTVgetRzxqfFKh2I2TNLJ6DhpXMFYSTc9Jcajy+Qk/ajtfNBLJZTfzO4yVtLJlrDVXT/Dh4vr778vJRPImXJMOgCUaww4eACZD4CHp0xzDjIptaTG+YTzAGxnZneASTqZAJP0grGSbnpKjEeXycuwnT0LpKaa//xkffKb2V3GSjrZEibp+undW8x8HxsL7NypdDQllJEIZD6ZlMOzumnOYecI+D0ZP3Fnj2nOQSZ1Pek60rPS4WjniKrlqiodjtkwSSejY5JeMCbppqdkJT0wUIyDV6uB//4z//nJ+uQ3s7us+pP3rImJ4kJUWqWk5P7N5Hj0wrm5AQMGiG2rn0BOHo/uVhFwcDPdeeSWd45Lt0rRCdEAgOo+1eFg56BwNOZjO8+UzIZJesHY7m56cXHiWokkHRAt7zduiJZ3VoSoKIW1u3t4ABUqADdvipb3Fi3MGxvZrnv3gE6dxAfKFSqITg/ta+1tT8+Sn+/QIfHhZuXKyv3ttibDhgH/93/A77+LD/ry68SxCqZudZdp1kvfC6hzADt7056PjCr6nkjSbanVHWCSTibAJL1grKSbnpKVdEAk6Rs2cPI40k9h7e6AaHlnkk7m9sMPwKknw3flv6kF8fQsPIkPChIfQjk6FnwMtroXzzPPAK1aAQcPAsuWARERSkdkIFMuv6atbEPA0QvISgIengTKNTLt+cio5Ep6Ld9aCkdiXkzSyeiYpBeMlXTTU3JMOpA7Lp1JOumjsHZ3QEwet2sXx6WT+UhS7szhU6YA9euLn9ObN8VF3r51C0hOFq3qFy4U/jOqUokVNwpK5nfsEPsxSdff8OEiSf/+e+CTTwB7aywOm3r5NZmdgxiXfmuraHlnkm5V7j8S8xawkk5UQkzSC6ZdSZekvEsuUcnk5Ig3j4BylfTGjcX3NS5OrGMbEKBMHGQdCmt3B3Inj+MM72QuBw8Cly4B7u7AuHGFt7OnpIhkvaAkXr7Ozgbu3BGXEycKPh6TdP29+irw/vvig+lt24AXXlA6IgOkPPlkx9RJOiBa3uUkvfY405+PjGZ97/VIy0yDysbeNDNJJ6Njkl4wuZKekwOkpYkxp2Q8t2+LN4P29gUnPabm6QnUqSNmeP/nH+DFF5WJgyxfVlbu38uC2t3lZdhYSSdzkavor71W9HhzT0/xQZL8YVJ+1GogIUE3cc9vu21boKrtTNxcYi4uwMCBwPz5YgI5q0vSJTWQcklsm7rdHcgdl35vP6DOFtV1shruTu5Kh2B2/Aklo8rJyZ2FmEl6Xm5uYlxeVpaopjNJNy651T0oSNnWv2bNmKRT0W7fFtcODoCPT/77yMnPpUsi2bHjmixkQqmpwNq1YnvIEOMc085OtLr7+wMNGxrnmCS8845I0rduFf//rGrSvfQbQM5jsUSae6jpz1emAeBYBsh6CDw4Afg0Nf05iUqA/+7JqO7fF23cQMFvOm2ZSpVbTefkccan9Hh0Gcelkz7kVveAgIKT70qVxAd7GRm5KxcQmcqvv4our2rVgNatlY6GilKrFtCunfgA74cflI6mmORJ4zyqmqeqbWcP+D8ZT8Gl2KzGmtNrEB4ZjsX/LFY6FLNjkk5GJbduli1b+Eyutkwel87J44xP6ZndZc2aietjx8SbJ6L8FDWzOyCq7NWqiW2OSydTk1vdBw/mnCnWYvhwcf3DD2K4l9Uw16Rx2uSW9zt7zHdOKpF/bv6Dvdf2IuZBjNKhmB2TdDIqOUn39VU2DkvGZdhMR+k10mV164rxgg8fijZlovwUNbO7jOPSyRwuXQL27xddHQMGKB0N6evll8V7rlu3RNu71TDX8mvayoeL63v7AXWW+c5LBpOXX7O1md0BJulkZJw0rmhchs10LKWS7ugINHqywgtb3qkgRc3sLuMM72QOkZHiunNnIDhY0VCoGJydRecDICaQsxpKVNLL1AecygLZqcD9f813XjKYJkn3Y5JOVCJM0ovGSrrpWMqYdIDj0qlo+rS7A6ykk+nl5OQm6XLCR9bjnXfE9bZtwNWrioaiP3MuvyZT2QH+7cQ2W94tXmpmKuKSRIskK+lEJcQkvWispJuOpVTSgdxx6UzSqSD6truzkk6mtmOH+HksV44rUlijatWAjh3FxL3ff690NHrIyQDSroptc7a7A1rj0jl5nKW7kCA+yPF184WPm+3NRs0knYyKSXrRWEk3jYyM3CWtLClJj4oSsRE9Td92d7mSHhcHPHpk2pjINskTxr3xhmifJuszbJi4Xr5cLPNq0VKviHXSHTwAlwDznluzXvoBICfTvOemYrHl8egAk3QyMibpRWMl3TRu3hTXLi6WMXFh5coijsxM4ORJpaMhS6Rvu7ufn/i7IUnA5csmD4tsTEICsGmT2DbW2uhkfj17AkOHAj//LFaFsGiaSeNqmn8ZAe9nAGcfICcduH/cvOemYsnIzkCgRyCTdCJjYJJeNFbSTUNudQ8Otoylg1QqtrxTwbKzgTt3xHZRlXSViuPSyXR+/llUXhs2BMLClI6GDOXkJJZha9/eMv4HFkqJSeNkKjvAP1xss+Xdog1tNBS3xt3CkheWKB2KIpikk1ElJIhrJukFkyvpTNKNy5ImjZMxSaeC3L0rKuP29vr9veS4dDIV7bXRicwiRcEkHchteb+7R5nzU7HY29krHYIimKSTUbGSXjS5ks52d+OylDXStclJ+tGjysZBlkdudS9fXiTqRWElnUzhxAkxb4aTE9Cvn9LRkM1QYo10bXIl/d5BMYkdkQVikk5GI0mspOuD7e6mYUkzu8vkJP3iRX6/SZe+M7vLWEknU5Cr6C+9BPjY3uTJpJRkBZZf0+ZdB3DxB3IeAYlsdbNEFxIuoOL8inh57ctKh6IYJulkNElJuTOKMkkvGCeOMw1LTNJ9fICqVcX2cc5PQ1r0nTROpl1JlyTTxES25fFj4KefxDZb3clsMpOAx08m5PCsrkwMKpXWuPQ9ysRAhTp37xxuJN/A9aTrSoeiGCbpZDRyq7uHh5hhm/InV9LT0qxgmRQrYolj0gGOS6f86bv8mqz6k/eyDx4AiYmmiYlsy++/i5+nChWA555TOhqyGSmXxLVLecDJW7k4yoeL67ucPM4SnU84DwCo7WebM7sDTNLJiDgeXT/eWv+TWE03Hksckw5wXDrlr7jt7m5uuT/bHJdOxiC3ug8cqN+8CERGob38mpL85fXSDwE5j5WNhfKw9TXSASbpZERM0vVjbw94eYltjlM2jtTU3A88LC1Jb95cXP/zD9uUKVdx290Bjksn47lxA9i+XWyz1Z3MSsnl17R51QRcAgB1BpDAT9EtDZN0JulkREzS9cdx6cYlt7p7eeV+AGIpwsIABwexJvZ12x1aRU8pbrs7wBneyXhWrhQfGrZtC1SrpnQ0ZFOUXn5NplLltrxzvXSLIkmSpt29lm8thaNRjqJJ+r59+9CjRw8EBQVBpVJh06ZNej/24MGDcHBwQFhYmMnio+Jhkq4/zvBuXJY6Hh0AXF2B+vXFNlveSVbcdneAlXQyDkkCli8X26yik9kpvfyaNs166UzSLcmN5BtIzUyFg50DqpWz3U8RFU3S09LS0KBBA3z99dfFelxSUhIGDBiAjh07migyMgSTdP0xSTcuS5zZXRsnjyNtOTmiswIoXrs7K+lkDPv3AzExYpLXV19VOhqyKZKk/PJr2uRx6QlHgOxHysZCGimZKWgd0hrNKzSHo72j0uEoxkHJk3ft2hVdu3Yt9uOGDRuGfv36wd7evljVdzItJun6Y7u7cVnqpHGy5s2BpUuZpJOQkCASdZUK8PfX/3FyJf3yZfF4TvZFhpAnjOvTRyTqRGbz+DaQnQqo7ACPKkpHA3hWA1yDgEe3gITDQEAHpSMiAHX86mD/4P1Kh6E4qxuTvmLFCsTExGDKlCl67Z+RkYHk5GSdC5kGk3T9sZJuXNZSST9+HMjONv35MjKAa9dyfyfJssit7v7+Yr4CfYWEAM7OQGam+P4SFVdKCrBundhmqzuZnTxpnHsoYO+saCgAnoxLf1JN57h0sjCKVtKL69KlS/j444+xf/9+OOj5zmbWrFmYNm2aiSMjIDch8PVVNg5rwEq6cVnymHRAVEA9PcUb5HPncseoF1dGBnD7tkjy4uPFdX7b8jra9vbA2bO5FViyDIbM7A6I72e1auJ7euECUMUCClFkXdatA9LTxdCJli2VjoZsjqVMGqfNPxy4uhq4u0fpSOiJrJwsm25zl1lNkp6Tk4N+/fph2rRpqFFD/1/uiRMnYuzYsZqvk5OTUdFSy21WjpV0/bGSblyWXkm3tweaNAF27xYt708n6fkl3/kl4XLyra+cHGDvXibplsaQmd1lNWqIJP3iRcCA0WJk4+RW98GDRRGRyKwsZY10bXIlPfEokJ0OOLgpGw+h4vyKcHN0w47+O2x64jirSdJTUlJw/PhxnDhxAqNGjQIAqNVqSJIEBwcH7NixAx065B1L4uzsDGdnC2ipKeUkiUl6cbCSbjySZPlj0gExLn33bjE2/eBB3SS8OMm3k5NI7oKCcq+1t+XrmTOBBQuA6GiTPSUykCEzu8vkD1w4eRwV14UL4m+PnR0wYIDS0ZBNspQ10rV5VAHcKgLp14GEQ0BAJ6UjsmmJ6Ym4kyZmVg30MOCfZCliNUm6l5cXTp8+rXPbkiVLsGvXLqxfvx6VK1dWKDICgLQ04PFjsc0kvWispBvP/fvAoyeTsgYHKxtLYZ59Vlz/+6+4PM3RseDEW3u7XDn9KmB16ohrJumWx9B2dyB3hncuw0bFFRkprrt2Nexnj6jELGn5NZlK9aTlfZUYl84kXVHy+ugh3iFwd3JXOBplKZqkp6am4vLly5qvY2NjERUVhXLlyiEkJAQTJ07EzZs3sXLlStjZ2aFu3bo6j/f394eLi0ue28n85Cq6szNni9WHXElnkl5ycqu7vz/g4qJsLIV54QXgk0+ApKT8q98+PsZtP61dW1wzSbc8JWl3ZyWdDJGdDfz4o9jmhHGkCHU2kBojti2pkg6Ilnc5SSdFRSeINy21fWsrHInyFE3Sjx8/jvbt22u+lseODxw4EJGRkYiPj0ec3MdKFk271Z3j3IomV9LZ7l5ylj4eXebgAHz2mfnOJyfpcXFAaio/PLMkxmh3v3FDdDC523ahgfS0fbv4cMjXF+jRQ+loyCalXQXUWYC9C+BmYW1vmnHpx4CsVMCR/zCVEn2PSbpM0SXYwsPDIUlSnkvkk56syMhI7Nmzp8DHT506FVFRUWaJlQqXkCCu2equH7a7G481jEdXgo9P7u8jq66WpSTt7j4+YsgDAFy6ZLyYqHSTJ4x7800xrwWR2WnGo1cX66RbEo9QwL0SIGUD9w4qHY1NkyvptXxrKRyJ8izst4SsFSeNKx7tieMkSclIrJ+1VNKVwJZ3y6NWi5n8AcMq6UBuNZ3j0kkfCQnA77+Lbba6k2Iscfk1bXI1/S5b3pWkaXf3YyWdSToZBZP04pEr6Wq1WDubDGfpa6QriUm65UlMBLKyxHb58oYdQ548jh0SpI/Vq8XPXOPGeZd/JDIbS1x+TZv/kyT9zh5Fw7BlakmN9qHt0axCM7a7w4pmdyfLxiS9eFxcRMthZqaopnt5KR2R9WIlvWBM0i2P3Oru52d42zEr6aQvSQKWLRPbrKKToixx+TVt5cPF9f3jQFYK4OipaDi2yE5lh+U9lysdhsVgJZ2Mgkl68ahUHJduLByTXrBaT4Z0MUm3HCWZ2V3GSjrp67//gNOnxcorr7+udDRk0yy93d09RKyZLuUAd/crHQ0Rk3QyDibpxac9Lp0Mk5MD3Lwptpmk5yVX0i9fzm2xJmWVZGZ3mXYlnXNaUGHkCeNefjl3wkEis8tOB9KftL1Z0hrpT9OMS9+jaBi2KjE9EZk5mUqHYTGYpJNRMEkvPlbSS+7OHbH+r51dyZKe0qpiRbFEV3Y2EBOjdDQElGxmd1nVqqIbJykJuHvXOHFR6fP4sRiPDrDVnRSW8mQpCqdygLOPsrEUxj9cXHO9dEUM2zIMbp+5YfkJtrwDTNLJSJikFx+T9JKTx6NXqCDWISddKhVb3i2NMdrdXV2BSpXENselU0E2bRKdWhUrAh07Kh0N2TRLb3WXyePSH/wHZCYpGootik6IRo6UgyDPEnyKXYowSSejYJJefGx3LzmORy8aJ4+zLMZodwc4Lp2KJre6DxoE2NsrGgrZOnnSOEtudQcAt2DAoxogqYF7ph+XnqPOwZ6re7Dm9BrsuboHOeock5/TUmWrs3EpUXRccGZ3gbUnKrGMjNxlxJik64+V9JLjzO5FY5JuWYzR7g6Icek7drCSTvmLiwN27hTbgwYpGgqR5S+/pq18eyD1smh5r9DdZKfZEL0B7297HzeSb2huC/YKxsIuC9Grdi+TnddSXXlwBVnqLLg5uqGiN9/UAaykkxHIVXQHh9zqMBWNlfSSY5JeNCbploWVdDKHlSvFpILh4UCVKkpHQzbP0pdf01be9Oulb4jegFfXvaqToAPAzeSbeHXdq9gQvcFk57ZU0ffEm5SaPjVhp2J6CpQgSY+JicGkSZPw+uuv4+6TmWu2bduGs2fPGi04sg5yku7rK8bAkn5YSS85OUkPCVE2DksmJ+nnzwNqtbKx2DpJMs6YdIBrpVPB1OrcVndOGEcWwVrGpAO549LTYoHsR0Y/fI46B+9vex8S8i7NId/2wbYPbK71PTpBJOm1/djqLjMoSd+7dy/q1auHo0ePYsOGDUhNTQUAnDp1ClOmTDFqgGT5OB7dMKyklxwr6UWrWlV0uaSlATduFL0/mc6DB0Dmk9VljFVJj4kRs/cTyfbtA65cATw9gVdeUToasnkZiUDmfbHtWU3ZWPThGgh0PQn0ugc4uBr98Pvj9uepoGuTIOF68nXsj7Ottdo1STrHo2sYlKR//PHHmDlzJnbu3AknJyfN7e3bt8fhw4eNFhxZB+1KOumPlfSS48RxRXN0BKpXF9tseVeW3Operhzg7FyyY1WsCLi4AFlZwNWrJQ6NShG5it63r1iCkUhRyU/G5LhVBBzclI1FX2XrA3ammW0xPiXeqPuVFu1D26NfvX5oWbGl0qFYDIOS9NOnT+Pll1/Oc7ufnx8SExNLHBRZF1bSDcNKeslkZop10gEm6UXhuHTLYKxWdwCws8v98IXj0kmWnAz8+qvYZqs7WQRranU3g0BP/f4B6LtfaTEobBBW91qNDpU7KB2KxTAoSS9Tpgzi4/N+wnPixAlUqFChxEGRdWGSbhhW0kvm5k0xxtfZmT97RWGSbhmMNbO7jOPS6Wnr1gGPHgG1agHPPqt0NESwnuXXzKRNSBsEewVDhfwncVJBhYpeFdEmpI2ZIyNLY1CS3q9fP0yYMAG3b9+GSqWCWq3GwYMHMX78eAwYMMDYMZKFY5JuGCbpJaM9Hp0TFhaOSbplMNbM7jLO8E5PW75cXA8Zwr+LZCE0lXQrWH7NDOzt7LGwy0IAyJOoy18v6LIA9iZqt7dE99Lu4fL9yzY3WV5RDErSP/vsM4SEhKBChQpITU1FnTp10LZtW7Rs2RKTJk0ydoxk4ZikG0Zud3/0SKw1T8XD8ej6Y5JuGYzZ7g6wkk66oqOBw4cBe3ugf3+loyF6IoWV9Kf1qt0L63uvRwUv3e7jYK9grO+93ubWSV9zZg2q/1919FnfR+lQLIqDIQ9ydHTE6tWrMX36dJw4cQJqtRoNGzZEdXmAHNmUhARxzSS9eLy9RaVDksS49PLllY7IunBmd/3JyVxCgrhwkkdlGLvdnZV00hYZKa67dQMCAhQNhUiQ1EDKJbHNMek6etXuhZ41e+Lv2L/R5acukCDh4JCDqOhte29q5DXSa/jwZ0SbQUm6rGrVqqhataqxYiErxUq6YezsAC8vICmJSbohuEa6/tzdxesUFyeqbW041E0Rpmp3v3ULSE0FPDyMc1yyPllZwI8/im1OGEcWI/0GkPMYsHME3CspHY3Fsbezx/NVn0ct31qITojG2XtnbTNJ5/Jr+TIoSR8yZEih9y+XB0WRTWCSbriyZUWSznHpxcdKevHUri2S9PPnmaQrxdjt7uXKia6IhATR8t6okXGOS9Zn2zax2oWfH/DCC0pHQ/SEvPyaR1XArkR1wVLt/ebvIyMnw2aTVE2S7mebz78gBv3GPHgqo8jKysKZM2fw8OFDdOjAqfNtSXY2cP++2GaSXnxchs1wHJNePLVrA9u3c1y6UiTJ+O3ugBjKwCSd5LXR+/cHnJyUjYVIg8uv6WVYk2FKh6CY+4/u427aXQBATR9OLqjNoCR948aNeW5Tq9UYMWIEqlSpUuKgyHokJoprlQrw8VE2FmvEGd4Nx0p68XDyOGUlJYlJIgHjVdIB0fJ+8CDHpduyu3eBP/4Q22x1J4vC5deoCPJ49GCvYHg6eyocjWUxaHb3fA9kZ4cxY8Zg/vz5xjokWQG51b1cOTGjLBWPXElnkl48aWm5rxnHpOuHSbqy5Cq6tzfg6mq843KGd1q9WnS1NW0K1K2rdDREWlhJ14skSTh5+yRWnlyJjGzbWu7nfMJ5AByPnh+jDhCJiYlBdna2MQ9JFo7j0UtGrqSz3b145Cq6l5e4UNHkJP3aNfEhh7u7svHYGlO0ugOc4d3WSRKwbJnYLmK6ICLz0yy/xjbmooT/GI6Hjx+ifvn6CAsIUzocs2kU2AgRbSNQpSw7sZ9mUJI+duxYna8lSUJ8fDy2bt2KgQMHGiUwsg5M0kuG7e6G4Xj04vP1zZ1k7MIFjl82N2PP7C7TrqRLkhh6RLbj+HHg7FnAxQXo21fpaIi05GQAaVfFNivphVKpVKhfvj72XduH03dO21SS3jCwIRoGNlQ6DItkUJJ+4sQJna/t7Ozg5+eHefPmFTnzO5UuTNJLhhPHGYbj0Q1Tuzawf79oeWeSbl7GntldVrWqWM4xJQW4fdv4xyfLJk8Y16tX7v8TIouQekWsk+7gCbhwjdmi1PcXSfqpO6eUDoUshEFJ+u7du40dB1kpJuklw0q6YbhGumG0k3QyL1O1uzs7A6GhwJUroprOJN12PHoE/Pyz2OaEcWRx5OXXvGqwxUcP9cvXBwCcums7Sfrj7MfYc3UPavvWRoh3CFT8OdFhtInjyDYxSS8ZVtINw0q6YTh5nHJM1e4OcFy6rdq0SawaEBICcPVbsjicNK5YNEm6DVXSzyecR9fVXdHoO7b25cegJP3OnTvo378/goKC4ODgAHt7e50L2Q4m6SXDSrphOCbdMEzSlWOqSjrAGd5t1fLl4nrwYDHkgciiMEkvlmf8n4EKKtxOva1ZN7y0k5dfq+1bm1X0fBjU7j5o0CDExcUhIiICgYGBfGFtGJP0kmEl3TCspBtGTtIvXQKysgBHR2XjsSWmGpMOsJJui65dA/7+W2xzvl6ySFwjvVg8nDxQtVxVXL5/GafvnEbHKh2VDsnkohNyk3TKy6Ak/cCBA9i/fz/CwsKMHA5ZGybpJcNKevFJEpN0Q1WsKJZeS0sDYmKAWrWUjsh2mLLdnZV02/Pjj+JvYYcOQOXKSkdDlA8uv1ZsszvNhouDCxoHNVY6FLOQk/Ravnwzkh+DkvSKFStCkiRjx0JWSE7SfX2VjcNaaa+TrlazZVEfDx4A6eliOzhY2VisjUolEvN//xUt70zSzSMlRXwwApg2Sb9yhR0StkCtzp3VnQvqkEXKTAIe3xHbntWVjcWK9KrdS+kQzErT7u7HSnp+DEoJFixYgI8//hhXr141cjhkTdRqIDFRbLOSbhi53V2SxBt5Kpo8Ht3PD3B1VTYWa8Rx6eYnt7p7egIeHsY/flAQ4OYGZGeLRJ1Ktz17gKtXAS8v4OWXlY6GKB8pl8S1SwDg6KVsLGSRstXZuHRf/Jyw3T1/BlXS+/Tpg/T0dFStWhVubm5wfOpj+/v37xslOLJsDx4AOTlim5V0w7i4iMvjx+L19PZWOiLLx1b3kpGr50zSzceUre6A6MCpUQOIihIt7zXZXVqqyVX0118XH84QWRzt5ddIb9nqbGw6vwmn75xGRLsIONgZlKZZhdgHscjMyYSrgysqlamkdDgWyaDv/oIFC4wcBlkjudXdy0us1UuGKVMGuH2bk8fpi0l6ybCSbn6mnNldJifpFy4APXqY7jykrKQkYP16sc210clicWZ3g9ip7DB482CkZqaiT90+qONXR+mQTMbXzReRPSPx4PED2Kk41jM/BiXpAzmVKIGTxhlL2bIiSefkcfqRk/SQEGXjsFZykn7+vBhmwcU5TM+UM7vLOHmcbVi7VnRe1akDNGumdDREBWCSbhA7lR3q+dfD4RuHcerOqVKdpJd1LYuBYcwnC2PwRxcxMTGYNGkSXn/9ddy9K9bz27ZtG86ePWu04MiyJSSIaybpJcNl2IqHlfSSqVYNcHAQE5nduKF0NLbB1O3uAJdhsxXy2uhDhvADNrJgXH7NYPXL1wcAnLpzSuFISGkGJel79+5FvXr1cPToUWzYsAGpqakAgFOnTmHKlClGDZAsFyvpxsFl2IpHnjiOSbphHB1Fog6w5d1czNHuzkp66XflCnD0KGBvD7z5ptLREBVAkrQq6Zwgo7iMnqRPnQrMmJH/fTNmiPsV8OvZX7ErdhfSMtMUOb81MChJ//jjjzFz5kzs3LkTTk5Omtvbt2+Pw4cPGy04smxM0o2DlfTiYSW95Dgu3bzM0e4uV9Jv3waSk013HlLOjh3iulUroHx5ZWMhKtDj20B2KqCyAzyqKB2N1TF6km5vD0yenDdRnzFD3G5vb5zzFIMkSRj6+1B0XNkRVx9eNfv5rYVBSfrp06fxcj7rfvj5+SFRXpOLSj0m6cbBSrr+1Grg5k2xzTHphmOSbl7maHf39s5N3FhNL53kJP3555WNg6hQcqu7e2XA3qnwfSmPev71AADXk6/jwSMjvDGMiACmT9dN1OUEffp0cb+Z3Uq5hZTMFNir7FHdp7rZz28tDErSy5Qpg3i5NKDlxIkTqFChQomDIuvAJN04mKTr784dICtLLDllyoSntGOSbl7maHcHOC69NMvOBv7+W2wzSSeLlvLkDxAnjTOIt4s3KnmLJcmMVk2PiACmTBGJuYODogk6AEQniDcfVctVhRM/yCmQQUl6v379MGHCBNy+fRsqlQpqtRoHDx7E+PHjMWDAAGPHSBaKSbpxsN1df/J49KAg8X+GDMMk3XzS0nLbz039wRLHpZde//wjfo7KlQMaNVI6GqJCcNK4ElvdazUujLqA1iGtS36wu3dF5fy778TXOTmAk5NiCToARN8Tbz5q+dZSLAZrYFCS/tlnnyEkJAQVKlRAamoq6tSpg7Zt26Jly5aYNGmSsWMkC8Uk3ThYSdcfx6MbR60n/xfv3QM4Qsm05Cq6mxvg6Wnac7GSXnrJre6dOikyhJRIf1x+rcRahbRCDZ8asLcrwS/7iRPAoEHiDdPkybn/jJycgMzMgieTMwO5kl7bt7ZiMVgDg5J0R0dHrF69GhcvXsS6devw008/4fz581i1ahXs+d/DZjBJNw5W0vXHNdKNw9099zVkNd20tFvdTb1kFivppRfHo5PVSGElXVFZWUB4uGi5+fFHkZDLQ5GnTAEyMnLHqDdqlLueshmdTzgPwAhJuoXOXG8sBi/BBgBVq1bFq6++it69e6N6dQ78tyWSxCTdWFhJ1x8r6cbDlnfzMMfM7jK5kn7xovgbTaXDw4di6TUAeO45RUMhKpw6G0iJEduspBvsUdYjfHHgCwzYOAA56pyiH5Cenrvt6CjeWDo4AK+/Drzzjphxd/r03KQ1IkK8CThxQlzLM/KaiaaS7lfCJN0CZ643JoOS9Oeeew4hISH4+OOPcebMGWPHRFYgJUV8OAcwSS8pVtL1xzXSjYdJunmYY2Z3WZUq4j1JWlruecn67dolVraoVYtdRGTh0q4CUjZg7wq4BSsdjdVysnfCtL3TsOrUKlx5cKXgHc+eBYYNE0t7xMbm3j5nDnD1KvDzz+KfT36TxG3YIMZgJSQArVsDMTEmeS5PkyQJ619bj+97fI86fnVKdjDtmeunTRO3KTxzvTEZlKTfunULH330Efbv34/69eujfv36mDNnDm7cuGHs+MhCyVV0NzdxIcOxkq4/VtKNh0m6eZhrZndADDWsXFlsc1x66cFWd7Ia8qRxntXFOulkEHs7e9T1rwsgnxne1Wrgjz/EBBV164oJ4VJTgV9/zd2nevXcFvepU/NPVmvVAk6dAqpVEwl969aAGQqvKpUKrUJa4a1Gb8HDyaPkB4yIAF55RTxPZ+dSk6ADBibpvr6+GDVqFA4ePIiYmBj06dMHK1euRGhoKDp06KD3cfbt24cePXogKCgIKpUKmzZtKnT/DRs24LnnnoOfnx+8vLzQokULbN++3ZCnQCXEVnfjkSvpjx+LCxWMY9KNh0m6eZiz3R3guPTSRpIA+W0Ok3SyeFx+zWjq+9cHoJWkp6cDCxaIcU0vvijWZLSzA3r1AvbsAT78sPgnCQ0F9u8H6tUDbt8G2rYVS0lYk4cPgX37xHZmpuIz1xtTiT/mqly5Mj7++GN88cUXqFevnma8uj7S0tLQoEEDfP3113rtv2/fPjz33HP4888/8e+//6J9+/bo0aMHTpw4YWj4ZCAm6cbj5ZU7oRRb3guWmSn+hwCspBuDnKRfuybao8k0zNnuDnCG99ImJkYUuRwdgXbtlI6GqAhcfs1o6pd/kqTffZKkq9Vi4reYGFHdGT9ebP/2m/jjYOjMpAEBIsl/9lnR0jlggFimzUT+uPAHvv/3e1y+f9k4ByxTBujaVWxbwMz1xlSilYYPHjyI1atXY/369Xj8+DFefPFFfP7553o/vmvXrugqv7B6WLBggc7Xn3/+OTZv3ow//vgDDRs21Ps4VHJM0o3Hzk78jXnwQFwCApSOyDLdvCmqSs7O/LkzBl9fwMdHLMF24QLXXjYVc7a7A6yklzZyq3urVoCHETpDiUyKy6/pZ+pUMYFIfhXfGTOA7Gy0q+qORX8C872jxO0eHuJxrq5A//5imRZjKVcO2LkTGDpUfBBgwgnXvv33W2y9tBVLui1BtXLVDDvIypViPP3LL4vXa+XK3BZ3eUw6YPUVdYOS9E8++QRr1qzBrVu30KlTJyxYsAAvvfQS3Mw8OFmtViMlJQXlypUrcJ+MjAxkZGRovk5OTjZHaKWenKT7+iobR2khJ+mspBdMbnUPDjb9Ula2onZt4MAB0fLOJN00zN3uzkp66cLx6GRVmKTrR56VHNBNJCMigJkzAV9fhCUkIAzAb7WvIjkjGV7OXsCYMaaLycMDWLtW97b4eKP/8yrRzO5pacCoUUBkpGhDPXgQmDdPdwy6fF0KEnWDkvQ9e/Zg/Pjx6NOnD3wVzNLmzZuHtLQ09O7du8B9Zs2ahWnyjH9kNKykG1fZsmJiTk4eVzCORzc+OUk/f17pSEqnR49yf6fNPSY9NjZ3eB5Zp6wsMbM7wCSdrEB2GpD+ZAJptrsX7ulEsn9/4M03RdIJiBnXPT2xLEyN6z6Pcfn+ZTQKNPMn6X//DfToAXz1FTB8uFEO+SjrEWIfiFnoi71G+tmzQO/ewLlzogV1/HjxRzK/SeLkr03Ytm8OBiXphw4dMnYcxbZmzRpMnToVmzdvhr+/f4H7TZw4EWPHjtV8nZycjIoc0FpiTNKNi8uwFY0zuxsfJ48zLXkOBReX3N9xUwsMFAWR1FQxXLF2CZehJeUcPSqWO/XxATiijyxeypMxxs4+4kKF007U5WQdAKpWBUaPBgYNQvucBLzpWQHODs7mj2/7dvFJ87vvAklJwIQJJT7kxcSLkCChjEsZ+LsXnLvpkCRROR85UsQTGCiWlgsPL/xxVlxBlxk8cdyqVavQqlUrBAUF4dq1awDEmPHNmzcbLbiCrF27FkOHDsW6devQqVOnQvd1dnaGl5eXzoVKjkm6cXEZtqJxjXTjY5JuWtqt7uYaoqFS5ba8c1y6dZNb3Z97ThSOiCwaW92LLyIit91JpRJLq128KJJ0Ly9UKVtFmQQdAGbPBj75RGx//DEwcaJImEtA0+ruWxsqff4pqtXAoEHAkCEiQX/uOSAqqugEvZQw6M/+N998g7Fjx6Jbt254+PAhcp60E5QpUybP5G7GtmbNGgwaNAg///wzXnjhBZOeiwqWkCCumaQbByvpRWMl3fjkJP3SJSA7W9lYSiNzz+wu47j00oHj0cmqJDNJL7YZM3LHJUkScOKE5Xwip1IBn30mknUA+OILUc1Wqw0+5PkEMbZO71Z3OzvA21tcf/YZsG0bUEj3dGlj0E/C//3f/+H777/Hp59+CnutGQCbNGmC06dP632c1NRUREVFISoqCgAQGxuLqKgoxD0pmU2cOBEDBgzQ7L9mzRoMGDAA8+bNw7PPPovbt2/j9u3bSEpKMuRpUAmwkm5crKQXjUm68VWsCLi5iWFdMTFKR1P6mHtmdxlneLd+9+8Dx46J7eeeUzYWIr0kP/lUkOPR9SPPQj59OpCRIa4nT9ZZPuzBowd46/e3EB4ZDqmEVWyDffQR8O23Imn/5huxRFtWlkGH0mvSOEnSXRf2yy+BQ4dEVd9SPsAwE4OebWxsbL5Lnjk7OyOtGAvuHj9+HA0bNtQca+zYsWjYsCEmPxmbER8fr0nYAeDbb79FdnY2Ro4cicDAQM3l/fffN+Rp/H979x0eRbX/D/y96UAKJCEJPaGXEKqNIqAIqGABxAtcsIDKtYDwRb16vXZ/XlGRYkMF1CsKCFguBhSkKyhiQu8llDQSMAkE0nZ+fxwnuyFtN5mZM7P7fj1PnhmWze5ZhpT3fj7nHKoFhnRtMaRXjwvHac/HB2jfXpyz5V17Rq/srmIl3frWrRMFq44dxY4WRKbHdnfXOQd051XJrwjqwQHB+GznZ9iYshEpOSnyxvvgg8CiRYCfn/jGVMOwPPfmuVg3fh1GdhxZ8R0uXBCL6N18s6O9LzAQuOaaGg7c2mq0cFxcXBySk5PRokWLMrevWrUKHdxYpaZ//6rfGfrkk0/K/HnDhg3uDJN0cumS400uhnRtsN29ahcvisoSwEq61jp0AP74Q4T0O+6QPRrPIqvdnZV061Nb3QcPljsOIpcoiqOSzpBevZISl1Yl9/f1R8eGHbEzYyd2ZexCbP1YY8fpbPRoIDYW6NmzxvuoR9WLQlRcJe3qu3YBd90lfnD5+orq+fXX13y8HqBGIf2JJ57AI488gsuXL0NRFPz222/48ssv8f/+3//D/PnztR4jmYxaRff3F9sUUu2xkl41tYoeEiKmJ5F2uHicfmS1u7dpI46ZmeKNP6NWlidtKArno5PFFGQDRX+K85DWUodiCS+8UPnfXRHcE6ITSkP6be1u03dc1bnuOse53S7miT/yCBAeXvPHVBTgo4/EYnkFBaJ16MsvgT59aj9ei6tRSL/vvvtQXFyMJ598Evn5+RgzZgyaNGmCuXPnom/fvlqPkUzGudXdqBWLPR0r6VXjfHT9MKTrR1a7e2ioeM60NFGUuPpqY5+faufwYSAlRawl5eWFJLIKtdW9bnPAr67csXiYhOgEAMCujF2SR3KFf/5TzBdfulS8q1jND7rtZ7Zj+f7l6NO8D4a2HSpuzM0FHnoIWLxY/PnWW8V2a5GR+o7dImo8A/+BBx5ASkoKMjMzkZ6ejt9++w1JSUlo3ZrvoHk6zkfXHivpVeN8dP2oIf3AgVrvrkJXkNXuDnBeupWpVfS+fcXCjkSmp4Z0LhqnOdOG9HvuET/c9uwR36xOnKjy7utPrMfrP7+ORbsXlX2MxYtFe/sbbwDffceA7sStkP7nn39i7NixaNiwIRo3bow5c+YgPDwc7777Llq3bo1t27ZhwYIFeo2VTIIhXXuspFeNlXT9tG4t1oK5cAE4fVr2aDxHYSGQnS3OjW53Bzgv3crY6k6Ww+3XdKOG9MPnDiO/KF/yaJx06gRs2QLExYntYfr0qbIlz3mP9FKvvioqBZs3A9One93q7dVx61/jmWeewaZNm3DPPfcgPDwcU6dOxdChQ7F582YkJiZi+/btGD16tF5jJZNgSNeeWknPyanVFpQeS93kgSFde/7+IqgDbHnXUnq6OAYE1G66Xk2pIZ2VdGspLATWrxfnDOlkGXlcNE4v0fWiEVUvCrH1Y5GWlyZ7OGW1bCmCeseOwJkzoqK+Y0eFd91/dj9CLwM37L7guLFjR1GJd57rTqXcCunff/89Fi5ciDfffBPfffcdFEVB27ZtsW7dOvTr10+vMZLJMKRrT62kK4qYokNlsZKuL85L157a6h4TI2ftDrXdnZV0a9m2TXS1REUBCQmyR0Pkoly2u+vFZrMh5fEUHJ18FK3CW8keTnmNGwObNolV37OzxUIaVyx+pygKAnbuwbFZQO/Jb4pgr2L1vFJuLRyXmpqKjh07AgBatmyJoKAgTJw4UZeBkXkxpGsvMBCoU0dsb3f+PFdjvhLnpOuLe6VrT9bK7irndvdabGtLBlNb3W+6ideMLEKxA3mHxTkr6boI8guSPYSqRUQAP/0EjBghwsErr4g2sn//G1AU5Lz1/7Du3YvwUwAlLFT8HVXLrZBut9vh7+9f+mdfX1/Uq1dP80GRuTGk66NBA0dIj4uTPRrzUBRW0vXGSrr2ZK3sroqNFWsNXLokuhD5tWMNnI9OlpN/CrAXAD7+QL0WskdDsoSGim9gNpv4peK554C8PODYMdRfvhwAcCTKH60PHHfM8aQquRXSFUXBvffei8DAQADA5cuXMWnSpHJBfcWKFdqNkEyHIV0f9euLFlkuHlfW+fPAxYvivGlTuWPxVAzp2pO5sjsg1hpo1UrMST94kCHdCrKygN9/F+c33SR3LEQuU1vdg1sBPjXa2ZmqkZqXijHLx+BM3hkcevQQbGbd/1gd17//LX55e+ON0r/6vjUw78XB+I4B3WVufTXdc889Zf7897//XdPBkDUwpOuD27BVTK2iR0aKKQGkPbXd/exZMaUsIkLueDyB7HZ3QMxLP3hQtLwPHChvHOSan34SnUOdO8t7c4fIbaXbr7WTOw4PFl4nHFtObkGJUoLUvFQ0CW0ie0jVCwsrPVX8/dH59yN4q7hA4oCsx62QvnDhQr3GQRbCkK4PbsNWMc5H119wsKi0njol9kvv3Vv2iKxPdiUdEPPS//c/rvBuFWx1J0vi9mu6C/ILQrvIdth3dh92ZeyyRkhXq+oBAbAVFqL5nE/LLShHVeOyJOSWwkKxTRggKpukHVbSK8b56MZgy7u2ZM9JBxwrvDOkm5+iMKSTRXH7NUOo+6XvytgleSQuePll4PnngZdeAgoKxPG558Tt5DKGdHJLVpY4+vjI2fvXk7GSXjHukW4MhnRtmaHd3XmFdzK3AweA06fFTh99+8oeDZEbuP2aIRKi/grpmSYP6S+/LAL5Sy8B//43ci7nYGS7nfjpvn4M6m7iCg/kFrXVPSKC28NojZX0irGSbgyGdO0UFQGZmeLcDJX0EyeAy5eBIJPv4uPN1Cr69ddz7Q2ykJIC4OIJcc5Kuq4sU0kvKSkN6ACwP2s/lu9fjq3xjXHmpZfE35NLGNLJLZyPrh+1ks6QXhbnpBuDIV07GRni6Ocnd1pQdLTYFSc3Fzh6FOjUSd5YqGpsdSdLunAUgAL4hQBB0bJH49HUkH4g6wAKigsQ6BcoeUSVeOGFMn/cf1b8UtEhsgMwjXPS3cFaKLlFbXdnSNeeWklnu3tZrKQbQw3pKSlAfr7csVid2uoeEyO348hm88556f/+N/DPf4p53lZQUABs2CDOGdLJUpxb3c26LZiHaBraFO0j2+OGuBtw/rJ1qjn7s0RIbx/ZXvJIrIeVdHILK+n6Ybt7eXa7mKcJMKTrrWFDMY0lO1sEum7dZI/IusywsruqXTux97a3zEs/dQp45RVxfvPNQL9+csfjil9+EW+MRUeL7deILEPdfi2E26/pzWazYf8j1mt1U0N6h8gOkkdiPaykk1sY0vXDhePKy8gQ83t9fOQuwOUt2PKuDTOs7K7ytkr67787zufMkTcOdzi3urMYSZaSx0XjqGoHsg4AADo0ZEh3F0M6uYUhXT+spJentro3bizm95K+GNK1YYaV3VXetsK7c0j/5huxaJ7ZcT46WVYut1+T4WLhRdlDcMnl4ss4dv4YAFbSa4IhndzCkK4fVtLL43x0YzGka8NM7e7eWkn39xfTZd57T+54qnP2LPDHH+J84EC5YyFyGyvphjqYdRBNZzZF67mtZQ/FJadyTsHfxx9hgWGICY6RPRzLYUgntzCk60etpBcUAJcuyR2LWXCPdGMxpGvDTJX0Nm3EMTtbfHgyRXGE9GeeEcePPgIumrjotHatOHbpIhYaJLKMwj+By3/tNRnSRupQvEWT0CZIzUtF+oV0ZF7MlD2carWJaIOLz1zEnof3wMa5PG5jSCe3MKTrJzjYsRI0q+kCK+nGav/X4quHDwPFxXLHYmVmmpMeHAw0aSLOPb3l/cQJ4Nw5ICBArO7eqpX4Xvr557JHVjm2upNl5R0Wx6AYwD9U7li8RHBAMFqFtwJggf3S/+Lr44umoU1lD8OSGNLJLQzp+vHx4V7pV2JIN1bz5kDdumKxvqNHZY/GuszU7g54z7x0tYqekAAEBQGPPir+PGeOObdjUxSGdLKwXLa6y6Dul272kF5iL8GGExvw5e4vseHEBpTYS2QPyXIY0sllJSWOdkmGdH1w8biy1JDevLnccXgLHx9HoGPLe82UlACZf3UhmqHdHfCeeelqSO/ZUxzvu090EuzbB6xbJ29cldm3T7yhExQE9OkjezREbuL2a1J0ie4CwNwhfcX+FYidHYsBnw7AmBVjMODTAYidHYsV+1fIHpqlMKSTy86dc1QjIiLkjsVTcfG4sjgn3Xicl147mZliwTIfH/O8meltlXQ1pIeFAffeK85nz5YypCqpVfR+/URQJ7IULhonhdkr6Sv2r8DIpSNxOvd0mdvP5J7ByKUjGdTdwJBOLlNb3Rs0ECvnkvZYSXcoLATS08U5Q7px1JB+4IDccViV2uoeHQ34+sodi8obKul2O7BjhzhXQzrgaHlfudJ8UzjY6k6Wxu3XpFBD+t6ze1FsN9fiMSX2EkxZPQUKys8vUm97fPXjbH13EUM6uYzz0fXHSrpDaqro3AgI4P85I7GSXjtmWtldpVbSDx8WYdYTHT0K5OSIinTHjo7b27UDhgwR30veeUfe+K50+TKwcaM4Z0gny1EUp3Z3hnQjxdaPxcCWAzGx20TT7Ze++eTmchV0ZwoUnMo9hc0nNxs4KutiSCeXMaTrj5V0B+dF43z4ncowzpV0My62ZXZmWtld1aKF6H4qKHBMIfE0aqt7167lO72mTBHHBQuAvDxDh1Wpn38WW202agR06iR7NERuupQGFF8EbD5AcEvZo/EqPjYfrBm3Bu/e+i7CgsJkD6eMtLw0Te/n7firL7mMIV1/rKQ7cGV3OVq3Fm3aeXnAmTOyR2M9ZlvZHQD8/MR1BTx3XvqV89GdDRokWv5zc4HPPjN2XJVxbnXn9sFkOUoxEHcP0HQ44BsgezRkEo1CXPvB5+r9vB1DOrmMIV1/rKQ7cNE4OQICHIGOLe/uM2O7O+D589KrCuk+PsDkyeJ8zhxztPxzPjpZWr3mwHWfAH2/kj0Sr3Wx8CIOZZvrXde+zftWuSe6DTY0C22Gvs37Gjgq62JIJ5epIT0yUu44PBkr6Q6spMvDeek1Z8Z2d8CzV3gvKQH++EOcVxTSAWD8eCA0VLx+NSDLkpEBJCeL84EDpQ6FiCxo+5ntCHktBAM/M9c3EF8fX8weUvFWGjaIlqFZQ2bB18ckq6qaHEM6uYyVdP2xku7APdLlYUivOTO2uwOeXUk/dAi4cAGoWxdo377i+4SEAPffL87nzDFubBVZu1Ycu3UDoqLkjoWIrKdtRNvSRdjOXzLXL4zDOwzH8lHLy1XUm4Y2xbJRyzC8w3BJI7MeP9kDIOtgSNcfQ7oDK+nyMKTXnFnb3T25kq62unfvXvW2d48+KvZLX7VKvFmh/psYja3uRFQbYUFhaBHWAik5KdiVsQv9YvvJHlIZwzsMx+3tbsfmk5uRlpeGRiGN0Ld5X1bQ3cRKOrksK0scGdL1w3Z3B85Jl4chvWbsdiA9XZybtZJ+8qRYVdyTVDUf3VmrVsDQoeJc1nZsisKQTkS11yWmCwBgV8YuySMpa83RNci5nANfH1/0j+2P0Z1Ho39sfwb0GmBIJ5exkq4/VtKF/Hzg3DlxzpBuPLVlODPTcR2oemfPivnRNhsQHS17NGU1bCjeBFQU4MgR2aPRlqshHXAsIPfJJ2JfdaPt2SPeyKlbF+jd2/jnJyLPkBCVAMBcIT0rPwu3fHELYt6K4TZrGmBIJ5coCivpRlAr6bm54pd9b6W2uoeEAGHm2gbUKwQHO94cYTXddWqre1SU2PbMTGw2z5yXXlwMJCWJc1dC+o03Ah07ijnsCxfqO7aKqFX0/v2BwEDjn5+IPENC9F8hPdM8IX3ZvmUothejY8OO3GZNAwzp5JKcHKCoSJwzpOtHDemAnCqPWTjPR+cewnKo1XSGdNeZdWV3lSfOS9+/X7Tvh4QAbdpUf3+bzVFNnzvX+DdD2epORFpQQ/qezD0osZujqrNo9yIAwJj4MZJH4hkY0sklaqt7cDAQFCR3LJ4sIEC0QQLePS+d89Hl47x095l1ZXeVGtI9qZK+fbs49ugh9kN3xd//Lt4QPXZMLCJnlEuXgE2bxDlDOhHVRuvw1ri/6/14ZcArKLIXyR4OUv5MwZaTW2CDDX+L/5vs4XgEhnRyCeejG4fz0rmyuxkwpLvPrCu7q9R2d0+qpLszH11Vrx7wwAPifHbFW/rqYssW4PJloGnTyreKIyJyha+PL+bfPh9Tr5uKID/51bMv93wJAOgf2x9NQptIHo1nYEgnlzCkG0dteWdI5x7pMjGku88q7e4HD4p1RjxBTUI6ADz8sKi8r10L7Nun/bgq4tzqzmk8RORJvtj9BQBgTGe2umuFIZ1cwpBuHLWS7s3t7qyky6eG9JQUsdo+Vc/s7e6tW4vj+fNAdrbcsWihsBDYuVOcuxvSY2OB228X53PmaDqsSnE+OhFpqaikCHsy92BTyiap4zh2/hj2ZO5BgG8ARnQYIXUsnoQhnVzCkG4ctrtzTroZNGwIhIeLiqsntUfryezt7nXrOrpTPGFe+p49Iqg3aAC0bOn+50+ZIo6ffab/99u0NGDXLlFBv/FGfZ+LiLzDlpNb0Pn9zrjv2/ukjqNlg5Y4OfUkFo9YjAZ1GkgdiydhSCeXMKQbR21399ZKuqKwkm4GNhtb3t1l9nZ3wLPmpTu3utekffz664GEBLGg2/z52o7tSmvXimOPHkBkpL7PRUTeoXN0ZwCikp1XkCd1LE1Dm+LODndKHYOnYUgnlzCkG8fbK+l//glcvCjOGdLlYkh3naJYI6R70grvNZ2PrnLeju2dd8Se63phqzsRaS2ybiQah4jWrT2Ze6SMQfGUBU5MiCGdXMKQbhxvr6SrVfTISKBOHblj8XYM6a7LzgaK/toFJyZG7liq4qmV9JoaMwaIiBBrL/zvf9qM60p2O7BmjThnSCciLXWJ7gIA2JWxS8rzP7bqMQz+fDC2nNwi5fk9GUM6uYQh3TjeXklXF4Liyu7yMaS7Tq2iR0YCAQFyx1IVT6mkX74M7N4tzmsT0uvUAR58UJzrtYDc7t1ARobY+u266/R5DiLyTgnRCQDkhPTCkkJ8uedL/Hj0R1wuvmz483s6hnRyCUO6cby5kq4owKxZ4vy226QOheAI6YcO6dsK7AnMvrK7Sq2kHzkClJTIHUtt7Nol/k82bFj7aTH/+Afg6wts2CAeV2tqq/uAAeZ+A4eIrKc0pGcaH9J/OPIDzl06h5jgGAyIHWD483s6qSF906ZNGDZsGBo3bgybzYZvvvmm2s/ZuHEjevTogaCgILRs2RIffPCB/gP1corCkG4kb66kr1sH/PGHWIX60Udlj4aaNxfXoqgIOHZM9mjMzewru6uaNwcCA8Wq6CkpskdTc7VdNM5Zs2bAiL92DdKjms756ESkF+dKutHzw7/YI/ZG/1unv8HXx9fQ5/YGUkP6xYsX0aVLF7zzzjsu3f/48eO45ZZb0LdvXyQlJeGZZ57B5MmTsXz5cp1H6t0uXhSthQBDuhG8OaTPmCGOEyaIeaIkl4+Poz2aLe9Vs8KicYCoGKv7pVt5XroW89GdqQvILVoEZGVp85gAkJ8PbN4szhnSiUhr7SLa4eUBL+PzOz+HXbEb9rx5BXn49sC3AIAxnccY9rzeRGpIv/nmm/HKK69g+PDhLt3/gw8+QPPmzTFr1ix06NABEydOxP33348333xT55F6N7WKHhgo5tSRvry13T0pSVScfH2BadNkj4ZUnJfuGqu0uwOeMS9d65DeqxfQvbt4Q/qjj7R5TEAE9IIC0cGgTjUgItKKv68/nr3+WQxrN8zQava3B7/FpeJLaBPeBj0ba/SNmMqw1Jz0rVu3YtAVb0UPHjwYv//+O4rUZXWvUFBQgNzc3DIf5B7nVvfathVS9Zwr6d60s8Ubb4jj3XcDsbFSh0JOGNJdY5V2d8ARFq0a0vPzgb17xblWId1mA6ZMEefvvedYqb+2nFvd+fOTiDzFot2LAIgquo3f3HRhqZCenp6O6OjoMrdFR0ejuLgYWZX0p7322msICwsr/WjGjZfdxvnoxlIr6UVFwKVLUodimOPHgaVLxfkTT8gdC5XFkO4aq7S7A45KulXb3ZOTxbZmjRpp+6bI3XcDUVHA6dOAC0vkuOSHH8SRre5EpJdzl87hmwPf4Ku9Xxn2nKM6jkK/Fv3Y6q4jS4V0AOXerVEXSajsXZynn34aOTk5pR+n1E2YyWXq+x8M6cYIDhYt34D3zEt/+22x0vSgQUDXrrJHQ87atxfHAwe8q7PDXVZqd7d6JV3rVndVYCDw0EPifPbs2j/emTOi4m+zATfeWPvHIyKqyO+pv+POJXfi3+v/bdhz3tftPmy4dwPaRnAej14sFdJjYmKQnp5e5rbMzEz4+fkhopJVpgIDAxEaGlrmg9zDSrqxbDbvmpeelQV8/LE4f/JJuWOh8tq0EW8a5eWJ0EHlKYq12t3VSvrp02JhUKvRK6QDYjs2Pz/g55+BHTtq91hr1ojjVVcB4eG1HxsRUUXUFd4PnzuM/KJ8yaMhrVgqpF933XVYo/7U+8uPP/6Inj17wt/fX9KoPB9DuvG8aYX3d98Vbf09egA33CB7NHSlgACgVStxzpb3iv35p1gcDABiYqQOxSUREY7QePiw3LHUhJ4hvVEjYNQocT53bu0ei1uvEZERoutFo2HdhrArduw7u0/X50r5MwVzf52LjAsZuj4PSQ7pFy5cQHJyMpKTkwGILdaSk5Nx8uRJAKJVffz48aX3nzRpElJSUjBt2jTs378fCxYswPz58zF9+nQZw/caDOnG85ZKen6+4xfhJ5/kwkpmxXnpVVNb3Rs0AIKC5I7FVVadl56XJ6ZeAOKNPT2o27F9+SWQUcPfQ+12RyWdIZ2I9GSz2crsl66nz3d9jsmrJ2Pc1+N0fR6SHNJ///13dOvWDd26dQMATJs2Dd26dcNzzz0HAEhLSysN7AAQFxeHxMREbNiwAV27dsXLL7+MOXPmYMSIEVLG7y0Y0o3nLZX0BQuA7GygZUvAxZ0YSQKG9KpZqdVdZdV56UlJYnpBs2bAFevIauaaa8RHYSHw4Yc1e4zkZDGVJzgYuPZaTYdHRFSOESFdUZTSVd1Hx4/W7XlI8JP55P379y9d+K0in3zySbnb+vXrhz/++EPHUdGVGNKN5w0hvbgYeOstcT59upgHSuakhnS1gkllWWlld5VVK+l6tro7mzwZGDtWbMf21FNi2oc71Fb3G24AOBuPiPRmREjfmbET+7P2I9A3EMM7sLKiN0vNSSc5GNKN5w3t7suWASdOiP9X994rezRUFVbSq2alld1VVq2kb98ujnqH9JEjxfVMTxffq9zF+ehEZCTnkF5VAbQ2vtj9BQBgaNuhCAsK0+U5yIEhnarFkG48T6+kKwrw+uvi/LHHgDp15I6HqqZuw5aR4bn/J2vDiu3uaiX94EFrba1nVCU9IECs9A4Ac+a497kXLwJbtohzhnQiMkLHhh2xeMRibL5vsy6Pb1fs+HLPlwCAsZ3H6vIcVBZDOlWpoEAs1AMwpBvJ0yvpa9eKOZt16wIPPyx7NFSdkBCgaVNxzmp6eVZsd2/TRnz95eYCO3fKHo1rzp8HjhwR53otGufswQdFWP/1V/Hhqo0bgaIiIDYWaN1at+EREZUK8gvC3fF3o0PDDrDpsArvppRNOJ17GmGBYbi5zc2aPz6Vx5BOVVKr6H5+juBI+vP0SvqMGeL4wANiOygyP7a8V86K7e6BgcDAgeL8f/+TOxZXqcvRxMUZ830jOhoY/dfaSO5U051b3bljBRF5gr2Ze+Hv44+RHUciyM8i25hYHEM6VUkN6ZGR/GXDSJ5cSf/jD1FJ9/UFpk6VPRpyFUN65azY7g4Aw4aJ48qVcsfhKqNa3Z099pg4Ll3qeDOmOpyPTkQyHD13FG/+8ibe3/6+5o/9yNWPIO3/0vBC/xc0f2yqGEM6VYnz0eXw5Eq6WkX/29+AFi3kjoVcx5BeMUWxZrs7ANx6qzj+9ptYIM3sZIT0Hj2A3r3FbhQffFD9/U+dEl8jPj5iZXciIqPsz9qPJ9Y8gfd+f0+Xx4+oG4GmoU11eWwqjyGdqsSQLoenhvRjx4CvvhLnTz4pdyzkHob0iuXmAvn54txqIb1RI0fg/f57uWNxhYyQDgBTpojjBx+IdVqqsmaNOF59teP7OBGREbpEdwEAHMg6gILiar5ZuSErP0uzxyLXMaRTlRjS5fDUdveZMwG7HRgyBEhIkD0acoca0k+cAC5dkjoUU1Gr6GFhYiE2q7FKy3tWlvi/BxizaJyzO+4QCyeePQssWVL1fdnqTkSyNA1tivpB9VFsL8aBrAOaPGZuQS6av90cveb3wvlLHlY5MjmGdKoSQ7ocagUmL0+0WXqCs2eBBQvEOavo1tOwIRAeLtq7rba3tp6suGics6FDxfHHH4HLl+WOpSo7dohj27biDREj+fs7dqGYPbvyLetKShyVdIZ0IjKazWYrs1+6Fr458A0uFV/C+cvnUT+oviaPSa5hSKcqMaTL4fxLaE6OvHFo6Z13RAW2Z0+gf3/ZoyF32WyO/dLZ8u5g1UXjVN26ibHn5wMbNsgeTeVktbqrHngACAoSC1/+8kvF90lKAs6dA0JDRbs7EZHREqK0DemLdi8CAIyJH6PL1m5UOYZ0qhJDuhz+/kBwsDj3hHnpFy+KkA4ATz3FnQKsivPSy7PqonEqm81RTTfzVmyyQ3pkJDB2rDivbDs2tdX9hhvE93AiIqOVVtIzax/SMy5kYO2xtQCAMZ3H1PrxyD0M6VQl5y3YyFieNC99wQJRYWrVCrjzTtmjoZpiSC/P6u3uQNl56ZW1cssmO6QDwOTJ4rh8uVjF/UpqSB882LgxERE5U0P6nsw9tX6sJXuXwK7YcU2Ta9AqvFWtH4/cw5BOVcr6a0FHVtKN5ykrvBcVAW+9Jc6nTxf7o5M1MaSXZ/V2d0BUfoOCgJMngd27ZY+mvPR04PRpUfXv1k3eOBISxFSdkhLg/Su2Ic7Lc7TBcz46EcnSJaYLfn/gdxx57EitH+uL3V8AYBVdFoZ0qhLb3eXxlEr6V18BKSlAVBRwzz2yR0O1oYb0Q4c8Z0HD2rJ6uzsgVqUfOFCcm7HlXV00rkMHxzQgWdRq+ocflt3lYONG8YZkq1ZAy5ZyxkZEFOQXhB6Ne6COf51aPc6Rc0fw65lf4WPzwd2d7tZodOQOhnSqVHGxaFEGGNJl8IRKuqIAM2aI88mTgTq1+5lBkrVoIa5hUZHY816GrCwRKJ94Qs7zX8kT2t0Bc2/FZoZWd9Vtt4mvg+xs4IsvHLdz6zUi8iRNQprgyxFf4tm+zyI6OFr2cLwSQzpVKjtbHG02ICJC7li8kSeE9B9/BHbuBOrVA/7xD9mjodry8QHatRPnB7TZgtUtJSXA6NHATz+JKRRqFVsmT2h3B4BbbxXHX38FMjPljuVKZgrpvr7Ao4+K8zlzHHP4GdKJyCy2n9mOSSsn4dVNr9b4Mer418Hf4v+GFwe8qOHIyB0M6VQptdU9PJzziGXwhHZ3tYr+wAPi/xFZn8x56c8+C6wVC81CUYAVK4wfg7O8PODCBXFu9Up6kyZA9+7i3zUxUfZoHBTFXCEdACZMEFMEdu0Sbe4pKcDBg+Ln5IABskdHRN7uTN4ZzNsxD8v3L5c9FKoFhnSqFOejy2X1SvrvvwPr1gF+fsDUqbJHQ1qRFdJXrAD+8x9xfuON4vjVV8aO4UpqFT04WP5caS2YcSu21FSxcJyvL9Cli+zRCA0aAOPGifM5c4A1a8T5tdcCYWHyxkVEBDhWeN97di+K7e4vIPP21rfx6qZXcTr3tNZDIzcwpFOlGNLlsnolXa2ijx4NNG8udyykHRkh/cABx6KD//d/Yks/ANi0SQQ4WTyl1V2lzkv/8UegoEDuWFRqFb1TJ1G9Ngt1AblvvwXmzxfnbHUnIjOIrR+L4IBgFJYU4lD2Ibc+t8Regjd+eQPPrn8Wf6T9odMIyRUM6VQphnS5rFxJP3JE7CUMmGeBL9KGc0g3Yk/t3FzgzjtFW3n//qKa3rw5cM018lvePWFld2fdu4vXcuGCaOM2A7O1uqs6dhQLGNrtwLZt4jaGdCIyAx+bDzpHdQYA7MrY5dbnbjixAWkX0tAgqAGGtB6ix/DIRQzpVCmGdLmsXEmfOVP88nrLLUDnzrJHQ1pq00a0HuflOVY214uiAPfeKyrpTZoAS5aI6RMAcNdd4iiz5d1TVnZX+fg4FpAzS8u7WUM64KimA+L7tRnHSETeSW15dzekq3uj39XxLgT4Bmg+LnIdQzpViiFdLqtW0jMzgYULxfmTT8odC2kvIEDsBQ3o3/L++uvA11+L51y+HIiKcvzdyJHiKLPl3dPa3YGyW7EZ0SlRFUUBtm8X52YMwLfe6vhauPFGxxtIRESyqSF9Z8ZOlz/ncvFlLNu/DAAwpvMYXcZFrmNIp0oxpMtl1Ur63LnA5cvA1VcD118vezSkByPmpa9ZA/zrX+L8nXdEe7uzFi3E/zG7XV7Lu6e1uwMibAYGAidOAHv3yh1LSorYCtTfH0hIkDuWivj4iOkXUVHcYpKIzEUN6ecunXP5cxIPJyK3IBfNQpuhb4u+eg2NXMSQTpViSJfLuZIuu6LlqgsXgHffFedPPgnYbHLHQ/rQO6SfOCEWHLTbxXZXDzxQ8f1kt7x7Wrs7ANSr51g9f+VKuWNRW907dxZvHJjRyJFARobj34yIyAyubnI1zj91HlsnbHX5cxbtXgQAGB0/Gj42RkTZeAWoUgzpcqkhvbgYuHhR7lhcNX++eFOhTRvgjjtkj4b00r69OOoR0i9dAkaMEBXUnj1FFb0yzi3vGRnaj6U6ntjuDphnKzYzz0cnIjKzAN8A1A+q7/L9FUVBg6AGqOdfj63uJsGQTpViSJerbl3HHEcrtLwXFYkF4wBg+nSxuBh5Jr0q6Yoi2ob/+AOIjBTz0IOCKr9/bCxw1VXyWt49sd0dcIT0rVsdPwdkYEgnIjKGzWbDx7d9jMwnMktb5UkuhnSqkN0uKlkAQ7osNpu1Fo9bsgQ4eRKIjgbGj5c9GtKTWknPyND2/+YHHwCffirm+i5ZIrZaq46slvf8fCAnR5x7Wkhv1gzo2lW8abJqlZwxKApDOhFRbaw6vAoDPxuIJ9e4vopvXf+6sHGuoikwpFOFzp8HSkrEeWSk3LF4M6ssHqcowIwZ4nzKlKqrn2R9oaFiSzRAu2r61q3i/w4gFuO64QbXPk9ted+4UewsYBS1il63rvj38DSyW96PHhVvggQGAp06yRkDEZGVXSi8gJ+O/4SNKRurvF9WfhZ2pu+EYpUFkLwEQzpVSG1xDAsT2x+RHFappP/wA7B7NxAcDEyaJHs0ZAQtW97T00XYLioSx+nTXf/cuDhRaTW65d251d0Tiw7qVmw//AAUFhr//GoVvUsX/gwiIqoJtW19T+YelNhLKr3ff3f+F13ndcU939xj1NDIBQzpVCHORzcHq1TSX39dHB980PHGAnk2rUJ6UREwapRYKb1jR2DBAvdDr4yWd09c2d1Zz55i6kpenliYz2hsdSciqp3W4a0R5BeE/KJ8HDt/rNL7qau6X9PkmkrvQ8ZjSKcKqSGdre5yWaGS/ttvwIYNYpG7xx+XPRoyilYh/YkngM2bRcv4ihVASIj7j6GG9A0bjGt599SV3VU+PsCtt4pzGS3vaki/6irjn5uIyBP4+vgiPioeALArY1eF9zmYdRA70nbA1+aLUZ1GGTk8qgZDOlUoK0scWUmXywoh/Y03xHHsWLHgFHkHNaQfOFDzx/jiC2D2bHH+2WdAu3Y1e5y4OKBHD9Hy/vXXNR+POzx1ZXdnasv7//4n1p0wit0O7NghzllJJyKquYQo0fJeWUj/YvcXAIBBrQahYT3+0m8mDOlUIba7m4PZ290PHxbbZAHuzSMm61ND+vHjYm9zd+3aBUycKM7/9S/g9ttrNx6jW949vd0dAAYOFPPBjx/Xfru9qhw6BFy4IBblU3cSICIi96nz0ndllg/piqLgiz0ipI/tPNbQcVH1GNKpQgzp5mD2Svpbb4kK2623AvHxskdDRoqKEv8/FUWEKnecPw/ceacI94MHAy++WPvxqCF9/Xpj9vb29HZ3QCwEqa6yv3Klcc+rtrp36yam0RARUc10iemCiDoRCA0svw3J9tTtOHLuCOr618Xt7Wv5TjlpjiGdKsSQbg5mrqRnZACffCLOn3pK6lBIAputZvPS7XYxNeLYMdGm/sUXgK9v7cfTsiXQvbtxLe/e0O4OyNmKjYvGERFpo1+Lfjj7xFl8esen5f5u2b5lAIDb292O4IBgo4dG1WBIpwoxpJuDmSvpc+cCBQXAtdcCffrIHg3JUJOQ/uKLwKpVQFCQWCguPFy78RjZ8u4N7e6AI6T/8guQnW3MczKkExFpw2azwVbJlimv3vAqvh/zPf7vuv8zeFTkCoZ0qhBDujmYtZKelwe8+644f/JJz9wnmqrnbkhfuRJ46SVx/uGHQNeu2o7HueVdXfxSD5cvO9448+R2dwBo0QJISBAdCqtW6f98xcVAUpI4Z0gnItKOXbGX+bO/rz9uaXMLejTuIWlEVBWGdKoQQ7o5mLWS/vHH4o2Dtm2B226TPRqSxZ2Qfvgw8Pe/i/NHHwXGjdN+PK1aiXnMJSX6trynp4tjYKDjjTRPZmTL+4EDQH6+mA/ftq3+z0dE5Ok+Sf4EsbNi8Wjio7KHQm5gSKdyFIUh3SzMWEkvKgJmzhTnTzyhzXxisiY1pB86JCqglblwARg+HMjJAXr3FgsO6sWIlnfnVndv6CJRt2JbvVp8/etJbXXv0UPs1U5ERLUT4BuAlJyU0m3YLhVdQsL7Cfjn2n8ivyhf8uioMvwRSOXk5QGFheKcIV0utZJ+4YL+vxy76ssvgdOngZgYR2WUvFPz5mJueWGh2KarIooitlrbs0f8n/nqK7Gtl17UkL5unX4t796wsruzq64SPwtyc4HNm/V9Ls5HJyLSVuk2bBm7oCgKvj/8PXZn7sbiPYsR5BckeXRUGYZ0KketotetKz5InrAwx7kZqumKAsyYIc6nTBEBjbyXry/Qrp04r6zlfdYsYMkSsZXWsmX6L7TWurWY615SAnzzjT7P4S0ru6t8fcU2i4D+W7ExpBMRaatdRDv4+/gjrzAPKTkpWLR7EQBgdPxo+NgYBc2KV4bKYau7efj5ASEh4twMIX3VKmDvXjGmSZNkj4bMoKp56Rs2iCkRAPD226LV3Qh6t7x7y8ruzpznpSuKPs9RVAQkJ4tzhnQiIm34+/qjY8OOAICNJzYi8XAiAGBswliZw6JqMKRTOQzp5mKmxeNef10cH3rIOxbMoupVFtJPnwZGjRIV7XHjgEceMW5Makj/6Sd9tg3ztnZ3ABg0SExTOHJErEGghz17xLaOYWFiEUAiItJGfFQ8AGD6j9NRWFKI+IbxpbeROTGkUzkM6eZilsXjtm0DNm0C/P1FqzsRUHFILygARowQ30u6dgU++MDYBdbatAG6dNGv5d3b2t0B0T3Tv78412uVd+dWd29YkI+IyAgr9q/AykNirlLWJbFYy6ncU1ixf4XMYVE1GNKpHIZ0czFLJf2NN8Rx7FigaVO5YyHzcA7pahv0lCnAb7+J/7srVshZ20LPlndvbHcH9N+KjfPRiYi0tWL/CoxcOhI5BTllbs8tyMXIpSMZ1E2MIZ3KYUg3FzNU0g8dcuw7rc4xJgJE1drHR+wKkZoKzJ8PzJsnKqFffAHExckZl3PL+7lz2j62N7a7A46Q/vPP2v+bAgzpRERaKrGXYMrqKVBQfiER9bbHVz+OEnuJ0UMjFzCkUzkM6eZihkr6zJmiSjpsGNCxo7xxkPkEBjrmD//3v4655y+/DAwZIm9cbdsCCQli/3YtW94LCx1bu3lbJT0uDujUSUwjWL1a28e+fBnYvVucM6QTEdXe5pObcTr3dKV/r0DBqdxT2HxS5701qUakh/T33nsPcXFxCAoKQo8ePbC5mk1YFy1ahC5duqBu3bpo1KgR7rvvPmTrsTKQF2NINxe1ki4rpBcUAIsXi/OpU+WMgcxNbXl/+mnx/+X228W5bHq0vKeni6O/PxARod3jWsWwYeKo9VZsu3eL1d0jIoAWLbR9bCIib5SWl6bp/chYUkP6kiVL8Pjjj+Nf//oXkpKS0LdvX9x88804efJkhfffsmULxo8fjwkTJmDv3r346quvsH37dkycONHgkXs2hnRzUSvpstrd164FcnJE1bBfPzljIHNTQzogKtiffipa4GVTQ/ratdq1ZzsvGueNi5upIX3VKhGqtcJF44iItNUoxLV2L1fvR8aS+mvUzJkzMWHCBEycOBEdOnTArFmz0KxZM7z//vsV3n/btm2IjY3F5MmTERcXhz59+uChhx7C7+pPd9KE2soZGSl3HCTIbndXq5AjR5ojeJH5xP+1i0u9emLtgrAwueNRtWsHdO4sWt6//Vabx/TGld2dXXON+Nnw559ibrpWOB+diEhbfZv3RdPQprCh4nc+bbChWWgz9G3e1+CRkSuk/cpdWFiIHTt2YNCgQWVuHzRoEH755ZcKP6dXr144ffo0EhMToSgKMjIysGzZMtx6662VPk9BQQFyc3PLfFDVWEk3F5kLxxUWOsKNWpUkutLIkWJBwVWrzLdmgdYt7966srvK1xe45RZxrmXLO0M6EZG2fH18MXvIbAAoF9TVP88aMgu+Pr6Gj42qJy2kZ2VloaSkBNHR0WVuj46ORro66e8KvXr1wqJFi3D33XcjICAAMTExqF+/PubOnVvp87z22msICwsr/WjWrJmmr8PTXLoEXLwozhnSzUFmJX3tWvHmQKNGQO/exj8/WUNQEDBjBtDXhG/GO7e8a/E15K0ruzvTeiu2/Hxg715xzpBORKSd4R2GY9moZWgS2qTM7U1Dm2LZqGUY3mG4pJFRdaQ3r9qumHymKEq521T79u3D5MmT8dxzz2HHjh1YvXo1jh8/jkmTJlX6+E8//TRycnJKP06dOqXp+D2NWkX39wdCQ+WOhQSZlfSlS8VxxAi2upM1tW8v2vGLirRpeff2dncAGDwY8PMTWzMeOlT7x9u5U6wYHx0NNGlS/f2JiMh1wzsMx4kpJ7D+nvX4YvgXWH/PehyfcpwB3eT8ZD1xZGQkfH19y1XNMzMzy1XXVa+99hp69+6NJ/7aqDkhIQH16tVD37598corr6BRBb81BQYGIjAwUPsX4KGcW925eI85yKqks9WdPMVddwF79oiW93vvrd1jeXu7OyDewO3XT+xBv3IlMG1a7R5PbXW/6ir+3CEi0oOvjy/6x/aXPQxyg7TaWEBAAHr06IE1a9aUuX3NmjXo1atXhZ+Tn58PnyvKeb6+Yh6Foij6DNTLcD66+ThX0o38b662usfEsNWdrE19k2nNmtp3pLDdXdByKzbORyciIipLagPrtGnT8PHHH2PBggXYv38/pk6dipMnT5a2rz/99NMYP3586f2HDRuGFStW4P3338exY8fw888/Y/Lkybj66qvR2Nt/Y9IIQ7r5qJX0khLgwgXjnlddaGvECLFYFJFVdegAdOqkTcs7290FdV765s21f+ODIZ2IiKgsqSH97rvvxqxZs/DSSy+ha9eu2LRpExITE9GiRQsAQFpaWpk90++9917MnDkT77zzDuLj43HXXXehXbt2WLFihayX4HEY0s2nTh0gIECcG9XyXlgIfPONOGerO3kCLVZ5Ly4GMjPFube/L9yqlXjzo7gYWL265o9z4QKwf78479FDm7ERERFZnU3xsj7x3NxchIWFIScnB6FcGa2cp58G/vMfYPJkYPZs2aMhVXS0CAc7dwIJCfo/36pVYpul6GjgzBlW0sn69u0T1XR/f/G1pE4jcceZM0DTpmLRtIICLqb41FNiVf+xY4HPP6/ZY2zeDFx/vfh35bquRETkydzJoV7+KwZdiZV0czJ68Ti2upOn6dhRfBQVAd99V7PHUFvdo6MZ0AFHy3tioqio1wRb3YmIiMrjrxlUBkO6ORm5DVtRkaPVfdQo/Z+PyCi1bXlXV3b39lZ31XXXAeHh4s3DrVtr9hgM6UREROUxpFMZDOnmZGQl/aefxPNERwN9+uj/fERGUUP6jz8COTnufz4XjSvLz09MiwGA//2vZo/BkE5ERFQeQzqVwZBuTkZW0tnqTp6qUyex2FlhYc1a3hnSy1Nb3msS0nNygEOHxDkXjSMiInJgSKcyGNLNyahKelER8PXX4pyrupMnqk3LO9vdyxs8WFTUDxwAjhxx73P/+EMcY2OByEjNh0ZERGRZDOlUqrDQ0QLKkG4uRlXSnVvd+/bV97mIZFBD+g8/uN/yzkp6efXrO75XrFzp3udu3y6ObHUnIiIqiyGdSmVliaOvr6NyS+ZgVCVdrS4OH85Wd/JMnToB7duLNyXdbdFmSK/YsGHi6G5I53x0IiKiijGkUym11T0igtsLmY0RId15VXe2upOnstlq3vLOdveKqSF940b3uhMY0omIiCrGKEalOB/dvIxod1+3Djh3DoiKAq6/Xr/nIZLNueU9N9e1zykpATIyxDkr6WW1bg20ayf2Sv/xR9c+JzsbOH5cnHfvrt/YiIiIrIghnUoxpJuXEZV0trqTt4iPF6GyoMD1lvfMTMBuF11GUVH6js+K1Gq6q/+eO3aIY+vWnF5FRER0JYZ0KqXOSecqu+ajdyWdq7qTN6lJy7s6Hz06mm9iVUTdii0xUXQdVIet7kRERJVjSKdSrKSbl96V9PXrRat7w4ZsdSfvoIb01atda3nnonFV691bvJmYnQ1s21b9/RnSiYiIKseQTqUY0s1LraTn54tVqbWmVhNHjBB7HhN5us6dgbZtRcu7K6uSq4vGMaRXzM8PuPlmce5KyztDOhERUeUY0qkUQ7p5hYU5zrVueWerO3kjd1ve1Uo6V3avnKtbsWVkAKdOiWvQrZv+4yIiIrIahnQqxZBuXr6+QGioONe65X39etGiylZ38jZqSF+1CsjLq/q+bHev3pAh4nvV3r2Oldsroi4a166d4/saEREROTCkUymGdHNT56VrXUl3XtWdre7kTRISgDZtXGt5Z7t79Ro0APr0EedV/Xuy1Z2IiKhqDOlUiiHd3PRYPI6t7uTN3Gl5Z7u7a1zZio0hnYiIqGoM6QRAbJmTnS3OGdLNSY9t2DZsENc9MhLo10+7xyWyCueW9wsXKr8f291do27FtmFD5avmM6QTERFVjSGdAIjttxRFnEdEyB0LVUyPSjpb3cnbdekCtG4NXL5ceYu23Q6kp4tzhvSqtWsnphAUFQFr1pT/+9RU8YaHjw8XjSMiIqoMQzoBcLS6N2gA+PvLHQtVTOtKenExW92JXGl5z8oSXy82GxAdbdzYrKqqlne1it6pE1C3rnFjIiIishKGdALA+ehWoHUlfcMGET4iI4H+/bV5TCIrUkN6YmLFLe9qq3vDhnwT0xVqy3tiophK5Yyt7kRERNVjSCcADOlWoHUlXa0a3nknW93Ju3XtCrRqJVrev/++/N9zZXf39OkDhIWJnyu//Vb27xjSiYiIqseQTgAY0q1Ay0p6cTGwYoU4HzWq9o9HZGXVtbxzZXf3+PuLPdOBsi3visKQTkRE5AqGdALAkG4FWob0jRvZ6k7kzLnl/eLFsn/Hld3dp85Ld16M79Qp8bPGz0/sUU9EREQVY0gnAAzpVqBlu/vSpeLIVncioVs3oGVL4NKl8i3vbHd335AhYgX33buBlBRxm1pF79wZCAqSNzYiIiKzY0gnAAzpVqBVJd251Z2ruhMJVbW8s93dfRERQO/e4lytprPVnYiIyDUM6QSAId0KtKqkq63uERHAgAG1HRWR51BD+vffl215Z7t7zVy5Fdv27eLIkE5ERFQ1hnQCwJBuBWol/c8/Abu95o/DVd2JKta9OxAXJ1reExMdt7PdvWbUrdjWrwfy8lhJJyIichVDOgEQlVWAId3M1Eq63V7xXs6uYKs7UeUqanlXFCA9XZyz3d097duLre0KC4F588QbjAEBQHy87JERERGZG0M6QVEcIT0yUu5YqHJ16gCBgeK8pvPSN20SXRPh4Wx1J6qIc8t7fj5w7pwImQAQEyNvXFZkszmq6TNmiGOXLiKoExERUeUY0gk5OUBRkThnJd3cajsv3bnV3d9fixEReZYePYDYWBHQExMdre4REQyXNaHOS1enVLHVnYiIqHqckeoF8vNFpfzs2fLHs2fF3rUAEBzMbXHMrkEDICOjZpX0khK2uhNVx2YDRo0Sld+vvgImTBC3s9W9Zvr2BUJDgdxc8WeGdCIiouoxpFuM3S4CWkVhu7Ignp/v2mN37Kjv2Kn2arMN26ZNQGamaHW/4QZtx0XkSe66S4T0lSuB/v3FbVw0rmYCAoDBgx1dPAzpRERE1WNIN6mffwY+/7x8EM/OrtnK3gEBopU9MrLyI4Ob+dWm3Z2t7kSuUVveT5wA5s8XtzGk19ywYeL7T1AQ3wwmIiJyBUO6SR09CnzwQeV/HxZWNmRXF8BDQkQbJ1lbTSvpJSXA8uXinK3uRFVTV3l/4w1gxw5xG9vda+7OO4FBg4BevbjtIxERkSv449KkuncHnn++4iDOBYy8V00r6Wx1J3KPGtJVrKTXXHAw8MMPskdBRERkHQzpJhUfz71kqbyaVtLVVvc77mCrO5ErevZ0tLwDDOlERERkHG7BRmQhNamkc1V3IvfZbMDIkY4/s92diIiIjMKQTmQhNamkb94stm1r0AC48UZ9xkXkiZzf1GIlnYiIiIzCdnciC6lJSGerO1HNXHWV+Lq5dAlo3lz2aIiIiMhbMKQTWYi77e5c1Z2o5mw24OuvZY+CiIiIvA3b3YksxN1K+pYtotW9fn22uhMRERERWQFDOpGFuFtJd25157Z9RERERETmx5BOZCFqJf3SJaCgoOr7Ore6jxql77iIiIiIiEgbDOlEFhIaKubJAtVX03/+GUhPZ6s7EREREZGVMKQTWYiPDxAWJs6rm5e+dKk4stWdiIiIiMg6GNKJLMaVeelc1Z2IiIiIyJqkh/T33nsPcXFxCAoKQo8ePbB58+Yq719QUIB//etfaNGiBQIDA9GqVSssWLDAoNESyefKCu/Ore4DBxoyLCIiIiIi0oDUfdKXLFmCxx9/HO+99x569+6NefPm4eabb8a+ffvQvHnzCj9n1KhRyMjIwPz589G6dWtkZmaiuLjY4JETyeNKSFdXdb/9dra6ExERERFZidSQPnPmTEyYMAETJ04EAMyaNQs//PAD3n//fbz22mvl7r969Wps3LgRx44dQ3h4OAAgNjbWyCETSVddu7vdzlZ3IiIiIiKrktbuXlhYiB07dmDQoEFlbh80aBB++eWXCj/nu+++Q8+ePTFjxgw0adIEbdu2xfTp03Hp0qVKn6egoAC5ubllPoisrLpK+s8/A2lpYoG5m24yblxERERERFR70irpWVlZKCkpQXR0dJnbo6OjkZ6eXuHnHDt2DFu2bEFQUBC+/vprZGVl4eGHH8a5c+cqnZf+2muv4cUXX9R8/ESyVFdJZ6s7EREREZF1SV84zqZu+vwXRVHK3aay2+2w2WxYtGgRrr76atxyyy2YOXMmPvnkk0qr6U8//TRycnJKP06dOqX5ayAyUlWVdLa6ExERERFZm7RKemRkJHx9fctVzTMzM8tV11WNGjVCkyZNEKZuFA2gQ4cOUBQFp0+fRps2bcp9TmBgIAIDA7UdPJFEVVXSf/kFSE0FQkPZ6k5EREREZEXSKukBAQHo0aMH1qxZU+b2NWvWoFevXhV+Tu/evZGamooLFy6U3nbo0CH4+PigadOmuo6XyCyqqqSrre533AHwvSkiIiIiIuuR2u4+bdo0fPzxx1iwYAH279+PqVOn4uTJk5g0aRIA0ao+fvz40vuPGTMGERERuO+++7Bv3z5s2rQJTzzxBO6//37UqVNH1ssgMlRllXS7HVi2TJyz1Z2IiIiIyJqkbsF29913Izs7Gy+99BLS0tIQHx+PxMREtGjRAgCQlpaGkydPlt4/ODgYa9aswWOPPYaePXsiIiICo0aNwiuvvCLrJRAZrrJKOlvdiYiIiIisz6YoiiJ7EEbKzc1FWFgYcnJyEBoaKns4RG47cADo0EFU1J2D+pQpwJw5wLhxwGefSRseERERERFdwZ0cKn11dyJyj9runpMjWtwBtroTEREREXkKhnQii1FDuqIAubnifOtWR6v7oEHShkZERERERLXEkE5kMUFB4gNwLB6nrup+221c1Z2IiIiIyMoY0oksyHnxOLa6ExERERF5DoZ0Igty3oZt2zbgzBkgJISt7kREREREVid1CzYiqhnnSvrmzeL8ttscbfBERERERGRNrKQTWZAa0s+dc7S6jxolbzxERERERKQNhnQiC1Lb3VevBk6fZqs7EREREZGnYEgnsiC1kv7tt+LIVnciIiIiIs/AkE5kQWolvbhYHLmqOxERERGRZ2BIJ7IgtZIOiFb3wYPljYWIiIiIiLTDkE5kQWolHQCGDWOrOxERERGRp2BIJ7Ig50o6W92JiIiIiDwHQzqRBUVEiGNwMFvdiYiIiIg8iZ/sARCR+3r3Bh5+WBzr1JE9GiIiIiIi0gpDOpEF+foC774rexRERERERKQ1trsTERERERERmQRDOhEREREREZFJMKQTERERERERmQRDOhEREREREZFJMKQTERERERERmQRDOhEREREREZFJMKQTERERERERmQRDOhEREREREZFJMKQTERERERERmQRDOhEREREREZFJMKQTERERERERmQRDOhEREREREZFJMKQTERERERERmQRDOhEREREREZFJMKQTERERERERmQRDOhEREREREZFJMKQTERERERERmQRDOhEREREREZFJ+MkegNEURQEA5ObmSh4JEREREREReQM1f6p5tCpeF9Lz8vIAAM2aNZM8EiIiIiIiIvImeXl5CAsLq/I+NsWVKO9B7HY7UlNTERISApvN5vbn5+bmolmzZjh16hRCQ0N1GCFpjdfMenjNrIfXzHp4zayH18x6eM2sh9fMeqxyzRRFQV5eHho3bgwfn6pnnXtdJd3HxwdNmzat9eOEhoaa+j8BlcdrZj28ZtbDa2Y9vGbWw2tmPbxm1sNrZj1WuGbVVdBVXDiOiIiIiIiIyCQY0omIiIiIiIhMgiHdTYGBgXj++ecRGBgoeyjkIl4z6+E1sx5eM+vhNbMeXjPr4TWzHl4z6/HEa+Z1C8cRERERERERmRUr6UREREREREQmwZBOREREREREZBIM6UREREREREQmwZBOREREREREZBJeF9Jfe+01XHXVVQgJCUFUVBTuuOMOHDx4sMx9FEXBCy+8gMaNG6NOnTro378/9u7dW+Y+H374Ifr374/Q0FDYbDb8+eefZf5+w4YNsNlsFX5s375d75fpUYy6ZgBw6NAh3H777YiMjERoaCh69+6N9evX6/nyPJKR1+yPP/7ATTfdhPr16yMiIgIPPvggLly4oOfL80haXLNz587hscceQ7t27VC3bl00b94ckydPRk5OTpnHOX/+PMaNG4ewsDCEhYVh3LhxFV5bqp6R1+3VV19Fr169ULduXdSvX9+Il+dxjLpeJ06cwIQJExAXF4c6deqgVatWeP7551FYWGjYa/UURn6N3XbbbWjevDmCgoLQqFEjjBs3DqmpqYa8Tk9i5DVTFRQUoGvXrrDZbEhOTtbz5XksI69bbGxsuXz2z3/+05DX6SqvC+kbN27EI488gm3btmHNmjUoLi7GoEGDcPHixdL7zJgxAzNnzsQ777yD7du3IyYmBjfddBPy8vJK75Ofn48hQ4bgmWeeqfB5evXqhbS0tDIfEydORGxsLHr27Kn76/QkRl0zALj11ltRXFyMdevWYceOHejatSuGDh2K9PR0XV+jpzHqmqWmpmLgwIFo3bo1fv31V6xevRp79+7Fvffeq/dL9DhaXLPU1FSkpqbizTffxO7du/HJJ59g9erVmDBhQpnnGjNmDJKTk7F69WqsXr0aycnJGDdunKGv11MYed0KCwtx11134R//+Iehr9GTGHW9Dhw4ALvdjnnz5mHv3r14++238cEHH1T5848qZuTX2IABA7B06VIcPHgQy5cvx9GjRzFy5EhDX68nMPKaqZ588kk0btzYkNfnqYy+bi+99FKZnPbss88a9lpdoni5zMxMBYCyceNGRVEUxW63KzExMcp//vOf0vtcvnxZCQsLUz744INyn79+/XoFgHL+/Pkqn6ewsFCJiopSXnrpJU3H7430umZnz55VACibNm0qvS03N1cBoKxdu1afF+Ml9Lpm8+bNU6KiopSSkpLS25KSkhQAyuHDh/V5MV6ittdMtXTpUiUgIEApKipSFEVR9u3bpwBQtm3bVnqfrVu3KgCUAwcO6PRqvIde183ZwoULlbCwMM3H7o2MuF6qGTNmKHFxcdoN3ksZec2+/fZbxWazKYWFhdq9AC+k9zVLTExU2rdvr+zdu1cBoCQlJenyOryNntetRYsWyttvv63b2LXgdZX0K6ntD+Hh4QCA48ePIz09HYMGDSq9T2BgIPr164dffvmlxs/z3XffISsrixU+Deh1zSIiItChQwd89tlnuHjxIoqLizFv3jxER0ejR48e2r4IL6PXNSsoKEBAQAB8fBzfyurUqQMA2LJlixZD91paXbOcnByEhobCz88PALB161aEhYXhmmuuKb3Ptddei7CwsFp9jyVBr+tG+jDyeuXk5JQ+D9WcUdfs3LlzWLRoEXr16gV/f38NX4H30fOaZWRk4IEHHsB///tf1K1bV6dX4J30/lp7/fXXERERga5du+LVV1813XQgrw7piqJg2rRp6NOnD+Lj4wGgtK05Ojq6zH2jo6Nr1fI8f/58DB48GM2aNav5gEnXa2az2bBmzRokJSUhJCQEQUFBePvtt7F69WrOv6wFPa/ZDTfcgPT0dLzxxhsoLCzE+fPnS9s509LSNHoF3kera5adnY2XX34ZDz30UOlt6enpiIqKKnffqKgoTiupJT2vG2nPyOt19OhRzJ07F5MmTdJo9N7JiGv21FNPoV69eoiIiMDJkyfx7bffavwqvIue10xRFNx7772YNGkSp7JqTO+vtSlTpmDx4sVYv349Hn30UcyaNQsPP/ywDq+k5rz6LfJHH30Uu3btqrDiZrPZyvxZUZRyt7nq9OnT+OGHH7B06dIafT456HnNFEXBww8/jKioKGzevBl16tTBxx9/jKFDh2L79u1o1KhRrcfv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",
|
| 200 |
+
"text/plain": [
|
| 201 |
+
"<Figure size 1200x600 with 1 Axes>"
|
| 202 |
+
]
|
| 203 |
+
},
|
| 204 |
+
"metadata": {},
|
| 205 |
+
"output_type": "display_data"
|
| 206 |
+
}
|
| 207 |
+
],
|
| 208 |
+
"source": [
|
| 209 |
+
"test_predictions = nf.predict()\n",
|
| 210 |
+
"\n",
|
| 211 |
+
"# %%\n",
|
| 212 |
+
"# Plot actual vs. forecasted revenue\n",
|
| 213 |
+
"plt.figure(figsize=(12, 6))\n",
|
| 214 |
+
"plt.plot(train_df[\"ds\"], train_df[\"y\"], label=\"Train Data\", color=\"blue\")\n",
|
| 215 |
+
"plt.plot(val_df[\"ds\"], val_df[\"y\"], label=\"Validation Data\", color=\"orange\")\n",
|
| 216 |
+
"plt.plot(test_df[\"ds\"], test_df[\"y\"], label=\"Test Data\", color=\"green\", linestyle=\"dashed\", marker=\"o\")\n",
|
| 217 |
+
"plt.plot(test_df[\"ds\"], test_predictions[best_model_name].values[:len(test_df)], label=f\"Forecast ({best_model_name})\", linestyle=\"dashed\", marker=\"x\", color=\"red\")\n",
|
| 218 |
+
"plt.xlabel(\"Year\")\n",
|
| 219 |
+
"plt.ylabel(\"Revenue\")\n",
|
| 220 |
+
"plt.title(f\"NeuralForecast: Best Model ({best_model_name}) for {company} Revenue\")\n",
|
| 221 |
+
"plt.legend()\n",
|
| 222 |
+
"plt.show()\n",
|
| 223 |
+
"\n"
|
| 224 |
+
]
|
| 225 |
+
},
|
| 226 |
+
{
|
| 227 |
+
"cell_type": "code",
|
| 228 |
+
"execution_count": 7,
|
| 229 |
+
"metadata": {},
|
| 230 |
+
"outputs": [
|
| 231 |
+
{
|
| 232 |
+
"name": "stdout",
|
| 233 |
+
"output_type": "stream",
|
| 234 |
+
"text": [
|
| 235 |
+
"\n",
|
| 236 |
+
"📌 Final Test MAE (PatchTST): 2708826167.75\n"
|
| 237 |
+
]
|
| 238 |
+
}
|
| 239 |
+
],
|
| 240 |
+
"source": [
|
| 241 |
+
"# %%\n",
|
| 242 |
+
"# Evaluate final model on test data\n",
|
| 243 |
+
"test_mae = mean_absolute_error(test_df[\"y\"].values, test_predictions[best_model_name].values[:len(test_df)])\n",
|
| 244 |
+
"print(f\"\\n📌 Final Test MAE ({best_model_name}): {test_mae:.2f}\")"
|
| 245 |
+
]
|
| 246 |
+
},
|
| 247 |
+
{
|
| 248 |
+
"cell_type": "code",
|
| 249 |
+
"execution_count": null,
|
| 250 |
+
"metadata": {},
|
| 251 |
+
"outputs": [],
|
| 252 |
+
"source": []
|
| 253 |
+
}
|
| 254 |
+
],
|
| 255 |
+
"metadata": {
|
| 256 |
+
"kernelspec": {
|
| 257 |
+
"display_name": "ai_env",
|
| 258 |
+
"language": "python",
|
| 259 |
+
"name": "python3"
|
| 260 |
+
},
|
| 261 |
+
"language_info": {
|
| 262 |
+
"codemirror_mode": {
|
| 263 |
+
"name": "ipython",
|
| 264 |
+
"version": 3
|
| 265 |
+
},
|
| 266 |
+
"file_extension": ".py",
|
| 267 |
+
"mimetype": "text/x-python",
|
| 268 |
+
"name": "python",
|
| 269 |
+
"nbconvert_exporter": "python",
|
| 270 |
+
"pygments_lexer": "ipython3",
|
| 271 |
+
"version": "3.10.16"
|
| 272 |
+
}
|
| 273 |
+
},
|
| 274 |
+
"nbformat": 4,
|
| 275 |
+
"nbformat_minor": 2
|
| 276 |
+
}
|
dev_notebooks/12_company_analysis/one_by_one_univariate_12_company copy.ipynb
ADDED
|
@@ -0,0 +1,1226 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 7,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [],
|
| 8 |
+
"source": [
|
| 9 |
+
"import pandas as pd\n",
|
| 10 |
+
"import numpy as np\n",
|
| 11 |
+
"import itertools\n",
|
| 12 |
+
"import plotly.express as px\n",
|
| 13 |
+
"import plotly.graph_objects as go\n",
|
| 14 |
+
"import matplotlib.pyplot as plt\n",
|
| 15 |
+
"import warnings\n",
|
| 16 |
+
"from statsmodels.tsa.statespace.sarimax import SARIMAX\n",
|
| 17 |
+
"from sklearn.metrics import mean_absolute_error, mean_squared_error, mean_absolute_percentage_error, r2_score\n",
|
| 18 |
+
"from sklearn.model_selection import TimeSeriesSplit\n",
|
| 19 |
+
"from rich.console import Console\n",
|
| 20 |
+
"from rich.progress import Progress\n",
|
| 21 |
+
"\n",
|
| 22 |
+
"# Suppress warnings\n",
|
| 23 |
+
"warnings.filterwarnings(\"ignore\")\n",
|
| 24 |
+
"console = Console()\n"
|
| 25 |
+
]
|
| 26 |
+
},
|
| 27 |
+
{
|
| 28 |
+
"cell_type": "code",
|
| 29 |
+
"execution_count": 8,
|
| 30 |
+
"metadata": {},
|
| 31 |
+
"outputs": [],
|
| 32 |
+
"source": [
|
| 33 |
+
"def load_data(filepath):\n",
|
| 34 |
+
" \"\"\"\n",
|
| 35 |
+
" Load the dataset from a CSV file.\n",
|
| 36 |
+
" \"\"\"\n",
|
| 37 |
+
" df = pd.read_csv(filepath)\n",
|
| 38 |
+
" df[\"Period\"] = pd.to_datetime(df[\"Period\"], format=\"%m/%d/%Y\")\n",
|
| 39 |
+
" return df"
|
| 40 |
+
]
|
| 41 |
+
},
|
| 42 |
+
{
|
| 43 |
+
"cell_type": "code",
|
| 44 |
+
"execution_count": 9,
|
| 45 |
+
"metadata": {},
|
| 46 |
+
"outputs": [],
|
| 47 |
+
"source": [
|
| 48 |
+
"def preprocess_data(df, company):\n",
|
| 49 |
+
" \"\"\"\n",
|
| 50 |
+
" Preprocesses data for a given company.\n",
|
| 51 |
+
" - Filters the dataset for the selected company.\n",
|
| 52 |
+
" - Sorts values by the period.\n",
|
| 53 |
+
" - Converts the Revenue column to numeric format to handle any non-numeric values.\n",
|
| 54 |
+
" This ensures that calculations such as forecasting and error measurements work correctly.\n",
|
| 55 |
+
" \"\"\"\n",
|
| 56 |
+
" company_df = df[df[\"Company\"] == company].copy()\n",
|
| 57 |
+
" company_df = company_df.sort_values(by=\"Period\")\n",
|
| 58 |
+
" company_df.set_index(\"Period\", inplace=True)\n",
|
| 59 |
+
" company_df[\"Revenue\"] = pd.to_numeric(company_df[\"Revenue\"], errors=\"coerce\")\n",
|
| 60 |
+
" return company_df[\"Revenue\"].dropna()"
|
| 61 |
+
]
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"cell_type": "code",
|
| 65 |
+
"execution_count": 10,
|
| 66 |
+
"metadata": {},
|
| 67 |
+
"outputs": [],
|
| 68 |
+
"source": [
|
| 69 |
+
"def train_sarima(train, test, best_cfg):\n",
|
| 70 |
+
" \"\"\"\n",
|
| 71 |
+
" Train the best SARIMA model and evaluate its performance.\n",
|
| 72 |
+
"\n",
|
| 73 |
+
" Args:\n",
|
| 74 |
+
" train (pd.Series): Training data.\n",
|
| 75 |
+
" test (pd.Series): Test data.\n",
|
| 76 |
+
" best_cfg (tuple): Best SARIMA hyperparameters.\n",
|
| 77 |
+
"\n",
|
| 78 |
+
" Returns:\n",
|
| 79 |
+
" dict: Model performance metrics.\n",
|
| 80 |
+
" \"\"\"\n",
|
| 81 |
+
" best_p, best_d, best_q, best_P, best_D, best_Q = best_cfg\n",
|
| 82 |
+
" S = 4 # Quarterly seasonality\n",
|
| 83 |
+
"\n",
|
| 84 |
+
" # Train SARIMA model with best configuration\n",
|
| 85 |
+
" optimized_model = SARIMAX(\n",
|
| 86 |
+
" train, order=(best_p, best_d, best_q),\n",
|
| 87 |
+
" seasonal_order=(best_P, best_D, best_Q, S),\n",
|
| 88 |
+
" enforce_stationarity=False, enforce_invertibility=False\n",
|
| 89 |
+
" )\n",
|
| 90 |
+
" optimized_model_fit = optimized_model.fit(disp=False)\n",
|
| 91 |
+
"\n",
|
| 92 |
+
" # Make predictions\n",
|
| 93 |
+
" optimized_predictions = optimized_model_fit.forecast(steps=len(test))\n",
|
| 94 |
+
"\n",
|
| 95 |
+
" # Compute performance metrics\n",
|
| 96 |
+
" optimized_mae = mean_absolute_error(test, optimized_predictions)\n",
|
| 97 |
+
" optimized_rmse = np.sqrt(mean_squared_error(test, optimized_predictions))\n",
|
| 98 |
+
" optimized_mape = mean_absolute_percentage_error(test, optimized_predictions)\n",
|
| 99 |
+
" optimized_r2 = r2_score(test, optimized_predictions)\n",
|
| 100 |
+
"\n",
|
| 101 |
+
" # Compute MASE (Mean Absolute Scaled Error)\n",
|
| 102 |
+
" naive_forecast = test.shift(1).dropna()\n",
|
| 103 |
+
" test_aligned = test.loc[naive_forecast.index] # Align lengths\n",
|
| 104 |
+
" mase_denominator = mean_absolute_error(test_aligned, naive_forecast)\n",
|
| 105 |
+
" optimized_mase = optimized_mae / mase_denominator if mase_denominator != 0 else np.nan\n",
|
| 106 |
+
"\n",
|
| 107 |
+
" return {\n",
|
| 108 |
+
" \"Best SARIMA Order\": best_cfg,\n",
|
| 109 |
+
" \"MAE\": optimized_mae,\n",
|
| 110 |
+
" \"RMSE\": optimized_rmse,\n",
|
| 111 |
+
" \"MAPE\": optimized_mape,\n",
|
| 112 |
+
" \"MASE\": optimized_mase,\n",
|
| 113 |
+
" \"R² Score\": optimized_r2\n",
|
| 114 |
+
" }\n",
|
| 115 |
+
"\n",
|
| 116 |
+
"def process_company(company, results):\n",
|
| 117 |
+
" \"\"\"\n",
|
| 118 |
+
" Processes a single company's data:\n",
|
| 119 |
+
" - Preprocess the data.\n",
|
| 120 |
+
" - Find the best SARIMA model.\n",
|
| 121 |
+
" - Train and evaluate the model.\n",
|
| 122 |
+
" - Store the results.\n",
|
| 123 |
+
" \"\"\"\n",
|
| 124 |
+
" console.print(f\"🚀 [bold blue]Processing {company}...[/bold blue]\")\n",
|
| 125 |
+
" series = preprocess_data(df, company)\n",
|
| 126 |
+
"\n",
|
| 127 |
+
" if len(series) < 10:\n",
|
| 128 |
+
" console.print(f\"⚠️ [yellow]Skipping {company} due to insufficient data points.[/yellow]\")\n",
|
| 129 |
+
" return results\n",
|
| 130 |
+
"\n",
|
| 131 |
+
" # Split data into train/test\n",
|
| 132 |
+
" train_size = int(len(series) * 0.8)\n",
|
| 133 |
+
" train, test = series[:train_size], series[train_size:]\n",
|
| 134 |
+
"\n",
|
| 135 |
+
" # Find best SARIMA order\n",
|
| 136 |
+
" best_cfg = find_best_sarima(train)\n",
|
| 137 |
+
" console.print(f\"📊 [bold green]Best SARIMA order for {company}: {best_cfg}[/bold green]\")\n",
|
| 138 |
+
"\n",
|
| 139 |
+
" # Train and evaluate SARIMA model\n",
|
| 140 |
+
" results[company] = train_sarima(train, test, best_cfg)\n",
|
| 141 |
+
"\n",
|
| 142 |
+
" return results\n",
|
| 143 |
+
"\n",
|
| 144 |
+
"\n",
|
| 145 |
+
"def find_best_sarima(train):\n",
|
| 146 |
+
" \"\"\"\n",
|
| 147 |
+
" Find the best SARIMA model using grid search.\n",
|
| 148 |
+
" \n",
|
| 149 |
+
" Parameter Ranges:\n",
|
| 150 |
+
" - `p_values` (Auto-Regressive terms): Typically, 0-2 is sufficient to capture most patterns.\n",
|
| 151 |
+
" - `d_values` (Differencing terms): 0-1 is generally enough for stationarity.\n",
|
| 152 |
+
" - `q_values` (Moving Average terms): 0-2 captures most real-world data behavior.\n",
|
| 153 |
+
" - `P_values` (Seasonal AR terms): Usually, 0-1 suffices for seasonal effects.\n",
|
| 154 |
+
" - `D_values` (Seasonal Differencing): Typically, 0-1 is sufficient for removing seasonal trends.\n",
|
| 155 |
+
" - `Q_values` (Seasonal MA terms): 0-1 captures most seasonal variations.\n",
|
| 156 |
+
" - `S`: Set to 4, assuming quarterly seasonality (adjust for different datasets).\n",
|
| 157 |
+
" \"\"\"\n",
|
| 158 |
+
" p_values = range(0, 3)\n",
|
| 159 |
+
" d_values = range(0, 2)\n",
|
| 160 |
+
" q_values = range(0, 3)\n",
|
| 161 |
+
" P_values = range(0, 2)\n",
|
| 162 |
+
" D_values = range(0, 2)\n",
|
| 163 |
+
" Q_values = range(0, 2)\n",
|
| 164 |
+
" S = 4 # Quarterly seasonality\n",
|
| 165 |
+
"\n",
|
| 166 |
+
" best_score, best_cfg = float(\"inf\"), None\n",
|
| 167 |
+
" total_combinations = len(p_values) * len(d_values) * len(q_values) * len(P_values) * len(D_values) * len(Q_values)\n",
|
| 168 |
+
"\n",
|
| 169 |
+
" console.print(f\"🔍 [bold cyan]Searching best SARIMA model... ({total_combinations} combinations)[/bold cyan]\")\n",
|
| 170 |
+
"\n",
|
| 171 |
+
" with Progress() as progress:\n",
|
| 172 |
+
" task = progress.add_task(\"[green]Optimizing SARIMA...\", total=total_combinations)\n",
|
| 173 |
+
"\n",
|
| 174 |
+
" for p, d, q, P, D, Q in itertools.product(p_values, d_values, q_values, P_values, D_values, Q_values):\n",
|
| 175 |
+
" if q == Q:\n",
|
| 176 |
+
" continue\n",
|
| 177 |
+
" try:\n",
|
| 178 |
+
" model = SARIMAX(train, order=(p, d, q), seasonal_order=(P, D, Q, S),\n",
|
| 179 |
+
" enforce_stationarity=False, enforce_invertibility=False)\n",
|
| 180 |
+
" model_fit = model.fit(disp=False)\n",
|
| 181 |
+
" predictions = model_fit.forecast(steps=len(train))\n",
|
| 182 |
+
" error = mean_absolute_error(train, predictions)\n",
|
| 183 |
+
" if error < best_score:\n",
|
| 184 |
+
" best_score, best_cfg = error, (p, d, q, P, D, Q)\n",
|
| 185 |
+
" except:\n",
|
| 186 |
+
" continue\n",
|
| 187 |
+
" progress.update(task, advance=1)\n",
|
| 188 |
+
"\n",
|
| 189 |
+
" console.print(f\"✅ [bold green]Best SARIMA order found:[/bold green] {best_cfg} with MAE = {best_score:.2f}\")\n",
|
| 190 |
+
" return best_cfg"
|
| 191 |
+
]
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"cell_type": "code",
|
| 195 |
+
"execution_count": null,
|
| 196 |
+
"metadata": {},
|
| 197 |
+
"outputs": [],
|
| 198 |
+
"source": []
|
| 199 |
+
},
|
| 200 |
+
{
|
| 201 |
+
"cell_type": "code",
|
| 202 |
+
"execution_count": 11,
|
| 203 |
+
"metadata": {},
|
| 204 |
+
"outputs": [],
|
| 205 |
+
"source": [
|
| 206 |
+
"def main(filepath):\n",
|
| 207 |
+
" \"\"\"\n",
|
| 208 |
+
" Main function to run the SARIMA model pipeline.\n",
|
| 209 |
+
" \n",
|
| 210 |
+
" Steps:\n",
|
| 211 |
+
" 1. Load the dataset.\n",
|
| 212 |
+
" 2. Iterate through each unique company in the dataset.\n",
|
| 213 |
+
" 3. Preprocess the data for each company.\n",
|
| 214 |
+
" 4. Optimize the SARIMA parameters using grid search.\n",
|
| 215 |
+
" 5. Validate the model using Walk-Forward Validation and Time-Series Cross-Validation.\n",
|
| 216 |
+
" 6. Store the results and display them as a dataframe.\n",
|
| 217 |
+
" \"\"\"\n",
|
| 218 |
+
" global df\n",
|
| 219 |
+
" df = load_data(filepath)\n",
|
| 220 |
+
" results = {}\n",
|
| 221 |
+
" for company in df[\"Company\"].unique():\n",
|
| 222 |
+
" results = process_company(company, results)\n",
|
| 223 |
+
" results_df = pd.DataFrame.from_dict(results, orient='index')\n",
|
| 224 |
+
" print(results_df)\n"
|
| 225 |
+
]
|
| 226 |
+
},
|
| 227 |
+
{
|
| 228 |
+
"cell_type": "code",
|
| 229 |
+
"execution_count": 12,
|
| 230 |
+
"metadata": {},
|
| 231 |
+
"outputs": [
|
| 232 |
+
{
|
| 233 |
+
"data": {
|
| 234 |
+
"text/html": [
|
| 235 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing Volkswagen AG...</span>\n",
|
| 236 |
+
"</pre>\n"
|
| 237 |
+
],
|
| 238 |
+
"text/plain": [
|
| 239 |
+
"🚀 \u001b[1;34mProcessing Volkswagen AG\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 240 |
+
]
|
| 241 |
+
},
|
| 242 |
+
"metadata": {},
|
| 243 |
+
"output_type": "display_data"
|
| 244 |
+
},
|
| 245 |
+
{
|
| 246 |
+
"data": {
|
| 247 |
+
"text/html": [
|
| 248 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 249 |
+
"</pre>\n"
|
| 250 |
+
],
|
| 251 |
+
"text/plain": [
|
| 252 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 253 |
+
]
|
| 254 |
+
},
|
| 255 |
+
"metadata": {},
|
| 256 |
+
"output_type": "display_data"
|
| 257 |
+
},
|
| 258 |
+
{
|
| 259 |
+
"data": {
|
| 260 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 261 |
+
"model_id": "0d8ff1559392461fa984ddbba1fad58a",
|
| 262 |
+
"version_major": 2,
|
| 263 |
+
"version_minor": 0
|
| 264 |
+
},
|
| 265 |
+
"text/plain": [
|
| 266 |
+
"Output()"
|
| 267 |
+
]
|
| 268 |
+
},
|
| 269 |
+
"metadata": {},
|
| 270 |
+
"output_type": "display_data"
|
| 271 |
+
},
|
| 272 |
+
{
|
| 273 |
+
"data": {
|
| 274 |
+
"text/html": [
|
| 275 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 276 |
+
],
|
| 277 |
+
"text/plain": []
|
| 278 |
+
},
|
| 279 |
+
"metadata": {},
|
| 280 |
+
"output_type": "display_data"
|
| 281 |
+
},
|
| 282 |
+
{
|
| 283 |
+
"data": {
|
| 284 |
+
"text/html": [
|
| 285 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2306532197.55</span>\n",
|
| 286 |
+
"</pre>\n"
|
| 287 |
+
],
|
| 288 |
+
"text/plain": [
|
| 289 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m2306532197.55\u001b[0m\n"
|
| 290 |
+
]
|
| 291 |
+
},
|
| 292 |
+
"metadata": {},
|
| 293 |
+
"output_type": "display_data"
|
| 294 |
+
},
|
| 295 |
+
{
|
| 296 |
+
"data": {
|
| 297 |
+
"text/html": [
|
| 298 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for Volkswagen AG: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 299 |
+
"</pre>\n"
|
| 300 |
+
],
|
| 301 |
+
"text/plain": [
|
| 302 |
+
"📊 \u001b[1;32mBest SARIMA order for Volkswagen AG: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 303 |
+
]
|
| 304 |
+
},
|
| 305 |
+
"metadata": {},
|
| 306 |
+
"output_type": "display_data"
|
| 307 |
+
},
|
| 308 |
+
{
|
| 309 |
+
"data": {
|
| 310 |
+
"text/html": [
|
| 311 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing Siemens AG...</span>\n",
|
| 312 |
+
"</pre>\n"
|
| 313 |
+
],
|
| 314 |
+
"text/plain": [
|
| 315 |
+
"🚀 \u001b[1;34mProcessing Siemens AG\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 316 |
+
]
|
| 317 |
+
},
|
| 318 |
+
"metadata": {},
|
| 319 |
+
"output_type": "display_data"
|
| 320 |
+
},
|
| 321 |
+
{
|
| 322 |
+
"data": {
|
| 323 |
+
"text/html": [
|
| 324 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 325 |
+
"</pre>\n"
|
| 326 |
+
],
|
| 327 |
+
"text/plain": [
|
| 328 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 329 |
+
]
|
| 330 |
+
},
|
| 331 |
+
"metadata": {},
|
| 332 |
+
"output_type": "display_data"
|
| 333 |
+
},
|
| 334 |
+
{
|
| 335 |
+
"data": {
|
| 336 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 337 |
+
"model_id": "46833b725aab4b0b9cd676f7345781b8",
|
| 338 |
+
"version_major": 2,
|
| 339 |
+
"version_minor": 0
|
| 340 |
+
},
|
| 341 |
+
"text/plain": [
|
| 342 |
+
"Output()"
|
| 343 |
+
]
|
| 344 |
+
},
|
| 345 |
+
"metadata": {},
|
| 346 |
+
"output_type": "display_data"
|
| 347 |
+
},
|
| 348 |
+
{
|
| 349 |
+
"data": {
|
| 350 |
+
"text/html": [
|
| 351 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 352 |
+
],
|
| 353 |
+
"text/plain": []
|
| 354 |
+
},
|
| 355 |
+
"metadata": {},
|
| 356 |
+
"output_type": "display_data"
|
| 357 |
+
},
|
| 358 |
+
{
|
| 359 |
+
"data": {
|
| 360 |
+
"text/html": [
|
| 361 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3888506250.14</span>\n",
|
| 362 |
+
"</pre>\n"
|
| 363 |
+
],
|
| 364 |
+
"text/plain": [
|
| 365 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m3888506250.14\u001b[0m\n"
|
| 366 |
+
]
|
| 367 |
+
},
|
| 368 |
+
"metadata": {},
|
| 369 |
+
"output_type": "display_data"
|
| 370 |
+
},
|
| 371 |
+
{
|
| 372 |
+
"data": {
|
| 373 |
+
"text/html": [
|
| 374 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for Siemens AG: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 375 |
+
"</pre>\n"
|
| 376 |
+
],
|
| 377 |
+
"text/plain": [
|
| 378 |
+
"📊 \u001b[1;32mBest SARIMA order for Siemens AG: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 379 |
+
]
|
| 380 |
+
},
|
| 381 |
+
"metadata": {},
|
| 382 |
+
"output_type": "display_data"
|
| 383 |
+
},
|
| 384 |
+
{
|
| 385 |
+
"data": {
|
| 386 |
+
"text/html": [
|
| 387 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing Allianz SE...</span>\n",
|
| 388 |
+
"</pre>\n"
|
| 389 |
+
],
|
| 390 |
+
"text/plain": [
|
| 391 |
+
"🚀 \u001b[1;34mProcessing Allianz SE\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 392 |
+
]
|
| 393 |
+
},
|
| 394 |
+
"metadata": {},
|
| 395 |
+
"output_type": "display_data"
|
| 396 |
+
},
|
| 397 |
+
{
|
| 398 |
+
"data": {
|
| 399 |
+
"text/html": [
|
| 400 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 401 |
+
"</pre>\n"
|
| 402 |
+
],
|
| 403 |
+
"text/plain": [
|
| 404 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 405 |
+
]
|
| 406 |
+
},
|
| 407 |
+
"metadata": {},
|
| 408 |
+
"output_type": "display_data"
|
| 409 |
+
},
|
| 410 |
+
{
|
| 411 |
+
"data": {
|
| 412 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 413 |
+
"model_id": "cb5efe06c5f241509b0a59a254e45a90",
|
| 414 |
+
"version_major": 2,
|
| 415 |
+
"version_minor": 0
|
| 416 |
+
},
|
| 417 |
+
"text/plain": [
|
| 418 |
+
"Output()"
|
| 419 |
+
]
|
| 420 |
+
},
|
| 421 |
+
"metadata": {},
|
| 422 |
+
"output_type": "display_data"
|
| 423 |
+
},
|
| 424 |
+
{
|
| 425 |
+
"data": {
|
| 426 |
+
"text/html": [
|
| 427 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 428 |
+
],
|
| 429 |
+
"text/plain": []
|
| 430 |
+
},
|
| 431 |
+
"metadata": {},
|
| 432 |
+
"output_type": "display_data"
|
| 433 |
+
},
|
| 434 |
+
{
|
| 435 |
+
"data": {
|
| 436 |
+
"text/html": [
|
| 437 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3116318448.62</span>\n",
|
| 438 |
+
"</pre>\n"
|
| 439 |
+
],
|
| 440 |
+
"text/plain": [
|
| 441 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m3116318448.62\u001b[0m\n"
|
| 442 |
+
]
|
| 443 |
+
},
|
| 444 |
+
"metadata": {},
|
| 445 |
+
"output_type": "display_data"
|
| 446 |
+
},
|
| 447 |
+
{
|
| 448 |
+
"data": {
|
| 449 |
+
"text/html": [
|
| 450 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for Allianz SE: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 451 |
+
"</pre>\n"
|
| 452 |
+
],
|
| 453 |
+
"text/plain": [
|
| 454 |
+
"📊 \u001b[1;32mBest SARIMA order for Allianz SE: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 455 |
+
]
|
| 456 |
+
},
|
| 457 |
+
"metadata": {},
|
| 458 |
+
"output_type": "display_data"
|
| 459 |
+
},
|
| 460 |
+
{
|
| 461 |
+
"data": {
|
| 462 |
+
"text/html": [
|
| 463 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing BMW AG...</span>\n",
|
| 464 |
+
"</pre>\n"
|
| 465 |
+
],
|
| 466 |
+
"text/plain": [
|
| 467 |
+
"🚀 \u001b[1;34mProcessing BMW AG\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 468 |
+
]
|
| 469 |
+
},
|
| 470 |
+
"metadata": {},
|
| 471 |
+
"output_type": "display_data"
|
| 472 |
+
},
|
| 473 |
+
{
|
| 474 |
+
"data": {
|
| 475 |
+
"text/html": [
|
| 476 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 477 |
+
"</pre>\n"
|
| 478 |
+
],
|
| 479 |
+
"text/plain": [
|
| 480 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 481 |
+
]
|
| 482 |
+
},
|
| 483 |
+
"metadata": {},
|
| 484 |
+
"output_type": "display_data"
|
| 485 |
+
},
|
| 486 |
+
{
|
| 487 |
+
"data": {
|
| 488 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 489 |
+
"model_id": "651cc8991afe40449b8ba6a883aa0747",
|
| 490 |
+
"version_major": 2,
|
| 491 |
+
"version_minor": 0
|
| 492 |
+
},
|
| 493 |
+
"text/plain": [
|
| 494 |
+
"Output()"
|
| 495 |
+
]
|
| 496 |
+
},
|
| 497 |
+
"metadata": {},
|
| 498 |
+
"output_type": "display_data"
|
| 499 |
+
},
|
| 500 |
+
{
|
| 501 |
+
"data": {
|
| 502 |
+
"text/html": [
|
| 503 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 504 |
+
],
|
| 505 |
+
"text/plain": []
|
| 506 |
+
},
|
| 507 |
+
"metadata": {},
|
| 508 |
+
"output_type": "display_data"
|
| 509 |
+
},
|
| 510 |
+
{
|
| 511 |
+
"data": {
|
| 512 |
+
"text/html": [
|
| 513 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3927821316.65</span>\n",
|
| 514 |
+
"</pre>\n"
|
| 515 |
+
],
|
| 516 |
+
"text/plain": [
|
| 517 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m3927821316.65\u001b[0m\n"
|
| 518 |
+
]
|
| 519 |
+
},
|
| 520 |
+
"metadata": {},
|
| 521 |
+
"output_type": "display_data"
|
| 522 |
+
},
|
| 523 |
+
{
|
| 524 |
+
"data": {
|
| 525 |
+
"text/html": [
|
| 526 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for BMW AG: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 527 |
+
"</pre>\n"
|
| 528 |
+
],
|
| 529 |
+
"text/plain": [
|
| 530 |
+
"📊 \u001b[1;32mBest SARIMA order for BMW AG: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 531 |
+
]
|
| 532 |
+
},
|
| 533 |
+
"metadata": {},
|
| 534 |
+
"output_type": "display_data"
|
| 535 |
+
},
|
| 536 |
+
{
|
| 537 |
+
"data": {
|
| 538 |
+
"text/html": [
|
| 539 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing BASF SE...</span>\n",
|
| 540 |
+
"</pre>\n"
|
| 541 |
+
],
|
| 542 |
+
"text/plain": [
|
| 543 |
+
"🚀 \u001b[1;34mProcessing BASF SE\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 544 |
+
]
|
| 545 |
+
},
|
| 546 |
+
"metadata": {},
|
| 547 |
+
"output_type": "display_data"
|
| 548 |
+
},
|
| 549 |
+
{
|
| 550 |
+
"data": {
|
| 551 |
+
"text/html": [
|
| 552 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 553 |
+
"</pre>\n"
|
| 554 |
+
],
|
| 555 |
+
"text/plain": [
|
| 556 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 557 |
+
]
|
| 558 |
+
},
|
| 559 |
+
"metadata": {},
|
| 560 |
+
"output_type": "display_data"
|
| 561 |
+
},
|
| 562 |
+
{
|
| 563 |
+
"data": {
|
| 564 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 565 |
+
"model_id": "ed3776471d644d2690ccb2fc4afa1c87",
|
| 566 |
+
"version_major": 2,
|
| 567 |
+
"version_minor": 0
|
| 568 |
+
},
|
| 569 |
+
"text/plain": [
|
| 570 |
+
"Output()"
|
| 571 |
+
]
|
| 572 |
+
},
|
| 573 |
+
"metadata": {},
|
| 574 |
+
"output_type": "display_data"
|
| 575 |
+
},
|
| 576 |
+
{
|
| 577 |
+
"data": {
|
| 578 |
+
"text/html": [
|
| 579 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 580 |
+
],
|
| 581 |
+
"text/plain": []
|
| 582 |
+
},
|
| 583 |
+
"metadata": {},
|
| 584 |
+
"output_type": "display_data"
|
| 585 |
+
},
|
| 586 |
+
{
|
| 587 |
+
"data": {
|
| 588 |
+
"text/html": [
|
| 589 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3186751477.35</span>\n",
|
| 590 |
+
"</pre>\n"
|
| 591 |
+
],
|
| 592 |
+
"text/plain": [
|
| 593 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m3186751477.35\u001b[0m\n"
|
| 594 |
+
]
|
| 595 |
+
},
|
| 596 |
+
"metadata": {},
|
| 597 |
+
"output_type": "display_data"
|
| 598 |
+
},
|
| 599 |
+
{
|
| 600 |
+
"data": {
|
| 601 |
+
"text/html": [
|
| 602 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for BASF SE: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 603 |
+
"</pre>\n"
|
| 604 |
+
],
|
| 605 |
+
"text/plain": [
|
| 606 |
+
"📊 \u001b[1;32mBest SARIMA order for BASF SE: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 607 |
+
]
|
| 608 |
+
},
|
| 609 |
+
"metadata": {},
|
| 610 |
+
"output_type": "display_data"
|
| 611 |
+
},
|
| 612 |
+
{
|
| 613 |
+
"data": {
|
| 614 |
+
"text/html": [
|
| 615 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing Deutsche Telekom AG...</span>\n",
|
| 616 |
+
"</pre>\n"
|
| 617 |
+
],
|
| 618 |
+
"text/plain": [
|
| 619 |
+
"🚀 \u001b[1;34mProcessing Deutsche Telekom AG\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 620 |
+
]
|
| 621 |
+
},
|
| 622 |
+
"metadata": {},
|
| 623 |
+
"output_type": "display_data"
|
| 624 |
+
},
|
| 625 |
+
{
|
| 626 |
+
"data": {
|
| 627 |
+
"text/html": [
|
| 628 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 629 |
+
"</pre>\n"
|
| 630 |
+
],
|
| 631 |
+
"text/plain": [
|
| 632 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 633 |
+
]
|
| 634 |
+
},
|
| 635 |
+
"metadata": {},
|
| 636 |
+
"output_type": "display_data"
|
| 637 |
+
},
|
| 638 |
+
{
|
| 639 |
+
"data": {
|
| 640 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 641 |
+
"model_id": "37ff962481f341d7b7d23edf17c5f044",
|
| 642 |
+
"version_major": 2,
|
| 643 |
+
"version_minor": 0
|
| 644 |
+
},
|
| 645 |
+
"text/plain": [
|
| 646 |
+
"Output()"
|
| 647 |
+
]
|
| 648 |
+
},
|
| 649 |
+
"metadata": {},
|
| 650 |
+
"output_type": "display_data"
|
| 651 |
+
},
|
| 652 |
+
{
|
| 653 |
+
"data": {
|
| 654 |
+
"text/html": [
|
| 655 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 656 |
+
],
|
| 657 |
+
"text/plain": []
|
| 658 |
+
},
|
| 659 |
+
"metadata": {},
|
| 660 |
+
"output_type": "display_data"
|
| 661 |
+
},
|
| 662 |
+
{
|
| 663 |
+
"data": {
|
| 664 |
+
"text/html": [
|
| 665 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3387525924.91</span>\n",
|
| 666 |
+
"</pre>\n"
|
| 667 |
+
],
|
| 668 |
+
"text/plain": [
|
| 669 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m3387525924.91\u001b[0m\n"
|
| 670 |
+
]
|
| 671 |
+
},
|
| 672 |
+
"metadata": {},
|
| 673 |
+
"output_type": "display_data"
|
| 674 |
+
},
|
| 675 |
+
{
|
| 676 |
+
"data": {
|
| 677 |
+
"text/html": [
|
| 678 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for Deutsche Telekom AG: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 679 |
+
"</pre>\n"
|
| 680 |
+
],
|
| 681 |
+
"text/plain": [
|
| 682 |
+
"📊 \u001b[1;32mBest SARIMA order for Deutsche Telekom AG: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 683 |
+
]
|
| 684 |
+
},
|
| 685 |
+
"metadata": {},
|
| 686 |
+
"output_type": "display_data"
|
| 687 |
+
},
|
| 688 |
+
{
|
| 689 |
+
"data": {
|
| 690 |
+
"text/html": [
|
| 691 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing Daimler AG...</span>\n",
|
| 692 |
+
"</pre>\n"
|
| 693 |
+
],
|
| 694 |
+
"text/plain": [
|
| 695 |
+
"🚀 \u001b[1;34mProcessing Daimler AG\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 696 |
+
]
|
| 697 |
+
},
|
| 698 |
+
"metadata": {},
|
| 699 |
+
"output_type": "display_data"
|
| 700 |
+
},
|
| 701 |
+
{
|
| 702 |
+
"data": {
|
| 703 |
+
"text/html": [
|
| 704 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 705 |
+
"</pre>\n"
|
| 706 |
+
],
|
| 707 |
+
"text/plain": [
|
| 708 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 709 |
+
]
|
| 710 |
+
},
|
| 711 |
+
"metadata": {},
|
| 712 |
+
"output_type": "display_data"
|
| 713 |
+
},
|
| 714 |
+
{
|
| 715 |
+
"data": {
|
| 716 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 717 |
+
"model_id": "ecf074c3b8064ce3be060c07ebc157c4",
|
| 718 |
+
"version_major": 2,
|
| 719 |
+
"version_minor": 0
|
| 720 |
+
},
|
| 721 |
+
"text/plain": [
|
| 722 |
+
"Output()"
|
| 723 |
+
]
|
| 724 |
+
},
|
| 725 |
+
"metadata": {},
|
| 726 |
+
"output_type": "display_data"
|
| 727 |
+
},
|
| 728 |
+
{
|
| 729 |
+
"data": {
|
| 730 |
+
"text/html": [
|
| 731 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 732 |
+
],
|
| 733 |
+
"text/plain": []
|
| 734 |
+
},
|
| 735 |
+
"metadata": {},
|
| 736 |
+
"output_type": "display_data"
|
| 737 |
+
},
|
| 738 |
+
{
|
| 739 |
+
"data": {
|
| 740 |
+
"text/html": [
|
| 741 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3536048815.70</span>\n",
|
| 742 |
+
"</pre>\n"
|
| 743 |
+
],
|
| 744 |
+
"text/plain": [
|
| 745 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m3536048815.70\u001b[0m\n"
|
| 746 |
+
]
|
| 747 |
+
},
|
| 748 |
+
"metadata": {},
|
| 749 |
+
"output_type": "display_data"
|
| 750 |
+
},
|
| 751 |
+
{
|
| 752 |
+
"data": {
|
| 753 |
+
"text/html": [
|
| 754 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for Daimler AG: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 755 |
+
"</pre>\n"
|
| 756 |
+
],
|
| 757 |
+
"text/plain": [
|
| 758 |
+
"📊 \u001b[1;32mBest SARIMA order for Daimler AG: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 759 |
+
]
|
| 760 |
+
},
|
| 761 |
+
"metadata": {},
|
| 762 |
+
"output_type": "display_data"
|
| 763 |
+
},
|
| 764 |
+
{
|
| 765 |
+
"data": {
|
| 766 |
+
"text/html": [
|
| 767 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing SAP SE...</span>\n",
|
| 768 |
+
"</pre>\n"
|
| 769 |
+
],
|
| 770 |
+
"text/plain": [
|
| 771 |
+
"🚀 \u001b[1;34mProcessing SAP SE\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 772 |
+
]
|
| 773 |
+
},
|
| 774 |
+
"metadata": {},
|
| 775 |
+
"output_type": "display_data"
|
| 776 |
+
},
|
| 777 |
+
{
|
| 778 |
+
"data": {
|
| 779 |
+
"text/html": [
|
| 780 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 781 |
+
"</pre>\n"
|
| 782 |
+
],
|
| 783 |
+
"text/plain": [
|
| 784 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 785 |
+
]
|
| 786 |
+
},
|
| 787 |
+
"metadata": {},
|
| 788 |
+
"output_type": "display_data"
|
| 789 |
+
},
|
| 790 |
+
{
|
| 791 |
+
"data": {
|
| 792 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 793 |
+
"model_id": "9a1be6f8eb7543ecadfd275284186e28",
|
| 794 |
+
"version_major": 2,
|
| 795 |
+
"version_minor": 0
|
| 796 |
+
},
|
| 797 |
+
"text/plain": [
|
| 798 |
+
"Output()"
|
| 799 |
+
]
|
| 800 |
+
},
|
| 801 |
+
"metadata": {},
|
| 802 |
+
"output_type": "display_data"
|
| 803 |
+
},
|
| 804 |
+
{
|
| 805 |
+
"data": {
|
| 806 |
+
"text/html": [
|
| 807 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 808 |
+
],
|
| 809 |
+
"text/plain": []
|
| 810 |
+
},
|
| 811 |
+
"metadata": {},
|
| 812 |
+
"output_type": "display_data"
|
| 813 |
+
},
|
| 814 |
+
{
|
| 815 |
+
"data": {
|
| 816 |
+
"text/html": [
|
| 817 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4058082892.89</span>\n",
|
| 818 |
+
"</pre>\n"
|
| 819 |
+
],
|
| 820 |
+
"text/plain": [
|
| 821 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m4058082892.89\u001b[0m\n"
|
| 822 |
+
]
|
| 823 |
+
},
|
| 824 |
+
"metadata": {},
|
| 825 |
+
"output_type": "display_data"
|
| 826 |
+
},
|
| 827 |
+
{
|
| 828 |
+
"data": {
|
| 829 |
+
"text/html": [
|
| 830 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for SAP SE: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 831 |
+
"</pre>\n"
|
| 832 |
+
],
|
| 833 |
+
"text/plain": [
|
| 834 |
+
"📊 \u001b[1;32mBest SARIMA order for SAP SE: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 835 |
+
]
|
| 836 |
+
},
|
| 837 |
+
"metadata": {},
|
| 838 |
+
"output_type": "display_data"
|
| 839 |
+
},
|
| 840 |
+
{
|
| 841 |
+
"data": {
|
| 842 |
+
"text/html": [
|
| 843 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing Bayer AG...</span>\n",
|
| 844 |
+
"</pre>\n"
|
| 845 |
+
],
|
| 846 |
+
"text/plain": [
|
| 847 |
+
"🚀 \u001b[1;34mProcessing Bayer AG\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 848 |
+
]
|
| 849 |
+
},
|
| 850 |
+
"metadata": {},
|
| 851 |
+
"output_type": "display_data"
|
| 852 |
+
},
|
| 853 |
+
{
|
| 854 |
+
"data": {
|
| 855 |
+
"text/html": [
|
| 856 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 857 |
+
"</pre>\n"
|
| 858 |
+
],
|
| 859 |
+
"text/plain": [
|
| 860 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 861 |
+
]
|
| 862 |
+
},
|
| 863 |
+
"metadata": {},
|
| 864 |
+
"output_type": "display_data"
|
| 865 |
+
},
|
| 866 |
+
{
|
| 867 |
+
"data": {
|
| 868 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 869 |
+
"model_id": "ea781864236349ce9ebd9f440fa8154d",
|
| 870 |
+
"version_major": 2,
|
| 871 |
+
"version_minor": 0
|
| 872 |
+
},
|
| 873 |
+
"text/plain": [
|
| 874 |
+
"Output()"
|
| 875 |
+
]
|
| 876 |
+
},
|
| 877 |
+
"metadata": {},
|
| 878 |
+
"output_type": "display_data"
|
| 879 |
+
},
|
| 880 |
+
{
|
| 881 |
+
"data": {
|
| 882 |
+
"text/html": [
|
| 883 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 884 |
+
],
|
| 885 |
+
"text/plain": []
|
| 886 |
+
},
|
| 887 |
+
"metadata": {},
|
| 888 |
+
"output_type": "display_data"
|
| 889 |
+
},
|
| 890 |
+
{
|
| 891 |
+
"data": {
|
| 892 |
+
"text/html": [
|
| 893 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2839841256.54</span>\n",
|
| 894 |
+
"</pre>\n"
|
| 895 |
+
],
|
| 896 |
+
"text/plain": [
|
| 897 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m2839841256.54\u001b[0m\n"
|
| 898 |
+
]
|
| 899 |
+
},
|
| 900 |
+
"metadata": {},
|
| 901 |
+
"output_type": "display_data"
|
| 902 |
+
},
|
| 903 |
+
{
|
| 904 |
+
"data": {
|
| 905 |
+
"text/html": [
|
| 906 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for Bayer AG: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 907 |
+
"</pre>\n"
|
| 908 |
+
],
|
| 909 |
+
"text/plain": [
|
| 910 |
+
"📊 \u001b[1;32mBest SARIMA order for Bayer AG: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 911 |
+
]
|
| 912 |
+
},
|
| 913 |
+
"metadata": {},
|
| 914 |
+
"output_type": "display_data"
|
| 915 |
+
},
|
| 916 |
+
{
|
| 917 |
+
"data": {
|
| 918 |
+
"text/html": [
|
| 919 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing Deutsche Bank AG...</span>\n",
|
| 920 |
+
"</pre>\n"
|
| 921 |
+
],
|
| 922 |
+
"text/plain": [
|
| 923 |
+
"🚀 \u001b[1;34mProcessing Deutsche Bank AG\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 924 |
+
]
|
| 925 |
+
},
|
| 926 |
+
"metadata": {},
|
| 927 |
+
"output_type": "display_data"
|
| 928 |
+
},
|
| 929 |
+
{
|
| 930 |
+
"data": {
|
| 931 |
+
"text/html": [
|
| 932 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 933 |
+
"</pre>\n"
|
| 934 |
+
],
|
| 935 |
+
"text/plain": [
|
| 936 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 937 |
+
]
|
| 938 |
+
},
|
| 939 |
+
"metadata": {},
|
| 940 |
+
"output_type": "display_data"
|
| 941 |
+
},
|
| 942 |
+
{
|
| 943 |
+
"data": {
|
| 944 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 945 |
+
"model_id": "cb0a71f3db064b23ae264047a4adcaf1",
|
| 946 |
+
"version_major": 2,
|
| 947 |
+
"version_minor": 0
|
| 948 |
+
},
|
| 949 |
+
"text/plain": [
|
| 950 |
+
"Output()"
|
| 951 |
+
]
|
| 952 |
+
},
|
| 953 |
+
"metadata": {},
|
| 954 |
+
"output_type": "display_data"
|
| 955 |
+
},
|
| 956 |
+
{
|
| 957 |
+
"data": {
|
| 958 |
+
"text/html": [
|
| 959 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 960 |
+
],
|
| 961 |
+
"text/plain": []
|
| 962 |
+
},
|
| 963 |
+
"metadata": {},
|
| 964 |
+
"output_type": "display_data"
|
| 965 |
+
},
|
| 966 |
+
{
|
| 967 |
+
"data": {
|
| 968 |
+
"text/html": [
|
| 969 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3148602585.67</span>\n",
|
| 970 |
+
"</pre>\n"
|
| 971 |
+
],
|
| 972 |
+
"text/plain": [
|
| 973 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m3148602585.67\u001b[0m\n"
|
| 974 |
+
]
|
| 975 |
+
},
|
| 976 |
+
"metadata": {},
|
| 977 |
+
"output_type": "display_data"
|
| 978 |
+
},
|
| 979 |
+
{
|
| 980 |
+
"data": {
|
| 981 |
+
"text/html": [
|
| 982 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for Deutsche Bank AG: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 983 |
+
"</pre>\n"
|
| 984 |
+
],
|
| 985 |
+
"text/plain": [
|
| 986 |
+
"📊 \u001b[1;32mBest SARIMA order for Deutsche Bank AG: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 987 |
+
]
|
| 988 |
+
},
|
| 989 |
+
"metadata": {},
|
| 990 |
+
"output_type": "display_data"
|
| 991 |
+
},
|
| 992 |
+
{
|
| 993 |
+
"data": {
|
| 994 |
+
"text/html": [
|
| 995 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing Porsche AG...</span>\n",
|
| 996 |
+
"</pre>\n"
|
| 997 |
+
],
|
| 998 |
+
"text/plain": [
|
| 999 |
+
"🚀 \u001b[1;34mProcessing Porsche AG\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 1000 |
+
]
|
| 1001 |
+
},
|
| 1002 |
+
"metadata": {},
|
| 1003 |
+
"output_type": "display_data"
|
| 1004 |
+
},
|
| 1005 |
+
{
|
| 1006 |
+
"data": {
|
| 1007 |
+
"text/html": [
|
| 1008 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 1009 |
+
"</pre>\n"
|
| 1010 |
+
],
|
| 1011 |
+
"text/plain": [
|
| 1012 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 1013 |
+
]
|
| 1014 |
+
},
|
| 1015 |
+
"metadata": {},
|
| 1016 |
+
"output_type": "display_data"
|
| 1017 |
+
},
|
| 1018 |
+
{
|
| 1019 |
+
"data": {
|
| 1020 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 1021 |
+
"model_id": "9c18dd4edc9642f7a28f5e575cd9429d",
|
| 1022 |
+
"version_major": 2,
|
| 1023 |
+
"version_minor": 0
|
| 1024 |
+
},
|
| 1025 |
+
"text/plain": [
|
| 1026 |
+
"Output()"
|
| 1027 |
+
]
|
| 1028 |
+
},
|
| 1029 |
+
"metadata": {},
|
| 1030 |
+
"output_type": "display_data"
|
| 1031 |
+
},
|
| 1032 |
+
{
|
| 1033 |
+
"data": {
|
| 1034 |
+
"text/html": [
|
| 1035 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 1036 |
+
],
|
| 1037 |
+
"text/plain": []
|
| 1038 |
+
},
|
| 1039 |
+
"metadata": {},
|
| 1040 |
+
"output_type": "display_data"
|
| 1041 |
+
},
|
| 1042 |
+
{
|
| 1043 |
+
"data": {
|
| 1044 |
+
"text/html": [
|
| 1045 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2956625321.60</span>\n",
|
| 1046 |
+
"</pre>\n"
|
| 1047 |
+
],
|
| 1048 |
+
"text/plain": [
|
| 1049 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m2956625321.60\u001b[0m\n"
|
| 1050 |
+
]
|
| 1051 |
+
},
|
| 1052 |
+
"metadata": {},
|
| 1053 |
+
"output_type": "display_data"
|
| 1054 |
+
},
|
| 1055 |
+
{
|
| 1056 |
+
"data": {
|
| 1057 |
+
"text/html": [
|
| 1058 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for Porsche AG: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 1059 |
+
"</pre>\n"
|
| 1060 |
+
],
|
| 1061 |
+
"text/plain": [
|
| 1062 |
+
"📊 \u001b[1;32mBest SARIMA order for Porsche AG: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 1063 |
+
]
|
| 1064 |
+
},
|
| 1065 |
+
"metadata": {},
|
| 1066 |
+
"output_type": "display_data"
|
| 1067 |
+
},
|
| 1068 |
+
{
|
| 1069 |
+
"data": {
|
| 1070 |
+
"text/html": [
|
| 1071 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🚀 <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">Processing Merck KGaA...</span>\n",
|
| 1072 |
+
"</pre>\n"
|
| 1073 |
+
],
|
| 1074 |
+
"text/plain": [
|
| 1075 |
+
"🚀 \u001b[1;34mProcessing Merck KGaA\u001b[0m\u001b[1;34m...\u001b[0m\n"
|
| 1076 |
+
]
|
| 1077 |
+
},
|
| 1078 |
+
"metadata": {},
|
| 1079 |
+
"output_type": "display_data"
|
| 1080 |
+
},
|
| 1081 |
+
{
|
| 1082 |
+
"data": {
|
| 1083 |
+
"text/html": [
|
| 1084 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🔍 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Searching best SARIMA model... (</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">144</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations)</span>\n",
|
| 1085 |
+
"</pre>\n"
|
| 1086 |
+
],
|
| 1087 |
+
"text/plain": [
|
| 1088 |
+
"🔍 \u001b[1;36mSearching best SARIMA model\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m144\u001b[0m\u001b[1;36m combinations\u001b[0m\u001b[1;36m)\u001b[0m\n"
|
| 1089 |
+
]
|
| 1090 |
+
},
|
| 1091 |
+
"metadata": {},
|
| 1092 |
+
"output_type": "display_data"
|
| 1093 |
+
},
|
| 1094 |
+
{
|
| 1095 |
+
"data": {
|
| 1096 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 1097 |
+
"model_id": "6eab33e4717249689dbcdb1895eee919",
|
| 1098 |
+
"version_major": 2,
|
| 1099 |
+
"version_minor": 0
|
| 1100 |
+
},
|
| 1101 |
+
"text/plain": [
|
| 1102 |
+
"Output()"
|
| 1103 |
+
]
|
| 1104 |
+
},
|
| 1105 |
+
"metadata": {},
|
| 1106 |
+
"output_type": "display_data"
|
| 1107 |
+
},
|
| 1108 |
+
{
|
| 1109 |
+
"data": {
|
| 1110 |
+
"text/html": [
|
| 1111 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 1112 |
+
],
|
| 1113 |
+
"text/plain": []
|
| 1114 |
+
},
|
| 1115 |
+
"metadata": {},
|
| 1116 |
+
"output_type": "display_data"
|
| 1117 |
+
},
|
| 1118 |
+
{
|
| 1119 |
+
"data": {
|
| 1120 |
+
"text/html": [
|
| 1121 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3593527704.42</span>\n",
|
| 1122 |
+
"</pre>\n"
|
| 1123 |
+
],
|
| 1124 |
+
"text/plain": [
|
| 1125 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m3593527704.42\u001b[0m\n"
|
| 1126 |
+
]
|
| 1127 |
+
},
|
| 1128 |
+
"metadata": {},
|
| 1129 |
+
"output_type": "display_data"
|
| 1130 |
+
},
|
| 1131 |
+
{
|
| 1132 |
+
"data": {
|
| 1133 |
+
"text/html": [
|
| 1134 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">📊 <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order for Merck KGaA: (</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">2</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">0</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">, </span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">1</span><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">)</span>\n",
|
| 1135 |
+
"</pre>\n"
|
| 1136 |
+
],
|
| 1137 |
+
"text/plain": [
|
| 1138 |
+
"📊 \u001b[1;32mBest SARIMA order for Merck KGaA: \u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m2\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m0\u001b[0m\u001b[1;32m, \u001b[0m\u001b[1;32m1\u001b[0m\u001b[1;32m)\u001b[0m\n"
|
| 1139 |
+
]
|
| 1140 |
+
},
|
| 1141 |
+
"metadata": {},
|
| 1142 |
+
"output_type": "display_data"
|
| 1143 |
+
},
|
| 1144 |
+
{
|
| 1145 |
+
"name": "stdout",
|
| 1146 |
+
"output_type": "stream",
|
| 1147 |
+
"text": [
|
| 1148 |
+
" Best SARIMA Order MAE RMSE MAPE \\\n",
|
| 1149 |
+
"Volkswagen AG (0, 0, 2, 0, 1, 0) 2.965775e+09 3.591599e+09 0.267049 \n",
|
| 1150 |
+
"Siemens AG (0, 1, 0, 0, 0, 1) 3.384833e+09 3.781294e+09 0.356424 \n",
|
| 1151 |
+
"Allianz SE (0, 1, 2, 0, 0, 1) 4.659838e+09 5.217301e+09 0.443738 \n",
|
| 1152 |
+
"BMW AG (2, 1, 1, 1, 0, 0) 3.908350e+09 4.430682e+09 0.398364 \n",
|
| 1153 |
+
"BASF SE (0, 1, 2, 1, 0, 0) 3.206611e+09 4.004590e+09 0.225905 \n",
|
| 1154 |
+
"Deutsche Telekom AG (2, 1, 1, 1, 0, 0) 4.798453e+09 5.774398e+09 0.618780 \n",
|
| 1155 |
+
"Daimler AG (2, 0, 2, 0, 1, 1) 4.064572e+09 4.735020e+09 0.505780 \n",
|
| 1156 |
+
"SAP SE (0, 1, 2, 1, 0, 0) 2.461732e+09 2.998258e+09 0.214557 \n",
|
| 1157 |
+
"Bayer AG (1, 1, 1, 0, 0, 0) 4.306329e+09 4.629554e+09 0.535126 \n",
|
| 1158 |
+
"Deutsche Bank AG (2, 0, 2, 1, 1, 1) 5.508653e+09 6.387944e+09 0.389402 \n",
|
| 1159 |
+
"Porsche AG (0, 1, 2, 1, 0, 1) 5.326442e+09 5.831061e+09 0.345923 \n",
|
| 1160 |
+
"Merck KGaA (1, 0, 2, 0, 0, 1) 4.115437e+09 4.516064e+09 0.277715 \n",
|
| 1161 |
+
"\n",
|
| 1162 |
+
" MASE R² Score \n",
|
| 1163 |
+
"Volkswagen AG 0.609831 -0.607107 \n",
|
| 1164 |
+
"Siemens AG 0.774242 -0.893854 \n",
|
| 1165 |
+
"Allianz SE 0.627911 -0.021448 \n",
|
| 1166 |
+
"BMW AG 0.860351 -0.092528 \n",
|
| 1167 |
+
"BASF SE 0.581394 -0.370256 \n",
|
| 1168 |
+
"Deutsche Telekom AG 0.739504 -0.416678 \n",
|
| 1169 |
+
"Daimler AG 0.592707 -0.126419 \n",
|
| 1170 |
+
"SAP SE 0.615539 0.029654 \n",
|
| 1171 |
+
"Bayer AG 1.228979 -1.517118 \n",
|
| 1172 |
+
"Deutsche Bank AG 0.752349 -0.729597 \n",
|
| 1173 |
+
"Porsche AG 1.780631 -10.643312 \n",
|
| 1174 |
+
"Merck KGaA 1.424593 -0.346031 \n"
|
| 1175 |
+
]
|
| 1176 |
+
}
|
| 1177 |
+
],
|
| 1178 |
+
"source": [
|
| 1179 |
+
"# Run the script\n",
|
| 1180 |
+
"main(\"../data/Top_12_German_Companies_Financial_Data.csv\")\n"
|
| 1181 |
+
]
|
| 1182 |
+
},
|
| 1183 |
+
{
|
| 1184 |
+
"cell_type": "code",
|
| 1185 |
+
"execution_count": null,
|
| 1186 |
+
"metadata": {},
|
| 1187 |
+
"outputs": [],
|
| 1188 |
+
"source": []
|
| 1189 |
+
},
|
| 1190 |
+
{
|
| 1191 |
+
"cell_type": "code",
|
| 1192 |
+
"execution_count": null,
|
| 1193 |
+
"metadata": {},
|
| 1194 |
+
"outputs": [],
|
| 1195 |
+
"source": []
|
| 1196 |
+
},
|
| 1197 |
+
{
|
| 1198 |
+
"cell_type": "code",
|
| 1199 |
+
"execution_count": null,
|
| 1200 |
+
"metadata": {},
|
| 1201 |
+
"outputs": [],
|
| 1202 |
+
"source": []
|
| 1203 |
+
}
|
| 1204 |
+
],
|
| 1205 |
+
"metadata": {
|
| 1206 |
+
"kernelspec": {
|
| 1207 |
+
"display_name": "ai_env",
|
| 1208 |
+
"language": "python",
|
| 1209 |
+
"name": "python3"
|
| 1210 |
+
},
|
| 1211 |
+
"language_info": {
|
| 1212 |
+
"codemirror_mode": {
|
| 1213 |
+
"name": "ipython",
|
| 1214 |
+
"version": 3
|
| 1215 |
+
},
|
| 1216 |
+
"file_extension": ".py",
|
| 1217 |
+
"mimetype": "text/x-python",
|
| 1218 |
+
"name": "python",
|
| 1219 |
+
"nbconvert_exporter": "python",
|
| 1220 |
+
"pygments_lexer": "ipython3",
|
| 1221 |
+
"version": "3.10.16"
|
| 1222 |
+
}
|
| 1223 |
+
},
|
| 1224 |
+
"nbformat": 4,
|
| 1225 |
+
"nbformat_minor": 2
|
| 1226 |
+
}
|
dev_notebooks/12_company_analysis/one_by_one_univariate_12_company.ipynb
ADDED
|
@@ -0,0 +1,2223 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 16,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [],
|
| 8 |
+
"source": [
|
| 9 |
+
"import pandas as pd\n",
|
| 10 |
+
"import numpy as np\n",
|
| 11 |
+
"import itertools\n",
|
| 12 |
+
"import plotly.express as px\n",
|
| 13 |
+
"import plotly.graph_objects as go\n",
|
| 14 |
+
"from statsmodels.tsa.statespace.sarimax import SARIMAX\n",
|
| 15 |
+
"from sklearn.metrics import mean_absolute_error, mean_squared_error, mean_absolute_percentage_error, r2_score\n",
|
| 16 |
+
"from rich.console import Console\n",
|
| 17 |
+
"from rich.progress import Progress\n",
|
| 18 |
+
"\n",
|
| 19 |
+
"console = Console()\n",
|
| 20 |
+
"import warnings\n",
|
| 21 |
+
"# Suppress warnings\n",
|
| 22 |
+
"warnings.filterwarnings(\"ignore\")"
|
| 23 |
+
]
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"cell_type": "code",
|
| 27 |
+
"execution_count": 17,
|
| 28 |
+
"metadata": {},
|
| 29 |
+
"outputs": [],
|
| 30 |
+
"source": [
|
| 31 |
+
"# Load the dataset\n",
|
| 32 |
+
"df = pd.read_csv(\"../data/Top_12_German_Companies_Financial_Data.csv\")\n",
|
| 33 |
+
"\n",
|
| 34 |
+
"# Convert Period column to datetime format\n",
|
| 35 |
+
"df[\"Period\"] = pd.to_datetime(df[\"Period\"], format=\"%m/%d/%Y\")"
|
| 36 |
+
]
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"cell_type": "code",
|
| 40 |
+
"execution_count": 18,
|
| 41 |
+
"metadata": {},
|
| 42 |
+
"outputs": [
|
| 43 |
+
{
|
| 44 |
+
"name": "stdout",
|
| 45 |
+
"output_type": "stream",
|
| 46 |
+
"text": [
|
| 47 |
+
"Unique Companies ['Volkswagen AG' 'Siemens AG' 'Allianz SE' 'BMW AG' 'BASF SE'\n",
|
| 48 |
+
" 'Deutsche Telekom AG' 'Daimler AG' 'SAP SE' 'Bayer AG' 'Deutsche Bank AG'\n",
|
| 49 |
+
" 'Porsche AG' 'Merck KGaA']\n"
|
| 50 |
+
]
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"source": [
|
| 54 |
+
"print(\"Unique Companies\", df[\"Company\"].unique())"
|
| 55 |
+
]
|
| 56 |
+
},
|
| 57 |
+
{
|
| 58 |
+
"cell_type": "code",
|
| 59 |
+
"execution_count": 19,
|
| 60 |
+
"metadata": {},
|
| 61 |
+
"outputs": [],
|
| 62 |
+
"source": [
|
| 63 |
+
"def load_data(filepath):\n",
|
| 64 |
+
" df = pd.read_csv(filepath)\n",
|
| 65 |
+
" df[\"Period\"] = pd.to_datetime(df[\"Period\"], format=\"%m/%d/%Y\")\n",
|
| 66 |
+
" return df\n",
|
| 67 |
+
"\n",
|
| 68 |
+
"def preprocess_data(df, company):\n",
|
| 69 |
+
" company_df = df[df[\"Company\"] == company].copy()\n",
|
| 70 |
+
" company_df = company_df.sort_values(by=\"Period\")\n",
|
| 71 |
+
" company_df.set_index(\"Period\", inplace=True)\n",
|
| 72 |
+
" company_df[\"Revenue\"] = pd.to_numeric(company_df[\"Revenue\"], errors=\"coerce\")\n",
|
| 73 |
+
" return company_df[\"Revenue\"].dropna()\n",
|
| 74 |
+
"\n",
|
| 75 |
+
"def split_data(series, train_ratio=0.8):\n",
|
| 76 |
+
" split_index = int(len(series) * train_ratio)\n",
|
| 77 |
+
" return series[:split_index], series[split_index:]\n",
|
| 78 |
+
"\n",
|
| 79 |
+
"def find_best_sarima(train, test):\n",
|
| 80 |
+
" p_values = range(0, 5) # AR terms\n",
|
| 81 |
+
" d_values = range(0, 3) # Differencing terms\n",
|
| 82 |
+
" q_values = range(0, 3) # MA terms\n",
|
| 83 |
+
" P_values = range(0, 3) # Seasonal AR terms\n",
|
| 84 |
+
" D_values = range(0, 2) # Seasonal differencing terms\n",
|
| 85 |
+
" Q_values = range(0, 2) # Seasonal MA terms\n",
|
| 86 |
+
" S = 4 # Seasonality (quarterly)\n",
|
| 87 |
+
"\n",
|
| 88 |
+
" best_score, best_cfg = float(\"inf\"), None\n",
|
| 89 |
+
"\n",
|
| 90 |
+
" total_iterations = len(list(itertools.product(p_values, d_values, q_values, P_values, D_values, Q_values)))\n",
|
| 91 |
+
" \n",
|
| 92 |
+
" console.print(f\"🧐 [bold cyan]Starting SARIMA tuning... {total_iterations} combinations to check.[/bold cyan]\")\n",
|
| 93 |
+
"\n",
|
| 94 |
+
" with Progress() as progress:\n",
|
| 95 |
+
" task = progress.add_task(\"[green]Optimizing SARIMA...\", total=total_iterations)\n",
|
| 96 |
+
"\n",
|
| 97 |
+
" for p, d, q, P, D, Q in itertools.product(p_values, d_values, q_values, P_values, D_values, Q_values):\n",
|
| 98 |
+
" if q == Q: # Avoid conflicts\n",
|
| 99 |
+
" continue \n",
|
| 100 |
+
"\n",
|
| 101 |
+
" try:\n",
|
| 102 |
+
" model = SARIMAX(train, order=(p, d, q), seasonal_order=(P, D, Q, S),\n",
|
| 103 |
+
" enforce_stationarity=False, enforce_invertibility=False)\n",
|
| 104 |
+
" model_fit = model.fit(disp=False)\n",
|
| 105 |
+
" predictions = model_fit.forecast(steps=len(test))\n",
|
| 106 |
+
" error = mean_absolute_error(test, predictions)\n",
|
| 107 |
+
" if error < best_score:\n",
|
| 108 |
+
" best_score, best_cfg = error, (p, d, q, P, D, Q)\n",
|
| 109 |
+
"\n",
|
| 110 |
+
" except:\n",
|
| 111 |
+
" continue\n",
|
| 112 |
+
"\n",
|
| 113 |
+
" progress.update(task, advance=1)\n",
|
| 114 |
+
"\n",
|
| 115 |
+
" console.print(f\"✅ [bold green]Best SARIMA order found:[/bold green] {best_cfg} with MAE = {best_score:.2f}\")\n",
|
| 116 |
+
" \n",
|
| 117 |
+
" return best_cfg\n",
|
| 118 |
+
"\n",
|
| 119 |
+
"def train_sarima(train, best_cfg):\n",
|
| 120 |
+
" best_p, best_d, best_q, best_P, best_D, best_Q = best_cfg\n",
|
| 121 |
+
" model = SARIMAX(train, order=(best_p, best_d, best_q), seasonal_order=(best_P, best_D, best_Q, 4),\n",
|
| 122 |
+
" enforce_stationarity=False, enforce_invertibility=False)\n",
|
| 123 |
+
" return model.fit(disp=False)\n",
|
| 124 |
+
"\n",
|
| 125 |
+
"def evaluate_model(test, predictions):\n",
|
| 126 |
+
" metrics = {\n",
|
| 127 |
+
" \"MAE\": mean_absolute_error(test, predictions),\n",
|
| 128 |
+
" \"RMSE\": np.sqrt(mean_squared_error(test, predictions)),\n",
|
| 129 |
+
" \"MAPE\": mean_absolute_percentage_error(test, predictions),\n",
|
| 130 |
+
" \"R² Score\": r2_score(test, predictions)\n",
|
| 131 |
+
" }\n",
|
| 132 |
+
" naive_forecast = test.shift(1).dropna()\n",
|
| 133 |
+
" mase_denominator = mean_absolute_error(test.loc[naive_forecast.index], naive_forecast) if not naive_forecast.empty else np.nan\n",
|
| 134 |
+
" metrics[\"MASE\"] = metrics[\"MAE\"] / mase_denominator if mase_denominator != 0 else np.nan\n",
|
| 135 |
+
" return metrics\n",
|
| 136 |
+
"\n",
|
| 137 |
+
"def plot_forecast(test, predictions, conf_int, company):\n",
|
| 138 |
+
" fig = go.Figure()\n",
|
| 139 |
+
" fig.add_trace(go.Scatter(x=test.index, y=test, mode='lines+markers', name='Actual Revenue'))\n",
|
| 140 |
+
" fig.add_trace(go.Scatter(x=test.index, y=predictions, mode='lines+markers', name='Optimized SARIMA Forecast', line=dict(dash='dash')))\n",
|
| 141 |
+
" fig.add_trace(go.Scatter(x=test.index, y=conf_int.iloc[:, 0], fill=None, mode='lines', line=dict(color='lightgray'), name='Lower Bound'))\n",
|
| 142 |
+
" fig.add_trace(go.Scatter(x=test.index, y=conf_int.iloc[:, 1], fill='tonexty', mode='lines', line=dict(color='lightgray'), name='Upper Bound'))\n",
|
| 143 |
+
" fig.update_layout(title=f\"Optimized SARIMA Forecast - {company} Revenue\", xaxis_title=\"Year\", yaxis_title=\"Revenue\")\n",
|
| 144 |
+
" fig.show()\n",
|
| 145 |
+
"\n",
|
| 146 |
+
"def plot_residuals(test, predictions, company):\n",
|
| 147 |
+
" residuals = test - predictions\n",
|
| 148 |
+
" fig = go.Figure()\n",
|
| 149 |
+
" fig.add_trace(go.Scatter(x=test.index, y=residuals, mode='lines+markers', name='Residuals', marker=dict(color='green')))\n",
|
| 150 |
+
" fig.add_hline(y=0, line=dict(color='black', dash='dash'))\n",
|
| 151 |
+
" fig.update_layout(title=f\"Residual Plot - SARIMA Model for {company} Revenue\", xaxis_title=\"Year\", yaxis_title=\"Residual (Error)\")\n",
|
| 152 |
+
" fig.show()\n"
|
| 153 |
+
]
|
| 154 |
+
},
|
| 155 |
+
{
|
| 156 |
+
"cell_type": "code",
|
| 157 |
+
"execution_count": 20,
|
| 158 |
+
"metadata": {},
|
| 159 |
+
"outputs": [],
|
| 160 |
+
"source": [
|
| 161 |
+
"def process_company(company, results):\n",
|
| 162 |
+
" print(f\"Processing {company}...\")\n",
|
| 163 |
+
" series = preprocess_data(df, company)\n",
|
| 164 |
+
" if len(series) < 10:\n",
|
| 165 |
+
" print(f\"Skipping {company} due to insufficient data points.\")\n",
|
| 166 |
+
" return results\n",
|
| 167 |
+
" train, test = split_data(series)\n",
|
| 168 |
+
" best_cfg = find_best_sarima(train, test)\n",
|
| 169 |
+
" print(\"Best SARIMA configuration found:\", best_cfg)\n",
|
| 170 |
+
" model_fit = train_sarima(train, best_cfg)\n",
|
| 171 |
+
" predictions = model_fit.get_forecast(steps=len(test))\n",
|
| 172 |
+
" optimized_predictions, conf_int = predictions.predicted_mean, predictions.conf_int()\n",
|
| 173 |
+
" results[company] = evaluate_model(test, optimized_predictions)\n",
|
| 174 |
+
" plot_forecast(test, optimized_predictions, conf_int, company)\n",
|
| 175 |
+
" plot_residuals(test, optimized_predictions, company)\n",
|
| 176 |
+
" return results"
|
| 177 |
+
]
|
| 178 |
+
},
|
| 179 |
+
{
|
| 180 |
+
"cell_type": "code",
|
| 181 |
+
"execution_count": 21,
|
| 182 |
+
"metadata": {},
|
| 183 |
+
"outputs": [],
|
| 184 |
+
"source": [
|
| 185 |
+
"list_of_companies = df[\"Company\"].unique()\n",
|
| 186 |
+
"results = {}"
|
| 187 |
+
]
|
| 188 |
+
},
|
| 189 |
+
{
|
| 190 |
+
"cell_type": "code",
|
| 191 |
+
"execution_count": 27,
|
| 192 |
+
"metadata": {},
|
| 193 |
+
"outputs": [
|
| 194 |
+
{
|
| 195 |
+
"name": "stdout",
|
| 196 |
+
"output_type": "stream",
|
| 197 |
+
"text": [
|
| 198 |
+
"Processing Merck KGaA...\n"
|
| 199 |
+
]
|
| 200 |
+
},
|
| 201 |
+
{
|
| 202 |
+
"data": {
|
| 203 |
+
"text/html": [
|
| 204 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">🧐 <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">Starting SARIMA tuning... </span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">540</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> combinations to check.</span>\n",
|
| 205 |
+
"</pre>\n"
|
| 206 |
+
],
|
| 207 |
+
"text/plain": [
|
| 208 |
+
"🧐 \u001b[1;36mStarting SARIMA tuning\u001b[0m\u001b[1;36m...\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m540\u001b[0m\u001b[1;36m combinations to check.\u001b[0m\n"
|
| 209 |
+
]
|
| 210 |
+
},
|
| 211 |
+
"metadata": {},
|
| 212 |
+
"output_type": "display_data"
|
| 213 |
+
},
|
| 214 |
+
{
|
| 215 |
+
"data": {
|
| 216 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 217 |
+
"model_id": "84d88e8487ef472096209e3a63564c22",
|
| 218 |
+
"version_major": 2,
|
| 219 |
+
"version_minor": 0
|
| 220 |
+
},
|
| 221 |
+
"text/plain": [
|
| 222 |
+
"Output()"
|
| 223 |
+
]
|
| 224 |
+
},
|
| 225 |
+
"metadata": {},
|
| 226 |
+
"output_type": "display_data"
|
| 227 |
+
},
|
| 228 |
+
{
|
| 229 |
+
"data": {
|
| 230 |
+
"text/html": [
|
| 231 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
|
| 232 |
+
],
|
| 233 |
+
"text/plain": []
|
| 234 |
+
},
|
| 235 |
+
"metadata": {},
|
| 236 |
+
"output_type": "display_data"
|
| 237 |
+
},
|
| 238 |
+
{
|
| 239 |
+
"data": {
|
| 240 |
+
"text/html": [
|
| 241 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">✅ <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Best SARIMA order found:</span> <span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span><span style=\"font-weight: bold\">)</span> with MAE = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1785817856.82</span>\n",
|
| 242 |
+
"</pre>\n"
|
| 243 |
+
],
|
| 244 |
+
"text/plain": [
|
| 245 |
+
"✅ \u001b[1;32mBest SARIMA order found:\u001b[0m \u001b[1m(\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m with MAE = \u001b[1;36m1785817856.82\u001b[0m\n"
|
| 246 |
+
]
|
| 247 |
+
},
|
| 248 |
+
"metadata": {},
|
| 249 |
+
"output_type": "display_data"
|
| 250 |
+
},
|
| 251 |
+
{
|
| 252 |
+
"name": "stdout",
|
| 253 |
+
"output_type": "stream",
|
| 254 |
+
"text": [
|
| 255 |
+
"Best SARIMA configuration found: (3, 1, 0, 0, 1, 1)\n"
|
| 256 |
+
]
|
| 257 |
+
},
|
| 258 |
+
{
|
| 259 |
+
"data": {
|
| 260 |
+
"application/vnd.plotly.v1+json": {
|
| 261 |
+
"config": {
|
| 262 |
+
"plotlyServerURL": "https://plot.ly"
|
| 263 |
+
},
|
| 264 |
+
"data": [
|
| 265 |
+
{
|
| 266 |
+
"mode": "lines+markers",
|
| 267 |
+
"name": "Actual Revenue",
|
| 268 |
+
"type": "scatter",
|
| 269 |
+
"x": [
|
| 270 |
+
"2023-06-30T00:00:00",
|
| 271 |
+
"2023-09-30T00:00:00",
|
| 272 |
+
"2023-12-31T00:00:00",
|
| 273 |
+
"2024-03-31T00:00:00",
|
| 274 |
+
"2024-06-30T00:00:00",
|
| 275 |
+
"2024-09-30T00:00:00",
|
| 276 |
+
"2024-12-31T00:00:00"
|
| 277 |
+
],
|
| 278 |
+
"y": [
|
| 279 |
+
9146296754,
|
| 280 |
+
9297896247,
|
| 281 |
+
17637490503,
|
| 282 |
+
18818295502,
|
| 283 |
+
16561793827,
|
| 284 |
+
15036344926,
|
| 285 |
+
18915504026
|
| 286 |
+
]
|
| 287 |
+
},
|
| 288 |
+
{
|
| 289 |
+
"line": {
|
| 290 |
+
"dash": "dash"
|
| 291 |
+
},
|
| 292 |
+
"mode": "lines+markers",
|
| 293 |
+
"name": "Optimized SARIMA Forecast",
|
| 294 |
+
"type": "scatter",
|
| 295 |
+
"x": [
|
| 296 |
+
"2023-06-30T00:00:00",
|
| 297 |
+
"2023-09-30T00:00:00",
|
| 298 |
+
"2023-12-31T00:00:00",
|
| 299 |
+
"2024-03-31T00:00:00",
|
| 300 |
+
"2024-06-30T00:00:00",
|
| 301 |
+
"2024-09-30T00:00:00",
|
| 302 |
+
"2024-12-31T00:00:00"
|
| 303 |
+
],
|
| 304 |
+
"y": [
|
| 305 |
+
10227200022.792908,
|
| 306 |
+
13335489289.944857,
|
| 307 |
+
15152848755.085747,
|
| 308 |
+
18342084773.32733,
|
| 309 |
+
17854604594.866013,
|
| 310 |
+
18130668621.319298,
|
| 311 |
+
18881262279.748497
|
| 312 |
+
]
|
| 313 |
+
},
|
| 314 |
+
{
|
| 315 |
+
"line": {
|
| 316 |
+
"color": "lightgray"
|
| 317 |
+
},
|
| 318 |
+
"mode": "lines",
|
| 319 |
+
"name": "Lower Bound",
|
| 320 |
+
"type": "scatter",
|
| 321 |
+
"x": [
|
| 322 |
+
"2023-06-30T00:00:00",
|
| 323 |
+
"2023-09-30T00:00:00",
|
| 324 |
+
"2023-12-31T00:00:00",
|
| 325 |
+
"2024-03-31T00:00:00",
|
| 326 |
+
"2024-06-30T00:00:00",
|
| 327 |
+
"2024-09-30T00:00:00",
|
| 328 |
+
"2024-12-31T00:00:00"
|
| 329 |
+
],
|
| 330 |
+
"y": [
|
| 331 |
+
-4505358899.269606,
|
| 332 |
+
-2596816102.129263,
|
| 333 |
+
-3203357521.5168,
|
| 334 |
+
-3578114561.7674026,
|
| 335 |
+
-5106405549.7327385,
|
| 336 |
+
-6985697438.32756,
|
| 337 |
+
-8006814762.206619
|
| 338 |
+
]
|
| 339 |
+
},
|
| 340 |
+
{
|
| 341 |
+
"fill": "tonexty",
|
| 342 |
+
"line": {
|
| 343 |
+
"color": "lightgray"
|
| 344 |
+
},
|
| 345 |
+
"mode": "lines",
|
| 346 |
+
"name": "Upper Bound",
|
| 347 |
+
"type": "scatter",
|
| 348 |
+
"x": [
|
| 349 |
+
"2023-06-30T00:00:00",
|
| 350 |
+
"2023-09-30T00:00:00",
|
| 351 |
+
"2023-12-31T00:00:00",
|
| 352 |
+
"2024-03-31T00:00:00",
|
| 353 |
+
"2024-06-30T00:00:00",
|
| 354 |
+
"2024-09-30T00:00:00",
|
| 355 |
+
"2024-12-31T00:00:00"
|
| 356 |
+
],
|
| 357 |
+
"y": [
|
| 358 |
+
24959758944.855423,
|
| 359 |
+
29267794682.018974,
|
| 360 |
+
33509055031.688293,
|
| 361 |
+
40262284108.422066,
|
| 362 |
+
40815614739.46477,
|
| 363 |
+
43247034680.966156,
|
| 364 |
+
45769339321.70361
|
| 365 |
+
]
|
| 366 |
+
}
|
| 367 |
+
],
|
| 368 |
+
"layout": {
|
| 369 |
+
"template": {
|
| 370 |
+
"data": {
|
| 371 |
+
"bar": [
|
| 372 |
+
{
|
| 373 |
+
"error_x": {
|
| 374 |
+
"color": "#2a3f5f"
|
| 375 |
+
},
|
| 376 |
+
"error_y": {
|
| 377 |
+
"color": "#2a3f5f"
|
| 378 |
+
},
|
| 379 |
+
"marker": {
|
| 380 |
+
"line": {
|
| 381 |
+
"color": "#E5ECF6",
|
| 382 |
+
"width": 0.5
|
| 383 |
+
},
|
| 384 |
+
"pattern": {
|
| 385 |
+
"fillmode": "overlay",
|
| 386 |
+
"size": 10,
|
| 387 |
+
"solidity": 0.2
|
| 388 |
+
}
|
| 389 |
+
},
|
| 390 |
+
"type": "bar"
|
| 391 |
+
}
|
| 392 |
+
],
|
| 393 |
+
"barpolar": [
|
| 394 |
+
{
|
| 395 |
+
"marker": {
|
| 396 |
+
"line": {
|
| 397 |
+
"color": "#E5ECF6",
|
| 398 |
+
"width": 0.5
|
| 399 |
+
},
|
| 400 |
+
"pattern": {
|
| 401 |
+
"fillmode": "overlay",
|
| 402 |
+
"size": 10,
|
| 403 |
+
"solidity": 0.2
|
| 404 |
+
}
|
| 405 |
+
},
|
| 406 |
+
"type": "barpolar"
|
| 407 |
+
}
|
| 408 |
+
],
|
| 409 |
+
"carpet": [
|
| 410 |
+
{
|
| 411 |
+
"aaxis": {
|
| 412 |
+
"endlinecolor": "#2a3f5f",
|
| 413 |
+
"gridcolor": "white",
|
| 414 |
+
"linecolor": "white",
|
| 415 |
+
"minorgridcolor": "white",
|
| 416 |
+
"startlinecolor": "#2a3f5f"
|
| 417 |
+
},
|
| 418 |
+
"baxis": {
|
| 419 |
+
"endlinecolor": "#2a3f5f",
|
| 420 |
+
"gridcolor": "white",
|
| 421 |
+
"linecolor": "white",
|
| 422 |
+
"minorgridcolor": "white",
|
| 423 |
+
"startlinecolor": "#2a3f5f"
|
| 424 |
+
},
|
| 425 |
+
"type": "carpet"
|
| 426 |
+
}
|
| 427 |
+
],
|
| 428 |
+
"choropleth": [
|
| 429 |
+
{
|
| 430 |
+
"colorbar": {
|
| 431 |
+
"outlinewidth": 0,
|
| 432 |
+
"ticks": ""
|
| 433 |
+
},
|
| 434 |
+
"type": "choropleth"
|
| 435 |
+
}
|
| 436 |
+
],
|
| 437 |
+
"contour": [
|
| 438 |
+
{
|
| 439 |
+
"colorbar": {
|
| 440 |
+
"outlinewidth": 0,
|
| 441 |
+
"ticks": ""
|
| 442 |
+
},
|
| 443 |
+
"colorscale": [
|
| 444 |
+
[
|
| 445 |
+
0,
|
| 446 |
+
"#0d0887"
|
| 447 |
+
],
|
| 448 |
+
[
|
| 449 |
+
0.1111111111111111,
|
| 450 |
+
"#46039f"
|
| 451 |
+
],
|
| 452 |
+
[
|
| 453 |
+
0.2222222222222222,
|
| 454 |
+
"#7201a8"
|
| 455 |
+
],
|
| 456 |
+
[
|
| 457 |
+
0.3333333333333333,
|
| 458 |
+
"#9c179e"
|
| 459 |
+
],
|
| 460 |
+
[
|
| 461 |
+
0.4444444444444444,
|
| 462 |
+
"#bd3786"
|
| 463 |
+
],
|
| 464 |
+
[
|
| 465 |
+
0.5555555555555556,
|
| 466 |
+
"#d8576b"
|
| 467 |
+
],
|
| 468 |
+
[
|
| 469 |
+
0.6666666666666666,
|
| 470 |
+
"#ed7953"
|
| 471 |
+
],
|
| 472 |
+
[
|
| 473 |
+
0.7777777777777778,
|
| 474 |
+
"#fb9f3a"
|
| 475 |
+
],
|
| 476 |
+
[
|
| 477 |
+
0.8888888888888888,
|
| 478 |
+
"#fdca26"
|
| 479 |
+
],
|
| 480 |
+
[
|
| 481 |
+
1,
|
| 482 |
+
"#f0f921"
|
| 483 |
+
]
|
| 484 |
+
],
|
| 485 |
+
"type": "contour"
|
| 486 |
+
}
|
| 487 |
+
],
|
| 488 |
+
"contourcarpet": [
|
| 489 |
+
{
|
| 490 |
+
"colorbar": {
|
| 491 |
+
"outlinewidth": 0,
|
| 492 |
+
"ticks": ""
|
| 493 |
+
},
|
| 494 |
+
"type": "contourcarpet"
|
| 495 |
+
}
|
| 496 |
+
],
|
| 497 |
+
"heatmap": [
|
| 498 |
+
{
|
| 499 |
+
"colorbar": {
|
| 500 |
+
"outlinewidth": 0,
|
| 501 |
+
"ticks": ""
|
| 502 |
+
},
|
| 503 |
+
"colorscale": [
|
| 504 |
+
[
|
| 505 |
+
0,
|
| 506 |
+
"#0d0887"
|
| 507 |
+
],
|
| 508 |
+
[
|
| 509 |
+
0.1111111111111111,
|
| 510 |
+
"#46039f"
|
| 511 |
+
],
|
| 512 |
+
[
|
| 513 |
+
0.2222222222222222,
|
| 514 |
+
"#7201a8"
|
| 515 |
+
],
|
| 516 |
+
[
|
| 517 |
+
0.3333333333333333,
|
| 518 |
+
"#9c179e"
|
| 519 |
+
],
|
| 520 |
+
[
|
| 521 |
+
0.4444444444444444,
|
| 522 |
+
"#bd3786"
|
| 523 |
+
],
|
| 524 |
+
[
|
| 525 |
+
0.5555555555555556,
|
| 526 |
+
"#d8576b"
|
| 527 |
+
],
|
| 528 |
+
[
|
| 529 |
+
0.6666666666666666,
|
| 530 |
+
"#ed7953"
|
| 531 |
+
],
|
| 532 |
+
[
|
| 533 |
+
0.7777777777777778,
|
| 534 |
+
"#fb9f3a"
|
| 535 |
+
],
|
| 536 |
+
[
|
| 537 |
+
0.8888888888888888,
|
| 538 |
+
"#fdca26"
|
| 539 |
+
],
|
| 540 |
+
[
|
| 541 |
+
1,
|
| 542 |
+
"#f0f921"
|
| 543 |
+
]
|
| 544 |
+
],
|
| 545 |
+
"type": "heatmap"
|
| 546 |
+
}
|
| 547 |
+
],
|
| 548 |
+
"heatmapgl": [
|
| 549 |
+
{
|
| 550 |
+
"colorbar": {
|
| 551 |
+
"outlinewidth": 0,
|
| 552 |
+
"ticks": ""
|
| 553 |
+
},
|
| 554 |
+
"colorscale": [
|
| 555 |
+
[
|
| 556 |
+
0,
|
| 557 |
+
"#0d0887"
|
| 558 |
+
],
|
| 559 |
+
[
|
| 560 |
+
0.1111111111111111,
|
| 561 |
+
"#46039f"
|
| 562 |
+
],
|
| 563 |
+
[
|
| 564 |
+
0.2222222222222222,
|
| 565 |
+
"#7201a8"
|
| 566 |
+
],
|
| 567 |
+
[
|
| 568 |
+
0.3333333333333333,
|
| 569 |
+
"#9c179e"
|
| 570 |
+
],
|
| 571 |
+
[
|
| 572 |
+
0.4444444444444444,
|
| 573 |
+
"#bd3786"
|
| 574 |
+
],
|
| 575 |
+
[
|
| 576 |
+
0.5555555555555556,
|
| 577 |
+
"#d8576b"
|
| 578 |
+
],
|
| 579 |
+
[
|
| 580 |
+
0.6666666666666666,
|
| 581 |
+
"#ed7953"
|
| 582 |
+
],
|
| 583 |
+
[
|
| 584 |
+
0.7777777777777778,
|
| 585 |
+
"#fb9f3a"
|
| 586 |
+
],
|
| 587 |
+
[
|
| 588 |
+
0.8888888888888888,
|
| 589 |
+
"#fdca26"
|
| 590 |
+
],
|
| 591 |
+
[
|
| 592 |
+
1,
|
| 593 |
+
"#f0f921"
|
| 594 |
+
]
|
| 595 |
+
],
|
| 596 |
+
"type": "heatmapgl"
|
| 597 |
+
}
|
| 598 |
+
],
|
| 599 |
+
"histogram": [
|
| 600 |
+
{
|
| 601 |
+
"marker": {
|
| 602 |
+
"pattern": {
|
| 603 |
+
"fillmode": "overlay",
|
| 604 |
+
"size": 10,
|
| 605 |
+
"solidity": 0.2
|
| 606 |
+
}
|
| 607 |
+
},
|
| 608 |
+
"type": "histogram"
|
| 609 |
+
}
|
| 610 |
+
],
|
| 611 |
+
"histogram2d": [
|
| 612 |
+
{
|
| 613 |
+
"colorbar": {
|
| 614 |
+
"outlinewidth": 0,
|
| 615 |
+
"ticks": ""
|
| 616 |
+
},
|
| 617 |
+
"colorscale": [
|
| 618 |
+
[
|
| 619 |
+
0,
|
| 620 |
+
"#0d0887"
|
| 621 |
+
],
|
| 622 |
+
[
|
| 623 |
+
0.1111111111111111,
|
| 624 |
+
"#46039f"
|
| 625 |
+
],
|
| 626 |
+
[
|
| 627 |
+
0.2222222222222222,
|
| 628 |
+
"#7201a8"
|
| 629 |
+
],
|
| 630 |
+
[
|
| 631 |
+
0.3333333333333333,
|
| 632 |
+
"#9c179e"
|
| 633 |
+
],
|
| 634 |
+
[
|
| 635 |
+
0.4444444444444444,
|
| 636 |
+
"#bd3786"
|
| 637 |
+
],
|
| 638 |
+
[
|
| 639 |
+
0.5555555555555556,
|
| 640 |
+
"#d8576b"
|
| 641 |
+
],
|
| 642 |
+
[
|
| 643 |
+
0.6666666666666666,
|
| 644 |
+
"#ed7953"
|
| 645 |
+
],
|
| 646 |
+
[
|
| 647 |
+
0.7777777777777778,
|
| 648 |
+
"#fb9f3a"
|
| 649 |
+
],
|
| 650 |
+
[
|
| 651 |
+
0.8888888888888888,
|
| 652 |
+
"#fdca26"
|
| 653 |
+
],
|
| 654 |
+
[
|
| 655 |
+
1,
|
| 656 |
+
"#f0f921"
|
| 657 |
+
]
|
| 658 |
+
],
|
| 659 |
+
"type": "histogram2d"
|
| 660 |
+
}
|
| 661 |
+
],
|
| 662 |
+
"histogram2dcontour": [
|
| 663 |
+
{
|
| 664 |
+
"colorbar": {
|
| 665 |
+
"outlinewidth": 0,
|
| 666 |
+
"ticks": ""
|
| 667 |
+
},
|
| 668 |
+
"colorscale": [
|
| 669 |
+
[
|
| 670 |
+
0,
|
| 671 |
+
"#0d0887"
|
| 672 |
+
],
|
| 673 |
+
[
|
| 674 |
+
0.1111111111111111,
|
| 675 |
+
"#46039f"
|
| 676 |
+
],
|
| 677 |
+
[
|
| 678 |
+
0.2222222222222222,
|
| 679 |
+
"#7201a8"
|
| 680 |
+
],
|
| 681 |
+
[
|
| 682 |
+
0.3333333333333333,
|
| 683 |
+
"#9c179e"
|
| 684 |
+
],
|
| 685 |
+
[
|
| 686 |
+
0.4444444444444444,
|
| 687 |
+
"#bd3786"
|
| 688 |
+
],
|
| 689 |
+
[
|
| 690 |
+
0.5555555555555556,
|
| 691 |
+
"#d8576b"
|
| 692 |
+
],
|
| 693 |
+
[
|
| 694 |
+
0.6666666666666666,
|
| 695 |
+
"#ed7953"
|
| 696 |
+
],
|
| 697 |
+
[
|
| 698 |
+
0.7777777777777778,
|
| 699 |
+
"#fb9f3a"
|
| 700 |
+
],
|
| 701 |
+
[
|
| 702 |
+
0.8888888888888888,
|
| 703 |
+
"#fdca26"
|
| 704 |
+
],
|
| 705 |
+
[
|
| 706 |
+
1,
|
| 707 |
+
"#f0f921"
|
| 708 |
+
]
|
| 709 |
+
],
|
| 710 |
+
"type": "histogram2dcontour"
|
| 711 |
+
}
|
| 712 |
+
],
|
| 713 |
+
"mesh3d": [
|
| 714 |
+
{
|
| 715 |
+
"colorbar": {
|
| 716 |
+
"outlinewidth": 0,
|
| 717 |
+
"ticks": ""
|
| 718 |
+
},
|
| 719 |
+
"type": "mesh3d"
|
| 720 |
+
}
|
| 721 |
+
],
|
| 722 |
+
"parcoords": [
|
| 723 |
+
{
|
| 724 |
+
"line": {
|
| 725 |
+
"colorbar": {
|
| 726 |
+
"outlinewidth": 0,
|
| 727 |
+
"ticks": ""
|
| 728 |
+
}
|
| 729 |
+
},
|
| 730 |
+
"type": "parcoords"
|
| 731 |
+
}
|
| 732 |
+
],
|
| 733 |
+
"pie": [
|
| 734 |
+
{
|
| 735 |
+
"automargin": true,
|
| 736 |
+
"type": "pie"
|
| 737 |
+
}
|
| 738 |
+
],
|
| 739 |
+
"scatter": [
|
| 740 |
+
{
|
| 741 |
+
"fillpattern": {
|
| 742 |
+
"fillmode": "overlay",
|
| 743 |
+
"size": 10,
|
| 744 |
+
"solidity": 0.2
|
| 745 |
+
},
|
| 746 |
+
"type": "scatter"
|
| 747 |
+
}
|
| 748 |
+
],
|
| 749 |
+
"scatter3d": [
|
| 750 |
+
{
|
| 751 |
+
"line": {
|
| 752 |
+
"colorbar": {
|
| 753 |
+
"outlinewidth": 0,
|
| 754 |
+
"ticks": ""
|
| 755 |
+
}
|
| 756 |
+
},
|
| 757 |
+
"marker": {
|
| 758 |
+
"colorbar": {
|
| 759 |
+
"outlinewidth": 0,
|
| 760 |
+
"ticks": ""
|
| 761 |
+
}
|
| 762 |
+
},
|
| 763 |
+
"type": "scatter3d"
|
| 764 |
+
}
|
| 765 |
+
],
|
| 766 |
+
"scattercarpet": [
|
| 767 |
+
{
|
| 768 |
+
"marker": {
|
| 769 |
+
"colorbar": {
|
| 770 |
+
"outlinewidth": 0,
|
| 771 |
+
"ticks": ""
|
| 772 |
+
}
|
| 773 |
+
},
|
| 774 |
+
"type": "scattercarpet"
|
| 775 |
+
}
|
| 776 |
+
],
|
| 777 |
+
"scattergeo": [
|
| 778 |
+
{
|
| 779 |
+
"marker": {
|
| 780 |
+
"colorbar": {
|
| 781 |
+
"outlinewidth": 0,
|
| 782 |
+
"ticks": ""
|
| 783 |
+
}
|
| 784 |
+
},
|
| 785 |
+
"type": "scattergeo"
|
| 786 |
+
}
|
| 787 |
+
],
|
| 788 |
+
"scattergl": [
|
| 789 |
+
{
|
| 790 |
+
"marker": {
|
| 791 |
+
"colorbar": {
|
| 792 |
+
"outlinewidth": 0,
|
| 793 |
+
"ticks": ""
|
| 794 |
+
}
|
| 795 |
+
},
|
| 796 |
+
"type": "scattergl"
|
| 797 |
+
}
|
| 798 |
+
],
|
| 799 |
+
"scattermapbox": [
|
| 800 |
+
{
|
| 801 |
+
"marker": {
|
| 802 |
+
"colorbar": {
|
| 803 |
+
"outlinewidth": 0,
|
| 804 |
+
"ticks": ""
|
| 805 |
+
}
|
| 806 |
+
},
|
| 807 |
+
"type": "scattermapbox"
|
| 808 |
+
}
|
| 809 |
+
],
|
| 810 |
+
"scatterpolar": [
|
| 811 |
+
{
|
| 812 |
+
"marker": {
|
| 813 |
+
"colorbar": {
|
| 814 |
+
"outlinewidth": 0,
|
| 815 |
+
"ticks": ""
|
| 816 |
+
}
|
| 817 |
+
},
|
| 818 |
+
"type": "scatterpolar"
|
| 819 |
+
}
|
| 820 |
+
],
|
| 821 |
+
"scatterpolargl": [
|
| 822 |
+
{
|
| 823 |
+
"marker": {
|
| 824 |
+
"colorbar": {
|
| 825 |
+
"outlinewidth": 0,
|
| 826 |
+
"ticks": ""
|
| 827 |
+
}
|
| 828 |
+
},
|
| 829 |
+
"type": "scatterpolargl"
|
| 830 |
+
}
|
| 831 |
+
],
|
| 832 |
+
"scatterternary": [
|
| 833 |
+
{
|
| 834 |
+
"marker": {
|
| 835 |
+
"colorbar": {
|
| 836 |
+
"outlinewidth": 0,
|
| 837 |
+
"ticks": ""
|
| 838 |
+
}
|
| 839 |
+
},
|
| 840 |
+
"type": "scatterternary"
|
| 841 |
+
}
|
| 842 |
+
],
|
| 843 |
+
"surface": [
|
| 844 |
+
{
|
| 845 |
+
"colorbar": {
|
| 846 |
+
"outlinewidth": 0,
|
| 847 |
+
"ticks": ""
|
| 848 |
+
},
|
| 849 |
+
"colorscale": [
|
| 850 |
+
[
|
| 851 |
+
0,
|
| 852 |
+
"#0d0887"
|
| 853 |
+
],
|
| 854 |
+
[
|
| 855 |
+
0.1111111111111111,
|
| 856 |
+
"#46039f"
|
| 857 |
+
],
|
| 858 |
+
[
|
| 859 |
+
0.2222222222222222,
|
| 860 |
+
"#7201a8"
|
| 861 |
+
],
|
| 862 |
+
[
|
| 863 |
+
0.3333333333333333,
|
| 864 |
+
"#9c179e"
|
| 865 |
+
],
|
| 866 |
+
[
|
| 867 |
+
0.4444444444444444,
|
| 868 |
+
"#bd3786"
|
| 869 |
+
],
|
| 870 |
+
[
|
| 871 |
+
0.5555555555555556,
|
| 872 |
+
"#d8576b"
|
| 873 |
+
],
|
| 874 |
+
[
|
| 875 |
+
0.6666666666666666,
|
| 876 |
+
"#ed7953"
|
| 877 |
+
],
|
| 878 |
+
[
|
| 879 |
+
0.7777777777777778,
|
| 880 |
+
"#fb9f3a"
|
| 881 |
+
],
|
| 882 |
+
[
|
| 883 |
+
0.8888888888888888,
|
| 884 |
+
"#fdca26"
|
| 885 |
+
],
|
| 886 |
+
[
|
| 887 |
+
1,
|
| 888 |
+
"#f0f921"
|
| 889 |
+
]
|
| 890 |
+
],
|
| 891 |
+
"type": "surface"
|
| 892 |
+
}
|
| 893 |
+
],
|
| 894 |
+
"table": [
|
| 895 |
+
{
|
| 896 |
+
"cells": {
|
| 897 |
+
"fill": {
|
| 898 |
+
"color": "#EBF0F8"
|
| 899 |
+
},
|
| 900 |
+
"line": {
|
| 901 |
+
"color": "white"
|
| 902 |
+
}
|
| 903 |
+
},
|
| 904 |
+
"header": {
|
| 905 |
+
"fill": {
|
| 906 |
+
"color": "#C8D4E3"
|
| 907 |
+
},
|
| 908 |
+
"line": {
|
| 909 |
+
"color": "white"
|
| 910 |
+
}
|
| 911 |
+
},
|
| 912 |
+
"type": "table"
|
| 913 |
+
}
|
| 914 |
+
]
|
| 915 |
+
},
|
| 916 |
+
"layout": {
|
| 917 |
+
"annotationdefaults": {
|
| 918 |
+
"arrowcolor": "#2a3f5f",
|
| 919 |
+
"arrowhead": 0,
|
| 920 |
+
"arrowwidth": 1
|
| 921 |
+
},
|
| 922 |
+
"autotypenumbers": "strict",
|
| 923 |
+
"coloraxis": {
|
| 924 |
+
"colorbar": {
|
| 925 |
+
"outlinewidth": 0,
|
| 926 |
+
"ticks": ""
|
| 927 |
+
}
|
| 928 |
+
},
|
| 929 |
+
"colorscale": {
|
| 930 |
+
"diverging": [
|
| 931 |
+
[
|
| 932 |
+
0,
|
| 933 |
+
"#8e0152"
|
| 934 |
+
],
|
| 935 |
+
[
|
| 936 |
+
0.1,
|
| 937 |
+
"#c51b7d"
|
| 938 |
+
],
|
| 939 |
+
[
|
| 940 |
+
0.2,
|
| 941 |
+
"#de77ae"
|
| 942 |
+
],
|
| 943 |
+
[
|
| 944 |
+
0.3,
|
| 945 |
+
"#f1b6da"
|
| 946 |
+
],
|
| 947 |
+
[
|
| 948 |
+
0.4,
|
| 949 |
+
"#fde0ef"
|
| 950 |
+
],
|
| 951 |
+
[
|
| 952 |
+
0.5,
|
| 953 |
+
"#f7f7f7"
|
| 954 |
+
],
|
| 955 |
+
[
|
| 956 |
+
0.6,
|
| 957 |
+
"#e6f5d0"
|
| 958 |
+
],
|
| 959 |
+
[
|
| 960 |
+
0.7,
|
| 961 |
+
"#b8e186"
|
| 962 |
+
],
|
| 963 |
+
[
|
| 964 |
+
0.8,
|
| 965 |
+
"#7fbc41"
|
| 966 |
+
],
|
| 967 |
+
[
|
| 968 |
+
0.9,
|
| 969 |
+
"#4d9221"
|
| 970 |
+
],
|
| 971 |
+
[
|
| 972 |
+
1,
|
| 973 |
+
"#276419"
|
| 974 |
+
]
|
| 975 |
+
],
|
| 976 |
+
"sequential": [
|
| 977 |
+
[
|
| 978 |
+
0,
|
| 979 |
+
"#0d0887"
|
| 980 |
+
],
|
| 981 |
+
[
|
| 982 |
+
0.1111111111111111,
|
| 983 |
+
"#46039f"
|
| 984 |
+
],
|
| 985 |
+
[
|
| 986 |
+
0.2222222222222222,
|
| 987 |
+
"#7201a8"
|
| 988 |
+
],
|
| 989 |
+
[
|
| 990 |
+
0.3333333333333333,
|
| 991 |
+
"#9c179e"
|
| 992 |
+
],
|
| 993 |
+
[
|
| 994 |
+
0.4444444444444444,
|
| 995 |
+
"#bd3786"
|
| 996 |
+
],
|
| 997 |
+
[
|
| 998 |
+
0.5555555555555556,
|
| 999 |
+
"#d8576b"
|
| 1000 |
+
],
|
| 1001 |
+
[
|
| 1002 |
+
0.6666666666666666,
|
| 1003 |
+
"#ed7953"
|
| 1004 |
+
],
|
| 1005 |
+
[
|
| 1006 |
+
0.7777777777777778,
|
| 1007 |
+
"#fb9f3a"
|
| 1008 |
+
],
|
| 1009 |
+
[
|
| 1010 |
+
0.8888888888888888,
|
| 1011 |
+
"#fdca26"
|
| 1012 |
+
],
|
| 1013 |
+
[
|
| 1014 |
+
1,
|
| 1015 |
+
"#f0f921"
|
| 1016 |
+
]
|
| 1017 |
+
],
|
| 1018 |
+
"sequentialminus": [
|
| 1019 |
+
[
|
| 1020 |
+
0,
|
| 1021 |
+
"#0d0887"
|
| 1022 |
+
],
|
| 1023 |
+
[
|
| 1024 |
+
0.1111111111111111,
|
| 1025 |
+
"#46039f"
|
| 1026 |
+
],
|
| 1027 |
+
[
|
| 1028 |
+
0.2222222222222222,
|
| 1029 |
+
"#7201a8"
|
| 1030 |
+
],
|
| 1031 |
+
[
|
| 1032 |
+
0.3333333333333333,
|
| 1033 |
+
"#9c179e"
|
| 1034 |
+
],
|
| 1035 |
+
[
|
| 1036 |
+
0.4444444444444444,
|
| 1037 |
+
"#bd3786"
|
| 1038 |
+
],
|
| 1039 |
+
[
|
| 1040 |
+
0.5555555555555556,
|
| 1041 |
+
"#d8576b"
|
| 1042 |
+
],
|
| 1043 |
+
[
|
| 1044 |
+
0.6666666666666666,
|
| 1045 |
+
"#ed7953"
|
| 1046 |
+
],
|
| 1047 |
+
[
|
| 1048 |
+
0.7777777777777778,
|
| 1049 |
+
"#fb9f3a"
|
| 1050 |
+
],
|
| 1051 |
+
[
|
| 1052 |
+
0.8888888888888888,
|
| 1053 |
+
"#fdca26"
|
| 1054 |
+
],
|
| 1055 |
+
[
|
| 1056 |
+
1,
|
| 1057 |
+
"#f0f921"
|
| 1058 |
+
]
|
| 1059 |
+
]
|
| 1060 |
+
},
|
| 1061 |
+
"colorway": [
|
| 1062 |
+
"#636efa",
|
| 1063 |
+
"#EF553B",
|
| 1064 |
+
"#00cc96",
|
| 1065 |
+
"#ab63fa",
|
| 1066 |
+
"#FFA15A",
|
| 1067 |
+
"#19d3f3",
|
| 1068 |
+
"#FF6692",
|
| 1069 |
+
"#B6E880",
|
| 1070 |
+
"#FF97FF",
|
| 1071 |
+
"#FECB52"
|
| 1072 |
+
],
|
| 1073 |
+
"font": {
|
| 1074 |
+
"color": "#2a3f5f"
|
| 1075 |
+
},
|
| 1076 |
+
"geo": {
|
| 1077 |
+
"bgcolor": "white",
|
| 1078 |
+
"lakecolor": "white",
|
| 1079 |
+
"landcolor": "#E5ECF6",
|
| 1080 |
+
"showlakes": true,
|
| 1081 |
+
"showland": true,
|
| 1082 |
+
"subunitcolor": "white"
|
| 1083 |
+
},
|
| 1084 |
+
"hoverlabel": {
|
| 1085 |
+
"align": "left"
|
| 1086 |
+
},
|
| 1087 |
+
"hovermode": "closest",
|
| 1088 |
+
"mapbox": {
|
| 1089 |
+
"style": "light"
|
| 1090 |
+
},
|
| 1091 |
+
"paper_bgcolor": "white",
|
| 1092 |
+
"plot_bgcolor": "#E5ECF6",
|
| 1093 |
+
"polar": {
|
| 1094 |
+
"angularaxis": {
|
| 1095 |
+
"gridcolor": "white",
|
| 1096 |
+
"linecolor": "white",
|
| 1097 |
+
"ticks": ""
|
| 1098 |
+
},
|
| 1099 |
+
"bgcolor": "#E5ECF6",
|
| 1100 |
+
"radialaxis": {
|
| 1101 |
+
"gridcolor": "white",
|
| 1102 |
+
"linecolor": "white",
|
| 1103 |
+
"ticks": ""
|
| 1104 |
+
}
|
| 1105 |
+
},
|
| 1106 |
+
"scene": {
|
| 1107 |
+
"xaxis": {
|
| 1108 |
+
"backgroundcolor": "#E5ECF6",
|
| 1109 |
+
"gridcolor": "white",
|
| 1110 |
+
"gridwidth": 2,
|
| 1111 |
+
"linecolor": "white",
|
| 1112 |
+
"showbackground": true,
|
| 1113 |
+
"ticks": "",
|
| 1114 |
+
"zerolinecolor": "white"
|
| 1115 |
+
},
|
| 1116 |
+
"yaxis": {
|
| 1117 |
+
"backgroundcolor": "#E5ECF6",
|
| 1118 |
+
"gridcolor": "white",
|
| 1119 |
+
"gridwidth": 2,
|
| 1120 |
+
"linecolor": "white",
|
| 1121 |
+
"showbackground": true,
|
| 1122 |
+
"ticks": "",
|
| 1123 |
+
"zerolinecolor": "white"
|
| 1124 |
+
},
|
| 1125 |
+
"zaxis": {
|
| 1126 |
+
"backgroundcolor": "#E5ECF6",
|
| 1127 |
+
"gridcolor": "white",
|
| 1128 |
+
"gridwidth": 2,
|
| 1129 |
+
"linecolor": "white",
|
| 1130 |
+
"showbackground": true,
|
| 1131 |
+
"ticks": "",
|
| 1132 |
+
"zerolinecolor": "white"
|
| 1133 |
+
}
|
| 1134 |
+
},
|
| 1135 |
+
"shapedefaults": {
|
| 1136 |
+
"line": {
|
| 1137 |
+
"color": "#2a3f5f"
|
| 1138 |
+
}
|
| 1139 |
+
},
|
| 1140 |
+
"ternary": {
|
| 1141 |
+
"aaxis": {
|
| 1142 |
+
"gridcolor": "white",
|
| 1143 |
+
"linecolor": "white",
|
| 1144 |
+
"ticks": ""
|
| 1145 |
+
},
|
| 1146 |
+
"baxis": {
|
| 1147 |
+
"gridcolor": "white",
|
| 1148 |
+
"linecolor": "white",
|
| 1149 |
+
"ticks": ""
|
| 1150 |
+
},
|
| 1151 |
+
"bgcolor": "#E5ECF6",
|
| 1152 |
+
"caxis": {
|
| 1153 |
+
"gridcolor": "white",
|
| 1154 |
+
"linecolor": "white",
|
| 1155 |
+
"ticks": ""
|
| 1156 |
+
}
|
| 1157 |
+
},
|
| 1158 |
+
"title": {
|
| 1159 |
+
"x": 0.05
|
| 1160 |
+
},
|
| 1161 |
+
"xaxis": {
|
| 1162 |
+
"automargin": true,
|
| 1163 |
+
"gridcolor": "white",
|
| 1164 |
+
"linecolor": "white",
|
| 1165 |
+
"ticks": "",
|
| 1166 |
+
"title": {
|
| 1167 |
+
"standoff": 15
|
| 1168 |
+
},
|
| 1169 |
+
"zerolinecolor": "white",
|
| 1170 |
+
"zerolinewidth": 2
|
| 1171 |
+
},
|
| 1172 |
+
"yaxis": {
|
| 1173 |
+
"automargin": true,
|
| 1174 |
+
"gridcolor": "white",
|
| 1175 |
+
"linecolor": "white",
|
| 1176 |
+
"ticks": "",
|
| 1177 |
+
"title": {
|
| 1178 |
+
"standoff": 15
|
| 1179 |
+
},
|
| 1180 |
+
"zerolinecolor": "white",
|
| 1181 |
+
"zerolinewidth": 2
|
| 1182 |
+
}
|
| 1183 |
+
}
|
| 1184 |
+
},
|
| 1185 |
+
"title": {
|
| 1186 |
+
"text": "Optimized SARIMA Forecast - Merck KGaA Revenue"
|
| 1187 |
+
},
|
| 1188 |
+
"xaxis": {
|
| 1189 |
+
"title": {
|
| 1190 |
+
"text": "Year"
|
| 1191 |
+
}
|
| 1192 |
+
},
|
| 1193 |
+
"yaxis": {
|
| 1194 |
+
"title": {
|
| 1195 |
+
"text": "Revenue"
|
| 1196 |
+
}
|
| 1197 |
+
}
|
| 1198 |
+
}
|
| 1199 |
+
},
|
| 1200 |
+
"text/html": [
|
| 1201 |
+
"<div> <div id=\"4c1984d2-3b18-4093-a1ff-31164ebf3eb5\" class=\"plotly-graph-div\" style=\"height:525px; width:100%;\"></div> <script type=\"text/javascript\"> require([\"plotly\"], function(Plotly) { window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById(\"4c1984d2-3b18-4093-a1ff-31164ebf3eb5\")) { Plotly.newPlot( \"4c1984d2-3b18-4093-a1ff-31164ebf3eb5\", [{\"mode\":\"lines+markers\",\"name\":\"Actual Revenue\",\"x\":[\"2023-06-30T00:00:00\",\"2023-09-30T00:00:00\",\"2023-12-31T00:00:00\",\"2024-03-31T00:00:00\",\"2024-06-30T00:00:00\",\"2024-09-30T00:00:00\",\"2024-12-31T00:00:00\"],\"y\":[9146296754,9297896247,17637490503,18818295502,16561793827,15036344926,18915504026],\"type\":\"scatter\"},{\"line\":{\"dash\":\"dash\"},\"mode\":\"lines+markers\",\"name\":\"Optimized SARIMA Forecast\",\"x\":[\"2023-06-30T00:00:00\",\"2023-09-30T00:00:00\",\"2023-12-31T00:00:00\",\"2024-03-31T00:00:00\",\"2024-06-30T00:00:00\",\"2024-09-30T00:00:00\",\"2024-12-31T00:00:00\"],\"y\":[10227200022.792908,13335489289.944857,15152848755.085747,18342084773.32733,17854604594.866013,18130668621.319298,18881262279.748497],\"type\":\"scatter\"},{\"line\":{\"color\":\"lightgray\"},\"mode\":\"lines\",\"name\":\"Lower Bound\",\"x\":[\"2023-06-30T00:00:00\",\"2023-09-30T00:00:00\",\"2023-12-31T00:00:00\",\"2024-03-31T00:00:00\",\"2024-06-30T00:00:00\",\"2024-09-30T00:00:00\",\"2024-12-31T00:00:00\"],\"y\":[-4505358899.269606,-2596816102.129263,-3203357521.5168,-3578114561.7674026,-5106405549.7327385,-6985697438.32756,-8006814762.206619],\"type\":\"scatter\"},{\"fill\":\"tonexty\",\"line\":{\"color\":\"lightgray\"},\"mode\":\"lines\",\"name\":\"Upper Bound\",\"x\":[\"2023-06-30T00:00:00\",\"2023-09-30T00:00:00\",\"2023-12-31T00:00:00\",\"2024-03-31T00:00:00\",\"2024-06-30T00:00:00\",\"2024-09-30T00:00:00\",\"2024-12-31T00:00:00\"],\"y\":[24959758944.855423,29267794682.018974,33509055031.688293,40262284108.422066,40815614739.46477,43247034680.966156,45769339321.70361],\"type\":\"scatter\"}], {\"template\":{\"data\":{\"histogram2dcontour\":[{\"type\":\"histogram2dcontour\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"choropleth\":[{\"type\":\"choropleth\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}],\"histogram2d\":[{\"type\":\"histogram2d\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"heatmap\":[{\"type\":\"heatmap\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"heatmapgl\":[{\"type\":\"heatmapgl\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"contourcarpet\":[{\"type\":\"contourcarpet\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}],\"contour\":[{\"type\":\"contour\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"surface\":[{\"type\":\"surface\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"mesh3d\":[{\"type\":\"mesh3d\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}],\"scatter\":[{\"fillpattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2},\"type\":\"scatter\"}],\"parcoords\":[{\"type\":\"parcoords\",\"line\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatterpolargl\":[{\"type\":\"scatterpolargl\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"bar\":[{\"error_x\":{\"color\":\"#2a3f5f\"},\"error_y\":{\"color\":\"#2a3f5f\"},\"marker\":{\"line\":{\"color\":\"#E5ECF6\",\"width\":0.5},\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"bar\"}],\"scattergeo\":[{\"type\":\"scattergeo\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatterpolar\":[{\"type\":\"scatterpolar\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"histogram\":[{\"marker\":{\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"histogram\"}],\"scattergl\":[{\"type\":\"scattergl\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatter3d\":[{\"type\":\"scatter3d\",\"line\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scattermapbox\":[{\"type\":\"scattermapbox\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatterternary\":[{\"type\":\"scatterternary\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scattercarpet\":[{\"type\":\"scattercarpet\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"carpet\":[{\"aaxis\":{\"endlinecolor\":\"#2a3f5f\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"minorgridcolor\":\"white\",\"startlinecolor\":\"#2a3f5f\"},\"baxis\":{\"endlinecolor\":\"#2a3f5f\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"minorgridcolor\":\"white\",\"startlinecolor\":\"#2a3f5f\"},\"type\":\"carpet\"}],\"table\":[{\"cells\":{\"fill\":{\"color\":\"#EBF0F8\"},\"line\":{\"color\":\"white\"}},\"header\":{\"fill\":{\"color\":\"#C8D4E3\"},\"line\":{\"color\":\"white\"}},\"type\":\"table\"}],\"barpolar\":[{\"marker\":{\"line\":{\"color\":\"#E5ECF6\",\"width\":0.5},\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"barpolar\"}],\"pie\":[{\"automargin\":true,\"type\":\"pie\"}]},\"layout\":{\"autotypenumbers\":\"strict\",\"colorway\":[\"#636efa\",\"#EF553B\",\"#00cc96\",\"#ab63fa\",\"#FFA15A\",\"#19d3f3\",\"#FF6692\",\"#B6E880\",\"#FF97FF\",\"#FECB52\"],\"font\":{\"color\":\"#2a3f5f\"},\"hovermode\":\"closest\",\"hoverlabel\":{\"align\":\"left\"},\"paper_bgcolor\":\"white\",\"plot_bgcolor\":\"#E5ECF6\",\"polar\":{\"bgcolor\":\"#E5ECF6\",\"angularaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"},\"radialaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"}},\"ternary\":{\"bgcolor\":\"#E5ECF6\",\"aaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"},\"baxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"},\"caxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"}},\"coloraxis\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"colorscale\":{\"sequential\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]],\"sequentialminus\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]],\"diverging\":[[0,\"#8e0152\"],[0.1,\"#c51b7d\"],[0.2,\"#de77ae\"],[0.3,\"#f1b6da\"],[0.4,\"#fde0ef\"],[0.5,\"#f7f7f7\"],[0.6,\"#e6f5d0\"],[0.7,\"#b8e186\"],[0.8,\"#7fbc41\"],[0.9,\"#4d9221\"],[1,\"#276419\"]]},\"xaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\",\"title\":{\"standoff\":15},\"zerolinecolor\":\"white\",\"automargin\":true,\"zerolinewidth\":2},\"yaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\",\"title\":{\"standoff\":15},\"zerolinecolor\":\"white\",\"automargin\":true,\"zerolinewidth\":2},\"scene\":{\"xaxis\":{\"backgroundcolor\":\"#E5ECF6\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"white\",\"gridwidth\":2},\"yaxis\":{\"backgroundcolor\":\"#E5ECF6\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"white\",\"gridwidth\":2},\"zaxis\":{\"backgroundcolor\":\"#E5ECF6\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"white\",\"gridwidth\":2}},\"shapedefaults\":{\"line\":{\"color\":\"#2a3f5f\"}},\"annotationdefaults\":{\"arrowcolor\":\"#2a3f5f\",\"arrowhead\":0,\"arrowwidth\":1},\"geo\":{\"bgcolor\":\"white\",\"landcolor\":\"#E5ECF6\",\"subunitcolor\":\"white\",\"showland\":true,\"showlakes\":true,\"lakecolor\":\"white\"},\"title\":{\"x\":0.05},\"mapbox\":{\"style\":\"light\"}}},\"title\":{\"text\":\"Optimized SARIMA Forecast - Merck KGaA Revenue\"},\"xaxis\":{\"title\":{\"text\":\"Year\"}},\"yaxis\":{\"title\":{\"text\":\"Revenue\"}}}, {\"responsive\": true} ).then(function(){\n",
|
| 1202 |
+
" \n",
|
| 1203 |
+
"var gd = document.getElementById('4c1984d2-3b18-4093-a1ff-31164ebf3eb5');\n",
|
| 1204 |
+
"var x = new MutationObserver(function (mutations, observer) {{\n",
|
| 1205 |
+
" var display = window.getComputedStyle(gd).display;\n",
|
| 1206 |
+
" if (!display || display === 'none') {{\n",
|
| 1207 |
+
" console.log([gd, 'removed!']);\n",
|
| 1208 |
+
" Plotly.purge(gd);\n",
|
| 1209 |
+
" observer.disconnect();\n",
|
| 1210 |
+
" }}\n",
|
| 1211 |
+
"}});\n",
|
| 1212 |
+
"\n",
|
| 1213 |
+
"// Listen for the removal of the full notebook cells\n",
|
| 1214 |
+
"var notebookContainer = gd.closest('#notebook-container');\n",
|
| 1215 |
+
"if (notebookContainer) {{\n",
|
| 1216 |
+
" x.observe(notebookContainer, {childList: true});\n",
|
| 1217 |
+
"}}\n",
|
| 1218 |
+
"\n",
|
| 1219 |
+
"// Listen for the clearing of the current output cell\n",
|
| 1220 |
+
"var outputEl = gd.closest('.output');\n",
|
| 1221 |
+
"if (outputEl) {{\n",
|
| 1222 |
+
" x.observe(outputEl, {childList: true});\n",
|
| 1223 |
+
"}}\n",
|
| 1224 |
+
"\n",
|
| 1225 |
+
" }) }; }); </script> </div>"
|
| 1226 |
+
]
|
| 1227 |
+
},
|
| 1228 |
+
"metadata": {},
|
| 1229 |
+
"output_type": "display_data"
|
| 1230 |
+
},
|
| 1231 |
+
{
|
| 1232 |
+
"data": {
|
| 1233 |
+
"application/vnd.plotly.v1+json": {
|
| 1234 |
+
"config": {
|
| 1235 |
+
"plotlyServerURL": "https://plot.ly"
|
| 1236 |
+
},
|
| 1237 |
+
"data": [
|
| 1238 |
+
{
|
| 1239 |
+
"marker": {
|
| 1240 |
+
"color": "green"
|
| 1241 |
+
},
|
| 1242 |
+
"mode": "lines+markers",
|
| 1243 |
+
"name": "Residuals",
|
| 1244 |
+
"type": "scatter",
|
| 1245 |
+
"x": [
|
| 1246 |
+
"2023-06-30T00:00:00",
|
| 1247 |
+
"2023-09-30T00:00:00",
|
| 1248 |
+
"2023-12-31T00:00:00",
|
| 1249 |
+
"2024-03-31T00:00:00",
|
| 1250 |
+
"2024-06-30T00:00:00",
|
| 1251 |
+
"2024-09-30T00:00:00",
|
| 1252 |
+
"2024-12-31T00:00:00"
|
| 1253 |
+
],
|
| 1254 |
+
"y": [
|
| 1255 |
+
-1080903268.7929077,
|
| 1256 |
+
-4037593042.9448566,
|
| 1257 |
+
2484641747.914253,
|
| 1258 |
+
476210728.67266846,
|
| 1259 |
+
-1292810767.8660126,
|
| 1260 |
+
-3094323695.319298,
|
| 1261 |
+
34241746.25150299
|
| 1262 |
+
]
|
| 1263 |
+
}
|
| 1264 |
+
],
|
| 1265 |
+
"layout": {
|
| 1266 |
+
"shapes": [
|
| 1267 |
+
{
|
| 1268 |
+
"line": {
|
| 1269 |
+
"color": "black",
|
| 1270 |
+
"dash": "dash"
|
| 1271 |
+
},
|
| 1272 |
+
"type": "line",
|
| 1273 |
+
"x0": 0,
|
| 1274 |
+
"x1": 1,
|
| 1275 |
+
"xref": "x domain",
|
| 1276 |
+
"y0": 0,
|
| 1277 |
+
"y1": 0,
|
| 1278 |
+
"yref": "y"
|
| 1279 |
+
}
|
| 1280 |
+
],
|
| 1281 |
+
"template": {
|
| 1282 |
+
"data": {
|
| 1283 |
+
"bar": [
|
| 1284 |
+
{
|
| 1285 |
+
"error_x": {
|
| 1286 |
+
"color": "#2a3f5f"
|
| 1287 |
+
},
|
| 1288 |
+
"error_y": {
|
| 1289 |
+
"color": "#2a3f5f"
|
| 1290 |
+
},
|
| 1291 |
+
"marker": {
|
| 1292 |
+
"line": {
|
| 1293 |
+
"color": "#E5ECF6",
|
| 1294 |
+
"width": 0.5
|
| 1295 |
+
},
|
| 1296 |
+
"pattern": {
|
| 1297 |
+
"fillmode": "overlay",
|
| 1298 |
+
"size": 10,
|
| 1299 |
+
"solidity": 0.2
|
| 1300 |
+
}
|
| 1301 |
+
},
|
| 1302 |
+
"type": "bar"
|
| 1303 |
+
}
|
| 1304 |
+
],
|
| 1305 |
+
"barpolar": [
|
| 1306 |
+
{
|
| 1307 |
+
"marker": {
|
| 1308 |
+
"line": {
|
| 1309 |
+
"color": "#E5ECF6",
|
| 1310 |
+
"width": 0.5
|
| 1311 |
+
},
|
| 1312 |
+
"pattern": {
|
| 1313 |
+
"fillmode": "overlay",
|
| 1314 |
+
"size": 10,
|
| 1315 |
+
"solidity": 0.2
|
| 1316 |
+
}
|
| 1317 |
+
},
|
| 1318 |
+
"type": "barpolar"
|
| 1319 |
+
}
|
| 1320 |
+
],
|
| 1321 |
+
"carpet": [
|
| 1322 |
+
{
|
| 1323 |
+
"aaxis": {
|
| 1324 |
+
"endlinecolor": "#2a3f5f",
|
| 1325 |
+
"gridcolor": "white",
|
| 1326 |
+
"linecolor": "white",
|
| 1327 |
+
"minorgridcolor": "white",
|
| 1328 |
+
"startlinecolor": "#2a3f5f"
|
| 1329 |
+
},
|
| 1330 |
+
"baxis": {
|
| 1331 |
+
"endlinecolor": "#2a3f5f",
|
| 1332 |
+
"gridcolor": "white",
|
| 1333 |
+
"linecolor": "white",
|
| 1334 |
+
"minorgridcolor": "white",
|
| 1335 |
+
"startlinecolor": "#2a3f5f"
|
| 1336 |
+
},
|
| 1337 |
+
"type": "carpet"
|
| 1338 |
+
}
|
| 1339 |
+
],
|
| 1340 |
+
"choropleth": [
|
| 1341 |
+
{
|
| 1342 |
+
"colorbar": {
|
| 1343 |
+
"outlinewidth": 0,
|
| 1344 |
+
"ticks": ""
|
| 1345 |
+
},
|
| 1346 |
+
"type": "choropleth"
|
| 1347 |
+
}
|
| 1348 |
+
],
|
| 1349 |
+
"contour": [
|
| 1350 |
+
{
|
| 1351 |
+
"colorbar": {
|
| 1352 |
+
"outlinewidth": 0,
|
| 1353 |
+
"ticks": ""
|
| 1354 |
+
},
|
| 1355 |
+
"colorscale": [
|
| 1356 |
+
[
|
| 1357 |
+
0,
|
| 1358 |
+
"#0d0887"
|
| 1359 |
+
],
|
| 1360 |
+
[
|
| 1361 |
+
0.1111111111111111,
|
| 1362 |
+
"#46039f"
|
| 1363 |
+
],
|
| 1364 |
+
[
|
| 1365 |
+
0.2222222222222222,
|
| 1366 |
+
"#7201a8"
|
| 1367 |
+
],
|
| 1368 |
+
[
|
| 1369 |
+
0.3333333333333333,
|
| 1370 |
+
"#9c179e"
|
| 1371 |
+
],
|
| 1372 |
+
[
|
| 1373 |
+
0.4444444444444444,
|
| 1374 |
+
"#bd3786"
|
| 1375 |
+
],
|
| 1376 |
+
[
|
| 1377 |
+
0.5555555555555556,
|
| 1378 |
+
"#d8576b"
|
| 1379 |
+
],
|
| 1380 |
+
[
|
| 1381 |
+
0.6666666666666666,
|
| 1382 |
+
"#ed7953"
|
| 1383 |
+
],
|
| 1384 |
+
[
|
| 1385 |
+
0.7777777777777778,
|
| 1386 |
+
"#fb9f3a"
|
| 1387 |
+
],
|
| 1388 |
+
[
|
| 1389 |
+
0.8888888888888888,
|
| 1390 |
+
"#fdca26"
|
| 1391 |
+
],
|
| 1392 |
+
[
|
| 1393 |
+
1,
|
| 1394 |
+
"#f0f921"
|
| 1395 |
+
]
|
| 1396 |
+
],
|
| 1397 |
+
"type": "contour"
|
| 1398 |
+
}
|
| 1399 |
+
],
|
| 1400 |
+
"contourcarpet": [
|
| 1401 |
+
{
|
| 1402 |
+
"colorbar": {
|
| 1403 |
+
"outlinewidth": 0,
|
| 1404 |
+
"ticks": ""
|
| 1405 |
+
},
|
| 1406 |
+
"type": "contourcarpet"
|
| 1407 |
+
}
|
| 1408 |
+
],
|
| 1409 |
+
"heatmap": [
|
| 1410 |
+
{
|
| 1411 |
+
"colorbar": {
|
| 1412 |
+
"outlinewidth": 0,
|
| 1413 |
+
"ticks": ""
|
| 1414 |
+
},
|
| 1415 |
+
"colorscale": [
|
| 1416 |
+
[
|
| 1417 |
+
0,
|
| 1418 |
+
"#0d0887"
|
| 1419 |
+
],
|
| 1420 |
+
[
|
| 1421 |
+
0.1111111111111111,
|
| 1422 |
+
"#46039f"
|
| 1423 |
+
],
|
| 1424 |
+
[
|
| 1425 |
+
0.2222222222222222,
|
| 1426 |
+
"#7201a8"
|
| 1427 |
+
],
|
| 1428 |
+
[
|
| 1429 |
+
0.3333333333333333,
|
| 1430 |
+
"#9c179e"
|
| 1431 |
+
],
|
| 1432 |
+
[
|
| 1433 |
+
0.4444444444444444,
|
| 1434 |
+
"#bd3786"
|
| 1435 |
+
],
|
| 1436 |
+
[
|
| 1437 |
+
0.5555555555555556,
|
| 1438 |
+
"#d8576b"
|
| 1439 |
+
],
|
| 1440 |
+
[
|
| 1441 |
+
0.6666666666666666,
|
| 1442 |
+
"#ed7953"
|
| 1443 |
+
],
|
| 1444 |
+
[
|
| 1445 |
+
0.7777777777777778,
|
| 1446 |
+
"#fb9f3a"
|
| 1447 |
+
],
|
| 1448 |
+
[
|
| 1449 |
+
0.8888888888888888,
|
| 1450 |
+
"#fdca26"
|
| 1451 |
+
],
|
| 1452 |
+
[
|
| 1453 |
+
1,
|
| 1454 |
+
"#f0f921"
|
| 1455 |
+
]
|
| 1456 |
+
],
|
| 1457 |
+
"type": "heatmap"
|
| 1458 |
+
}
|
| 1459 |
+
],
|
| 1460 |
+
"heatmapgl": [
|
| 1461 |
+
{
|
| 1462 |
+
"colorbar": {
|
| 1463 |
+
"outlinewidth": 0,
|
| 1464 |
+
"ticks": ""
|
| 1465 |
+
},
|
| 1466 |
+
"colorscale": [
|
| 1467 |
+
[
|
| 1468 |
+
0,
|
| 1469 |
+
"#0d0887"
|
| 1470 |
+
],
|
| 1471 |
+
[
|
| 1472 |
+
0.1111111111111111,
|
| 1473 |
+
"#46039f"
|
| 1474 |
+
],
|
| 1475 |
+
[
|
| 1476 |
+
0.2222222222222222,
|
| 1477 |
+
"#7201a8"
|
| 1478 |
+
],
|
| 1479 |
+
[
|
| 1480 |
+
0.3333333333333333,
|
| 1481 |
+
"#9c179e"
|
| 1482 |
+
],
|
| 1483 |
+
[
|
| 1484 |
+
0.4444444444444444,
|
| 1485 |
+
"#bd3786"
|
| 1486 |
+
],
|
| 1487 |
+
[
|
| 1488 |
+
0.5555555555555556,
|
| 1489 |
+
"#d8576b"
|
| 1490 |
+
],
|
| 1491 |
+
[
|
| 1492 |
+
0.6666666666666666,
|
| 1493 |
+
"#ed7953"
|
| 1494 |
+
],
|
| 1495 |
+
[
|
| 1496 |
+
0.7777777777777778,
|
| 1497 |
+
"#fb9f3a"
|
| 1498 |
+
],
|
| 1499 |
+
[
|
| 1500 |
+
0.8888888888888888,
|
| 1501 |
+
"#fdca26"
|
| 1502 |
+
],
|
| 1503 |
+
[
|
| 1504 |
+
1,
|
| 1505 |
+
"#f0f921"
|
| 1506 |
+
]
|
| 1507 |
+
],
|
| 1508 |
+
"type": "heatmapgl"
|
| 1509 |
+
}
|
| 1510 |
+
],
|
| 1511 |
+
"histogram": [
|
| 1512 |
+
{
|
| 1513 |
+
"marker": {
|
| 1514 |
+
"pattern": {
|
| 1515 |
+
"fillmode": "overlay",
|
| 1516 |
+
"size": 10,
|
| 1517 |
+
"solidity": 0.2
|
| 1518 |
+
}
|
| 1519 |
+
},
|
| 1520 |
+
"type": "histogram"
|
| 1521 |
+
}
|
| 1522 |
+
],
|
| 1523 |
+
"histogram2d": [
|
| 1524 |
+
{
|
| 1525 |
+
"colorbar": {
|
| 1526 |
+
"outlinewidth": 0,
|
| 1527 |
+
"ticks": ""
|
| 1528 |
+
},
|
| 1529 |
+
"colorscale": [
|
| 1530 |
+
[
|
| 1531 |
+
0,
|
| 1532 |
+
"#0d0887"
|
| 1533 |
+
],
|
| 1534 |
+
[
|
| 1535 |
+
0.1111111111111111,
|
| 1536 |
+
"#46039f"
|
| 1537 |
+
],
|
| 1538 |
+
[
|
| 1539 |
+
0.2222222222222222,
|
| 1540 |
+
"#7201a8"
|
| 1541 |
+
],
|
| 1542 |
+
[
|
| 1543 |
+
0.3333333333333333,
|
| 1544 |
+
"#9c179e"
|
| 1545 |
+
],
|
| 1546 |
+
[
|
| 1547 |
+
0.4444444444444444,
|
| 1548 |
+
"#bd3786"
|
| 1549 |
+
],
|
| 1550 |
+
[
|
| 1551 |
+
0.5555555555555556,
|
| 1552 |
+
"#d8576b"
|
| 1553 |
+
],
|
| 1554 |
+
[
|
| 1555 |
+
0.6666666666666666,
|
| 1556 |
+
"#ed7953"
|
| 1557 |
+
],
|
| 1558 |
+
[
|
| 1559 |
+
0.7777777777777778,
|
| 1560 |
+
"#fb9f3a"
|
| 1561 |
+
],
|
| 1562 |
+
[
|
| 1563 |
+
0.8888888888888888,
|
| 1564 |
+
"#fdca26"
|
| 1565 |
+
],
|
| 1566 |
+
[
|
| 1567 |
+
1,
|
| 1568 |
+
"#f0f921"
|
| 1569 |
+
]
|
| 1570 |
+
],
|
| 1571 |
+
"type": "histogram2d"
|
| 1572 |
+
}
|
| 1573 |
+
],
|
| 1574 |
+
"histogram2dcontour": [
|
| 1575 |
+
{
|
| 1576 |
+
"colorbar": {
|
| 1577 |
+
"outlinewidth": 0,
|
| 1578 |
+
"ticks": ""
|
| 1579 |
+
},
|
| 1580 |
+
"colorscale": [
|
| 1581 |
+
[
|
| 1582 |
+
0,
|
| 1583 |
+
"#0d0887"
|
| 1584 |
+
],
|
| 1585 |
+
[
|
| 1586 |
+
0.1111111111111111,
|
| 1587 |
+
"#46039f"
|
| 1588 |
+
],
|
| 1589 |
+
[
|
| 1590 |
+
0.2222222222222222,
|
| 1591 |
+
"#7201a8"
|
| 1592 |
+
],
|
| 1593 |
+
[
|
| 1594 |
+
0.3333333333333333,
|
| 1595 |
+
"#9c179e"
|
| 1596 |
+
],
|
| 1597 |
+
[
|
| 1598 |
+
0.4444444444444444,
|
| 1599 |
+
"#bd3786"
|
| 1600 |
+
],
|
| 1601 |
+
[
|
| 1602 |
+
0.5555555555555556,
|
| 1603 |
+
"#d8576b"
|
| 1604 |
+
],
|
| 1605 |
+
[
|
| 1606 |
+
0.6666666666666666,
|
| 1607 |
+
"#ed7953"
|
| 1608 |
+
],
|
| 1609 |
+
[
|
| 1610 |
+
0.7777777777777778,
|
| 1611 |
+
"#fb9f3a"
|
| 1612 |
+
],
|
| 1613 |
+
[
|
| 1614 |
+
0.8888888888888888,
|
| 1615 |
+
"#fdca26"
|
| 1616 |
+
],
|
| 1617 |
+
[
|
| 1618 |
+
1,
|
| 1619 |
+
"#f0f921"
|
| 1620 |
+
]
|
| 1621 |
+
],
|
| 1622 |
+
"type": "histogram2dcontour"
|
| 1623 |
+
}
|
| 1624 |
+
],
|
| 1625 |
+
"mesh3d": [
|
| 1626 |
+
{
|
| 1627 |
+
"colorbar": {
|
| 1628 |
+
"outlinewidth": 0,
|
| 1629 |
+
"ticks": ""
|
| 1630 |
+
},
|
| 1631 |
+
"type": "mesh3d"
|
| 1632 |
+
}
|
| 1633 |
+
],
|
| 1634 |
+
"parcoords": [
|
| 1635 |
+
{
|
| 1636 |
+
"line": {
|
| 1637 |
+
"colorbar": {
|
| 1638 |
+
"outlinewidth": 0,
|
| 1639 |
+
"ticks": ""
|
| 1640 |
+
}
|
| 1641 |
+
},
|
| 1642 |
+
"type": "parcoords"
|
| 1643 |
+
}
|
| 1644 |
+
],
|
| 1645 |
+
"pie": [
|
| 1646 |
+
{
|
| 1647 |
+
"automargin": true,
|
| 1648 |
+
"type": "pie"
|
| 1649 |
+
}
|
| 1650 |
+
],
|
| 1651 |
+
"scatter": [
|
| 1652 |
+
{
|
| 1653 |
+
"fillpattern": {
|
| 1654 |
+
"fillmode": "overlay",
|
| 1655 |
+
"size": 10,
|
| 1656 |
+
"solidity": 0.2
|
| 1657 |
+
},
|
| 1658 |
+
"type": "scatter"
|
| 1659 |
+
}
|
| 1660 |
+
],
|
| 1661 |
+
"scatter3d": [
|
| 1662 |
+
{
|
| 1663 |
+
"line": {
|
| 1664 |
+
"colorbar": {
|
| 1665 |
+
"outlinewidth": 0,
|
| 1666 |
+
"ticks": ""
|
| 1667 |
+
}
|
| 1668 |
+
},
|
| 1669 |
+
"marker": {
|
| 1670 |
+
"colorbar": {
|
| 1671 |
+
"outlinewidth": 0,
|
| 1672 |
+
"ticks": ""
|
| 1673 |
+
}
|
| 1674 |
+
},
|
| 1675 |
+
"type": "scatter3d"
|
| 1676 |
+
}
|
| 1677 |
+
],
|
| 1678 |
+
"scattercarpet": [
|
| 1679 |
+
{
|
| 1680 |
+
"marker": {
|
| 1681 |
+
"colorbar": {
|
| 1682 |
+
"outlinewidth": 0,
|
| 1683 |
+
"ticks": ""
|
| 1684 |
+
}
|
| 1685 |
+
},
|
| 1686 |
+
"type": "scattercarpet"
|
| 1687 |
+
}
|
| 1688 |
+
],
|
| 1689 |
+
"scattergeo": [
|
| 1690 |
+
{
|
| 1691 |
+
"marker": {
|
| 1692 |
+
"colorbar": {
|
| 1693 |
+
"outlinewidth": 0,
|
| 1694 |
+
"ticks": ""
|
| 1695 |
+
}
|
| 1696 |
+
},
|
| 1697 |
+
"type": "scattergeo"
|
| 1698 |
+
}
|
| 1699 |
+
],
|
| 1700 |
+
"scattergl": [
|
| 1701 |
+
{
|
| 1702 |
+
"marker": {
|
| 1703 |
+
"colorbar": {
|
| 1704 |
+
"outlinewidth": 0,
|
| 1705 |
+
"ticks": ""
|
| 1706 |
+
}
|
| 1707 |
+
},
|
| 1708 |
+
"type": "scattergl"
|
| 1709 |
+
}
|
| 1710 |
+
],
|
| 1711 |
+
"scattermapbox": [
|
| 1712 |
+
{
|
| 1713 |
+
"marker": {
|
| 1714 |
+
"colorbar": {
|
| 1715 |
+
"outlinewidth": 0,
|
| 1716 |
+
"ticks": ""
|
| 1717 |
+
}
|
| 1718 |
+
},
|
| 1719 |
+
"type": "scattermapbox"
|
| 1720 |
+
}
|
| 1721 |
+
],
|
| 1722 |
+
"scatterpolar": [
|
| 1723 |
+
{
|
| 1724 |
+
"marker": {
|
| 1725 |
+
"colorbar": {
|
| 1726 |
+
"outlinewidth": 0,
|
| 1727 |
+
"ticks": ""
|
| 1728 |
+
}
|
| 1729 |
+
},
|
| 1730 |
+
"type": "scatterpolar"
|
| 1731 |
+
}
|
| 1732 |
+
],
|
| 1733 |
+
"scatterpolargl": [
|
| 1734 |
+
{
|
| 1735 |
+
"marker": {
|
| 1736 |
+
"colorbar": {
|
| 1737 |
+
"outlinewidth": 0,
|
| 1738 |
+
"ticks": ""
|
| 1739 |
+
}
|
| 1740 |
+
},
|
| 1741 |
+
"type": "scatterpolargl"
|
| 1742 |
+
}
|
| 1743 |
+
],
|
| 1744 |
+
"scatterternary": [
|
| 1745 |
+
{
|
| 1746 |
+
"marker": {
|
| 1747 |
+
"colorbar": {
|
| 1748 |
+
"outlinewidth": 0,
|
| 1749 |
+
"ticks": ""
|
| 1750 |
+
}
|
| 1751 |
+
},
|
| 1752 |
+
"type": "scatterternary"
|
| 1753 |
+
}
|
| 1754 |
+
],
|
| 1755 |
+
"surface": [
|
| 1756 |
+
{
|
| 1757 |
+
"colorbar": {
|
| 1758 |
+
"outlinewidth": 0,
|
| 1759 |
+
"ticks": ""
|
| 1760 |
+
},
|
| 1761 |
+
"colorscale": [
|
| 1762 |
+
[
|
| 1763 |
+
0,
|
| 1764 |
+
"#0d0887"
|
| 1765 |
+
],
|
| 1766 |
+
[
|
| 1767 |
+
0.1111111111111111,
|
| 1768 |
+
"#46039f"
|
| 1769 |
+
],
|
| 1770 |
+
[
|
| 1771 |
+
0.2222222222222222,
|
| 1772 |
+
"#7201a8"
|
| 1773 |
+
],
|
| 1774 |
+
[
|
| 1775 |
+
0.3333333333333333,
|
| 1776 |
+
"#9c179e"
|
| 1777 |
+
],
|
| 1778 |
+
[
|
| 1779 |
+
0.4444444444444444,
|
| 1780 |
+
"#bd3786"
|
| 1781 |
+
],
|
| 1782 |
+
[
|
| 1783 |
+
0.5555555555555556,
|
| 1784 |
+
"#d8576b"
|
| 1785 |
+
],
|
| 1786 |
+
[
|
| 1787 |
+
0.6666666666666666,
|
| 1788 |
+
"#ed7953"
|
| 1789 |
+
],
|
| 1790 |
+
[
|
| 1791 |
+
0.7777777777777778,
|
| 1792 |
+
"#fb9f3a"
|
| 1793 |
+
],
|
| 1794 |
+
[
|
| 1795 |
+
0.8888888888888888,
|
| 1796 |
+
"#fdca26"
|
| 1797 |
+
],
|
| 1798 |
+
[
|
| 1799 |
+
1,
|
| 1800 |
+
"#f0f921"
|
| 1801 |
+
]
|
| 1802 |
+
],
|
| 1803 |
+
"type": "surface"
|
| 1804 |
+
}
|
| 1805 |
+
],
|
| 1806 |
+
"table": [
|
| 1807 |
+
{
|
| 1808 |
+
"cells": {
|
| 1809 |
+
"fill": {
|
| 1810 |
+
"color": "#EBF0F8"
|
| 1811 |
+
},
|
| 1812 |
+
"line": {
|
| 1813 |
+
"color": "white"
|
| 1814 |
+
}
|
| 1815 |
+
},
|
| 1816 |
+
"header": {
|
| 1817 |
+
"fill": {
|
| 1818 |
+
"color": "#C8D4E3"
|
| 1819 |
+
},
|
| 1820 |
+
"line": {
|
| 1821 |
+
"color": "white"
|
| 1822 |
+
}
|
| 1823 |
+
},
|
| 1824 |
+
"type": "table"
|
| 1825 |
+
}
|
| 1826 |
+
]
|
| 1827 |
+
},
|
| 1828 |
+
"layout": {
|
| 1829 |
+
"annotationdefaults": {
|
| 1830 |
+
"arrowcolor": "#2a3f5f",
|
| 1831 |
+
"arrowhead": 0,
|
| 1832 |
+
"arrowwidth": 1
|
| 1833 |
+
},
|
| 1834 |
+
"autotypenumbers": "strict",
|
| 1835 |
+
"coloraxis": {
|
| 1836 |
+
"colorbar": {
|
| 1837 |
+
"outlinewidth": 0,
|
| 1838 |
+
"ticks": ""
|
| 1839 |
+
}
|
| 1840 |
+
},
|
| 1841 |
+
"colorscale": {
|
| 1842 |
+
"diverging": [
|
| 1843 |
+
[
|
| 1844 |
+
0,
|
| 1845 |
+
"#8e0152"
|
| 1846 |
+
],
|
| 1847 |
+
[
|
| 1848 |
+
0.1,
|
| 1849 |
+
"#c51b7d"
|
| 1850 |
+
],
|
| 1851 |
+
[
|
| 1852 |
+
0.2,
|
| 1853 |
+
"#de77ae"
|
| 1854 |
+
],
|
| 1855 |
+
[
|
| 1856 |
+
0.3,
|
| 1857 |
+
"#f1b6da"
|
| 1858 |
+
],
|
| 1859 |
+
[
|
| 1860 |
+
0.4,
|
| 1861 |
+
"#fde0ef"
|
| 1862 |
+
],
|
| 1863 |
+
[
|
| 1864 |
+
0.5,
|
| 1865 |
+
"#f7f7f7"
|
| 1866 |
+
],
|
| 1867 |
+
[
|
| 1868 |
+
0.6,
|
| 1869 |
+
"#e6f5d0"
|
| 1870 |
+
],
|
| 1871 |
+
[
|
| 1872 |
+
0.7,
|
| 1873 |
+
"#b8e186"
|
| 1874 |
+
],
|
| 1875 |
+
[
|
| 1876 |
+
0.8,
|
| 1877 |
+
"#7fbc41"
|
| 1878 |
+
],
|
| 1879 |
+
[
|
| 1880 |
+
0.9,
|
| 1881 |
+
"#4d9221"
|
| 1882 |
+
],
|
| 1883 |
+
[
|
| 1884 |
+
1,
|
| 1885 |
+
"#276419"
|
| 1886 |
+
]
|
| 1887 |
+
],
|
| 1888 |
+
"sequential": [
|
| 1889 |
+
[
|
| 1890 |
+
0,
|
| 1891 |
+
"#0d0887"
|
| 1892 |
+
],
|
| 1893 |
+
[
|
| 1894 |
+
0.1111111111111111,
|
| 1895 |
+
"#46039f"
|
| 1896 |
+
],
|
| 1897 |
+
[
|
| 1898 |
+
0.2222222222222222,
|
| 1899 |
+
"#7201a8"
|
| 1900 |
+
],
|
| 1901 |
+
[
|
| 1902 |
+
0.3333333333333333,
|
| 1903 |
+
"#9c179e"
|
| 1904 |
+
],
|
| 1905 |
+
[
|
| 1906 |
+
0.4444444444444444,
|
| 1907 |
+
"#bd3786"
|
| 1908 |
+
],
|
| 1909 |
+
[
|
| 1910 |
+
0.5555555555555556,
|
| 1911 |
+
"#d8576b"
|
| 1912 |
+
],
|
| 1913 |
+
[
|
| 1914 |
+
0.6666666666666666,
|
| 1915 |
+
"#ed7953"
|
| 1916 |
+
],
|
| 1917 |
+
[
|
| 1918 |
+
0.7777777777777778,
|
| 1919 |
+
"#fb9f3a"
|
| 1920 |
+
],
|
| 1921 |
+
[
|
| 1922 |
+
0.8888888888888888,
|
| 1923 |
+
"#fdca26"
|
| 1924 |
+
],
|
| 1925 |
+
[
|
| 1926 |
+
1,
|
| 1927 |
+
"#f0f921"
|
| 1928 |
+
]
|
| 1929 |
+
],
|
| 1930 |
+
"sequentialminus": [
|
| 1931 |
+
[
|
| 1932 |
+
0,
|
| 1933 |
+
"#0d0887"
|
| 1934 |
+
],
|
| 1935 |
+
[
|
| 1936 |
+
0.1111111111111111,
|
| 1937 |
+
"#46039f"
|
| 1938 |
+
],
|
| 1939 |
+
[
|
| 1940 |
+
0.2222222222222222,
|
| 1941 |
+
"#7201a8"
|
| 1942 |
+
],
|
| 1943 |
+
[
|
| 1944 |
+
0.3333333333333333,
|
| 1945 |
+
"#9c179e"
|
| 1946 |
+
],
|
| 1947 |
+
[
|
| 1948 |
+
0.4444444444444444,
|
| 1949 |
+
"#bd3786"
|
| 1950 |
+
],
|
| 1951 |
+
[
|
| 1952 |
+
0.5555555555555556,
|
| 1953 |
+
"#d8576b"
|
| 1954 |
+
],
|
| 1955 |
+
[
|
| 1956 |
+
0.6666666666666666,
|
| 1957 |
+
"#ed7953"
|
| 1958 |
+
],
|
| 1959 |
+
[
|
| 1960 |
+
0.7777777777777778,
|
| 1961 |
+
"#fb9f3a"
|
| 1962 |
+
],
|
| 1963 |
+
[
|
| 1964 |
+
0.8888888888888888,
|
| 1965 |
+
"#fdca26"
|
| 1966 |
+
],
|
| 1967 |
+
[
|
| 1968 |
+
1,
|
| 1969 |
+
"#f0f921"
|
| 1970 |
+
]
|
| 1971 |
+
]
|
| 1972 |
+
},
|
| 1973 |
+
"colorway": [
|
| 1974 |
+
"#636efa",
|
| 1975 |
+
"#EF553B",
|
| 1976 |
+
"#00cc96",
|
| 1977 |
+
"#ab63fa",
|
| 1978 |
+
"#FFA15A",
|
| 1979 |
+
"#19d3f3",
|
| 1980 |
+
"#FF6692",
|
| 1981 |
+
"#B6E880",
|
| 1982 |
+
"#FF97FF",
|
| 1983 |
+
"#FECB52"
|
| 1984 |
+
],
|
| 1985 |
+
"font": {
|
| 1986 |
+
"color": "#2a3f5f"
|
| 1987 |
+
},
|
| 1988 |
+
"geo": {
|
| 1989 |
+
"bgcolor": "white",
|
| 1990 |
+
"lakecolor": "white",
|
| 1991 |
+
"landcolor": "#E5ECF6",
|
| 1992 |
+
"showlakes": true,
|
| 1993 |
+
"showland": true,
|
| 1994 |
+
"subunitcolor": "white"
|
| 1995 |
+
},
|
| 1996 |
+
"hoverlabel": {
|
| 1997 |
+
"align": "left"
|
| 1998 |
+
},
|
| 1999 |
+
"hovermode": "closest",
|
| 2000 |
+
"mapbox": {
|
| 2001 |
+
"style": "light"
|
| 2002 |
+
},
|
| 2003 |
+
"paper_bgcolor": "white",
|
| 2004 |
+
"plot_bgcolor": "#E5ECF6",
|
| 2005 |
+
"polar": {
|
| 2006 |
+
"angularaxis": {
|
| 2007 |
+
"gridcolor": "white",
|
| 2008 |
+
"linecolor": "white",
|
| 2009 |
+
"ticks": ""
|
| 2010 |
+
},
|
| 2011 |
+
"bgcolor": "#E5ECF6",
|
| 2012 |
+
"radialaxis": {
|
| 2013 |
+
"gridcolor": "white",
|
| 2014 |
+
"linecolor": "white",
|
| 2015 |
+
"ticks": ""
|
| 2016 |
+
}
|
| 2017 |
+
},
|
| 2018 |
+
"scene": {
|
| 2019 |
+
"xaxis": {
|
| 2020 |
+
"backgroundcolor": "#E5ECF6",
|
| 2021 |
+
"gridcolor": "white",
|
| 2022 |
+
"gridwidth": 2,
|
| 2023 |
+
"linecolor": "white",
|
| 2024 |
+
"showbackground": true,
|
| 2025 |
+
"ticks": "",
|
| 2026 |
+
"zerolinecolor": "white"
|
| 2027 |
+
},
|
| 2028 |
+
"yaxis": {
|
| 2029 |
+
"backgroundcolor": "#E5ECF6",
|
| 2030 |
+
"gridcolor": "white",
|
| 2031 |
+
"gridwidth": 2,
|
| 2032 |
+
"linecolor": "white",
|
| 2033 |
+
"showbackground": true,
|
| 2034 |
+
"ticks": "",
|
| 2035 |
+
"zerolinecolor": "white"
|
| 2036 |
+
},
|
| 2037 |
+
"zaxis": {
|
| 2038 |
+
"backgroundcolor": "#E5ECF6",
|
| 2039 |
+
"gridcolor": "white",
|
| 2040 |
+
"gridwidth": 2,
|
| 2041 |
+
"linecolor": "white",
|
| 2042 |
+
"showbackground": true,
|
| 2043 |
+
"ticks": "",
|
| 2044 |
+
"zerolinecolor": "white"
|
| 2045 |
+
}
|
| 2046 |
+
},
|
| 2047 |
+
"shapedefaults": {
|
| 2048 |
+
"line": {
|
| 2049 |
+
"color": "#2a3f5f"
|
| 2050 |
+
}
|
| 2051 |
+
},
|
| 2052 |
+
"ternary": {
|
| 2053 |
+
"aaxis": {
|
| 2054 |
+
"gridcolor": "white",
|
| 2055 |
+
"linecolor": "white",
|
| 2056 |
+
"ticks": ""
|
| 2057 |
+
},
|
| 2058 |
+
"baxis": {
|
| 2059 |
+
"gridcolor": "white",
|
| 2060 |
+
"linecolor": "white",
|
| 2061 |
+
"ticks": ""
|
| 2062 |
+
},
|
| 2063 |
+
"bgcolor": "#E5ECF6",
|
| 2064 |
+
"caxis": {
|
| 2065 |
+
"gridcolor": "white",
|
| 2066 |
+
"linecolor": "white",
|
| 2067 |
+
"ticks": ""
|
| 2068 |
+
}
|
| 2069 |
+
},
|
| 2070 |
+
"title": {
|
| 2071 |
+
"x": 0.05
|
| 2072 |
+
},
|
| 2073 |
+
"xaxis": {
|
| 2074 |
+
"automargin": true,
|
| 2075 |
+
"gridcolor": "white",
|
| 2076 |
+
"linecolor": "white",
|
| 2077 |
+
"ticks": "",
|
| 2078 |
+
"title": {
|
| 2079 |
+
"standoff": 15
|
| 2080 |
+
},
|
| 2081 |
+
"zerolinecolor": "white",
|
| 2082 |
+
"zerolinewidth": 2
|
| 2083 |
+
},
|
| 2084 |
+
"yaxis": {
|
| 2085 |
+
"automargin": true,
|
| 2086 |
+
"gridcolor": "white",
|
| 2087 |
+
"linecolor": "white",
|
| 2088 |
+
"ticks": "",
|
| 2089 |
+
"title": {
|
| 2090 |
+
"standoff": 15
|
| 2091 |
+
},
|
| 2092 |
+
"zerolinecolor": "white",
|
| 2093 |
+
"zerolinewidth": 2
|
| 2094 |
+
}
|
| 2095 |
+
}
|
| 2096 |
+
},
|
| 2097 |
+
"title": {
|
| 2098 |
+
"text": "Residual Plot - SARIMA Model for Merck KGaA Revenue"
|
| 2099 |
+
},
|
| 2100 |
+
"xaxis": {
|
| 2101 |
+
"title": {
|
| 2102 |
+
"text": "Year"
|
| 2103 |
+
}
|
| 2104 |
+
},
|
| 2105 |
+
"yaxis": {
|
| 2106 |
+
"title": {
|
| 2107 |
+
"text": "Residual (Error)"
|
| 2108 |
+
}
|
| 2109 |
+
}
|
| 2110 |
+
}
|
| 2111 |
+
},
|
| 2112 |
+
"text/html": [
|
| 2113 |
+
"<div> <div id=\"61735a22-7b4e-40af-901d-934547e7d010\" class=\"plotly-graph-div\" style=\"height:525px; width:100%;\"></div> <script type=\"text/javascript\"> require([\"plotly\"], function(Plotly) { window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById(\"61735a22-7b4e-40af-901d-934547e7d010\")) { Plotly.newPlot( \"61735a22-7b4e-40af-901d-934547e7d010\", [{\"marker\":{\"color\":\"green\"},\"mode\":\"lines+markers\",\"name\":\"Residuals\",\"x\":[\"2023-06-30T00:00:00\",\"2023-09-30T00:00:00\",\"2023-12-31T00:00:00\",\"2024-03-31T00:00:00\",\"2024-06-30T00:00:00\",\"2024-09-30T00:00:00\",\"2024-12-31T00:00:00\"],\"y\":[-1080903268.7929077,-4037593042.9448566,2484641747.914253,476210728.67266846,-1292810767.8660126,-3094323695.319298,34241746.25150299],\"type\":\"scatter\"}], {\"template\":{\"data\":{\"histogram2dcontour\":[{\"type\":\"histogram2dcontour\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"choropleth\":[{\"type\":\"choropleth\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}],\"histogram2d\":[{\"type\":\"histogram2d\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"heatmap\":[{\"type\":\"heatmap\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"heatmapgl\":[{\"type\":\"heatmapgl\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"contourcarpet\":[{\"type\":\"contourcarpet\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}],\"contour\":[{\"type\":\"contour\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"surface\":[{\"type\":\"surface\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]]}],\"mesh3d\":[{\"type\":\"mesh3d\",\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}],\"scatter\":[{\"fillpattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2},\"type\":\"scatter\"}],\"parcoords\":[{\"type\":\"parcoords\",\"line\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatterpolargl\":[{\"type\":\"scatterpolargl\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"bar\":[{\"error_x\":{\"color\":\"#2a3f5f\"},\"error_y\":{\"color\":\"#2a3f5f\"},\"marker\":{\"line\":{\"color\":\"#E5ECF6\",\"width\":0.5},\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"bar\"}],\"scattergeo\":[{\"type\":\"scattergeo\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatterpolar\":[{\"type\":\"scatterpolar\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"histogram\":[{\"marker\":{\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"histogram\"}],\"scattergl\":[{\"type\":\"scattergl\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatter3d\":[{\"type\":\"scatter3d\",\"line\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scattermapbox\":[{\"type\":\"scattermapbox\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scatterternary\":[{\"type\":\"scatterternary\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"scattercarpet\":[{\"type\":\"scattercarpet\",\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}}}],\"carpet\":[{\"aaxis\":{\"endlinecolor\":\"#2a3f5f\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"minorgridcolor\":\"white\",\"startlinecolor\":\"#2a3f5f\"},\"baxis\":{\"endlinecolor\":\"#2a3f5f\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"minorgridcolor\":\"white\",\"startlinecolor\":\"#2a3f5f\"},\"type\":\"carpet\"}],\"table\":[{\"cells\":{\"fill\":{\"color\":\"#EBF0F8\"},\"line\":{\"color\":\"white\"}},\"header\":{\"fill\":{\"color\":\"#C8D4E3\"},\"line\":{\"color\":\"white\"}},\"type\":\"table\"}],\"barpolar\":[{\"marker\":{\"line\":{\"color\":\"#E5ECF6\",\"width\":0.5},\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"barpolar\"}],\"pie\":[{\"automargin\":true,\"type\":\"pie\"}]},\"layout\":{\"autotypenumbers\":\"strict\",\"colorway\":[\"#636efa\",\"#EF553B\",\"#00cc96\",\"#ab63fa\",\"#FFA15A\",\"#19d3f3\",\"#FF6692\",\"#B6E880\",\"#FF97FF\",\"#FECB52\"],\"font\":{\"color\":\"#2a3f5f\"},\"hovermode\":\"closest\",\"hoverlabel\":{\"align\":\"left\"},\"paper_bgcolor\":\"white\",\"plot_bgcolor\":\"#E5ECF6\",\"polar\":{\"bgcolor\":\"#E5ECF6\",\"angularaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"},\"radialaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"}},\"ternary\":{\"bgcolor\":\"#E5ECF6\",\"aaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"},\"baxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"},\"caxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\"}},\"coloraxis\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"colorscale\":{\"sequential\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]],\"sequentialminus\":[[0.0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1.0,\"#f0f921\"]],\"diverging\":[[0,\"#8e0152\"],[0.1,\"#c51b7d\"],[0.2,\"#de77ae\"],[0.3,\"#f1b6da\"],[0.4,\"#fde0ef\"],[0.5,\"#f7f7f7\"],[0.6,\"#e6f5d0\"],[0.7,\"#b8e186\"],[0.8,\"#7fbc41\"],[0.9,\"#4d9221\"],[1,\"#276419\"]]},\"xaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\",\"title\":{\"standoff\":15},\"zerolinecolor\":\"white\",\"automargin\":true,\"zerolinewidth\":2},\"yaxis\":{\"gridcolor\":\"white\",\"linecolor\":\"white\",\"ticks\":\"\",\"title\":{\"standoff\":15},\"zerolinecolor\":\"white\",\"automargin\":true,\"zerolinewidth\":2},\"scene\":{\"xaxis\":{\"backgroundcolor\":\"#E5ECF6\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"white\",\"gridwidth\":2},\"yaxis\":{\"backgroundcolor\":\"#E5ECF6\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"white\",\"gridwidth\":2},\"zaxis\":{\"backgroundcolor\":\"#E5ECF6\",\"gridcolor\":\"white\",\"linecolor\":\"white\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"white\",\"gridwidth\":2}},\"shapedefaults\":{\"line\":{\"color\":\"#2a3f5f\"}},\"annotationdefaults\":{\"arrowcolor\":\"#2a3f5f\",\"arrowhead\":0,\"arrowwidth\":1},\"geo\":{\"bgcolor\":\"white\",\"landcolor\":\"#E5ECF6\",\"subunitcolor\":\"white\",\"showland\":true,\"showlakes\":true,\"lakecolor\":\"white\"},\"title\":{\"x\":0.05},\"mapbox\":{\"style\":\"light\"}}},\"shapes\":[{\"line\":{\"color\":\"black\",\"dash\":\"dash\"},\"type\":\"line\",\"x0\":0,\"x1\":1,\"xref\":\"x domain\",\"y0\":0,\"y1\":0,\"yref\":\"y\"}],\"title\":{\"text\":\"Residual Plot - SARIMA Model for Merck KGaA Revenue\"},\"xaxis\":{\"title\":{\"text\":\"Year\"}},\"yaxis\":{\"title\":{\"text\":\"Residual (Error)\"}}}, {\"responsive\": true} ).then(function(){\n",
|
| 2114 |
+
" \n",
|
| 2115 |
+
"var gd = document.getElementById('61735a22-7b4e-40af-901d-934547e7d010');\n",
|
| 2116 |
+
"var x = new MutationObserver(function (mutations, observer) {{\n",
|
| 2117 |
+
" var display = window.getComputedStyle(gd).display;\n",
|
| 2118 |
+
" if (!display || display === 'none') {{\n",
|
| 2119 |
+
" console.log([gd, 'removed!']);\n",
|
| 2120 |
+
" Plotly.purge(gd);\n",
|
| 2121 |
+
" observer.disconnect();\n",
|
| 2122 |
+
" }}\n",
|
| 2123 |
+
"}});\n",
|
| 2124 |
+
"\n",
|
| 2125 |
+
"// Listen for the removal of the full notebook cells\n",
|
| 2126 |
+
"var notebookContainer = gd.closest('#notebook-container');\n",
|
| 2127 |
+
"if (notebookContainer) {{\n",
|
| 2128 |
+
" x.observe(notebookContainer, {childList: true});\n",
|
| 2129 |
+
"}}\n",
|
| 2130 |
+
"\n",
|
| 2131 |
+
"// Listen for the clearing of the current output cell\n",
|
| 2132 |
+
"var outputEl = gd.closest('.output');\n",
|
| 2133 |
+
"if (outputEl) {{\n",
|
| 2134 |
+
" x.observe(outputEl, {childList: true});\n",
|
| 2135 |
+
"}}\n",
|
| 2136 |
+
"\n",
|
| 2137 |
+
" }) }; }); </script> </div>"
|
| 2138 |
+
]
|
| 2139 |
+
},
|
| 2140 |
+
"metadata": {},
|
| 2141 |
+
"output_type": "display_data"
|
| 2142 |
+
},
|
| 2143 |
+
{
|
| 2144 |
+
"data": {
|
| 2145 |
+
"text/plain": [
|
| 2146 |
+
"{'Daimler AG': {'MAE': 2803403604.737504,\n",
|
| 2147 |
+
" 'RMSE': np.float64(3229035031.7458644),\n",
|
| 2148 |
+
" 'MAPE': 0.2592787144524177,\n",
|
| 2149 |
+
" 'R² Score': 0.476156175144558,\n",
|
| 2150 |
+
" 'MASE': 0.4088002509751166},\n",
|
| 2151 |
+
" 'SAP SE': {'MAE': 1795966753.3207772,\n",
|
| 2152 |
+
" 'RMSE': np.float64(2276246995.6220593),\n",
|
| 2153 |
+
" 'MAPE': 0.15346896680489733,\n",
|
| 2154 |
+
" 'R² Score': 0.44072214479808214,\n",
|
| 2155 |
+
" 'MASE': 0.4490690656807591},\n",
|
| 2156 |
+
" 'Bayer AG': {'MAE': 1904095941.842971,\n",
|
| 2157 |
+
" 'RMSE': np.float64(2299718936.7021823),\n",
|
| 2158 |
+
" 'MAPE': 0.23220658526728813,\n",
|
| 2159 |
+
" 'R² Score': 0.37888093690197866,\n",
|
| 2160 |
+
" 'MASE': 0.5434079601836702},\n",
|
| 2161 |
+
" 'Deutsche Bank AG': {'MAE': 4650226927.57839,\n",
|
| 2162 |
+
" 'RMSE': np.float64(5801968772.601931),\n",
|
| 2163 |
+
" 'MAPE': 0.31027975021307463,\n",
|
| 2164 |
+
" 'R² Score': -0.4268341425413975,\n",
|
| 2165 |
+
" 'MASE': 0.6351088757138532},\n",
|
| 2166 |
+
" 'Porsche AG': {'MAE': 3060876810.471199,\n",
|
| 2167 |
+
" 'RMSE': np.float64(3823746336.8342195),\n",
|
| 2168 |
+
" 'MAPE': 0.19385020352210683,\n",
|
| 2169 |
+
" 'R² Score': -4.00679160952956,\n",
|
| 2170 |
+
" 'MASE': 1.023251665129631},\n",
|
| 2171 |
+
" 'Merck KGaA': {'MAE': 1785817856.8230712,\n",
|
| 2172 |
+
" 'RMSE': np.float64(2239837431.6204414),\n",
|
| 2173 |
+
" 'MAPE': 0.14346650412945658,\n",
|
| 2174 |
+
" 'R² Score': 0.6688933714067669,\n",
|
| 2175 |
+
" 'MASE': 0.6181757408326258}}"
|
| 2176 |
+
]
|
| 2177 |
+
},
|
| 2178 |
+
"execution_count": 27,
|
| 2179 |
+
"metadata": {},
|
| 2180 |
+
"output_type": "execute_result"
|
| 2181 |
+
}
|
| 2182 |
+
],
|
| 2183 |
+
"source": [
|
| 2184 |
+
"process_company(str(list_of_companies[11]), results)"
|
| 2185 |
+
]
|
| 2186 |
+
},
|
| 2187 |
+
{
|
| 2188 |
+
"cell_type": "code",
|
| 2189 |
+
"execution_count": null,
|
| 2190 |
+
"metadata": {},
|
| 2191 |
+
"outputs": [],
|
| 2192 |
+
"source": []
|
| 2193 |
+
},
|
| 2194 |
+
{
|
| 2195 |
+
"cell_type": "code",
|
| 2196 |
+
"execution_count": null,
|
| 2197 |
+
"metadata": {},
|
| 2198 |
+
"outputs": [],
|
| 2199 |
+
"source": []
|
| 2200 |
+
}
|
| 2201 |
+
],
|
| 2202 |
+
"metadata": {
|
| 2203 |
+
"kernelspec": {
|
| 2204 |
+
"display_name": "ai_env",
|
| 2205 |
+
"language": "python",
|
| 2206 |
+
"name": "python3"
|
| 2207 |
+
},
|
| 2208 |
+
"language_info": {
|
| 2209 |
+
"codemirror_mode": {
|
| 2210 |
+
"name": "ipython",
|
| 2211 |
+
"version": 3
|
| 2212 |
+
},
|
| 2213 |
+
"file_extension": ".py",
|
| 2214 |
+
"mimetype": "text/x-python",
|
| 2215 |
+
"name": "python",
|
| 2216 |
+
"nbconvert_exporter": "python",
|
| 2217 |
+
"pygments_lexer": "ipython3",
|
| 2218 |
+
"version": "3.10.16"
|
| 2219 |
+
}
|
| 2220 |
+
},
|
| 2221 |
+
"nbformat": 4,
|
| 2222 |
+
"nbformat_minor": 2
|
| 2223 |
+
}
|
dev_notebooks/12_company_analysis/simple_test.ipynb
ADDED
|
@@ -0,0 +1,394 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 49,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [],
|
| 8 |
+
"source": [
|
| 9 |
+
"from statsmodels.tsa.statespace.sarimax import SARIMAX\n",
|
| 10 |
+
"from sklearn.metrics import mean_absolute_error, mean_squared_error, mean_absolute_percentage_error, r2_score\n",
|
| 11 |
+
"from sklearn.model_selection import TimeSeriesSplit\n",
|
| 12 |
+
"import warnings \n",
|
| 13 |
+
"import numpy as np\n",
|
| 14 |
+
"import pandas as pd\n",
|
| 15 |
+
"import itertools\n",
|
| 16 |
+
"from rich.progress import Progress\n",
|
| 17 |
+
"from rich.console import Console\n",
|
| 18 |
+
"from itertools import product\n",
|
| 19 |
+
"\n",
|
| 20 |
+
"# Suppress warnings\n",
|
| 21 |
+
"warnings.filterwarnings(\"ignore\")\n",
|
| 22 |
+
"\n",
|
| 23 |
+
"console = Console()"
|
| 24 |
+
]
|
| 25 |
+
},
|
| 26 |
+
{
|
| 27 |
+
"cell_type": "code",
|
| 28 |
+
"execution_count": 50,
|
| 29 |
+
"metadata": {},
|
| 30 |
+
"outputs": [],
|
| 31 |
+
"source": [
|
| 32 |
+
"# Hyperparameter Grid Search for SARIMAX\n",
|
| 33 |
+
"def sarimax_grid_search(train, param_grid):\n",
|
| 34 |
+
" best_score, best_params = float(\"inf\"), None\n",
|
| 35 |
+
" for params in param_grid:\n",
|
| 36 |
+
" order, seasonal_order = params[:3], (params[3], params[4], params[5], params[6])\n",
|
| 37 |
+
"\n",
|
| 38 |
+
" model = SARIMAX(train, order=order, seasonal_order=seasonal_order, enforce_stationarity=False, enforce_invertibility=False)\n",
|
| 39 |
+
" results = model.fit(disp=False)\n",
|
| 40 |
+
" score = results.aic # Using AIC as evaluation metric\n",
|
| 41 |
+
" if score < best_score:\n",
|
| 42 |
+
" best_score, best_params = score, params\n",
|
| 43 |
+
" return best_params\n",
|
| 44 |
+
"\n",
|
| 45 |
+
"# Walk-Forward Validation\n",
|
| 46 |
+
"def walk_forward_validation(series, param_grid):\n",
|
| 47 |
+
" train_size = int(len(series) * 0.8)\n",
|
| 48 |
+
" train, test = series[:train_size], series[train_size:]\n",
|
| 49 |
+
" history = list(train)\n",
|
| 50 |
+
" predictions = []\n",
|
| 51 |
+
"\n",
|
| 52 |
+
" best_params = sarimax_grid_search(train, param_grid)\n",
|
| 53 |
+
" order, seasonal_order = best_params[:3], (best_params[3], best_params[4], best_params[5], best_params[6])\n",
|
| 54 |
+
" \n",
|
| 55 |
+
" for t in range(len(test)):\n",
|
| 56 |
+
" model = SARIMAX(history, order=order, seasonal_order=seasonal_order, enforce_stationarity=False, enforce_invertibility=False)\n",
|
| 57 |
+
" results = model.fit(disp=False)\n",
|
| 58 |
+
" yhat = results.forecast(steps=1)[0]\n",
|
| 59 |
+
" predictions.append(yhat)\n",
|
| 60 |
+
" history.append(test.iloc[t])\n",
|
| 61 |
+
"\n",
|
| 62 |
+
" mae = mean_absolute_error(test, predictions)\n",
|
| 63 |
+
" mse = mean_squared_error(test, predictions)\n",
|
| 64 |
+
" r2 = r2_score(test, predictions)\n",
|
| 65 |
+
" \n",
|
| 66 |
+
" print(f\"Walk-Forward Validation MAE: {mae:.3f}\")\n",
|
| 67 |
+
" print(f\"Walk-Forward Validation MSE: {mse:.3f}\")\n",
|
| 68 |
+
" print(f\"Walk-Forward Validation R2 Score: {r2:.3f}\")\n",
|
| 69 |
+
" \n",
|
| 70 |
+
" return mae, mse, r2\n",
|
| 71 |
+
"\n",
|
| 72 |
+
"# Naive Forecast Benchmark\n",
|
| 73 |
+
"def naive_forecast(series):\n",
|
| 74 |
+
" return series.shift(1) # Predicts the last value as the next value\n",
|
| 75 |
+
"\n",
|
| 76 |
+
"def evaluate_naive(series):\n",
|
| 77 |
+
" train_size = int(len(series) * 0.8)\n",
|
| 78 |
+
" train, test = series[:train_size], series[train_size:]\n",
|
| 79 |
+
" naive_preds = naive_forecast(test)\n",
|
| 80 |
+
" naive_mae = mean_absolute_error(test[1:], naive_preds[1:]) # Skip NaN value\n",
|
| 81 |
+
" naive_mse = mean_squared_error(test[1:], naive_preds[1:])\n",
|
| 82 |
+
" naive_r2 = r2_score(test[1:], naive_preds[1:])\n",
|
| 83 |
+
" \n",
|
| 84 |
+
" print(f\"Naive Forecast MAE: {naive_mae:.3f}\")\n",
|
| 85 |
+
" print(f\"Naive Forecast MSE: {naive_mse:.3f}\")\n",
|
| 86 |
+
" print(f\"Naive Forecast R2 Score: {naive_r2:.3f}\")\n",
|
| 87 |
+
" \n",
|
| 88 |
+
" return naive_mae, naive_mse, naive_r2\n",
|
| 89 |
+
"\n",
|
| 90 |
+
"\n",
|
| 91 |
+
"\n"
|
| 92 |
+
]
|
| 93 |
+
},
|
| 94 |
+
{
|
| 95 |
+
"cell_type": "code",
|
| 96 |
+
"execution_count": 51,
|
| 97 |
+
"metadata": {},
|
| 98 |
+
"outputs": [],
|
| 99 |
+
"source": [
|
| 100 |
+
"# Re-load the dataset (user needs to re-upload the file)\n",
|
| 101 |
+
"df = pd.read_csv(f\"../data/Top_12_German_Companies_Financial_Data.csv\") # Load the dataset\n",
|
| 102 |
+
"\n",
|
| 103 |
+
"# Filter dataset for SAP SE only\n",
|
| 104 |
+
"sap_df = df[df[\"Company\"] == \"SAP SE\"].copy()\n",
|
| 105 |
+
"\n",
|
| 106 |
+
"# Convert Period column to datetime format\n",
|
| 107 |
+
"sap_df[\"Period\"] = pd.to_datetime(sap_df[\"Period\"], format=\"%m/%d/%Y\")\n",
|
| 108 |
+
"\n",
|
| 109 |
+
"# Sort data by Period for proper time-series analysis\n",
|
| 110 |
+
"sap_df = sap_df.sort_values(by=\"Period\")\n",
|
| 111 |
+
"\n",
|
| 112 |
+
"# Convert revenue to numeric\n",
|
| 113 |
+
"sap_df[\"Revenue\"] = pd.to_numeric(sap_df[\"Revenue\"], errors=\"coerce\")\n",
|
| 114 |
+
"sap_df= sap_df[[\"Revenue\", 'Period']]\n"
|
| 115 |
+
]
|
| 116 |
+
},
|
| 117 |
+
{
|
| 118 |
+
"cell_type": "code",
|
| 119 |
+
"execution_count": 52,
|
| 120 |
+
"metadata": {},
|
| 121 |
+
"outputs": [
|
| 122 |
+
{
|
| 123 |
+
"data": {
|
| 124 |
+
"text/html": [
|
| 125 |
+
"<div>\n",
|
| 126 |
+
"<style scoped>\n",
|
| 127 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 128 |
+
" vertical-align: middle;\n",
|
| 129 |
+
" }\n",
|
| 130 |
+
"\n",
|
| 131 |
+
" .dataframe tbody tr th {\n",
|
| 132 |
+
" vertical-align: top;\n",
|
| 133 |
+
" }\n",
|
| 134 |
+
"\n",
|
| 135 |
+
" .dataframe thead th {\n",
|
| 136 |
+
" text-align: right;\n",
|
| 137 |
+
" }\n",
|
| 138 |
+
"</style>\n",
|
| 139 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 140 |
+
" <thead>\n",
|
| 141 |
+
" <tr style=\"text-align: right;\">\n",
|
| 142 |
+
" <th></th>\n",
|
| 143 |
+
" <th>y</th>\n",
|
| 144 |
+
" </tr>\n",
|
| 145 |
+
" <tr>\n",
|
| 146 |
+
" <th>ds</th>\n",
|
| 147 |
+
" <th></th>\n",
|
| 148 |
+
" </tr>\n",
|
| 149 |
+
" </thead>\n",
|
| 150 |
+
" <tbody>\n",
|
| 151 |
+
" <tr>\n",
|
| 152 |
+
" <th>2017-03-31</th>\n",
|
| 153 |
+
" <td>6568715630</td>\n",
|
| 154 |
+
" </tr>\n",
|
| 155 |
+
" <tr>\n",
|
| 156 |
+
" <th>2017-06-30</th>\n",
|
| 157 |
+
" <td>6644029236</td>\n",
|
| 158 |
+
" </tr>\n",
|
| 159 |
+
" <tr>\n",
|
| 160 |
+
" <th>2017-09-30</th>\n",
|
| 161 |
+
" <td>18227487487</td>\n",
|
| 162 |
+
" </tr>\n",
|
| 163 |
+
" <tr>\n",
|
| 164 |
+
" <th>2017-12-31</th>\n",
|
| 165 |
+
" <td>17560385805</td>\n",
|
| 166 |
+
" </tr>\n",
|
| 167 |
+
" <tr>\n",
|
| 168 |
+
" <th>2018-03-31</th>\n",
|
| 169 |
+
" <td>19774628627</td>\n",
|
| 170 |
+
" </tr>\n",
|
| 171 |
+
" <tr>\n",
|
| 172 |
+
" <th>2018-06-30</th>\n",
|
| 173 |
+
" <td>5282345417</td>\n",
|
| 174 |
+
" </tr>\n",
|
| 175 |
+
" <tr>\n",
|
| 176 |
+
" <th>2018-09-30</th>\n",
|
| 177 |
+
" <td>8133295785</td>\n",
|
| 178 |
+
" </tr>\n",
|
| 179 |
+
" <tr>\n",
|
| 180 |
+
" <th>2018-12-31</th>\n",
|
| 181 |
+
" <td>10184334320</td>\n",
|
| 182 |
+
" </tr>\n",
|
| 183 |
+
" <tr>\n",
|
| 184 |
+
" <th>2019-03-31</th>\n",
|
| 185 |
+
" <td>18300753695</td>\n",
|
| 186 |
+
" </tr>\n",
|
| 187 |
+
" <tr>\n",
|
| 188 |
+
" <th>2019-06-30</th>\n",
|
| 189 |
+
" <td>13878289168</td>\n",
|
| 190 |
+
" </tr>\n",
|
| 191 |
+
" <tr>\n",
|
| 192 |
+
" <th>2019-09-30</th>\n",
|
| 193 |
+
" <td>13973147193</td>\n",
|
| 194 |
+
" </tr>\n",
|
| 195 |
+
" <tr>\n",
|
| 196 |
+
" <th>2019-12-31</th>\n",
|
| 197 |
+
" <td>8046709255</td>\n",
|
| 198 |
+
" </tr>\n",
|
| 199 |
+
" <tr>\n",
|
| 200 |
+
" <th>2020-03-31</th>\n",
|
| 201 |
+
" <td>9236017256</td>\n",
|
| 202 |
+
" </tr>\n",
|
| 203 |
+
" <tr>\n",
|
| 204 |
+
" <th>2020-06-30</th>\n",
|
| 205 |
+
" <td>6413035553</td>\n",
|
| 206 |
+
" </tr>\n",
|
| 207 |
+
" <tr>\n",
|
| 208 |
+
" <th>2020-09-30</th>\n",
|
| 209 |
+
" <td>15986728775</td>\n",
|
| 210 |
+
" </tr>\n",
|
| 211 |
+
" <tr>\n",
|
| 212 |
+
" <th>2020-12-31</th>\n",
|
| 213 |
+
" <td>9687560178</td>\n",
|
| 214 |
+
" </tr>\n",
|
| 215 |
+
" <tr>\n",
|
| 216 |
+
" <th>2021-03-31</th>\n",
|
| 217 |
+
" <td>6588278496</td>\n",
|
| 218 |
+
" </tr>\n",
|
| 219 |
+
" <tr>\n",
|
| 220 |
+
" <th>2021-06-30</th>\n",
|
| 221 |
+
" <td>11199189899</td>\n",
|
| 222 |
+
" </tr>\n",
|
| 223 |
+
" <tr>\n",
|
| 224 |
+
" <th>2021-09-30</th>\n",
|
| 225 |
+
" <td>9000667547</td>\n",
|
| 226 |
+
" </tr>\n",
|
| 227 |
+
" <tr>\n",
|
| 228 |
+
" <th>2021-12-31</th>\n",
|
| 229 |
+
" <td>12465229611</td>\n",
|
| 230 |
+
" </tr>\n",
|
| 231 |
+
" <tr>\n",
|
| 232 |
+
" <th>2022-03-31</th>\n",
|
| 233 |
+
" <td>14896500404</td>\n",
|
| 234 |
+
" </tr>\n",
|
| 235 |
+
" <tr>\n",
|
| 236 |
+
" <th>2022-06-30</th>\n",
|
| 237 |
+
" <td>14799049316</td>\n",
|
| 238 |
+
" </tr>\n",
|
| 239 |
+
" <tr>\n",
|
| 240 |
+
" <th>2022-09-30</th>\n",
|
| 241 |
+
" <td>18713092617</td>\n",
|
| 242 |
+
" </tr>\n",
|
| 243 |
+
" <tr>\n",
|
| 244 |
+
" <th>2022-12-31</th>\n",
|
| 245 |
+
" <td>16805465254</td>\n",
|
| 246 |
+
" </tr>\n",
|
| 247 |
+
" <tr>\n",
|
| 248 |
+
" <th>2023-03-31</th>\n",
|
| 249 |
+
" <td>14505450248</td>\n",
|
| 250 |
+
" </tr>\n",
|
| 251 |
+
" <tr>\n",
|
| 252 |
+
" <th>2023-06-30</th>\n",
|
| 253 |
+
" <td>10806122549</td>\n",
|
| 254 |
+
" </tr>\n",
|
| 255 |
+
" <tr>\n",
|
| 256 |
+
" <th>2023-09-30</th>\n",
|
| 257 |
+
" <td>17167661800</td>\n",
|
| 258 |
+
" </tr>\n",
|
| 259 |
+
" <tr>\n",
|
| 260 |
+
" <th>2023-12-31</th>\n",
|
| 261 |
+
" <td>13414872686</td>\n",
|
| 262 |
+
" </tr>\n",
|
| 263 |
+
" <tr>\n",
|
| 264 |
+
" <th>2024-03-31</th>\n",
|
| 265 |
+
" <td>13351789947</td>\n",
|
| 266 |
+
" </tr>\n",
|
| 267 |
+
" <tr>\n",
|
| 268 |
+
" <th>2024-06-30</th>\n",
|
| 269 |
+
" <td>8144018454</td>\n",
|
| 270 |
+
" </tr>\n",
|
| 271 |
+
" <tr>\n",
|
| 272 |
+
" <th>2024-09-30</th>\n",
|
| 273 |
+
" <td>10824151396</td>\n",
|
| 274 |
+
" </tr>\n",
|
| 275 |
+
" <tr>\n",
|
| 276 |
+
" <th>2024-12-31</th>\n",
|
| 277 |
+
" <td>16754700510</td>\n",
|
| 278 |
+
" </tr>\n",
|
| 279 |
+
" </tbody>\n",
|
| 280 |
+
"</table>\n",
|
| 281 |
+
"</div>"
|
| 282 |
+
],
|
| 283 |
+
"text/plain": [
|
| 284 |
+
" y\n",
|
| 285 |
+
"ds \n",
|
| 286 |
+
"2017-03-31 6568715630\n",
|
| 287 |
+
"2017-06-30 6644029236\n",
|
| 288 |
+
"2017-09-30 18227487487\n",
|
| 289 |
+
"2017-12-31 17560385805\n",
|
| 290 |
+
"2018-03-31 19774628627\n",
|
| 291 |
+
"2018-06-30 5282345417\n",
|
| 292 |
+
"2018-09-30 8133295785\n",
|
| 293 |
+
"2018-12-31 10184334320\n",
|
| 294 |
+
"2019-03-31 18300753695\n",
|
| 295 |
+
"2019-06-30 13878289168\n",
|
| 296 |
+
"2019-09-30 13973147193\n",
|
| 297 |
+
"2019-12-31 8046709255\n",
|
| 298 |
+
"2020-03-31 9236017256\n",
|
| 299 |
+
"2020-06-30 6413035553\n",
|
| 300 |
+
"2020-09-30 15986728775\n",
|
| 301 |
+
"2020-12-31 9687560178\n",
|
| 302 |
+
"2021-03-31 6588278496\n",
|
| 303 |
+
"2021-06-30 11199189899\n",
|
| 304 |
+
"2021-09-30 9000667547\n",
|
| 305 |
+
"2021-12-31 12465229611\n",
|
| 306 |
+
"2022-03-31 14896500404\n",
|
| 307 |
+
"2022-06-30 14799049316\n",
|
| 308 |
+
"2022-09-30 18713092617\n",
|
| 309 |
+
"2022-12-31 16805465254\n",
|
| 310 |
+
"2023-03-31 14505450248\n",
|
| 311 |
+
"2023-06-30 10806122549\n",
|
| 312 |
+
"2023-09-30 17167661800\n",
|
| 313 |
+
"2023-12-31 13414872686\n",
|
| 314 |
+
"2024-03-31 13351789947\n",
|
| 315 |
+
"2024-06-30 8144018454\n",
|
| 316 |
+
"2024-09-30 10824151396\n",
|
| 317 |
+
"2024-12-31 16754700510"
|
| 318 |
+
]
|
| 319 |
+
},
|
| 320 |
+
"execution_count": 52,
|
| 321 |
+
"metadata": {},
|
| 322 |
+
"output_type": "execute_result"
|
| 323 |
+
}
|
| 324 |
+
],
|
| 325 |
+
"source": [
|
| 326 |
+
"# Convert 'Year' column to datetime if it's not already\n",
|
| 327 |
+
"sap_df['ds'] = pd.to_datetime(sap_df['Period'], format='%Y')\n",
|
| 328 |
+
"#sap_df['unique_id'] = \"all\"\n",
|
| 329 |
+
"sap_df = sap_df.rename(columns={\"Revenue\": \"y\"}) \n",
|
| 330 |
+
"# sap_df = sap_df[[\"unique_id\", \"ds\", \"y\"]]\n",
|
| 331 |
+
"sap_df = sap_df[[ \"ds\", \"y\"]] \n",
|
| 332 |
+
"sap_df = sap_df.set_index(\"ds\")\n",
|
| 333 |
+
"sap_df"
|
| 334 |
+
]
|
| 335 |
+
},
|
| 336 |
+
{
|
| 337 |
+
"cell_type": "code",
|
| 338 |
+
"execution_count": 53,
|
| 339 |
+
"metadata": {},
|
| 340 |
+
"outputs": [
|
| 341 |
+
{
|
| 342 |
+
"ename": "TypeError",
|
| 343 |
+
"evalue": "ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''",
|
| 344 |
+
"output_type": "error",
|
| 345 |
+
"traceback": [
|
| 346 |
+
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
| 347 |
+
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
|
| 348 |
+
"Cell \u001b[0;32mIn[53], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m sp_values \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m4\u001b[39m]\n\u001b[1;32m 9\u001b[0m param_grid \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(product(p_values, d_values, q_values, P_values, D_values, Q_values, sp_values))\n\u001b[0;32m---> 11\u001b[0m \u001b[43mwalk_forward_validation\u001b[49m\u001b[43m(\u001b[49m\u001b[43msap_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparam_grid\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# time_series_cv(sap_df, param_grid)\u001b[39;00m\n\u001b[1;32m 13\u001b[0m evaluate_naive(sap_df)\n",
|
| 349 |
+
"Cell \u001b[0;32mIn[50], line 25\u001b[0m, in \u001b[0;36mwalk_forward_validation\u001b[0;34m(series, param_grid)\u001b[0m\n\u001b[1;32m 22\u001b[0m order, seasonal_order \u001b[38;5;241m=\u001b[39m best_params[:\u001b[38;5;241m3\u001b[39m], (best_params[\u001b[38;5;241m3\u001b[39m], best_params[\u001b[38;5;241m4\u001b[39m], best_params[\u001b[38;5;241m5\u001b[39m], best_params[\u001b[38;5;241m6\u001b[39m])\n\u001b[1;32m 24\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mlen\u001b[39m(test)):\n\u001b[0;32m---> 25\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[43mSARIMAX\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhistory\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mseasonal_order\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mseasonal_order\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43menforce_stationarity\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43menforce_invertibility\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 26\u001b[0m results \u001b[38;5;241m=\u001b[39m model\u001b[38;5;241m.\u001b[39mfit(disp\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 27\u001b[0m yhat \u001b[38;5;241m=\u001b[39m results\u001b[38;5;241m.\u001b[39mforecast(steps\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)[\u001b[38;5;241m0\u001b[39m]\n",
|
| 350 |
+
"File \u001b[0;32m/opt/conda/envs/ai_env/lib/python3.10/site-packages/statsmodels/tsa/statespace/sarimax.py:328\u001b[0m, in \u001b[0;36mSARIMAX.__init__\u001b[0;34m(self, endog, exog, order, seasonal_order, trend, measurement_error, time_varying_regression, mle_regression, simple_differencing, enforce_stationarity, enforce_invertibility, hamilton_representation, concentrate_scale, trend_offset, use_exact_diffuse, dates, freq, missing, validate_specification, **kwargs)\u001b[0m\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, endog, exog\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, order\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m),\n\u001b[1;32m 319\u001b[0m seasonal_order\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m), trend\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 320\u001b[0m measurement_error\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m, time_varying_regression\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 325\u001b[0m freq\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, missing\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnone\u001b[39m\u001b[38;5;124m'\u001b[39m, validate_specification\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m 326\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 328\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_spec \u001b[38;5;241m=\u001b[39m \u001b[43mSARIMAXSpecification\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 329\u001b[0m \u001b[43m \u001b[49m\u001b[43mendog\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexog\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexog\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mseasonal_order\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mseasonal_order\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 330\u001b[0m \u001b[43m \u001b[49m\u001b[43mtrend\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtrend\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43menforce_stationarity\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43menforce_invertibility\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 331\u001b[0m \u001b[43m \u001b[49m\u001b[43mconcentrate_scale\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconcentrate_scale\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdates\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdates\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfreq\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfreq\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 332\u001b[0m \u001b[43m \u001b[49m\u001b[43mmissing\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmissing\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalidate_specification\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvalidate_specification\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 333\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_params \u001b[38;5;241m=\u001b[39m SARIMAXParams(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_spec)\n\u001b[1;32m 335\u001b[0m \u001b[38;5;66;03m# Save given orders\u001b[39;00m\n",
|
| 351 |
+
"File \u001b[0;32m/opt/conda/envs/ai_env/lib/python3.10/site-packages/statsmodels/tsa/arima/specification.py:458\u001b[0m, in \u001b[0;36mSARIMAXSpecification.__init__\u001b[0;34m(self, endog, exog, order, seasonal_order, ar_order, diff, ma_order, seasonal_ar_order, seasonal_diff, seasonal_ma_order, seasonal_periods, trend, enforce_stationarity, enforce_invertibility, concentrate_scale, trend_offset, dates, freq, missing, validate_specification)\u001b[0m\n\u001b[1;32m 452\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (validate_specification \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m faux_endog \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[1;32m 453\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mendog\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mendog\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m):\n\u001b[1;32m 454\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSARIMAX models require univariate `endog`. Got\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 455\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m shape \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mendog\u001b[38;5;241m.\u001b[39mshape))\n\u001b[1;32m 457\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_has_missing \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m--> 458\u001b[0m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01mif\u001b[39;00m faux_endog \u001b[38;5;28;01melse\u001b[39;00m np\u001b[38;5;241m.\u001b[39many(\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43misnan\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mendog\u001b[49m\u001b[43m)\u001b[49m))\n",
|
| 352 |
+
"\u001b[0;31mTypeError\u001b[0m: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''"
|
| 353 |
+
]
|
| 354 |
+
}
|
| 355 |
+
],
|
| 356 |
+
"source": [
|
| 357 |
+
"# Define hyperparameter grid\n",
|
| 358 |
+
"p_values = [0, 1, 2]\n",
|
| 359 |
+
"d_values = [0, 1]\n",
|
| 360 |
+
"q_values = [0, 1, 2]\n",
|
| 361 |
+
"P_values = [0, 1]\n",
|
| 362 |
+
"D_values = [0, 1]\n",
|
| 363 |
+
"Q_values = [0, 1]\n",
|
| 364 |
+
"sp_values = [4]\n",
|
| 365 |
+
"param_grid = list(product(p_values, d_values, q_values, P_values, D_values, Q_values, sp_values))\n",
|
| 366 |
+
"\n",
|
| 367 |
+
"walk_forward_validation(sap_df, param_grid)\n",
|
| 368 |
+
"# time_series_cv(sap_df, param_grid)\n",
|
| 369 |
+
"evaluate_naive(sap_df)"
|
| 370 |
+
]
|
| 371 |
+
}
|
| 372 |
+
],
|
| 373 |
+
"metadata": {
|
| 374 |
+
"kernelspec": {
|
| 375 |
+
"display_name": "ai_env",
|
| 376 |
+
"language": "python",
|
| 377 |
+
"name": "python3"
|
| 378 |
+
},
|
| 379 |
+
"language_info": {
|
| 380 |
+
"codemirror_mode": {
|
| 381 |
+
"name": "ipython",
|
| 382 |
+
"version": 3
|
| 383 |
+
},
|
| 384 |
+
"file_extension": ".py",
|
| 385 |
+
"mimetype": "text/x-python",
|
| 386 |
+
"name": "python",
|
| 387 |
+
"nbconvert_exporter": "python",
|
| 388 |
+
"pygments_lexer": "ipython3",
|
| 389 |
+
"version": "3.10.16"
|
| 390 |
+
}
|
| 391 |
+
},
|
| 392 |
+
"nbformat": 4,
|
| 393 |
+
"nbformat_minor": 2
|
| 394 |
+
}
|
dev_notebooks/12_company_analysis/walk_forward_validation_main_Merck KGaA.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/walk_forward_validation_main_Merck_KGaA_TCN.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/12_company_analysis/xgb.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/gradio_trials/SAP_SE_find_bestconfig.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/gradio_trials/gradio_app.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import itertools
|
| 4 |
+
import plotly.graph_objects as go
|
| 5 |
+
from statsmodels.tsa.statespace.sarimax import SARIMAX
|
| 6 |
+
from sklearn.metrics import mean_absolute_error
|
| 7 |
+
import gradio as gr
|
| 8 |
+
import warnings
|
| 9 |
+
warnings.filterwarnings("ignore")
|
| 10 |
+
# Set random seed for reproducibility
|
| 11 |
+
np.random.seed(42)
|
| 12 |
+
|
| 13 |
+
# Load the dataset
|
| 14 |
+
df = pd.read_csv("data/Top_12_German_Companies_Financial_Data.csv")
|
| 15 |
+
companies = np.unique(df.Company)
|
| 16 |
+
company = companies[9]
|
| 17 |
+
print(f"Company: {company}")
|
| 18 |
+
|
| 19 |
+
# Filter for the selected company
|
| 20 |
+
df = df[df["Company"] == company].copy()
|
| 21 |
+
df["Period"] = pd.to_datetime(df["Period"], format="%m/%d/%Y")
|
| 22 |
+
df = df.sort_values(by="Period")
|
| 23 |
+
df.set_index("Period", inplace=True)
|
| 24 |
+
df["Revenue"] = pd.to_numeric(df["Revenue"], errors="coerce")
|
| 25 |
+
series = df['Revenue']
|
| 26 |
+
|
| 27 |
+
# Train-validation-test split
|
| 28 |
+
train_idx = int(len(series) * 0.8)
|
| 29 |
+
val_idx = int(len(series) * 0.9)
|
| 30 |
+
train, val, test = series[:train_idx], series[train_idx:val_idx], series[val_idx:]
|
| 31 |
+
|
| 32 |
+
# Define parameter ranges for SARIMA tuning
|
| 33 |
+
p_values, d_values, q_values = range(0, 6), range(0, 3), range(0, 6)
|
| 34 |
+
P_values, D_values, Q_values = range(0, 3), range(0, 2), range(0, 3)
|
| 35 |
+
S = 12 # Quarterly seasonality
|
| 36 |
+
|
| 37 |
+
best_score, best_cfg = float("inf"), None
|
| 38 |
+
|
| 39 |
+
# Grid search over SARIMA parameter combinations
|
| 40 |
+
for p, d, q, P, D, Q in itertools.product(p_values, d_values, q_values, P_values, D_values, Q_values):
|
| 41 |
+
try:
|
| 42 |
+
model = SARIMAX(train, order=(p, d, q), seasonal_order=(P, D, Q, S), enforce_stationarity=False, enforce_invertibility=False)
|
| 43 |
+
model_fit = model.fit(disp=False)
|
| 44 |
+
predictions = model_fit.forecast(steps=len(val))
|
| 45 |
+
error = mean_absolute_error(val, predictions)
|
| 46 |
+
if error < best_score:
|
| 47 |
+
best_score, best_cfg = error, (p, d, q, P, D, Q)
|
| 48 |
+
except:
|
| 49 |
+
continue
|
| 50 |
+
|
| 51 |
+
# Train best SARIMA model
|
| 52 |
+
best_p, best_d, best_q, best_P, best_D, best_Q = best_cfg
|
| 53 |
+
final_model = SARIMAX(pd.concat([train, val]), order=(best_p, best_d, best_q), seasonal_order=(best_P, best_D, best_Q, S), enforce_stationarity=False, enforce_invertibility=False, initialization="approximate_diffuse")
|
| 54 |
+
final_model_fit = final_model.fit(disp=False)
|
| 55 |
+
|
| 56 |
+
def forecast_turnover(horizon, confidence_level):
|
| 57 |
+
try:
|
| 58 |
+
horizon = int(horizon)
|
| 59 |
+
alpha_value = 1 - (confidence_level / 100) # Convert % to alpha
|
| 60 |
+
predictions_result = final_model_fit.get_forecast(steps=horizon)
|
| 61 |
+
final_predictions = predictions_result.predicted_mean
|
| 62 |
+
conf_int = predictions_result.conf_int(alpha=alpha_value)
|
| 63 |
+
|
| 64 |
+
last_date = test.index.min()
|
| 65 |
+
future_dates = pd.date_range(start=last_date, periods=horizon, freq="Q")
|
| 66 |
+
|
| 67 |
+
debug_info = f"""
|
| 68 |
+
✅ Forecast for {horizon} quarters.
|
| 69 |
+
Confidence Level: {confidence_level}%
|
| 70 |
+
Alpha: {alpha_value}
|
| 71 |
+
Forecasted Values: {final_predictions.values}
|
| 72 |
+
Confidence Interval:\n{conf_int}
|
| 73 |
+
"""
|
| 74 |
+
|
| 75 |
+
# Create interactive Plotly plot
|
| 76 |
+
fig = go.Figure()
|
| 77 |
+
fig.add_trace(go.Scatter(x=train.index, y=train, mode='lines', name='Training Data', line=dict(color='blue')))
|
| 78 |
+
fig.add_trace(go.Scatter(x=val.index, y=val, mode='lines', name='Validation Data', line=dict(color='orange')))
|
| 79 |
+
fig.add_trace(go.Scatter(x=test.index, y=test, mode='lines+markers', name='Test Data', line=dict(color='green')))
|
| 80 |
+
fig.add_trace(go.Scatter(x=future_dates, y=final_predictions, mode='lines+markers', name=f'Forecast ({confidence_level}%)', line=dict(color='red', dash='dash')))
|
| 81 |
+
|
| 82 |
+
# Confidence interval fill
|
| 83 |
+
fig.add_trace(go.Scatter(
|
| 84 |
+
x=future_dates.tolist() + future_dates[::-1].tolist(),
|
| 85 |
+
y=conf_int.iloc[:, 0].tolist() + conf_int.iloc[:, 1].tolist()[::-1],
|
| 86 |
+
fill='toself',
|
| 87 |
+
fillcolor='rgba(255, 0, 0, 0.2)',
|
| 88 |
+
line=dict(color='rgba(255,255,255,0)'),
|
| 89 |
+
showlegend=True,
|
| 90 |
+
name=f'Confidence Interval ({confidence_level}%)'
|
| 91 |
+
))
|
| 92 |
+
|
| 93 |
+
fig.update_layout(title=f"SARIMA Forecast for {company} Revenue", xaxis_title="Year", yaxis_title="Revenue", hovermode='x')
|
| 94 |
+
|
| 95 |
+
return fig, debug_info
|
| 96 |
+
except Exception as e:
|
| 97 |
+
return None, f"❌ Error: {str(e)}"
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
# Launch Gradio Interface
|
| 101 |
+
iface = gr.Interface(
|
| 102 |
+
fn=forecast_turnover,
|
| 103 |
+
inputs=[
|
| 104 |
+
gr.Slider(minimum=1, maximum=6, step=1, label="Forecast Horizon (Quarters)"),
|
| 105 |
+
gr.Slider(minimum=50, maximum=99, step=1, label="Confidence Level (%)") # ✅ New confidence level slider
|
| 106 |
+
],
|
| 107 |
+
outputs=[gr.Plot(), gr.Textbox()],
|
| 108 |
+
title=f"{company} Revenue Forecast",
|
| 109 |
+
description="Select the forecast horizon (in quarters) and confidence level for revenue predictions.",
|
| 110 |
+
)
|
| 111 |
+
|
| 112 |
+
iface.launch(debug=True)
|
dev_notebooks/gradio_trials/gradio_app_SAP.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dev_notebooks/naics/Dataset_overview.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# NBER-CES Manufacturing Industry Database Overview
|
| 2 |
+
|
| 3 |
+
## 1. Dataset Overview
|
| 4 |
+
- **Source:** NBER-CES Manufacturing Industry Database
|
| 5 |
+
- **Time Span:** 1958 to 2018 (Annual Data)
|
| 6 |
+
- **Region:** U.S.-based manufacturing industries (sectoral level)
|
| 7 |
+
- **Industries Covered:** Over 450 manufacturing industries
|
| 8 |
+
- **Key Features:** Revenue, employment, capital investment, R&D spending, productivity, and energy usage
|
| 9 |
+
|
| 10 |
+
## 2. Data Coverage
|
| 11 |
+
The NBER-CES database is a comprehensive resource for analyzing various aspects of the U.S. manufacturing sector. It includes:
|
| 12 |
+
|
| 13 |
+
- **Industry Classification:**
|
| 14 |
+
- **1987 SIC (Standard Industrial Classification):** 459 four-digit industries.
|
| 15 |
+
- **1997 NAICS (North American Industry Classification System):** 473 six-digit industries.
|
| 16 |
+
- **2012 NAICS:** 364 six-digit industries.
|
| 17 |
+
- **Key Variables:**
|
| 18 |
+
- **Output Measures:** Value of Shipments, Value Added
|
| 19 |
+
- **Input Measures:** Employment, Payroll, Cost of Materials, Energy Consumption
|
| 20 |
+
- **Investment and Capital:** Capital Expenditures, Capital Stocks
|
| 21 |
+
- **Productivity Metrics:** Total Factor Productivity (TFP), Labor Productivity
|
| 22 |
+
- **Price Indexes:** Industry-specific price deflators
|
| 23 |
+
|
| 24 |
+
## 3. Applications
|
| 25 |
+
This dataset can be utilized for:
|
| 26 |
+
- **Economic Research:** Analyzing trends in manufacturing output, productivity, and employment.
|
| 27 |
+
- **Policy Analysis:** Assessing the impact of policy changes on different manufacturing industries.
|
| 28 |
+
- **Business Strategy:** Supporting investment, production, and resource allocation decisions.
|
| 29 |
+
|
| 30 |
+
## 4. Data Format
|
| 31 |
+
The dataset is available in multiple formats for ease of analysis:
|
| 32 |
+
- **Stata**
|
| 33 |
+
- **SAS**
|
| 34 |
+
- **Excel**
|
| 35 |
+
- **CSV**
|
| 36 |
+
|
| 37 |
+
## 5. Documentation
|
| 38 |
+
Comprehensive documentation is provided, including:
|
| 39 |
+
- **Variable Descriptions & Summary Statistics**: Explains each variable and its statistical properties.
|
| 40 |
+
- **Technical Notes**: Details methodology used in data collection and processing.
|
| 41 |
+
- **Industry Concordances**: Helps navigate industry classification changes over time.
|
| 42 |
+
|
| 43 |
+
## 6. Citation
|
| 44 |
+
If using this database, please cite:
|
| 45 |
+
> Becker, Randy A., Wayne B. Gray, and Jordan Marvakov. (2021). “NBER-CES Manufacturing Industry Database (1958-2018, version 2021a).” National Bureau of Economic Research.
|
| 46 |
+
|
| 47 |
+
---
|
| 48 |
+
|
| 49 |
+
## 7. Key Features for Turnover Forecasting
|
| 50 |
+
The dataset includes several features that are critical for turnover forecasting:
|
| 51 |
+
|
| 52 |
+
| Feature | Description | Importance |
|
| 53 |
+
|----------|-------------|-------------|
|
| 54 |
+
| **VSHIP (Value of Shipments)** | Total revenue from shipments of goods | Primary revenue indicator for turnover forecasting |
|
| 55 |
+
| **EMP (Employment)** | Number of employees in the sector | Correlates labor with revenue growth |
|
| 56 |
+
| **CAPEX (Capital Expenditure)** | Investment in machinery and assets | Higher CAPEX often leads to future revenue growth |
|
| 57 |
+
| **ENERGY (Energy Usage)** | Power consumption in industry | Signals productivity and operational efficiency |
|
| 58 |
+
| **MATCOST (Materials Cost)** | Cost of raw materials used | Higher costs may impact profit margins and revenue |
|
| 59 |
+
| **RD (R&D Expenditure)** | Investment in innovation and new tech | High R&D leads to long-term revenue growth |
|
| 60 |
+
| **WAGE (Wages)** | Total wages paid in the industry | Useful for modeling cost-revenue relationships |
|
| 61 |
+
| **PROD (Productivity)** | Output per worker or per machine | Efficiency metric to predict revenue shifts |
|
| 62 |
+
|
| 63 |
+
---
|
| 64 |
+
|
| 65 |
+
## 8. Additional Variables for Turnover Forecasting
|
| 66 |
+
|
| 67 |
+
| Column | Description | Importance |
|
| 68 |
+
|--------|-------------|------------|
|
| 69 |
+
| **NAICS** | NAICS Industry Code | Unique identifier for each industry classification |
|
| 70 |
+
| **Year** | Year of observation | Used for time-series analysis and forecasting trends |
|
| 71 |
+
| **PRODE** | Productivity (Output per employee) | Measures efficiency; affects turnover growth |
|
| 72 |
+
| **PRODH** | Productivity (Output per hour worked) | Higher values indicate better labor efficiency |
|
| 73 |
+
| **PRODW** | Productivity (Output per wage dollar) | Helps in measuring cost efficiency |
|
| 74 |
+
| **VADD** | Value Added (Revenue - Input Costs) | Represents economic contribution of the industry |
|
| 75 |
+
| **INVEST** | Investment (Capital Expenditure - CAPEX) | High investments often lead to future revenue growth |
|
| 76 |
+
| **INVENT** | Inventory Levels | Impacts supply chain and demand forecasting |
|
| 77 |
+
| **ENERGY** | Energy Costs | Higher energy costs reduce profit margins |
|
| 78 |
+
| **CAP** | Capital Stock | Total capital assets; influences production capacity |
|
| 79 |
+
| **EQUIP** | Equipment Stock | Investment in machinery; affects manufacturing output |
|
| 80 |
+
| **PLANT** | Plant Stock | Investment in physical infrastructure |
|
| 81 |
+
| **PISHIP** | Price Index for Shipments | Adjusts revenue for inflation effects |
|
| 82 |
+
| **PIMAT** | Price Index for Materials | Adjusts material costs for inflation |
|
| 83 |
+
| **PIINV** | Price Index for Inventory | Adjusts inventory value for inflation |
|
| 84 |
+
| **PIEN** | Price Index for Energy | Adjusts energy costs for inflation |
|
| 85 |
+
| **DTFP5** | Δ Total Factor Productivity (5-factor model) | Measures efficiency improvements over time |
|
| 86 |
+
| **TFP5** | Total Factor Productivity (5-factor model) | Higher values indicate better overall efficiency |
|
| 87 |
+
| **DTFP4** | Δ Total Factor Productivity (4-factor model) | Alternative measure of productivity growth |
|
| 88 |
+
| **TFP4** | Total Factor Productivity (4-factor model) | Measures multi-factor efficiency |
|
| 89 |
+
|
| 90 |
+
---
|