test_storage_utils.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import pytest
  2. import pandas as pd
  3. from flexmeasures.data.models.planning.utils import process_time_series_segments
  4. from flexmeasures.utils.unit_utils import ur
  5. @pytest.mark.parametrize(
  6. "index, variable_quantity, unit, resolution, resolve_overlaps, expected",
  7. [
  8. # Test case 1: Simple case with no overlaps
  9. (
  10. pd.date_range("2023-01-01", "2023-01-05", freq="1h", inclusive="left"),
  11. [
  12. {
  13. "value": 1,
  14. "start": pd.Timestamp("2023-01-01"),
  15. "end": pd.Timestamp("2023-01-03"),
  16. },
  17. {
  18. "value": 2,
  19. "start": pd.Timestamp("2023-01-03"),
  20. "end": pd.Timestamp("2023-01-05"),
  21. },
  22. ],
  23. "dimensionless",
  24. pd.Timedelta("1h"),
  25. "first",
  26. pd.Series(
  27. [1] * 24 * 2 + [2] * 24 * 2,
  28. index=pd.date_range(
  29. "2023-01-01", "2023-01-05", freq="1h", inclusive="left"
  30. ),
  31. name="event_value",
  32. ),
  33. ),
  34. # Test case 2: Resolving overlaps with mean
  35. (
  36. pd.date_range("2023-01-01", "2023-01-05", freq="1h", inclusive="left"),
  37. [
  38. {
  39. "value": 1,
  40. "start": pd.Timestamp("2023-01-01"),
  41. "end": pd.Timestamp("2023-01-04"),
  42. },
  43. {
  44. "value": 2,
  45. "start": pd.Timestamp("2023-01-03"),
  46. "end": pd.Timestamp("2023-01-05"),
  47. },
  48. ],
  49. "dimensionless",
  50. pd.Timedelta("1h"),
  51. "mean",
  52. pd.Series(
  53. [1] * 24 * 2 + [1.5] * 24 + [2] * 24,
  54. index=pd.date_range(
  55. "2023-01-01", "2023-01-05", freq="1h", inclusive="left"
  56. ),
  57. name="event_value",
  58. ),
  59. ),
  60. # Test case 3: Handling Quantity values with first
  61. (
  62. pd.date_range("2023-01-01", "2023-01-05", freq="1h", inclusive="left"),
  63. [
  64. {
  65. "value": ur.Quantity(1, "m"),
  66. "start": pd.Timestamp("2023-01-01"),
  67. "end": pd.Timestamp("2023-01-04"),
  68. },
  69. {
  70. "value": ur.Quantity(2, "m"),
  71. "start": pd.Timestamp("2023-01-03"),
  72. "end": pd.Timestamp("2023-01-05"),
  73. },
  74. ],
  75. "km",
  76. pd.Timedelta("1h"),
  77. "first",
  78. pd.Series(
  79. [0.001] * 24 * 3 + [0.002] * 24,
  80. index=pd.date_range(
  81. "2023-01-01", "2023-01-05", freq="1h", inclusive="left"
  82. ),
  83. name="event_value",
  84. ),
  85. ),
  86. # Test case 4: switch order of segments in list, with respect to test case 3
  87. (
  88. pd.date_range("2023-01-01", "2023-01-05", freq="1h", inclusive="left"),
  89. [
  90. {
  91. "value": ur.Quantity(2, "m"),
  92. "start": pd.Timestamp("2023-01-03"),
  93. "end": pd.Timestamp("2023-01-05"),
  94. },
  95. {
  96. "value": ur.Quantity(1, "m"),
  97. "start": pd.Timestamp("2023-01-01"),
  98. "end": pd.Timestamp("2023-01-04"),
  99. },
  100. ],
  101. "km",
  102. pd.Timedelta("1h"),
  103. "first",
  104. pd.Series(
  105. [0.001] * 24 * 2 + [0.002] * 24 * 2,
  106. index=pd.date_range(
  107. "2023-01-01", "2023-01-05", freq="1h", inclusive="left"
  108. ),
  109. name="event_value",
  110. ),
  111. ),
  112. ],
  113. )
  114. def test_process_time_series_segments(
  115. index, variable_quantity, unit, resolution, resolve_overlaps, expected
  116. ):
  117. result = process_time_series_segments(
  118. index, variable_quantity, unit, resolution, resolve_overlaps
  119. )
  120. pd.testing.assert_series_equal(result, expected, check_dtype=False)