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
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-05 14:27 +0000
1import numpy as np
2import datetime as dt
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.
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
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}
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.
63 Returns:
64 float: spot price
66 Example:
68 .. highlight:: python
69 .. code-block:: python
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
91 if timestamp.weekday() >= 5:
92 spot_price -= weekend_price_level
94 if timestamp.month in {1, 2, 3, 10, 11, 12}:
95 spot_price += winter_price_level
97 spot_price += np.random.normal(loc=epsilon_mean, scale=np.sqrt(epsilon_var))
98 return spot_price