tsam 2.3.6__tar.gz → 2.3.8__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 (56) hide show
  1. {tsam-2.3.6/src/tsam.egg-info → tsam-2.3.8}/PKG-INFO +4 -3
  2. {tsam-2.3.6 → tsam-2.3.8}/pyproject.toml +2 -2
  3. {tsam-2.3.6 → tsam-2.3.8}/requirements.yml +1 -1
  4. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/timeseriesaggregation.py +3 -0
  5. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/utils/durationRepresentation.py +63 -52
  6. {tsam-2.3.6 → tsam-2.3.8/src/tsam.egg-info}/PKG-INFO +4 -3
  7. {tsam-2.3.6 → tsam-2.3.8}/test/test_assert_raises.py +5 -5
  8. {tsam-2.3.6 → tsam-2.3.8}/LICENSE.txt +0 -0
  9. {tsam-2.3.6 → tsam-2.3.8}/MANIFEST.in +0 -0
  10. {tsam-2.3.6 → tsam-2.3.8}/README.md +0 -0
  11. {tsam-2.3.6 → tsam-2.3.8}/examples/results/paretoOptimalAggregation.csv +0 -0
  12. {tsam-2.3.6 → tsam-2.3.8}/examples/results/preprocessed_wind.csv +0 -0
  13. {tsam-2.3.6 → tsam-2.3.8}/examples/results/testperiods_hierarchical.csv +0 -0
  14. {tsam-2.3.6 → tsam-2.3.8}/examples/results/testperiods_kmeans.csv +0 -0
  15. {tsam-2.3.6 → tsam-2.3.8}/examples/results/testperiods_kmedoids.csv +0 -0
  16. {tsam-2.3.6 → tsam-2.3.8}/examples/results/testperiods_predefClusterOrder.csv +0 -0
  17. {tsam-2.3.6 → tsam-2.3.8}/examples/results/testperiods_predefClusterOrderAndClusterCenters.csv +0 -0
  18. {tsam-2.3.6 → tsam-2.3.8}/examples/results/testperiods_segmentation.csv +0 -0
  19. {tsam-2.3.6 → tsam-2.3.8}/examples/testdata.csv +0 -0
  20. {tsam-2.3.6 → tsam-2.3.8}/requirements.txt +0 -0
  21. {tsam-2.3.6 → tsam-2.3.8}/requirements_dev.txt +0 -0
  22. {tsam-2.3.6 → tsam-2.3.8}/setup.cfg +0 -0
  23. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/__init__.py +0 -0
  24. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/hyperparametertuning.py +0 -0
  25. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/periodAggregation.py +0 -0
  26. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/representations.py +0 -0
  27. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/utils/__init__.py +0 -0
  28. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/utils/k_maxoids.py +0 -0
  29. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/utils/k_medoids_contiguity.py +0 -0
  30. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/utils/k_medoids_exact.py +0 -0
  31. {tsam-2.3.6 → tsam-2.3.8}/src/tsam/utils/segmentation.py +0 -0
  32. {tsam-2.3.6 → tsam-2.3.8}/src/tsam.egg-info/SOURCES.txt +0 -0
  33. {tsam-2.3.6 → tsam-2.3.8}/src/tsam.egg-info/dependency_links.txt +0 -0
  34. {tsam-2.3.6 → tsam-2.3.8}/src/tsam.egg-info/requires.txt +0 -0
  35. {tsam-2.3.6 → tsam-2.3.8}/src/tsam.egg-info/top_level.txt +0 -0
  36. {tsam-2.3.6 → tsam-2.3.8}/test/test_accuracyIndicators.py +0 -0
  37. {tsam-2.3.6 → tsam-2.3.8}/test/test_adjacent_periods.py +0 -0
  38. {tsam-2.3.6 → tsam-2.3.8}/test/test_aggregate_hiearchical.py +0 -0
  39. {tsam-2.3.6 → tsam-2.3.8}/test/test_averaging.py +0 -0
  40. {tsam-2.3.6 → tsam-2.3.8}/test/test_cluster_order.py +0 -0
  41. {tsam-2.3.6 → tsam-2.3.8}/test/test_durationCurve.py +0 -0
  42. {tsam-2.3.6 → tsam-2.3.8}/test/test_durationRepresentation.py +0 -0
  43. {tsam-2.3.6 → tsam-2.3.8}/test/test_extremePeriods.py +0 -0
  44. {tsam-2.3.6 → tsam-2.3.8}/test/test_hierarchical.py +0 -0
  45. {tsam-2.3.6 → tsam-2.3.8}/test/test_hypertuneAggregation.py +0 -0
  46. {tsam-2.3.6 → tsam-2.3.8}/test/test_k_maxoids.py +0 -0
  47. {tsam-2.3.6 → tsam-2.3.8}/test/test_k_medoids.py +0 -0
  48. {tsam-2.3.6 → tsam-2.3.8}/test/test_k_medoids_contiguity.py +0 -0
  49. {tsam-2.3.6 → tsam-2.3.8}/test/test_minmaxRepresentation.py +0 -0
  50. {tsam-2.3.6 → tsam-2.3.8}/test/test_preprocess.py +0 -0
  51. {tsam-2.3.6 → tsam-2.3.8}/test/test_properties.py +0 -0
  52. {tsam-2.3.6 → tsam-2.3.8}/test/test_samemean.py +0 -0
  53. {tsam-2.3.6 → tsam-2.3.8}/test/test_segmentation.py +0 -0
  54. {tsam-2.3.6 → tsam-2.3.8}/test/test_subhourlyResolution.py +0 -0
  55. {tsam-2.3.6 → tsam-2.3.8}/test/test_subhourly_periods.py +0 -0
  56. {tsam-2.3.6 → tsam-2.3.8}/test/test_weightingFactors.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: tsam
