Coverage for rivapy/sample_data/dummy_power_spot_price.py: 100%

16 statements  

« prev     ^ index     » next       coverage.py v7.8.2, created at 2025-06-05 14:27 +0000

1import numpy as np 

2import datetime as dt 

3 

4 

5def spot_price_model( 

6 timestamp: dt.datetime, 

7 spot_price_level: float, 

8 peak_price_level: float, 

9 solar_price_level: float, 

10 weekend_price_level: float, 

11 winter_price_level: float, 

12 epsilon_mean: float = 0, 

13 epsilon_var: float = 1, 

14 seed: int = 42, 

15) -> float: 

16 """Dummy power spot price model. 

17 

18 .. math:: 

19 S(t) = S_0 + 

20 \\begin{cases} 

21 0, & 0 \leq h(t) < 8 \n 

22 P_p, & 8 \leq h(t) < 11 \n 

23 -P_{pv}, & 11 \leq h(t) < 16 \n 

24 P_p, & 16 \leq h(t) \leq 20 \n 

25 0, & 20 < h(t) \leq 23 

26 \\end{cases} 

27 + 

28 \\begin{cases} 

29 0, & 1\leq d(t) \leq 5 \n 

30 -P_{we}, & 6\leq d(t) \leq 7 

31 \\end{cases} 

32 + 

33 \\begin{cases} 

34 0, & m(t) \in \\{4,5,6,7,8,9\\} \n 

35 P_{W}, & m(t) \in \\{1,2,3,10,11,12\\} 

36 \\end{cases} 

37 + \\varepsilon 

38 

39 .. math:: 

40 \\begin{aligned} 

41 S_0 &\quad \\text{Spot price level} \n 

42 P_p &\quad \\text{Peak price level} \n 

43 P_{pv} &\quad \\text{Price level with regard to solar power} \n 

44 P_{we} &\quad \\text{Price level for weekends} \n 

45 P_W &\quad \\text{Price level for winter} \n 

46 h(t) &\quad \\text{Hour of the time step } t \n 

47 d(t) &\quad \\text{Weekday of the time step } t \n 

48 m(t) &\quad \\text{Month of the time step } t \n 

49 \\varepsilon &\sim \\mathcal{N}(\\mu, \\sigma^2) 

50 \\end{aligned} 

51 

52 Args: 

53 timestamp (dt.datetime): Time stamp 

54 spot_price_level (float): Spot price level 

55 peak_price_level (float): Peak price level 

56 solar_price_level (float): Price level with regard to solar power 

57 weekend_price_level (float): Price level for weekends 

58 winter_price_level (float): Price level for winter 

59 epsilon_mean (float, optional): Additional additive noise mean. Defaults to 0. 

60 epsilon_var (float, optional): Additional additive noise standard deviation. Defaults to 1. 

61 seed (int, optional): Random seed. Defaults to 42. 

62 

63 Returns: 

64 float: spot price 

65 

66 Example: 

67 

68 .. highlight:: python 

69 .. code-block:: python 

70 

71 parameter_dict = { 

72 'spot_price_level': 100, 

73 'peak_price_level': 10, 

74 'solar_price_level': 8, 

75 'weekend_price_level': 10, 

76 'winter_price_level': 20, 

77 'epsilon_mean': 0, 

78 'epsilon_var': 5 

79 } 

80 date_range = pd.date_range(start='1/1/2023', end='1/1/2025', freq='h', inclusive='left') 

81 spot_prices = list(map(lambda x: spot_price_model(x, **parameter_dict), date_range)) 

82 """ 

83 if seed is not None: 

84 np.random.seed(seed) 

85 spot_price = spot_price_level 

86 if (timestamp.hour >= 8 and timestamp.hour < 11) or (timestamp.hour >= 16 and timestamp.hour <= 20): 

87 spot_price += peak_price_level 

88 elif timestamp.hour >= 11 and timestamp.hour < 16: 

89 spot_price -= solar_price_level 

90 

91 if timestamp.weekday() >= 5: 

92 spot_price -= weekend_price_level 

93 

94 if timestamp.month in {1, 2, 3, 10, 11, 12}: 

95 spot_price += winter_price_level 

96 

97 spot_price += np.random.normal(loc=epsilon_mean, scale=np.sqrt(epsilon_var)) 

98 return spot_price