Skip to content

Commit 94fd51f

Browse files
authored
Fix: Rerun Examples and Fix Minor Issues (NREL#275)
* put default value back to month start to ensure examples run correctly * fix new issue with duplicated column/index names * don't download monthly reanalysis if it already exists * fix offset string bug and update changelog * rerun examples to remove fixed warnings and ensure they work
1 parent c0485c8 commit 94fd51f

23 files changed

+808
-1485
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ All notable changes to this project will be documented in this file. If you make
1515
- L -> ms
1616
- U -> us
1717
- N -> ns
18+
- Replaced the "ME" default time basis with "MS" to maintain consistency with the examples.
19+
- Fixes a bug in the frequency validation where a monthly frequency offset is attempted to be
20+
converted into seconds. Prior to Pandas 2.0 this was supported, but "M" would return 1 minute,
21+
so OpenOA will no longer attempt to convert "ME" or "MS", which are unsupported or incorrect,
22+
respectively.
1823
- Python 3.11 is now supported.
1924
- Updates the dependency requirements to minimize the number of required packages, and have a more
2025
expansive list of modifiers. Users can now use any combination of
@@ -33,6 +38,8 @@ All notable changes to this project will be documented in this file. If you make
3338
- The turbine capacity value used for power curve filtering in `TurbineLongTermGrossEnergy` is
3439
changed to the rated power from the asset table instead of the maximum power from SCADA. This
3540
makes the power curve filtering more robust to turbine power outliers above rated power.
41+
- Fixed a minor bug in the Cubico example workflow that caused the download of reanalysis data
42+
without checking for its existence, unlike what is done with the project data.
3643

3744
## [3.0.1 - 2023-12-22]
3845

examples/00_intro_to_plant_data.ipynb

Lines changed: 58 additions & 111 deletions
Large diffs are not rendered by default.

examples/01_utils_examples.ipynb

Lines changed: 11 additions & 76 deletions
Large diffs are not rendered by default.

examples/02a_plant_aep_analysis.ipynb

Lines changed: 10 additions & 76 deletions
Large diffs are not rendered by default.

examples/02b_plant_aep_analysis_cubico.ipynb

Lines changed: 193 additions & 152 deletions
Large diffs are not rendered by default.

examples/03_turbine_ideal_energy.ipynb

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,7 @@
3737
"cell_type": "code",
3838
"execution_count": 2,
3939
"metadata": {},
40-
"outputs": [
41-
{
42-
"name": "stderr",
43-
"output_type": "stream",
44-
"text": [
45-
"WARNING:py.warnings:/Users/rhammond/GitHub_Public/OpenOA/openoa/utils/plot.py:1514: DeprecationWarning: invalid escape sequence '\\c'\n",
46-
" label=f\"Max. Power Vane Angle = {round(curve_fit_params_ws[:,i,1].mean(),1)}$^\\circ$\", # noqa: W605\n",
47-
"\n",
48-
"WARNING:py.warnings:/Users/rhammond/GitHub_Public/OpenOA/openoa/analysis/electrical_losses.py:374: DeprecationWarning: invalid escape sequence '\\m'\n",
49-
" label=f\"Electrical Losses\\n$\\mu$={mean:.2%}, $\\sigma$={std:.2%}\", # noqa: W605\n",
50-
"\n",
51-
"WARNING:py.warnings:/Users/rhammond/GitHub_Public/OpenOA/openoa/analysis/electrical_losses.py:374: DeprecationWarning: invalid escape sequence '\\s'\n",
52-
" label=f\"Electrical Losses\\n$\\mu$={mean:.2%}, $\\sigma$={std:.2%}\", # noqa: W605\n",
53-
"\n"
54-
]
55-
}
56-
],
40+
"outputs": [],
5741
"source": [
5842
"# Import required packages\n",
5943
"import numpy as np\n",
@@ -294,7 +278,7 @@
294278
"name": "stderr",
295279
"output_type": "stream",
296280
"text": [
297-
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 2/2 [00:02<00:00, 1.22s/it]\n"
281+
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 2/2 [00:02<00:00, 1.13s/it]\n"
298282
]
299283
}
300284
],
@@ -520,7 +504,7 @@
520504
"name": "stderr",
521505
"output_type": "stream",
522506
"text": [
523-
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 75/75 [02:05<00:00, 1.68s/it]\n"
507+
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 75/75 [02:04<00:00, 1.65s/it]\n"
524508
]
525509
}
526510
],
@@ -545,7 +529,7 @@
545529
{
546530
"data": {
547531
"text/plain": [
548-
"13544928.004463477"
532+
"13475324.95297888"
549533
]
550534
},
551535
"execution_count": 13,
@@ -565,7 +549,7 @@
565549
{
566550
"data": {
567551
"text/plain": [
568-
"147320.39759589723"
552+
"225706.67759221946"
569553
]
570554
},
571555
"execution_count": 14,
@@ -587,7 +571,7 @@
587571
"output_type": "stream",
588572
"text": [
589573
"Mean long-term turbine ideal energy is 13.5 GWh/year\n",
590-
"Uncertainty in long-term turbine ideal energy is 0.1 GWh/year, or 1.1% percent\n"
574+
"Uncertainty in long-term turbine ideal energy is 0.2 GWh/year, or 1.7% percent\n"
591575
]
592576
}
593577
],

