GitHub Actions commited on
Commit
e4f4b02
·
0 Parent(s):

🚀 Deploying to Hugging Face Space: TurnoverForecasting

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +37 -0
  2. README.md +108 -0
  3. app.py +244 -0
  4. app_old.py +160 -0
  5. data/Top_12_German_Companies_Financial_Data.csv +385 -0
  6. data/naics_names_2012.xls +0 -0
  7. data/nberces5818v1_n2012.csv +0 -0
  8. data/processed_data.csv +0 -0
  9. data/processed_data_336111.csv +62 -0
  10. dev_notebooks/.gradio/certificate.pem +31 -0
  11. dev_notebooks/12_company_analysis/12_company_BMW_neural_forecasting_scaled_version.ipynb +0 -0
  12. dev_notebooks/12_company_analysis/12_company_Daimler_neural_forecasting_scaled_version1.ipynb +0 -0
  13. dev_notebooks/12_company_analysis/12_company_SAP_Basic_univariate.ipynb +0 -0
  14. dev_notebooks/12_company_analysis/12_company_SAP_Basic_univariate_all.ipynb +0 -0
  15. dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting.ipynb +0 -0
  16. dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled.ipynb +746 -0
  17. dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled_version.ipynb +0 -0
  18. dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled_version1.ipynb +0 -0
  19. dev_notebooks/12_company_analysis/12_company_SAP_neural_forecasting_scaled_version2.ipynb +0 -0
  20. dev_notebooks/12_company_analysis/12_company_SAP_simple_univariate.ipynb +0 -0
  21. dev_notebooks/12_company_analysis/12_company_Volkswagen_neural_forecasting_scaled_version1.ipynb +0 -0
  22. dev_notebooks/12_company_analysis/12_company_basic.ipynb +0 -0
  23. dev_notebooks/12_company_analysis/Sarimax/12_company_basic.ipynb +0 -0
  24. dev_notebooks/12_company_analysis/Sarimax/Allianz_find_bestconfig.ipynb +0 -0
  25. dev_notebooks/12_company_analysis/Sarimax/BASF_find_bestconfig.ipynb +0 -0
  26. dev_notebooks/12_company_analysis/Sarimax/BMW_find_bestconfig.ipynb +0 -0
  27. dev_notebooks/12_company_analysis/Sarimax/Bayer_find_bestconfig.ipynb +0 -0
  28. dev_notebooks/12_company_analysis/Sarimax/Daimler_find_bestconfig.ipynb +0 -0
  29. dev_notebooks/12_company_analysis/Sarimax/Deutsche_Bank_find_bestconfig.ipynb +0 -0
  30. dev_notebooks/12_company_analysis/Sarimax/Deutsche_Telekom_find_bestconfig.ipynb +0 -0
  31. dev_notebooks/12_company_analysis/Sarimax/Merck_KGaA_find_bestconfig.ipynb +0 -0
  32. dev_notebooks/12_company_analysis/Sarimax/Porsche_AG_find_bestconfig.ipynb +0 -0
  33. dev_notebooks/12_company_analysis/Sarimax/SAP_SE_find_bestconfig.ipynb +0 -0
  34. dev_notebooks/12_company_analysis/Sarimax/SAP_find_bestconfig.ipynb +0 -0
  35. dev_notebooks/12_company_analysis/Sarimax/Siemens_AG_find_bestconfig.ipynb +0 -0
  36. dev_notebooks/12_company_analysis/Sarimax/Volkswagen_AG_find_bestconfig.ipynb +0 -0
  37. dev_notebooks/12_company_analysis/gradio_app_BASF.ipynb +0 -0
  38. dev_notebooks/12_company_analysis/gradio_app_Deutsche_Telekom.ipynb +0 -0
  39. dev_notebooks/12_company_analysis/gradio_app_Siemens.ipynb +0 -0
  40. dev_notebooks/12_company_analysis/neural_forecast.ipynb +276 -0
  41. dev_notebooks/12_company_analysis/one_by_one_univariate_12_company copy.ipynb +1226 -0
  42. dev_notebooks/12_company_analysis/one_by_one_univariate_12_company.ipynb +2223 -0
  43. dev_notebooks/12_company_analysis/simple_test.ipynb +394 -0
  44. dev_notebooks/12_company_analysis/walk_forward_validation_main_Merck KGaA.ipynb +0 -0
  45. dev_notebooks/12_company_analysis/walk_forward_validation_main_Merck_KGaA_TCN.ipynb +0 -0
  46. dev_notebooks/12_company_analysis/xgb.ipynb +0 -0
  47. dev_notebooks/gradio_trials/SAP_SE_find_bestconfig.ipynb +0 -0
  48. dev_notebooks/gradio_trials/gradio_app.py +112 -0
  49. dev_notebooks/gradio_trials/gradio_app_SAP.ipynb +0 -0
  50. 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
+ [![Hugging Face Space](https://img.shields.io/badge/🤗%20View%20on%20Hugging%20Face-blue?logo=huggingface)](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/+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GjVCkyZNEKZuFA2gQ4cOUBQFp0+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
+ ---