forecastscope 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. forecastscope-0.1.0/CHANGELOG.md +8 -0
  2. forecastscope-0.1.0/LICENSE +21 -0
  3. forecastscope-0.1.0/MANIFEST.in +3 -0
  4. forecastscope-0.1.0/PKG-INFO +85 -0
  5. forecastscope-0.1.0/README.md +50 -0
  6. forecastscope-0.1.0/VERSION +1 -0
  7. forecastscope-0.1.0/docs/boundary.md +31 -0
  8. forecastscope-0.1.0/docs/extraction-source.json +183 -0
  9. forecastscope-0.1.0/docs/product-parity.json +132 -0
  10. forecastscope-0.1.0/docs/test-environment.json +23 -0
  11. forecastscope-0.1.0/docs/validation.json +57 -0
  12. forecastscope-0.1.0/pyproject.toml +41 -0
  13. forecastscope-0.1.0/requirements-test.txt +16 -0
  14. forecastscope-0.1.0/setup.cfg +4 -0
  15. forecastscope-0.1.0/src/forecastscope/__init__.py +5 -0
  16. forecastscope-0.1.0/src/forecastscope/api.py +72 -0
  17. forecastscope-0.1.0/src/forecastscope/combinations/__init__.py +1 -0
  18. forecastscope-0.1.0/src/forecastscope/combinations/context_memory.py +127 -0
  19. forecastscope-0.1.0/src/forecastscope/combinations/validated.py +144 -0
  20. forecastscope-0.1.0/src/forecastscope/diagnostics/__init__.py +236 -0
  21. forecastscope-0.1.0/src/forecastscope/diagnostics/autocorrelation.py +217 -0
  22. forecastscope-0.1.0/src/forecastscope/diagnostics/causality.py +183 -0
  23. forecastscope-0.1.0/src/forecastscope/diagnostics/changepoints.py +172 -0
  24. forecastscope-0.1.0/src/forecastscope/diagnostics/distribution.py +180 -0
  25. forecastscope-0.1.0/src/forecastscope/diagnostics/filters.py +201 -0
  26. forecastscope-0.1.0/src/forecastscope/diagnostics/fractal.py +206 -0
  27. forecastscope-0.1.0/src/forecastscope/diagnostics/nonlinear.py +267 -0
  28. forecastscope-0.1.0/src/forecastscope/diagnostics/seasonality.py +218 -0
  29. forecastscope-0.1.0/src/forecastscope/diagnostics/sequence.py +130 -0
  30. forecastscope-0.1.0/src/forecastscope/diagnostics/stationarity.py +233 -0
  31. forecastscope-0.1.0/src/forecastscope/diagnostics/volatility.py +187 -0
  32. forecastscope-0.1.0/src/forecastscope/forecasting.py +263 -0
  33. forecastscope-0.1.0/src/forecastscope/types.py +12 -0
  34. forecastscope-0.1.0/src/forecastscope.egg-info/PKG-INFO +85 -0
  35. forecastscope-0.1.0/src/forecastscope.egg-info/SOURCES.txt +52 -0
  36. forecastscope-0.1.0/src/forecastscope.egg-info/dependency_links.txt +1 -0
  37. forecastscope-0.1.0/src/forecastscope.egg-info/requires.txt +24 -0
  38. forecastscope-0.1.0/src/forecastscope.egg-info/top_level.txt +1 -0
  39. forecastscope-0.1.0/tests/test_analysis_autocorrelation.py +87 -0
  40. forecastscope-0.1.0/tests/test_analysis_causality.py +84 -0
  41. forecastscope-0.1.0/tests/test_analysis_changepoints.py +80 -0
  42. forecastscope-0.1.0/tests/test_analysis_distribution.py +89 -0
  43. forecastscope-0.1.0/tests/test_analysis_filters.py +93 -0
  44. forecastscope-0.1.0/tests/test_analysis_fractal.py +95 -0
  45. forecastscope-0.1.0/tests/test_analysis_nonlinear.py +89 -0
  46. forecastscope-0.1.0/tests/test_analysis_seasonality.py +86 -0
  47. forecastscope-0.1.0/tests/test_analysis_stationarity.py +90 -0
  48. forecastscope-0.1.0/tests/test_analysis_volatility.py +88 -0
  49. forecastscope-0.1.0/tests/test_diagnostic_availability.py +27 -0
  50. forecastscope-0.1.0/tests/test_forecasters.py +75 -0
  51. forecastscope-0.1.0/tests/test_public_api.py +48 -0
  52. forecastscope-0.1.0/tests/test_sequence_diagnostics.py +88 -0
  53. forecastscope-0.1.0/tests/test_validated_combination.py +48 -0
  54. forecastscope-0.1.0/tools/check_product_parity.py +65 -0