examples/04_electrical_losses.ipynb

Lines changed: 6 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,7 @@
4646
"cell_type": "code",
4747
"execution_count": 2,
4848
"metadata": {},
49-
"outputs": [
50-
{
51-
"name": "stderr",
52-
"output_type": "stream",
53-
"text": [
54-
"/var/folders/q5/tfpytqxn0r396dfg7rk5sj8rwq9tvv/T/ipykernel_77703/3508303544.py:5: DeprecationWarning: \n",
55-
"Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0),\n",
56-
"(to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries)\n",
57-
"but was not found to be installed on your system.\n",
58-
"If this would cause problems for you,\n",
59-
"please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466\n",
60-
" \n",
61-
" import pandas as pd\n"
62-
]
63-
}
64-
],
49+
"outputs": [],
6550
"source": [
6651
"# Import required packages\n",
6752
"from datetime import datetime\n",
@@ -85,58 +70,7 @@
8570
"cell_type": "code",
8671
"execution_count": 3,
8772
"metadata": {},
88-
"outputs": [
89-
{
90-
"name": "stderr",
91-
"output_type": "stream",
92-
"text": [
93-
"/Users/rhammond/GitHub_Public/OpenOA/examples/project_ENGIE.py:106: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!\n",
94-
"You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.\n",
95-
"A typical example is when you are setting values in a column of a DataFrame, like:\n",
96-
"\n",
97-
"df[\"col\"][row_indexer] = value\n",
98-
"\n",
99-
"Use `df.loc[row_indexer, \"col\"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.\n",
100-
"\n",
101-
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
102-
"\n",
103-
" scada_df.loc[ix_turbine, \"Ot_avg\"].loc[ix_flag.values.flatten()] = np.nan\n",
104-
"/Users/rhammond/GitHub_Public/OpenOA/examples/project_ENGIE.py:106: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!\n",
105-
"You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.\n",
106-
"A typical example is when you are setting values in a column of a DataFrame, like:\n",
107-
"\n",
108-
"df[\"col\"][row_indexer] = value\n",
109-
"\n",
110-
"Use `df.loc[row_indexer, \"col\"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.\n",
111-
"\n",
112-
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
113-
"\n",
114-
" scada_df.loc[ix_turbine, \"Ot_avg\"].loc[ix_flag.values.flatten()] = np.nan\n",
115-
"/Users/rhammond/GitHub_Public/OpenOA/examples/project_ENGIE.py:106: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!\n",
116-
"You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.\n",
117-
"A typical example is when you are setting values in a column of a DataFrame, like:\n",
118-
"\n",
119-
"df[\"col\"][row_indexer] = value\n",
120-
"\n",
121-
"Use `df.loc[row_indexer, \"col\"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.\n",
122-
"\n",
123-
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
124-
"\n",
125-
" scada_df.loc[ix_turbine, \"Ot_avg\"].loc[ix_flag.values.flatten()] = np.nan\n",
126-
"/Users/rhammond/GitHub_Public/OpenOA/examples/project_ENGIE.py:106: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!\n",
127-
"You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.\n",
128-
"A typical example is when you are setting values in a column of a DataFrame, like:\n",
129-
"\n",
130-
"df[\"col\"][row_indexer] = value\n",
131-
"\n",
132-
"Use `df.loc[row_indexer, \"col\"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.\n",
133-
"\n",
134-
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
135-
"\n",
136-
" scada_df.loc[ix_turbine, \"Ot_avg\"].loc[ix_flag.values.flatten()] = np.nan\n"
137-
]
138-
}
139-
],
73+
"outputs": [],
14074
"source": [
14175
"# Load wind farm object, append the analysis type for this example, and revalidate the data\n",
14276
"project = project_ENGIE.prepare('./data/la_haute_borne', use_cleansed=False)\n",
@@ -176,7 +110,7 @@
176110
"name": "stderr",
177111
"output_type": "stream",
178112
"text": [
179-
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 1/1 [00:00<00:00, 365.39it/s]\n"
113+
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 1/1 [00:00<00:00, 372.60it/s]\n"
180114
]
181115
}
182116
],
@@ -301,7 +235,7 @@
301235
"name": "stderr",
302236
"output_type": "stream",
303237
"text": [
304-
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 3000/3000 [00:01<00:00, 1762.28it/s]\n"
238+
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 3000/3000 [00:01<00:00, 1958.02it/s]\n"
305239
]
306240
}
307241
],
@@ -326,7 +260,7 @@
326260
"name": "stdout",
327261
"output_type": "stream",
328262
"text": [
329-
"Electrical losses are 2.01%\n",
263+
"Electrical losses are 1.99%\n",
330264
"Uncertainty in the electrical loss estimate is 0.69%\n"
331265
]
332266
}
@@ -361,7 +295,7 @@
361295
"name": "python",
362296
"nbconvert_exporter": "python",
363297
"pygments_lexer": "ipython3",
364-
"version": "3.9.18"
298+
"version": "3.11.7"
365299
},
366300
"toc": {
367301
"base_numbering": 1,

0 commit comments

Comments
 (0)