diff --git a/.gitignore b/.gitignore
index 60f82c6..7fb1547 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,7 +4,7 @@ octave-workspace
# Local
tests/results/*.xlsx
tests/results/**/*.xlsx
-
+data/*.xlsx
# Playground
playground.ipynb
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 841ea7e..b6554db 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -30,7 +30,6 @@ Optionally, if you want to test matlab compatibility, you can install `matlabeng
uv pip install matlabengine
```
-
## Install in development mode
```shell
diff --git a/data/case9_reduced.m b/data/case9_reduced.m
new file mode 100644
index 0000000..44bb5e1
--- /dev/null
+++ b/data/case9_reduced.m
@@ -0,0 +1,41 @@
+function mpc = case9_reduced
+%CASE9_REDUCED 6-bus reduced of power flow data from 9 bus, 3 generator case.
+% Derived from the standard CASE9 test case data from Joe H. Chow's book, p. 70.
+% by removing the three branch without BR_R and move the generator.
+%
+% Original Bus 1 (Gen 1) merged into Bus 4 (slack)
+% Original Bus 2 (Gen 2) merged into Bus 8 (PV)
+% Original Bus 3 (Gen 3) merged into Bus 6 (PV)
+
+mpc.version = '2';
+mpc.baseMVA = 100;
+
+%% bus data
+% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin
+mpc.bus = [
+ 4 3 0 0 0 0 1 1.040000 -2.216788 345 1 1.1 0.9;
+ 5 1 90 30 0 0 1 1.019544 -3.599309 345 1 1.1 0.9;
+ 6 2 0 0 0 0 1 1.025000 2.208471 345 1 1.1 0.9;
+ 7 1 100 35 0 0 1 1.012276 0.912347 345 1 1.1 0.9;
+ 8 2 0 0 0 0 1 1.025000 3.885641 345 1 1.1 0.9;
+ 9 1 125 50 0 0 1 1.005122 -3.900271 345 1 1.1 0.9;
+];
+
+%% generator data
+% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin
+mpc.gen = [
+ 4 71.730424 38.076988 300 -300 1.040 100 1 250 10;
+ 8 163.000000 -11.552844 300 -300 1.025 100 1 300 10;
+ 6 85.000000 -26.910102 300 -300 1.025 100 1 270 10;
+];
+
+%% branch data
+% fbus tbus r x b rateA rateB rateC tap shift status angmin angmax
+mpc.branch = [
+ 4 5 0.0170 0.0920 0.158 250 250 250 0 0 1 -360 360;
+ 5 6 0.0390 0.1700 0.358 150 150 150 0 0 1 -360 360;
+ 6 7 0.0119 0.1008 0.209 150 150 150 0 0 1 -360 360;
+ 7 8 0.0085 0.0720 0.149 250 250 250 0 0 1 -360 360;
+ 8 9 0.0320 0.1610 0.306 250 250 250 0 0 1 -360 360;
+ 9 4 0.0100 0.0850 0.176 250 250 250 0 0 1 -360 360;
+];
diff --git a/matpowercaseframes/core.py b/matpowercaseframes/core.py
index 336629c..edf4c9f 100644
--- a/matpowercaseframes/core.py
+++ b/matpowercaseframes/core.py
@@ -1023,15 +1023,48 @@ def _get_dataframe(self, attribute, data, n_cols=None, columns_template=None):
def _update_index(self, allow_any_keys=False):
"""
- Update the index of the bus, branch, and generator tables based on naming.
+ Update the index of the bus, branch, generator, etc tables based on naming.
+ For buses, prefer:
+ 1) bus_name (if available)
+ 2) BUS_I column (if available)
+ 3) a 1-based RangeIndex fallback
Args:
allow_any_keys (bool):
Whether to update index for any keys beyond standard attributes.
"""
+
for attribute, attribute_name in zip(["bus", "branch", "gen"], ATTRIBUTES_NAME):
attribute_data = getattr(self, attribute)
+
+ if attribute == "bus":
+ try:
+ attribute_name_data = getattr(self, attribute_name) # bus_name
+ attribute_data.set_index(
+ attribute_name_data, drop=False, inplace=True
+ )
+ continue
+ except AttributeError:
+ pass
+
+ if (
+ isinstance(attribute_data, pd.DataFrame)
+ and "BUS_I" in attribute_data.columns
+ ):
+ attribute_data.set_index(
+ attribute_data["BUS_I"].astype(int), drop=False, inplace=True
+ )
+ attribute_data.index.name = "bus"
+ continue
+
+ attribute_data.set_index(
+ pd.RangeIndex(1, len(attribute_data.index) + 1, name="bus"),
+ drop=False,
+ inplace=True,
+ )
+ continue
+
try:
attribute_name_data = getattr(self, attribute_name)
attribute_data.set_index(attribute_name_data, drop=False, inplace=True)
diff --git a/notebooks/from_extract_islands.ipynb b/notebooks/from_extract_islands.ipynb
new file mode 100644
index 0000000..6750cff
--- /dev/null
+++ b/notebooks/from_extract_islands.ipynb
@@ -0,0 +1,1600 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "63b62eba",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%load_ext autoreload\n",
+ "%autoreload 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bc1b26ff",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "\n",
+ "from matpower import path_matpower, start_instance\n",
+ "\n",
+ "from matpowercaseframes import CaseFrames"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "277fe1e3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "path = os.path.join(path_matpower, \"data/case9.m\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2ac3ec42",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "m = start_instance()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a6c06b62",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " F_BUS | \n",
+ " T_BUS | \n",
+ " BR_R | \n",
+ " BR_X | \n",
+ " BR_B | \n",
+ " RATE_A | \n",
+ " RATE_B | \n",
+ " RATE_C | \n",
+ " TAP | \n",
+ " SHIFT | \n",
+ " BR_STATUS | \n",
+ " ANGMIN | \n",
+ " ANGMAX | \n",
+ " PF | \n",
+ " QF | \n",
+ " PT | \n",
+ " QT | \n",
+ "
\n",
+ " \n",
+ " | branch | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ " 0.0000 | \n",
+ " 0.0576 | \n",
+ " 0.000 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 71.641021 | \n",
+ " 27.045924 | \n",
+ " -71.641021 | \n",
+ " -23.923127 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 4 | \n",
+ " 5 | \n",
+ " 0.0170 | \n",
+ " 0.0920 | \n",
+ " 0.158 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 30.703670 | \n",
+ " 1.030006 | \n",
+ " -30.537263 | \n",
+ " -16.543365 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 5 | \n",
+ " 6 | \n",
+ " 0.0390 | \n",
+ " 0.1700 | \n",
+ " 0.358 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -59.462737 | \n",
+ " -13.456635 | \n",
+ " 60.816586 | \n",
+ " -18.074836 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 3 | \n",
+ " 6 | \n",
+ " 0.0000 | \n",
+ " 0.0586 | \n",
+ " 0.000 | \n",
+ " 300 | \n",
+ " 300 | \n",
+ " 300 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 85.000000 | \n",
+ " -10.859709 | \n",
+ " -85.000000 | \n",
+ " 14.955327 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 6 | \n",
+ " 7 | \n",
+ " 0.0119 | \n",
+ " 0.1008 | \n",
+ " 0.209 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 24.183414 | \n",
+ " 3.119508 | \n",
+ " -24.095417 | \n",
+ " -24.295823 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 7 | \n",
+ " 8 | \n",
+ " 0.0085 | \n",
+ " 0.0720 | \n",
+ " 0.149 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -75.904583 | \n",
+ " -10.704177 | \n",
+ " 76.379866 | \n",
+ " -0.797331 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 8 | \n",
+ " 2 | \n",
+ " 0.0000 | \n",
+ " 0.0625 | \n",
+ " 0.000 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -163.000000 | \n",
+ " 9.178149 | \n",
+ " 163.000000 | \n",
+ " 6.653660 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 8 | \n",
+ " 9 | \n",
+ " 0.0320 | \n",
+ " 0.1610 | \n",
+ " 0.306 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 86.620134 | \n",
+ " -8.380817 | \n",
+ " -84.320163 | \n",
+ " -11.312751 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 9 | \n",
+ " 4 | \n",
+ " 0.0100 | \n",
+ " 0.0850 | \n",
+ " 0.176 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -40.679837 | \n",
+ " -38.687249 | \n",
+ " 40.937352 | \n",
+ " 22.893121 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " F_BUS T_BUS BR_R BR_X BR_B RATE_A RATE_B RATE_C TAP \\\n",
+ "branch \n",
+ "1 1 4 0.0000 0.0576 0.000 250 250 250 0 \n",
+ "2 4 5 0.0170 0.0920 0.158 250 250 250 0 \n",
+ "3 5 6 0.0390 0.1700 0.358 150 150 150 0 \n",
+ "4 3 6 0.0000 0.0586 0.000 300 300 300 0 \n",
+ "5 6 7 0.0119 0.1008 0.209 150 150 150 0 \n",
+ "6 7 8 0.0085 0.0720 0.149 250 250 250 0 \n",
+ "7 8 2 0.0000 0.0625 0.000 250 250 250 0 \n",
+ "8 8 9 0.0320 0.1610 0.306 250 250 250 0 \n",
+ "9 9 4 0.0100 0.0850 0.176 250 250 250 0 \n",
+ "\n",
+ " SHIFT BR_STATUS ANGMIN ANGMAX PF QF PT \\\n",
+ "branch \n",
+ "1 0 1 -360 360 71.641021 27.045924 -71.641021 \n",
+ "2 0 1 -360 360 30.703670 1.030006 -30.537263 \n",
+ "3 0 1 -360 360 -59.462737 -13.456635 60.816586 \n",
+ "4 0 1 -360 360 85.000000 -10.859709 -85.000000 \n",
+ "5 0 1 -360 360 24.183414 3.119508 -24.095417 \n",
+ "6 0 1 -360 360 -75.904583 -10.704177 76.379866 \n",
+ "7 0 1 -360 360 -163.000000 9.178149 163.000000 \n",
+ "8 0 1 -360 360 86.620134 -8.380817 -84.320163 \n",
+ "9 0 1 -360 360 -40.679837 -38.687249 40.937352 \n",
+ "\n",
+ " QT \n",
+ "branch \n",
+ "1 -23.923127 \n",
+ "2 -16.543365 \n",
+ "3 -18.074836 \n",
+ "4 14.955327 \n",
+ "5 -24.295823 \n",
+ "6 -0.797331 \n",
+ "7 6.653660 \n",
+ "8 -11.312751 \n",
+ "9 22.893121 "
+ ]
+ },
+ "execution_count": null,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cf = CaseFrames(path, load_case_engine=m)\n",
+ "\n",
+ "mpc = m.runpf(cf.to_mpc(), verbose=False)\n",
+ "cf = CaseFrames(mpc)\n",
+ "cf.infer_numpy()\n",
+ "cf.branch"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fa4362cd",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " F_BUS | \n",
+ " T_BUS | \n",
+ " BR_R | \n",
+ " BR_X | \n",
+ " BR_B | \n",
+ " RATE_A | \n",
+ " RATE_B | \n",
+ " RATE_C | \n",
+ " TAP | \n",
+ " SHIFT | \n",
+ " BR_STATUS | \n",
+ " ANGMIN | \n",
+ " ANGMAX | \n",
+ " PF | \n",
+ " QF | \n",
+ " PT | \n",
+ " QT | \n",
+ "
\n",
+ " \n",
+ " | branch | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ " 0.0000 | \n",
+ " 0.0576 | \n",
+ " 0.000 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 71.641021 | \n",
+ " 27.045924 | \n",
+ " -71.641021 | \n",
+ " -23.923127 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 4 | \n",
+ " 5 | \n",
+ " 0.0170 | \n",
+ " 0.0920 | \n",
+ " 0.158 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 30.703670 | \n",
+ " 1.030006 | \n",
+ " -30.537263 | \n",
+ " -16.543365 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 5 | \n",
+ " 6 | \n",
+ " 0.0390 | \n",
+ " 0.1700 | \n",
+ " 0.358 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -59.462737 | \n",
+ " -13.456635 | \n",
+ " 60.816586 | \n",
+ " -18.074836 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 3 | \n",
+ " 6 | \n",
+ " 0.0000 | \n",
+ " 0.0586 | \n",
+ " 0.000 | \n",
+ " 300 | \n",
+ " 300 | \n",
+ " 300 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 85.000000 | \n",
+ " -10.859709 | \n",
+ " -85.000000 | \n",
+ " 14.955327 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 6 | \n",
+ " 7 | \n",
+ " 0.0119 | \n",
+ " 0.1008 | \n",
+ " 0.209 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 24.183414 | \n",
+ " 3.119508 | \n",
+ " -24.095417 | \n",
+ " -24.295823 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 7 | \n",
+ " 8 | \n",
+ " 0.0085 | \n",
+ " 0.0720 | \n",
+ " 0.149 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -75.904583 | \n",
+ " -10.704177 | \n",
+ " 76.379866 | \n",
+ " -0.797331 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 8 | \n",
+ " 2 | \n",
+ " 0.0000 | \n",
+ " 0.0625 | \n",
+ " 0.000 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -163.000000 | \n",
+ " 9.178149 | \n",
+ " 163.000000 | \n",
+ " 6.653660 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 8 | \n",
+ " 9 | \n",
+ " 0.0320 | \n",
+ " 0.1610 | \n",
+ " 0.306 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 86.620134 | \n",
+ " -8.380817 | \n",
+ " -84.320163 | \n",
+ " -11.312751 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 9 | \n",
+ " 4 | \n",
+ " 0.0100 | \n",
+ " 0.0850 | \n",
+ " 0.176 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -40.679837 | \n",
+ " -38.687249 | \n",
+ " 40.937352 | \n",
+ " 22.893121 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " F_BUS T_BUS BR_R BR_X BR_B RATE_A RATE_B RATE_C TAP \\\n",
+ "branch \n",
+ "1 1 4 0.0000 0.0576 0.000 250 250 250 0 \n",
+ "2 4 5 0.0170 0.0920 0.158 250 250 250 0 \n",
+ "3 5 6 0.0390 0.1700 0.358 150 150 150 0 \n",
+ "4 3 6 0.0000 0.0586 0.000 300 300 300 0 \n",
+ "5 6 7 0.0119 0.1008 0.209 150 150 150 0 \n",
+ "6 7 8 0.0085 0.0720 0.149 250 250 250 0 \n",
+ "7 8 2 0.0000 0.0625 0.000 250 250 250 0 \n",
+ "8 8 9 0.0320 0.1610 0.306 250 250 250 0 \n",
+ "9 9 4 0.0100 0.0850 0.176 250 250 250 0 \n",
+ "\n",
+ " SHIFT BR_STATUS ANGMIN ANGMAX PF QF PT \\\n",
+ "branch \n",
+ "1 0 1 -360 360 71.641021 27.045924 -71.641021 \n",
+ "2 0 1 -360 360 30.703670 1.030006 -30.537263 \n",
+ "3 0 0 -360 360 -59.462737 -13.456635 60.816586 \n",
+ "4 0 1 -360 360 85.000000 -10.859709 -85.000000 \n",
+ "5 0 1 -360 360 24.183414 3.119508 -24.095417 \n",
+ "6 0 1 -360 360 -75.904583 -10.704177 76.379866 \n",
+ "7 0 1 -360 360 -163.000000 9.178149 163.000000 \n",
+ "8 0 0 -360 360 86.620134 -8.380817 -84.320163 \n",
+ "9 0 1 -360 360 -40.679837 -38.687249 40.937352 \n",
+ "\n",
+ " QT \n",
+ "branch \n",
+ "1 -23.923127 \n",
+ "2 -16.543365 \n",
+ "3 -18.074836 \n",
+ "4 14.955327 \n",
+ "5 -24.295823 \n",
+ "6 -0.797331 \n",
+ "7 6.653660 \n",
+ "8 -11.312751 \n",
+ "9 22.893121 "
+ ]
+ },
+ "execution_count": null,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cf.branch.loc[[3, 8], \"BR_STATUS\"] = 0\n",
+ "cf.branch"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b1cb7954",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(Cell([[array([[2., 3., 6., 7., 8.]]), array([[1., 4., 5., 9.]])]],\n",
+ " dtype=object),\n",
+ " array([], shape=(1, 0), dtype=float64))"
+ ]
+ },
+ "execution_count": null,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "[groups, isolated] = m.find_islands(cf.to_mpc(), nout=2)\n",
+ "groups, isolated"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6fad4a6a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " F_BUS | \n",
+ " T_BUS | \n",
+ " BR_R | \n",
+ " BR_X | \n",
+ " BR_B | \n",
+ " RATE_A | \n",
+ " RATE_B | \n",
+ " RATE_C | \n",
+ " TAP | \n",
+ " SHIFT | \n",
+ " BR_STATUS | \n",
+ " ANGMIN | \n",
+ " ANGMAX | \n",
+ " PF | \n",
+ " QF | \n",
+ " PT | \n",
+ " QT | \n",
+ "
\n",
+ " \n",
+ " | branch | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 3 | \n",
+ " 6 | \n",
+ " 0.0000 | \n",
+ " 0.0586 | \n",
+ " 0.000 | \n",
+ " 300 | \n",
+ " 300 | \n",
+ " 300 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 85.000000 | \n",
+ " -10.859709 | \n",
+ " -85.000000 | \n",
+ " 14.955327 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 6 | \n",
+ " 7 | \n",
+ " 0.0119 | \n",
+ " 0.1008 | \n",
+ " 0.209 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 24.183414 | \n",
+ " 3.119508 | \n",
+ " -24.095417 | \n",
+ " -24.295823 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 7 | \n",
+ " 8 | \n",
+ " 0.0085 | \n",
+ " 0.0720 | \n",
+ " 0.149 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -75.904583 | \n",
+ " -10.704177 | \n",
+ " 76.379866 | \n",
+ " -0.797331 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 8 | \n",
+ " 2 | \n",
+ " 0.0000 | \n",
+ " 0.0625 | \n",
+ " 0.000 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -163.000000 | \n",
+ " 9.178149 | \n",
+ " 163.000000 | \n",
+ " 6.653660 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " F_BUS T_BUS BR_R BR_X BR_B RATE_A RATE_B RATE_C TAP \\\n",
+ "branch \n",
+ "1 3 6 0.0000 0.0586 0.000 300 300 300 0 \n",
+ "2 6 7 0.0119 0.1008 0.209 150 150 150 0 \n",
+ "3 7 8 0.0085 0.0720 0.149 250 250 250 0 \n",
+ "4 8 2 0.0000 0.0625 0.000 250 250 250 0 \n",
+ "\n",
+ " SHIFT BR_STATUS ANGMIN ANGMAX PF QF PT \\\n",
+ "branch \n",
+ "1 0 1 -360 360 85.000000 -10.859709 -85.000000 \n",
+ "2 0 1 -360 360 24.183414 3.119508 -24.095417 \n",
+ "3 0 1 -360 360 -75.904583 -10.704177 76.379866 \n",
+ "4 0 1 -360 360 -163.000000 9.178149 163.000000 \n",
+ "\n",
+ " QT \n",
+ "branch \n",
+ "1 14.955327 \n",
+ "2 -24.295823 \n",
+ "3 -0.797331 \n",
+ "4 6.653660 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " BUS_I | \n",
+ " BUS_TYPE | \n",
+ " PD | \n",
+ " QD | \n",
+ " GS | \n",
+ " BS | \n",
+ " BUS_AREA | \n",
+ " VM | \n",
+ " VA | \n",
+ " BASE_KV | \n",
+ " ZONE | \n",
+ " VMAX | \n",
+ " VMIN | \n",
+ "
\n",
+ " \n",
+ " | bus | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.025000 | \n",
+ " 9.280005 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.025000 | \n",
+ " 4.664751 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 6 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.032353 | \n",
+ " 1.966716 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 7 | \n",
+ " 1 | \n",
+ " 100 | \n",
+ " 35 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.015883 | \n",
+ " 0.727536 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 8 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.025769 | \n",
+ " 3.719701 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " BUS_I BUS_TYPE PD QD GS BS BUS_AREA VM VA BASE_KV \\\n",
+ "bus \n",
+ "2 2 2 0 0 0 0 1 1.025000 9.280005 345 \n",
+ "3 3 2 0 0 0 0 1 1.025000 4.664751 345 \n",
+ "6 6 1 0 0 0 0 1 1.032353 1.966716 345 \n",
+ "7 7 1 100 35 0 0 1 1.015883 0.727536 345 \n",
+ "8 8 1 0 0 0 0 1 1.025769 3.719701 345 \n",
+ "\n",
+ " ZONE VMAX VMIN \n",
+ "bus \n",
+ "2 1 1.1 0.9 \n",
+ "3 1 1.1 0.9 \n",
+ "6 1 1.1 0.9 \n",
+ "7 1 1.1 0.9 \n",
+ "8 1 1.1 0.9 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " GEN_BUS | \n",
+ " PG | \n",
+ " QG | \n",
+ " QMAX | \n",
+ " QMIN | \n",
+ " VG | \n",
+ " MBASE | \n",
+ " GEN_STATUS | \n",
+ " PMAX | \n",
+ " PMIN | \n",
+ " ... | \n",
+ " PC2 | \n",
+ " QC1MIN | \n",
+ " QC1MAX | \n",
+ " QC2MIN | \n",
+ " QC2MAX | \n",
+ " RAMP_AGC | \n",
+ " RAMP_10 | \n",
+ " RAMP_30 | \n",
+ " RAMP_Q | \n",
+ " APF | \n",
+ "
\n",
+ " \n",
+ " | gen | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 163 | \n",
+ " 6.653660 | \n",
+ " 300 | \n",
+ " -300 | \n",
+ " 1.025 | \n",
+ " 100 | \n",
+ " 1 | \n",
+ " 300 | \n",
+ " 10 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 85 | \n",
+ " -10.859709 | \n",
+ " 300 | \n",
+ " -300 | \n",
+ " 1.025 | \n",
+ " 100 | \n",
+ " 1 | \n",
+ " 270 | \n",
+ " 10 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
2 rows × 21 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " GEN_BUS PG QG QMAX QMIN VG MBASE GEN_STATUS PMAX \\\n",
+ "gen \n",
+ "1 2 163 6.653660 300 -300 1.025 100 1 300 \n",
+ "2 3 85 -10.859709 300 -300 1.025 100 1 270 \n",
+ "\n",
+ " PMIN ... PC2 QC1MIN QC1MAX QC2MIN QC2MAX RAMP_AGC RAMP_10 \\\n",
+ "gen ... \n",
+ "1 10 ... 0 0 0 0 0 0 0 \n",
+ "2 10 ... 0 0 0 0 0 0 0 \n",
+ "\n",
+ " RAMP_30 RAMP_Q APF \n",
+ "gen \n",
+ "1 0 0 0 \n",
+ "2 0 0 0 \n",
+ "\n",
+ "[2 rows x 21 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " F_BUS | \n",
+ " T_BUS | \n",
+ " BR_R | \n",
+ " BR_X | \n",
+ " BR_B | \n",
+ " RATE_A | \n",
+ " RATE_B | \n",
+ " RATE_C | \n",
+ " TAP | \n",
+ " SHIFT | \n",
+ " BR_STATUS | \n",
+ " ANGMIN | \n",
+ " ANGMAX | \n",
+ " PF | \n",
+ " QF | \n",
+ " PT | \n",
+ " QT | \n",
+ "
\n",
+ " \n",
+ " | branch | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ " 0.000 | \n",
+ " 0.0576 | \n",
+ " 0.000 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 71.641021 | \n",
+ " 27.045924 | \n",
+ " -71.641021 | \n",
+ " -23.923127 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 4 | \n",
+ " 5 | \n",
+ " 0.017 | \n",
+ " 0.0920 | \n",
+ " 0.158 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " 30.703670 | \n",
+ " 1.030006 | \n",
+ " -30.537263 | \n",
+ " -16.543365 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 9 | \n",
+ " 4 | \n",
+ " 0.010 | \n",
+ " 0.0850 | \n",
+ " 0.176 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ " -40.679837 | \n",
+ " -38.687249 | \n",
+ " 40.937352 | \n",
+ " 22.893121 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " F_BUS T_BUS BR_R BR_X BR_B RATE_A RATE_B RATE_C TAP \\\n",
+ "branch \n",
+ "1 1 4 0.000 0.0576 0.000 250 250 250 0 \n",
+ "2 4 5 0.017 0.0920 0.158 250 250 250 0 \n",
+ "3 9 4 0.010 0.0850 0.176 250 250 250 0 \n",
+ "\n",
+ " SHIFT BR_STATUS ANGMIN ANGMAX PF QF PT \\\n",
+ "branch \n",
+ "1 0 1 -360 360 71.641021 27.045924 -71.641021 \n",
+ "2 0 1 -360 360 30.703670 1.030006 -30.537263 \n",
+ "3 0 1 -360 360 -40.679837 -38.687249 40.937352 \n",
+ "\n",
+ " QT \n",
+ "branch \n",
+ "1 -23.923127 \n",
+ "2 -16.543365 \n",
+ "3 22.893121 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " BUS_I | \n",
+ " BUS_TYPE | \n",
+ " PD | \n",
+ " QD | \n",
+ " GS | \n",
+ " BS | \n",
+ " BUS_AREA | \n",
+ " VM | \n",
+ " VA | \n",
+ " BASE_KV | \n",
+ " ZONE | \n",
+ " VMAX | \n",
+ " VMIN | \n",
+ "
\n",
+ " \n",
+ " | bus | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.040000 | \n",
+ " 0.000000 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.025788 | \n",
+ " -2.216788 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 5 | \n",
+ " 1 | \n",
+ " 90 | \n",
+ " 30 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.012654 | \n",
+ " -3.687396 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 9 | \n",
+ " 1 | \n",
+ " 125 | \n",
+ " 50 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0.995631 | \n",
+ " -3.988805 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " BUS_I BUS_TYPE PD QD GS BS BUS_AREA VM VA BASE_KV \\\n",
+ "bus \n",
+ "1 1 3 0 0 0 0 1 1.040000 0.000000 345 \n",
+ "4 4 1 0 0 0 0 1 1.025788 -2.216788 345 \n",
+ "5 5 1 90 30 0 0 1 1.012654 -3.687396 345 \n",
+ "9 9 1 125 50 0 0 1 0.995631 -3.988805 345 \n",
+ "\n",
+ " ZONE VMAX VMIN \n",
+ "bus \n",
+ "1 1 1.1 0.9 \n",
+ "4 1 1.1 0.9 \n",
+ "5 1 1.1 0.9 \n",
+ "9 1 1.1 0.9 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " GEN_BUS | \n",
+ " PG | \n",
+ " QG | \n",
+ " QMAX | \n",
+ " QMIN | \n",
+ " VG | \n",
+ " MBASE | \n",
+ " GEN_STATUS | \n",
+ " PMAX | \n",
+ " PMIN | \n",
+ " ... | \n",
+ " PC2 | \n",
+ " QC1MIN | \n",
+ " QC1MAX | \n",
+ " QC2MIN | \n",
+ " QC2MAX | \n",
+ " RAMP_AGC | \n",
+ " RAMP_10 | \n",
+ " RAMP_30 | \n",
+ " RAMP_Q | \n",
+ " APF | \n",
+ "
\n",
+ " \n",
+ " | gen | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 71.641021 | \n",
+ " 27.045924 | \n",
+ " 300 | \n",
+ " -300 | \n",
+ " 1.04 | \n",
+ " 100 | \n",
+ " 1 | \n",
+ " 250 | \n",
+ " 10 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
1 rows × 21 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " GEN_BUS PG QG QMAX QMIN VG MBASE GEN_STATUS PMAX \\\n",
+ "gen \n",
+ "1 1 71.641021 27.045924 300 -300 1.04 100 1 250 \n",
+ "\n",
+ " PMIN ... PC2 QC1MIN QC1MAX QC2MIN QC2MAX RAMP_AGC RAMP_10 \\\n",
+ "gen ... \n",
+ "1 10 ... 0 0 0 0 0 0 0 \n",
+ "\n",
+ " RAMP_30 RAMP_Q APF \n",
+ "gen \n",
+ "1 0 0 0 \n",
+ "\n",
+ "[1 rows x 21 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "mpcs = m.extract_islands(cf.to_mpc(), groups)\n",
+ "\n",
+ "cfs = {}\n",
+ "for isl, mpc in enumerate(mpcs.flatten()):\n",
+ " cfs[isl] = CaseFrames(mpc)\n",
+ " cfs[isl].infer_numpy()\n",
+ " display(cfs[isl].branch)\n",
+ " display(cfs[isl].bus)\n",
+ " display(cfs[isl].gen)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3d46a433",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "env",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/load_case9_reduced.ipynb b/notebooks/load_case9_reduced.ipynb
new file mode 100644
index 0000000..ac8c319
--- /dev/null
+++ b/notebooks/load_case9_reduced.ipynb
@@ -0,0 +1,538 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2b722971",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%load_ext autoreload\n",
+ "%autoreload 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5bc6d51a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from matpowercaseframes import CaseFrames"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9a804fba",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " F_BUS | \n",
+ " T_BUS | \n",
+ " BR_R | \n",
+ " BR_X | \n",
+ " BR_B | \n",
+ " RATE_A | \n",
+ " RATE_B | \n",
+ " RATE_C | \n",
+ " TAP | \n",
+ " SHIFT | \n",
+ " BR_STATUS | \n",
+ " ANGMIN | \n",
+ " ANGMAX | \n",
+ "
\n",
+ " \n",
+ " | branch | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 4 | \n",
+ " 5 | \n",
+ " 0.0170 | \n",
+ " 0.0920 | \n",
+ " 0.158 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 5 | \n",
+ " 6 | \n",
+ " 0.0390 | \n",
+ " 0.1700 | \n",
+ " 0.358 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 6 | \n",
+ " 7 | \n",
+ " 0.0119 | \n",
+ " 0.1008 | \n",
+ " 0.209 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 150 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 7 | \n",
+ " 8 | \n",
+ " 0.0085 | \n",
+ " 0.0720 | \n",
+ " 0.149 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 8 | \n",
+ " 9 | \n",
+ " 0.0320 | \n",
+ " 0.1610 | \n",
+ " 0.306 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 9 | \n",
+ " 4 | \n",
+ " 0.0100 | \n",
+ " 0.0850 | \n",
+ " 0.176 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 250 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " -360 | \n",
+ " 360 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " F_BUS T_BUS BR_R BR_X BR_B RATE_A RATE_B RATE_C TAP \\\n",
+ "branch \n",
+ "1 4 5 0.0170 0.0920 0.158 250 250 250 0 \n",
+ "2 5 6 0.0390 0.1700 0.358 150 150 150 0 \n",
+ "3 6 7 0.0119 0.1008 0.209 150 150 150 0 \n",
+ "4 7 8 0.0085 0.0720 0.149 250 250 250 0 \n",
+ "5 8 9 0.0320 0.1610 0.306 250 250 250 0 \n",
+ "6 9 4 0.0100 0.0850 0.176 250 250 250 0 \n",
+ "\n",
+ " SHIFT BR_STATUS ANGMIN ANGMAX \n",
+ "branch \n",
+ "1 0 1 -360 360 \n",
+ "2 0 1 -360 360 \n",
+ "3 0 1 -360 360 \n",
+ "4 0 1 -360 360 \n",
+ "5 0 1 -360 360 \n",
+ "6 0 1 -360 360 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " BUS_I | \n",
+ " BUS_TYPE | \n",
+ " PD | \n",
+ " QD | \n",
+ " GS | \n",
+ " BS | \n",
+ " BUS_AREA | \n",
+ " VM | \n",
+ " VA | \n",
+ " BASE_KV | \n",
+ " ZONE | \n",
+ " VMAX | \n",
+ " VMIN | \n",
+ "
\n",
+ " \n",
+ " | bus | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 4 | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.040000 | \n",
+ " -2.216788 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 5 | \n",
+ " 1 | \n",
+ " 90 | \n",
+ " 30 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.019544 | \n",
+ " -3.599309 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 6 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.025000 | \n",
+ " 2.208471 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 7 | \n",
+ " 1 | \n",
+ " 100 | \n",
+ " 35 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.012276 | \n",
+ " 0.912347 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 8 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.025000 | \n",
+ " 3.885641 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 9 | \n",
+ " 1 | \n",
+ " 125 | \n",
+ " 50 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1.005122 | \n",
+ " -3.900271 | \n",
+ " 345 | \n",
+ " 1 | \n",
+ " 1.1 | \n",
+ " 0.9 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " BUS_I BUS_TYPE PD QD GS BS BUS_AREA VM VA BASE_KV \\\n",
+ "bus \n",
+ "4 4 3 0 0 0 0 1 1.040000 -2.216788 345 \n",
+ "5 5 1 90 30 0 0 1 1.019544 -3.599309 345 \n",
+ "6 6 2 0 0 0 0 1 1.025000 2.208471 345 \n",
+ "7 7 1 100 35 0 0 1 1.012276 0.912347 345 \n",
+ "8 8 2 0 0 0 0 1 1.025000 3.885641 345 \n",
+ "9 9 1 125 50 0 0 1 1.005122 -3.900271 345 \n",
+ "\n",
+ " ZONE VMAX VMIN \n",
+ "bus \n",
+ "4 1 1.1 0.9 \n",
+ "5 1 1.1 0.9 \n",
+ "6 1 1.1 0.9 \n",
+ "7 1 1.1 0.9 \n",
+ "8 1 1.1 0.9 \n",
+ "9 1 1.1 0.9 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " GEN_BUS | \n",
+ " PG | \n",
+ " QG | \n",
+ " QMAX | \n",
+ " QMIN | \n",
+ " VG | \n",
+ " MBASE | \n",
+ " GEN_STATUS | \n",
+ " PMAX | \n",
+ " PMIN | \n",
+ "
\n",
+ " \n",
+ " | gen | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 4 | \n",
+ " 71.730424 | \n",
+ " 38.076988 | \n",
+ " 300 | \n",
+ " -300 | \n",
+ " 1.040 | \n",
+ " 100 | \n",
+ " 1 | \n",
+ " 250 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 8 | \n",
+ " 163.000000 | \n",
+ " -11.552844 | \n",
+ " 300 | \n",
+ " -300 | \n",
+ " 1.025 | \n",
+ " 100 | \n",
+ " 1 | \n",
+ " 300 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 6 | \n",
+ " 85.000000 | \n",
+ " -26.910102 | \n",
+ " 300 | \n",
+ " -300 | \n",
+ " 1.025 | \n",
+ " 100 | \n",
+ " 1 | \n",
+ " 270 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " GEN_BUS PG QG QMAX QMIN VG MBASE GEN_STATUS \\\n",
+ "gen \n",
+ "1 4 71.730424 38.076988 300 -300 1.040 100 1 \n",
+ "2 8 163.000000 -11.552844 300 -300 1.025 100 1 \n",
+ "3 6 85.000000 -26.910102 300 -300 1.025 100 1 \n",
+ "\n",
+ " PMAX PMIN \n",
+ "gen \n",
+ "1 250 10 \n",
+ "2 300 10 \n",
+ "3 270 10 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "CASE_NAME = \"../data/case9_reduced.m\"\n",
+ "cf = CaseFrames(CASE_NAME)\n",
+ "cf.infer_numpy()\n",
+ "display(cf.branch)\n",
+ "display(cf.bus)\n",
+ "display(cf.gen)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c7bfe67c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# cf.to_excel(\"../data/case9_reduced.xlsx\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0031003f",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "env",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/tests/test_core.py b/tests/test_core.py
index e88f8c6..215e003 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -304,3 +304,21 @@ def test_reset_index_and_infer_numpy_case9():
cf_reset.reset_index()
cf_reset.reset_index()
assert_frames_struct_equal(cf, cf_reset)
+
+ # removing first row of bus and gen, converting to mpc, then back to cf:
+ # bus index is preserved (via BUS_I), but generator index is not (no named ID column)
+ cf2 = CaseFrames(CASE_PATH_CASE9)
+ cf2.bus = cf2.bus.iloc[1:] # drop first bus row, so bus.index starts at 2
+ cf2.gen = cf2.gen.iloc[1:] # drop first gen row, so gen.index starts at 2
+
+ assert cf2.bus.index[0] == 2
+ assert cf2.gen.index[0] == 2
+
+ mpc = cf2.to_mpc()
+ cf2_rt = CaseFrames(mpc)
+
+ # BUS_I is explicit so it survives the round-trip
+ assert np.array_equal(cf2_rt.bus["BUS_I"].values, cf2.bus["BUS_I"].values)
+
+ # gen has no named index column — round-trip resets to 1-based RangeIndex
+ assert cf2_rt.gen.index.tolist() == list(range(1, len(cf2_rt.gen) + 1))