@@ -0,0 +1,8 @@
1
+ # Changelog
2
+
3
+ ## 0.01.000 - unreleased
4
+
5
+ - Extract finite-prefix forecasting, five-expert combinations and sequence
6
+ diagnostics with explicit originating source bindings.
7
+ - Add strict public request and forecast-output boundaries.
8
+ - Preserve numerical adversarial controls; product adoption remains pending.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Felipe Santibanez-Leal
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,3 @@
1
+ include VERSION CHANGELOG.md requirements-test.txt
2
+ recursive-include docs *.md *.json
3
+ recursive-include tools *.py
@@ -0,0 +1,85 @@
1
+ Metadata-Version: 2.4
2
+ Name: forecastscope
3
+ Version: 0.1.0
4
+ Summary: Finite-prefix forecasting, temporal forecast combinations and sequence diagnostics.
5
+ Author: Felipe Santibáñez-Leal
6
+ License-Expression: MIT
7
+ Project-URL: Repository, https://github.com/fsantibanezleal/CAOS_ForecastScope
8
+ Project-URL: Issues, https://github.com/fsantibanezleal/CAOS_ForecastScope/issues
9
+ Requires-Python: >=3.11
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Requires-Dist: numpy<3,>=2.0
13
+ Provides-Extra: diagnostics
14
+ Requires-Dist: scipy<2,>=1.15; extra == "diagnostics"
15
+ Requires-Dist: pandas<4,>=2.3; extra == "diagnostics"
16
+ Requires-Dist: statsmodels<0.15,>=0.14.6; extra == "diagnostics"
17
+ Requires-Dist: arch<9,>=8; extra == "diagnostics"
18
+ Requires-Dist: ruptures<2,>=1.1.10; extra == "diagnostics"
19
+ Requires-Dist: EMD-signal<2,>=1.9; extra == "diagnostics"
20
+ Requires-Dist: PyWavelets<2,>=1.8; extra == "diagnostics"
21
+ Requires-Dist: antropy<0.3,>=0.2.2; extra == "diagnostics"
22
+ Requires-Dist: nolds==0.6.3; extra == "diagnostics"
23
+ Requires-Dist: hurst==0.0.5; extra == "diagnostics"
24
+ Requires-Dist: MFDFA==0.4.3; extra == "diagnostics"
25
+ Requires-Dist: pycatch22<0.5,>=0.4.5; extra == "diagnostics"
26
+ Requires-Dist: stumpy<2,>=1.14.1; extra == "diagnostics"
27
+ Requires-Dist: scikit-learn<2,>=1.9; extra == "diagnostics"
28
+ Requires-Dist: coreforecast<0.1,>=0.0.17; extra == "diagnostics"
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest>=8; extra == "dev"
31
+ Requires-Dist: ruff<0.17,>=0.15; extra == "dev"
32
+ Requires-Dist: build; extra == "dev"
33
+ Requires-Dist: twine; extra == "dev"
34
+ Dynamic: license-file
35
+
36
+ # forecastscope
37
+
38
+ Finite-prefix forecasts, temporal combinations of reference experts, and sequence
39
+ diagnostics in a reusable Python library. The core requires NumPy. Diagnostic
40
+ implementations use optional scientific packages through `forecastscope.diagnostics`.
41
+
42
+ Release availability is recorded on [PyPI](https://pypi.org/project/forecastscope/)
43
+ and [GitHub](https://github.com/fsantibanezleal/CAOS_ForecastScope/releases).
44
+ Application adoption is a separate step. The extraction preserves numerical
45
+ equations while adding strict public request and output validation, lint
46
+ normalization and warnings for unavailable optional diagnostics. It makes no new forecast
47
+ accuracy, calibration, chaos-identification or operational-performance claim.
48
+
49
+ ```python
50
+ import numpy as np
51
+ from forecastscope import combine, forecast
52
+
53
+ history = 20 + np.tile([1., 4., 2., 3.], 30)
54
+ columns = forecast("HoltWinters", history, seasonality=4, horizon=8)
55
+ allocation = combine("ValidationMix", history, seasonality=4, horizon=8)
56
+ print(columns.shape, allocation.weights, allocation.origins)
57
+ ```
58
+
59
+ The caller supplies a contiguous observed history; raw arrays contain no timestamps,
60
+ so contiguity itself is a caller precondition. Future targets belong to the caller's evaluation
61
+ protocol. NaNs, infinite values, fractional horizons, invalid seasonal lags and
62
+ unsupported probability grids are refused by the public entry points. The reference kernels preserve their documented short-history policies, including
63
+ Holt fallback when additive seasonal smoothing lacks two cycles or has lag one.
64
+ Combination experts can consequently coincide on a nonseasonal input. The five
65
+ reference experts use approximate Gaussian residual intervals; ordered columns do
66
+ not establish calibration. Temporal validation filters an outer-prefix-defined
67
+ historical grid, and does not reconstruct the exact grid a historical service
68
+ would have proposed at every earlier date.
69
+
70
+ The fixed contextual combination has an unfavorable comparison with its matching
71
+ recency control in its original development study. Later validation-selected
72
+ combinations have bounded point-score improvements on specified external collections,
73
+ with stronger automatic-method and interval-score comparisons retained. The package
74
+ does not turn those studies into a general superiority claim.
75
+
76
+ For diagnostics, install the `diagnostics` extra and import the topic module, for
77
+ example `forecastscope.diagnostics.sequence.matrix_profile`. Diagnostics describe
78
+ their supplied sequence and can be retrospective. They must not be computed on a
79
+ future block and then treated as prefix-only model-selection inputs.
80
+
81
+ The source origin and exact input hashes are recorded in
82
+ [docs/extraction-source.json](docs/extraction-source.json). The originating software
83
+ is MIT licensed; its copyright and licence remain in this repository. Application
84
+ cases, generator seeds, source CSVs, artifact schemas, pipeline stages and web assets
85
+ are outside this library. See [the extraction boundary](docs/boundary.md).
@@ -0,0 +1,50 @@
1
+ # forecastscope
2
+
3
+ Finite-prefix forecasts, temporal combinations of reference experts, and sequence
4
+ diagnostics in a reusable Python library. The core requires NumPy. Diagnostic
5
+ implementations use optional scientific packages through `forecastscope.diagnostics`.
6
+
7
+ Release availability is recorded on [PyPI](https://pypi.org/project/forecastscope/)
8
+ and [GitHub](https://github.com/fsantibanezleal/CAOS_ForecastScope/releases).
9
+ Application adoption is a separate step. The extraction preserves numerical
10
+ equations while adding strict public request and output validation, lint
11
+ normalization and warnings for unavailable optional diagnostics. It makes no new forecast
12
+ accuracy, calibration, chaos-identification or operational-performance claim.
13
+
14
+ ```python
15
+ import numpy as np
16
+ from forecastscope import combine, forecast
17
+
18
+ history = 20 + np.tile([1., 4., 2., 3.], 30)
19
+ columns = forecast("HoltWinters", history, seasonality=4, horizon=8)
20
+ allocation = combine("ValidationMix", history, seasonality=4, horizon=8)
21
+ print(columns.shape, allocation.weights, allocation.origins)
22
+ ```
23
+
24
+ The caller supplies a contiguous observed history; raw arrays contain no timestamps,
25
+ so contiguity itself is a caller precondition. Future targets belong to the caller's evaluation
26
+ protocol. NaNs, infinite values, fractional horizons, invalid seasonal lags and
27
+ unsupported probability grids are refused by the public entry points. The reference kernels preserve their documented short-history policies, including
28
+ Holt fallback when additive seasonal smoothing lacks two cycles or has lag one.
29
+ Combination experts can consequently coincide on a nonseasonal input. The five
30
+ reference experts use approximate Gaussian residual intervals; ordered columns do
31
+ not establish calibration. Temporal validation filters an outer-prefix-defined
32
+ historical grid, and does not reconstruct the exact grid a historical service
33
+ would have proposed at every earlier date.
34
+
35
+ The fixed contextual combination has an unfavorable comparison with its matching
36
+ recency control in its original development study. Later validation-selected
37
+ combinations have bounded point-score improvements on specified external collections,
38
+ with stronger automatic-method and interval-score comparisons retained. The package
39
+ does not turn those studies into a general superiority claim.
40
+
41
+ For diagnostics, install the `diagnostics` extra and import the topic module, for
42
+ example `forecastscope.diagnostics.sequence.matrix_profile`. Diagnostics describe
43
+ their supplied sequence and can be retrospective. They must not be computed on a
44
+ future block and then treated as prefix-only model-selection inputs.
45
+
46
+ The source origin and exact input hashes are recorded in
47
+ [docs/extraction-source.json](docs/extraction-source.json). The originating software
48
+ is MIT licensed; its copyright and licence remain in this repository. Application
49
+ cases, generator seeds, source CSVs, artifact schemas, pipeline stages and web assets
50
+ are outside this library. See [the extraction boundary](docs/boundary.md).
@@ -0,0 +1 @@
1
+ 0.01.000
@@ -0,0 +1,31 @@
1
+ # Extraction boundary
2
+
3
+ The reusable domain is finite-prefix forecasting, contextual combination and
4
+ sequence diagnostics. These procedures accept numerical histories and explicit
5
+ settings, and produce numerical results. They do not acquire a case, select a
6
+ customer, publish a manuscript or promote an artifact candidate.
7
+
8
+ The initial source moves preserve the originating kernels and their mathematical
9
+ adversarial tests. The application-specific forecast result dependency is replaced
10
+ with an independent five-field result type. Import relocation does not establish
11
+ parity by itself: core controls, diagnostic controls, installed-wheel execution
12
+ and comparison against the source implementation are separate checks.
13
+
14
+ The stable top-level calls validate complete finite histories, integer horizon
15
+ and seasonality, probability order, output shape and finite ordered forecast
16
+ columns. Lower-level extracted kernels retain historical numerical conventions,
17
+ including finite parameter grids and degeneracy floors. Those conventions are
18
+ documented rather than silently redefined during extraction. A later method
19
+ improvement requires a separately identified experiment and release.
20
+
21
+ ChronoScope retains source manifests, source reconstruction, case generators,
22
+ runtime/checkpoint policy, rendering and admission. Corpus-study partition policy
23
+ and its fixed model-selection protocol also remain application responsibilities.
24
+ They cannot become library defaults merely by copying a research script.
25
+
26
+ The product's historical evidence remains bound to the source that produced it.
27
+ Migration must archive the exact old source inputs and bind fresh executions to
28
+ the published library revision. Updating a recorded historical source hash to
29
+ hide a migration is forbidden. A successful package release alone does not close
30
+ the application's package-boundary requirement: it must consume that release,
31
+ remove its private distribution declaration and pass its own reproduction gates.
@@ -0,0 +1,183 @@
1
+ {
2
+ "source_repository": "https://github.com/fsantibanezleal/CAOS_RES_ChronoScope",
3
+ "source_commit": "9bda497e29f1705939e15e96e68dbd9f35a6dcfa",
4
+ "licence": "MIT",
5
+ "scope": "Initial extraction candidate; not a published dependency or product migration",
6
+ "files": {
7
+ "forecasting.py": {
8
+ "source_path": "data-pipeline/chronoscopelab/model/forecasters.py",
9
+ "source_sha256": "940c194ab85fe9d2ccbd58b89b986c1e0bb580298954f06a8793117b6469e664",
10
+ "extracted_sha256": "f10386d4ee119ed4b2075e245249fd570eb958e495c5109cdc872f5612a132e0",
11
+ "initial_extracted_sha256": "373d0243cdf8e5fb5bb3b9d411466bb486dc6625ac8825c50815863df712f73f",
12
+ "initial_function_and_class_bodies": "AST-identical to origin",
13
+ "initial_change": "import relocation and module documentation only; no function or class body change",
14
+ "current_ast_changes": [],
15
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
16
+ },
17
+ "combinations/context_memory.py": {
18
+ "source_path": "data-pipeline/chronoscopelab/model/context_memory.py",
19
+ "source_sha256": "dbafac6c79f05a562718e217113c170aac6a968ddbae6bf723e8e5e7292fc5ad",
20
+ "extracted_sha256": "b20f37561e9eceb338a164a824b4bb23df83029978384335793a4d7d8da0b80d",
21
+ "initial_extracted_sha256": "b20f37561e9eceb338a164a824b4bb23df83029978384335793a4d7d8da0b80d",
22
+ "initial_function_and_class_bodies": "AST-identical to origin",
23
+ "initial_change": "import relocation and module documentation only; no function or class body change",
24
+ "current_ast_changes": [],
25
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
26
+ },
27
+ "combinations/validated.py": {
28
+ "source_path": "data-pipeline/chronoscopelab/model/validated_combination.py",
29
+ "source_sha256": "dfbf1940dd6bd4832e234cc2f1efb28b06d5b4f72f6006e9b49f551918c88c95",
30
+ "extracted_sha256": "cc9d4494394ac0b02ce17eb2464d4e9e54875c716781d9f0d50dd5a43a9f635d",
31
+ "initial_extracted_sha256": "4bb43a8f0a325e5033844a3a0990acde68c14c31a3a324f5acbb9b53beb8171b",
32
+ "initial_function_and_class_bodies": "AST-identical to origin",
33
+ "initial_change": "import relocation and module documentation only; no function or class body change",
34
+ "current_ast_changes": [
35
+ "fit_validated"
36
+ ],
37
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
38
+ },
39
+ "diagnostics/autocorrelation.py": {
40
+ "source_path": "data-pipeline/chronoscopelab/analysis/autocorrelation.py",
41
+ "source_sha256": "a05b538d3d89d4a11081ab35e9ff01430157571063a5dae9af65d7127e110552",
42
+ "extracted_sha256": "a05b538d3d89d4a11081ab35e9ff01430157571063a5dae9af65d7127e110552",
43
+ "initial_extracted_sha256": "a05b538d3d89d4a11081ab35e9ff01430157571063a5dae9af65d7127e110552",
44
+ "initial_function_and_class_bodies": "AST-identical to origin",
45
+ "initial_change": "import relocation and module documentation only; no function or class body change",
46
+ "current_ast_changes": [],
47
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
48
+ },
49
+ "diagnostics/causality.py": {
50
+ "source_path": "data-pipeline/chronoscopelab/analysis/causality.py",
51
+ "source_sha256": "e9b8fe8bc9b64a5cadf0e7accc2fae0b322fa1511958c375828f8ffede840c01",
52
+ "extracted_sha256": "f10c2313e4f25f3cda929ed2db6193e45ab05bdc366cf76962809a8233526ae8",
53
+ "initial_extracted_sha256": "e9b8fe8bc9b64a5cadf0e7accc2fae0b322fa1511958c375828f8ffede840c01",
54
+ "initial_function_and_class_bodies": "AST-identical to origin",
55
+ "initial_change": "import relocation and module documentation only; no function or class body change",
56
+ "current_ast_changes": [
57
+ "causality_report"
58
+ ],
59
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
60
+ },
61
+ "diagnostics/changepoints.py": {
62
+ "source_path": "data-pipeline/chronoscopelab/analysis/changepoints.py",
63
+ "source_sha256": "dc0ce4fcb0eae8ca1b58bcf12046d09298d9807ce83e3d9344528a583b8e1466",
64
+ "extracted_sha256": "c482aea7728181e162c951da5f6e787ab89c958da9fa7f7717a882bb327551c2",
65
+ "initial_extracted_sha256": "dc0ce4fcb0eae8ca1b58bcf12046d09298d9807ce83e3d9344528a583b8e1466",
66
+ "initial_function_and_class_bodies": "AST-identical to origin",
67
+ "initial_change": "import relocation and module documentation only; no function or class body change",
68
+ "current_ast_changes": [
69
+ "_segments",
70
+ "changepoints_report"
71
+ ],
72
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
73
+ },
74
+ "diagnostics/distribution.py": {
75
+ "source_path": "data-pipeline/chronoscopelab/analysis/distribution.py",
76
+ "source_sha256": "36d79880747d2cef9c715e84e23586014988b77eadb78acac33edf6cf3d07f42",
77
+ "extracted_sha256": "39d3ce3d551727d44963bfdbcaae0723f6673639fe83a3267cdef75224b59889",
78
+ "initial_extracted_sha256": "36d79880747d2cef9c715e84e23586014988b77eadb78acac33edf6cf3d07f42",
79
+ "initial_function_and_class_bodies": "AST-identical to origin",
80
+ "initial_change": "import relocation and module documentation only; no function or class body change",
81
+ "current_ast_changes": [
82
+ "complexity",
83
+ "distribution_report"
84
+ ],
85
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
86
+ },
87
+ "diagnostics/filters.py": {
88
+ "source_path": "data-pipeline/chronoscopelab/analysis/filters.py",
89
+ "source_sha256": "227301d30878b6379d9588e8baa204a03a1d8d8dd4a329f90df8ac65db87741f",
90
+ "extracted_sha256": "12a85b23ab530c1d20a960dc2d97d109d2fc3fda67a82777c56cc3a446487bcc",
91
+ "initial_extracted_sha256": "227301d30878b6379d9588e8baa204a03a1d8d8dd4a329f90df8ac65db87741f",
92
+ "initial_function_and_class_bodies": "AST-identical to origin",
93
+ "initial_change": "import relocation and module documentation only; no function or class body change",
94
+ "current_ast_changes": [
95
+ "filters_report"
96
+ ],
97
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
98
+ },
99
+ "diagnostics/fractal.py": {
100
+ "source_path": "data-pipeline/chronoscopelab/analysis/fractal.py",
101
+ "source_sha256": "f1fa42f4c0676a97cde5a07ca79e9a832ae356c13451a7d46ee3859c107f3b1e",
102
+ "extracted_sha256": "c4c9752da0abee7d29eec8dd28445b2ebc8d7db49a5264d6e2406019bc3087cc",
103
+ "initial_extracted_sha256": "f1fa42f4c0676a97cde5a07ca79e9a832ae356c13451a7d46ee3859c107f3b1e",
104
+ "initial_function_and_class_bodies": "AST-identical to origin",
105
+ "initial_change": "import relocation and module documentation only; no function or class body change",
106
+ "current_ast_changes": [
107
+ "dcca_coefficient",
108
+ "fractal_report",
109
+ "hurst"
110
+ ],
111
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
112
+ },
113
+ "diagnostics/nonlinear.py": {
114
+ "source_path": "data-pipeline/chronoscopelab/analysis/nonlinear.py",
115
+ "source_sha256": "fcbc4a473636d1dd8a6c13b5170d1d6ee977fd6dc78beb56bd2d12f2caa6f593",
116
+ "extracted_sha256": "d3d139e2a65716fdf9471335101677a01508cd2ac0f972679c8ff825faadbc18",
117
+ "initial_extracted_sha256": "fcbc4a473636d1dd8a6c13b5170d1d6ee977fd6dc78beb56bd2d12f2caa6f593",
118
+ "initial_function_and_class_bodies": "AST-identical to origin",
119
+ "initial_change": "import relocation and module documentation only; no function or class body change",
120
+ "current_ast_changes": [
121
+ "nonlinear_report"
122
+ ],
123
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
124
+ },
125
+ "diagnostics/seasonality.py": {
126
+ "source_path": "data-pipeline/chronoscopelab/analysis/seasonality.py",
127
+ "source_sha256": "99c328fdb6b792b73485928146313e613f9c3ba354b1760e82e8bdd7e50b7cbb",
128
+ "extracted_sha256": "c9c41ae90230eef5e3eec723a44792476ed57646ca1af1f11b6e5ee9bb9a5ace",
129
+ "initial_extracted_sha256": "99c328fdb6b792b73485928146313e613f9c3ba354b1760e82e8bdd7e50b7cbb",
130
+ "initial_function_and_class_bodies": "AST-identical to origin",
131
+ "initial_change": "import relocation and module documentation only; no function or class body change",
132
+ "current_ast_changes": [
133
+ "seasonality_report"
134
+ ],
135
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
136
+ },
137
+ "diagnostics/sequence.py": {
138
+ "source_path": "data-pipeline/chronoscopelab/analysis/sequence.py",
139
+ "source_sha256": "63cf6a21ba110d08fd5bde2c9e4df2ec53a75b29ab03fba151b83be35c7420b9",
140
+ "extracted_sha256": "a89bc7f5353fa892e99fc76383434bdc9d717d988a6942bc6c44fbe0a891c8da",
141
+ "initial_extracted_sha256": "63cf6a21ba110d08fd5bde2c9e4df2ec53a75b29ab03fba151b83be35c7420b9",
142
+ "initial_function_and_class_bodies": "AST-identical to origin",
143
+ "initial_change": "import relocation and module documentation only; no function or class body change",
144
+ "current_ast_changes": [
145
+ "matrix_profile"
146
+ ],
147
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
148
+ },
149
+ "diagnostics/stationarity.py": {
150
+ "source_path": "data-pipeline/chronoscopelab/analysis/stationarity.py",
151
+ "source_sha256": "42490c61430e82012d163318fbf231a0a21c50b4e53ca9d2e1c58a13bf257029",
152
+ "extracted_sha256": "42490c61430e82012d163318fbf231a0a21c50b4e53ca9d2e1c58a13bf257029",
153
+ "initial_extracted_sha256": "42490c61430e82012d163318fbf231a0a21c50b4e53ca9d2e1c58a13bf257029",
154
+ "initial_function_and_class_bodies": "AST-identical to origin",
155
+ "initial_change": "import relocation and module documentation only; no function or class body change",
156
+ "current_ast_changes": [],
157
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
158
+ },
159
+ "diagnostics/volatility.py": {
160
+ "source_path": "data-pipeline/chronoscopelab/analysis/volatility.py",
161
+ "source_sha256": "38685dc0684377d816ead19cff357c75caef68c5db7038fb9c5c96ad213978c0",
162
+ "extracted_sha256": "1113870a8749f528821265c14fe0998fd936521704aaca50c2e60d5102997215",
163
+ "initial_extracted_sha256": "38685dc0684377d816ead19cff357c75caef68c5db7038fb9c5c96ad213978c0",
164
+ "initial_function_and_class_bodies": "AST-identical to origin",
165
+ "initial_change": "import relocation and module documentation only; no function or class body change",
166
+ "current_ast_changes": [
167
+ "volatility_report"
168
+ ],
169
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
170
+ },
171
+ "diagnostics/__init__.py": {
172
+ "source_path": "data-pipeline/chronoscopelab/analysis/__init__.py",
173
+ "source_sha256": "875ba0e041f06378c91d12ac260ad30245f6404d7cb0e747e5ebb223ad991437",
174
+ "extracted_sha256": "0082636cf6110170eb52fa6f9067d34492aa21027772e19acc4030f49d195d46",
175
+ "initial_extracted_sha256": "61ca22b5c6eb33191702e43b00e51eea7b17e3af5aa1283949e82d2cd2dc157b",
176
+ "initial_function_and_class_bodies": "AST-identical to origin",
177
+ "initial_change": "import relocation and module documentation only; no function or class body change",
178
+ "current_ast_changes": [],
179
+ "current_change": "Linter normalization; explicit unavailable-diagnostic warnings where applicable; numerical parity measured separately"
180
+ }
181
+ },
182
+ "initial_extraction_commit": "4ac2e9e37cdb4cdb0775957cd8ecea87771d3c58"
183
+ }
@@ -0,0 +1,132 @@
1
+ {
2
+ "state": "installed-wheel-parity; product adoption separate",
3
+ "source_artifact_sha256": "8b49b2fe6298bede97a209ac117389152bf1859d78e0006a96e8521ac02a16a1",
4
+ "cases": [
5
+ {
6
+ "case_id": "BRKV_level_shift",
7
+ "history_sha256": "638f51aba294642d2f443ca2696529c7a6b567775cf289ef2b2410d9567c2752",
8
+ "history_length": 288,
9
+ "horizon": 12,
10
+ "seasonality": 12,
11
+ "exact_method_comparisons": 10
12
+ },
13
+ {
14
+ "case_id": "CHAO_mackey",
15
+ "history_sha256": "f45f00b8f7d20dff4913033654380eed162f3c0b76cec4b4c632a282618b4eaa",
16
+ "history_length": 488,
17
+ "horizon": 12,
18
+ "seasonality": 1,
19
+ "exact_method_comparisons": 10
20
+ },
21
+ {
22
+ "case_id": "CTRL_white_noise",
23
+ "history_sha256": "c616114588fc458e97120ddcaf524a6b514cd0d5f7d7da4130a2729ad528dcb4",
24
+ "history_length": 148,
25
+ "horizon": 12,
26
+ "seasonality": 1,
27
+ "exact_method_comparisons": 10
28
+ },
29
+ {
30
+ "case_id": "EXOG_promo",
31
+ "history_sha256": "e9eda802c21d30f314343920fa40d0c563dee28d85c4c8906a7be43ee55489fe",
32
+ "history_length": 226,
33
+ "horizon": 14,
34
+ "seasonality": 7,
35
+ "exact_method_comparisons": 10
36
+ },
37
+ {
38
+ "case_id": "HETV_garch",
39
+ "history_sha256": "1fd83131c366f0fbd6d53063d5c3f597bcd175b98820c8d39afe069b2569e3d3",
40
+ "history_length": 488,
41
+ "horizon": 12,
42
+ "seasonality": 1,
43
+ "exact_method_comparisons": 10
44
+ },
45
+ {
46
+ "case_id": "INTM_demand",
47
+ "history_sha256": "2af699ad52da5f20ea73083cf827f08d7313c88e1c93c3b2e947f89325b5403c",
48
+ "history_length": 188,
49
+ "horizon": 12,
50
+ "seasonality": 1,
51
+ "exact_method_comparisons": 10
52
+ },
53
+ {
54
+ "case_id": "LMEM_fractional",
55
+ "history_sha256": "8db0096900fb2afa0c885ba844b82cbe6a9695af50778bff076a9582902e00bd",
56
+ "history_length": 488,
57
+ "horizon": 12,
58
+ "seasonality": 1,
59
+ "exact_method_comparisons": 10
60
+ },
61
+ {
62
+ "case_id": "MSEA_daily_weekly",
63
+ "history_sha256": "55ca773de66d99466146704eaa768a5e58c1fc24489750a1ccfc5a9d3ed84df2",
64
+ "history_length": 648,
65
+ "horizon": 24,
66
+ "seasonality": 24,
67
+ "exact_method_comparisons": 10
68
+ },
69
+ {
70
+ "case_id": "REAL_electricity",
71
+ "history_sha256": "f52426a81659d943fda200e18b2a87a7204ee95d7f6a38534826a4107e5673f1",
72
+ "history_length": 456,
73
+ "horizon": 24,
74
+ "seasonality": 24,
75
+ "exact_method_comparisons": 10
76
+ },
77
+ {
78
+ "case_id": "REAL_m4_daily",
79
+ "history_sha256": "19778fb24286d629735984783e956156a601998e4780a4a84523b41da6cd08b3",
80
+ "history_length": 386,
81
+ "horizon": 14,
82
+ "seasonality": 7,
83
+ "exact_method_comparisons": 10
84
+ },
85
+ {
86
+ "case_id": "REAL_m4_hourly",
87
+ "history_sha256": "88c3fc19baeda2a2382373e7faca054dda3d4724eb385590a128b0dcbee3c52d",
88
+ "history_length": 456,
89
+ "horizon": 24,
90
+ "seasonality": 24,
91
+ "exact_method_comparisons": 10
92
+ },
93
+ {
94
+ "case_id": "REAL_pm25",
95
+ "history_sha256": "ea8eb0c5ac7a0d73d28490690ce1a77beb4a6ce0ee720b21f74a89b2601e8916",
96
+ "history_length": 456,
97
+ "horizon": 24,
98
+ "seasonality": 24,
99
+ "exact_method_comparisons": 10
100
+ },
101
+ {
102
+ "case_id": "RWLK_noise",
103
+ "history_sha256": "67223f6d58ffdab11c374e18b477bdf7cb5f06a77d1d61bc8d73eafc42f484a9",
104
+ "history_length": 188,
105
+ "horizon": 12,
106
+ "seasonality": 1,
107
+ "exact_method_comparisons": 10
108
+ },
109
+ {
110
+ "case_id": "SEAS_hourly",
111
+ "history_sha256": "1f7fb34587e6e19742a4e0c392edbd7f24b6752e1b573d06bbcca6f340fb50a9",
112
+ "history_length": 456,
113
+ "horizon": 24,
114
+ "seasonality": 24,
115
+ "exact_method_comparisons": 10
116
+ },
117
+ {
118
+ "case_id": "TRND_seasonal",
119
+ "history_sha256": "3edefdb9459052438bb4948035d45f1fe83f9797e8415f1c49516e83840a6016",
120
+ "history_length": 168,
121
+ "horizon": 12,
122
+ "seasonality": 12,
123
+ "exact_method_comparisons": 10
124
+ }
125
+ ],
126
+ "total_exact_comparisons": 150,
127
+ "scope": "Full-precision quantile matrices, allocation weights and historical origins; no new accuracy trial",
128
+ "runtime": {
129
+ "python": "3.12.10",
130
+ "numpy": "2.5.4"
131
+ }
132
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "python": "3.12.10",
3
+ "platform_class": "Windows x86_64",
4
+ "scientific_dependencies": {
5
+ "numpy": "2.5.4",
6
+ "pandas": "3.1.1",
7
+ "scipy": "1.18.1",
8
+ "statsmodels": "0.14.6",
9
+ "arch": "8.0.0",
10
+ "EMD-signal": "1.10.0",
11
+ "PyWavelets": "1.10.0",
12
+ "antropy": "0.2.3",
13
+ "nolds": "0.6.3",
14
+ "hurst": "0.0.5",
15
+ "MFDFA": "0.4.3",
16
+ "pycatch22": "0.4.5",
17
+ "stumpy": "1.14.1",
18
+ "scikit-learn": "1.9.1",
19
+ "coreforecast": "0.0.20",
20
+ "numba": "0.68.1"
21
+ },
22
+ "scope": "Local diagnostic validation environment; the consuming product retains its own exact pins"
23
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "state": "validated-local-candidate; PyPI publication and product adoption pending",
3
+ "version": "0.1.0",
4
+ "checks": [
5
+ {
6
+ "check": "source core controls",
7
+ "passed": 31,
8
+ "python": "3.13.14",
9
+ "numpy": "2.4.6"
10
+ },
11
+ {
12
+ "check": "complete installed-wheel diagnostic and core suite",
13
+ "passed": 128,
14
+ "warnings_retained": 35,
15
+ "python": "3.12.10",
16
+ "numpy": "2.5.4"
17
+ },
18
+ {
19
+ "check": "isolated installed wheel without SciPy or product package",
20
+ "passed": 31,
21
+ "python": "3.12.10"
22
+ },
23
+ {
24
+ "check": "exact product forecast and combination comparisons",
25
+ "passed": 150,
26
+ "cases": 15
27
+ },
28
+ {
29
+ "check": "wheel and sdist metadata",
30
+ "state": "pass"
31
+ },
32
+ {
33
+ "check": "declared dependencies",
34
+ "state": "no broken requirements"
35
+ },
36
+ {
37
+ "check": "Ruff current source tests and parity tooling",
38
+ "state": "pass"
39
+ }
40
+ ],
41
+ "retained_failures": [
42
+ {
43
+ "check": "initial optional diagnostic suite",
44
+ "passed": 125,
45
+ "failed": 1,
46
+ "reason": "Missing coreforecast declaration for Guerrero seasonal Box-Cox; dependency added and complete suite rerun"
47
+ },
48
+ {
49
+ "check": "first current-Ruff check",
50
+ "reason": "New lint rules found import/order/normalization and silent optional-error handling; corrected, no rules disabled"
51
+ }
52
+ ],
53
+ "limits": [
54
+ "These are numerical and packaging controls, not a new forecasting accuracy trial",
55
+ "Linux CI, PyPI publication, app migration and its own release gates are separate"
56
+ ]
57
+ }
@@ -0,0 +1,41 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "forecastscope"
7
+ version = "0.1.0"
8
+ description = "Finite-prefix forecasting, temporal forecast combinations and sequence diagnostics."
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = "MIT"
12
+ authors = [{name = "Felipe Santibáñez-Leal"}]
13
+ dependencies = ["numpy>=2.0,<3"]
14
+
15
+ [project.optional-dependencies]
16
+ diagnostics = [
17
+ "scipy>=1.15,<2", "pandas>=2.3,<4", "statsmodels>=0.14.6,<0.15", "arch>=8,<9",
18
+ "ruptures>=1.1.10,<2", "EMD-signal>=1.9,<2", "PyWavelets>=1.8,<2",
19
+ "antropy>=0.2.2,<0.3", "nolds==0.6.3", "hurst==0.0.5", "MFDFA==0.4.3",
20
+ "pycatch22>=0.4.5,<0.5", "stumpy>=1.14.1,<2", "scikit-learn>=1.9,<2",
21
+ "coreforecast>=0.0.17,<0.1",
22
+ ]
23
+ dev = ["pytest>=8", "ruff>=0.15,<0.17", "build", "twine"]
24
+
25
+ [project.urls]
26
+ Repository = "https://github.com/fsantibanezleal/CAOS_ForecastScope"
27
+ Issues = "https://github.com/fsantibanezleal/CAOS_ForecastScope/issues"
28
+
29
+ [tool.setuptools.packages.find]
30
+ where = ["src"]
31
+
32
+ [tool.pytest.ini_options]
33
+ testpaths = ["tests"]
34
+ addopts = "-q"
35
+
36
+ [tool.ruff]
37
+ line-length = 110
38
+ target-version = "py311"
39
+
40
+ [tool.ruff.lint]
41
+ ignore = ["E741"]