test_time_series_services.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import pandas as pd
  2. from timely_beliefs import utils as tb_utils
  3. from flexmeasures.data.utils import save_to_db
  4. from flexmeasures.data.models.data_sources import DataSource
  5. from flexmeasures.tests.utils import get_test_sensor
  6. def test_drop_unchanged_beliefs(setup_beliefs, db):
  7. """Trying to save beliefs that are already in the database shouldn't raise an error.
  8. Even after updating the belief time, we expect to persist only the older belief time.
  9. """
  10. # Set a reference for the number of beliefs stored and their belief times
  11. sensor = get_test_sensor(db)
  12. bdf = sensor.search_beliefs(most_recent_beliefs_only=False)
  13. num_beliefs_before = len(bdf)
  14. belief_times_before = bdf.belief_times
  15. # See what happens when storing all existing beliefs verbatim
  16. save_to_db(bdf)
  17. # Verify that no new beliefs were saved
  18. bdf = sensor.search_beliefs(most_recent_beliefs_only=False)
  19. assert len(bdf) == num_beliefs_before
  20. # See what happens when storing all beliefs with their belief time updated
  21. bdf = tb_utils.replace_multi_index_level(
  22. bdf, "belief_time", bdf.belief_times + pd.Timedelta("1h")
  23. )
  24. save_to_db(bdf)
  25. # Verify that no new beliefs were saved
  26. bdf = sensor.search_beliefs(most_recent_beliefs_only=False)
  27. assert len(bdf) == num_beliefs_before
  28. assert list(bdf.belief_times) == list(belief_times_before)
  29. def test_do_not_drop_beliefs_copied_by_another_source(setup_beliefs, db):
  30. """Trying to copy beliefs from one source to another should double the number of beliefs."""
  31. # Set a reference for the number of beliefs stored
  32. sensor = get_test_sensor(db)
  33. bdf = sensor.search_beliefs(most_recent_beliefs_only=False)
  34. num_beliefs_before = len(bdf)
  35. # See what happens when storing all belief with their source updated
  36. new_source = DataSource(name="Not Seita", type="demo script")
  37. bdf = tb_utils.replace_multi_index_level(
  38. bdf, "source", pd.Index([new_source] * num_beliefs_before)
  39. )
  40. save_to_db(bdf)
  41. # Verify that all the new beliefs were added
  42. bdf = sensor.search_beliefs(most_recent_beliefs_only=False)
  43. num_beliefs_after = len(bdf)
  44. assert num_beliefs_after == 2 * num_beliefs_before
  45. def test_do_not_drop_changed_probabilistic_belief(setup_beliefs, db):
  46. """Trying to save a changed probabilistic belief should result in saving the whole belief.
  47. For example, given a belief that defines both cp=0.2 and cp=0.5,
  48. if that belief becomes more certain (e.g. cp=0.3 and cp=0.5),
  49. we expect to see the full new belief stored, rather than just the cp=0.3 value.
  50. """
  51. # Set a reference for the number of beliefs stored
  52. sensor = get_test_sensor(db)
  53. bdf = sensor.search_beliefs(source="ENTSO-E", most_recent_beliefs_only=False)
  54. num_beliefs_before = len(bdf)
  55. # See what happens when storing a belief with more certainty one hour later
  56. old_belief = bdf.loc[
  57. (
  58. bdf.index.get_level_values("event_start")
  59. == pd.Timestamp("2021-03-28 16:00:00+00:00")
  60. )
  61. & (
  62. bdf.index.get_level_values("belief_time")
  63. == pd.Timestamp("2021-03-27 9:00:00+00:00")
  64. )
  65. ]
  66. new_belief = tb_utils.replace_multi_index_level(
  67. old_belief, "cumulative_probability", pd.Index([0.3, 0.5])
  68. )
  69. new_belief = tb_utils.replace_multi_index_level(
  70. new_belief, "belief_time", new_belief.belief_times + pd.Timedelta("1h")
  71. )
  72. save_to_db(new_belief)
  73. # Verify that the whole probabilistic belief was added
  74. bdf = sensor.search_beliefs(source="ENTSO-E", most_recent_beliefs_only=False)
  75. num_beliefs_after = len(bdf)
  76. assert num_beliefs_after == num_beliefs_before + len(new_belief)