3
- Version: 2.3.6
3
+ Version: 2.3.8
4
4
  Summary: Time series aggregation module (tsam) to create typical periods
5
5
  Author-email: Leander Kotzur <leander.kotzur@googlemail.com>, Maximilian Hoffmann <maximilian.hoffmann@julumni.fz-juelich.de>
6
6
  Maintainer-email: Julian Belina <j.belina@fz-juelich.de>
@@ -37,7 +37,7 @@ Classifier: Programming Language :: Python :: 2
37
37
  Classifier: Programming Language :: Python :: 3
38
38
  Classifier: Topic :: Scientific/Engineering :: Mathematics
39
39
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
40
- Requires-Python: <3.13,>=3.9
40
+ Requires-Python: <3.14,>=3.9
41
41
  Description-Content-Type: text/markdown
42
42
  License-File: LICENSE.txt
43
43
  Requires-Dist: scikit-learn>=0.0
@@ -55,6 +55,7 @@ Requires-Dist: sphinx; extra == "dev"
55
55
  Requires-Dist: sphinx-autobuild; extra == "dev"
56
56
  Requires-Dist: sphinx_book_theme; extra == "dev"
57
57
  Requires-Dist: twine; extra == "dev"
58
+ Dynamic: license-file
58
59
 
59
60
  [![daily pytest](https://github.com/FZJ-IEK3-VSA/tsam/actions/workflows/daily_tests.yml/badge.svg?branch=master)](https://github.com/FZJ-IEK3-VSA/tsam/actions) [![Version](https://img.shields.io/pypi/v/tsam.svg)](https://pypi.python.org/pypi/tsam) [![Conda Version](https://img.shields.io/conda/vn/conda-forge/tsam.svg)](https://anaconda.org/conda-forge/tsam) [![Documentation Status](https://readthedocs.org/projects/tsam/badge/?version=latest)](https://tsam.readthedocs.io/en/latest/) [![PyPI - License](https://img.shields.io/pypi/l/tsam)]((https://github.com/FZJ-IEK3-VSA/tsam/blob/master/LICENSE.txt)) [![codecov](https://codecov.io/gh/FZJ-IEK3-VSA/tsam/branch/master/graph/badge.svg)](https://codecov.io/gh/FZJ-IEK3-VSA/tsam)
60
61
  [![badge](https://img.shields.io/badge/launch-binder-579aca.svg?logo=data:image/png;base64,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)](https://mybinder.org/v2/gh/FZJ-IEK3-VSA/voila-tsam/HEAD?urlpath=voila/render/Time-Series-Aggregation-Module.ipynb)
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "tsam"
8
- version = "2.3.6"
8
+ version = "2.3.8"
9
9
  description = "Time series aggregation module (tsam) to create typical periods"
10
10
  authors = [
11
11
  { name = "Leander Kotzur", email = "leander.kotzur@googlemail.com" },
@@ -16,7 +16,7 @@ maintainers = [
16
16
  ]
17
17
  license = { file = "LICENSE.txt" }
18
18
  keywords = ["clustering", "optimization"]
19
- requires-python = ">=3.9,<3.13"
19
+ requires-python = ">=3.9,<3.14"
20
20
  readme = "README.md"
21
21
  classifiers=[
22
22
  "Development Status :: 4 - Beta",
@@ -2,5 +2,5 @@ name: tsam_env
2
2
  channels:
3
3
  - conda-forge
4
4
  dependencies:
5
- - python>=3.9,<3.13
5
+ - python>=3.9,<3.14
6
6
  - pip
@@ -199,6 +199,9 @@ class TimeSeriesAggregation(object):
199
199
  differently evaluated while the clustering process. optional (default: None )
200
200
  :type weightDict: dict
201
201
 
202
+ :param segmentation: Boolean if time steps in periods should be aggregated to segments. optional (default: False)
203
+ :type segmentation: boolean
204
+
202
205
  :param extremePeriodMethod: Method how to integrate extreme Periods (peak demand, lowest temperature etc.)
203
206
  into to the typical period profiles. optional, default: 'None'
204
207
  |br| Options are:
@@ -28,69 +28,80 @@ def durationRepresentation(
28
28
  :type representMinMax: bool
29
29
  """
30
30
 
31
- # make pd.DataFrame each row represents a candidate, and the columns are defined by two levels: the attributes and
32
- # the time steps inside the candidates.
33
- columnTuples = []
34
- for i in range(int(candidates.shape[1] / timeStepsPerPeriod)):
35
- for j in range(timeStepsPerPeriod):
36
- columnTuples.append((i, j))
37
- candidates = pd.DataFrame(
38
- candidates, columns=pd.MultiIndex.from_tuples(columnTuples)
31
+ # Convert candidates to numpy array at the beginning if it's a DataFrame
32
+ if isinstance(candidates, pd.DataFrame):
33
+ candidates_array = candidates.values
34
+ else:
35
+ candidates_array = candidates
36
+
37
+ # Create a pandas DataFrame only when necessary
38
+ columnTuples = [(i, j) for i in range(int(candidates_array.shape[1] / timeStepsPerPeriod))
39
+ for j in range(timeStepsPerPeriod)]
40
+
41
+ candidates_df = pd.DataFrame(
42
+ candidates_array, columns=pd.MultiIndex.from_tuples(columnTuples)
39
43
  )
40
-
41
- # There are two options for the duration representation. Either, the distribution of each cluster is preserved
42
- # (periodWise = True) or the distribution of the total time series is preserved only. In the latter case, the
43
- # inner-cluster variance is smaller and the variance across the typical periods' mean values is higher
44
+
44
45
  if distributionPeriodWise:
45
46
  clusterCenters = []
46
- for clusterNum in np.unique(clusterOrder):
47
- indice = np.where(clusterOrder == clusterNum)
48
- noCandidates = len(indice[0])
49
- clean_index = []
50
-
51
- clusterCenter = []
52
- # get a clean index depending on the size
53
- for y in candidates.columns.levels[1]:
54
- for x in range(noCandidates):
55
- clean_index.append((x, y))
56
- for a in candidates.columns.levels[0]:
57
- # get all the values of a certain attribute and cluster
58
- candidateValues = candidates.loc[indice[0], a]
59
- # sort all values
60
- sortedAttr = candidateValues.stack(
61
- future_stack=True,
62
- ).sort_values()
63
- # reindex and arrange such that every sorted segment gets represented by its mean
64
- sortedAttr.index = pd.MultiIndex.from_tuples(clean_index)
65
- representationValues = sortedAttr.unstack(level=0).mean(axis=1)
66
- # respect max and min of the attributes
47
+ unique_clusters = np.unique(clusterOrder)
48
+
49
+ for clusterNum in unique_clusters:
50
+ indice = np.where(clusterOrder == clusterNum)[0]
51
+ noCandidates = len(indice)
52
+
53
+ # Pre-allocate the full cluster center array
54
+ cluster_values_count = noCandidates * timeStepsPerPeriod * len(candidates_df.columns.levels[0])
55
+ clusterCenter = np.zeros(cluster_values_count)
56
+ current_idx = 0
57
+
58
+ for a in candidates_df.columns.levels[0]:
59
+ # Get values using numpy indexing when possible
60
+ candidateValues = candidates_df.loc[indice, a].values
61
+
62
+ # Reshape to more easily work with numpy
63
+ candidateValues_reshaped = candidateValues.reshape(-1)
64
+
65
+ # Sort values using numpy
66
+ sorted_values = np.sort(candidateValues_reshaped)
67
+
68
+ # Calculate representative values directly
69
+ values_per_timestep = noCandidates
70
+ representation_values = np.zeros(timeStepsPerPeriod)
71
+
72
+ for t in range(timeStepsPerPeriod):
73
+ start_idx = t * values_per_timestep
74
+ end_idx = start_idx + values_per_timestep
75
+ representation_values[t] = np.mean(sorted_values[start_idx:end_idx])
76
+
77
+ # Handle min/max representation if needed
67
78
  if representMinMax:
68
- representationValues.loc[0] = sortedAttr.values[0]
69
- representationValues.loc[representationValues.index[-1]] = (
70
- sortedAttr.values[-1]
71
- )
72
-
73
- # get the order of the representation values such that euclidean distance to the candidates is minimized
74
- order = candidateValues.mean().sort_values().index
75
- # arrange
76
- representationValues.index = order
77
- representationValues.sort_index(inplace=True)
78
-
79
- # add to cluster center
80
- clusterCenter = np.append(clusterCenter, representationValues.values)
81
-
82
- clusterCenters.append(clusterCenter)
83
-
79
+ representation_values[0] = sorted_values[0]
80
+ representation_values[-1] = sorted_values[-1]
81
+
82
+ # Re-order values based on the mean of candidate values
83
+ mean_values = np.mean(candidateValues, axis=0)
84
+ order_indices = np.argsort(mean_values)
85
+
86
+ # Reorder representation values
87
+ representation_values_ordered = representation_values[order_indices]
88
+
89
+ # Add to cluster center
90
+ clusterCenter[current_idx:current_idx+len(representation_values)] = representation_values_ordered
91
+ current_idx += len(representation_values)
92
+
93
+ clusterCenters.append(clusterCenter[:current_idx]) # Trim if we didn't use the whole pre-allocation
94
+
84
95
  else:
85
96
  clusterCentersList = []
86
- for a in candidates.columns.levels[0]:
97
+ for a in candidates_df.columns.levels[0]:
87
98
  meanVals = []
88
99
  clusterLengths = []
89
100
  for clusterNum in np.unique(clusterOrder):
90
101
  indice = np.where(clusterOrder == clusterNum)
91
102
  noCandidates = len(indice[0])
92
103
  # get all the values of a certain attribute and cluster
93
- candidateValues = candidates.loc[indice[0], a]
104
+ candidateValues = candidates_df.loc[indice[0], a]
94
105
  # calculate centroid of each cluster and append to list
95
106
  meanVals.append(candidateValues.mean())
96
107
  # make a list of weights of each cluster for each time step within the period
@@ -113,7 +124,7 @@ def durationRepresentation(
113
124
  order = meansAndWeightsSorted.index
114
125
  # sort all values of the original time series
115
126
  sortedAttr = (
116
- candidates.loc[:, a]
127
+ candidates_df.loc[:, a]
117
128
  .stack(
118
129
  future_stack=True,
119
130
  )
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: tsam
3
- Version: 2.3.6
3
+ Version: 2.3.8
4
4
  Summary: Time series aggregation module (tsam) to create typical periods
5
5
  Author-email: Leander Kotzur <leander.kotzur@googlemail.com>, Maximilian Hoffmann <maximilian.hoffmann@julumni.fz-juelich.de>
6
6
  Maintainer-email: Julian Belina <j.belina@fz-juelich.de>
@@ -37,7 +37,7 @@ Classifier: Programming Language :: Python :: 2
37
37
  Classifier: Programming Language :: Python :: 3
38
38
  Classifier: Topic :: Scientific/Engineering :: Mathematics
39
39
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
40
- Requires-Python: <3.13,>=3.9
40
+ Requires-Python: <3.14,>=3.9
41
41
  Description-Content-Type: text/markdown
42
42
  License-File: LICENSE.txt
43
43
  Requires-Dist: scikit-learn>=0.0
@@ -55,6 +55,7 @@ Requires-Dist: sphinx; extra == "dev"
55
55
  Requires-Dist: sphinx-autobuild; extra == "dev"
56
56
  Requires-Dist: sphinx_book_theme; extra == "dev"
57
57
  Requires-Dist: twine; extra == "dev"
58
+ Dynamic: license-file
58
59
 
59
60
  [![daily pytest](https://github.com/FZJ-IEK3-VSA/tsam/actions/workflows/daily_tests.yml/badge.svg?branch=master)](https://github.com/FZJ-IEK3-VSA/tsam/actions) [![Version](https://img.shields.io/pypi/v/tsam.svg)](https://pypi.python.org/pypi/tsam) [![Conda Version](https://img.shields.io/conda/vn/conda-forge/tsam.svg)](https://anaconda.org/conda-forge/tsam) [![Documentation Status](https://readthedocs.org/projects/tsam/badge/?version=latest)](https://tsam.readthedocs.io/en/latest/) [![PyPI - License](https://img.shields.io/pypi/l/tsam)]((https://github.com/FZJ-IEK3-VSA/tsam/blob/master/LICENSE.txt)) [![codecov](https://codecov.io/gh/FZJ-IEK3-VSA/tsam/branch/master/graph/badge.svg)](https://codecov.io/gh/FZJ-IEK3-VSA/tsam)
60
61
  [![badge](https://img.shields.io/badge/launch-binder-579aca.svg?logo=data:image/png;base64,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)](https://mybinder.org/v2/gh/FZJ-IEK3-VSA/voila-tsam/HEAD?urlpath=voila/render/Time-Series-Aggregation-Module.ipynb)
@@ -18,7 +18,7 @@ def test_assert_raises():
18
18
  # check error message for wrong time series
19
19
  np.testing.assert_raises_regex(
20
20
  ValueError,
21
- "timeSeries has to be of type pandas.DataFrame\(\) or of type np.array\(\) in "
21
+ r"timeSeries has to be of type pandas.DataFrame\(\) or of type np.array\(\) in "
22
22
  "initialization of object of class TimeSeriesAggregation",
23
23
  tsam.TimeSeriesAggregation,
24
24
  timeSeries="erroneousTimeSeries",
@@ -126,8 +126,8 @@ def test_assert_raises():
126
126
  # check erroneous clusterMethod argument
127
127
  np.testing.assert_raises_regex(
128
128
  ValueError,
129
- "clusterMethod needs to be one of the following: \['averaging', 'k_means', "
130
- "'k_medoids', 'k_maxoids', 'hierarchical', 'adjacent_periods'\]",
129
+ r"clusterMethod needs to be one of the following: \['averaging', 'k_means', "
130
+ r"'k_medoids', 'k_maxoids', 'hierarchical', 'adjacent_periods'\]",
131
131
  tsam.TimeSeriesAggregation,
132
132
  timeSeries=raw,
133
133
  clusterMethod="erroneousClusterMethod",
@@ -144,8 +144,8 @@ def test_assert_raises():
144
144
  # check erroneous extremePeriodMethod argument
145
145
  np.testing.assert_raises_regex(
146
146
  ValueError,
147
- "extremePeriodMethod needs to be one of the following: \['None', 'append', "
148
- "'new_cluster_center', 'replace_cluster_center'\]",
147
+ r"extremePeriodMethod needs to be one of the following: \['None', 'append', "
148
+ r"'new_cluster_center', 'replace_cluster_center'\]",
149
149
  tsam.TimeSeriesAggregation,
150
150
  timeSeries=raw,
151
151
  extremePeriodMethod="erroneousExtremePeriodMethod",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes