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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
F_BUST_BUSBR_RBR_XBR_BRATE_ARATE_BRATE_CTAPSHIFTBR_STATUSANGMINANGMAXPFQFPTQT
branch
1140.00000.05760.000250250250001-36036071.64102127.045924-71.641021-23.923127
2450.01700.09200.158250250250001-36036030.7036701.030006-30.537263-16.543365
3560.03900.17000.358150150150001-360360-59.462737-13.45663560.816586-18.074836
4360.00000.05860.000300300300001-36036085.000000-10.859709-85.00000014.955327
5670.01190.10080.209150150150001-36036024.1834143.119508-24.095417-24.295823
6780.00850.07200.149250250250001-360360-75.904583-10.70417776.379866-0.797331
7820.00000.06250.000250250250001-360360-163.0000009.178149163.0000006.653660
8890.03200.16100.306250250250001-36036086.620134-8.380817-84.320163-11.312751
9940.01000.08500.176250250250001-360360-40.679837-38.68724940.93735222.893121
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
F_BUST_BUSBR_RBR_XBR_BRATE_ARATE_BRATE_CTAPSHIFTBR_STATUSANGMINANGMAXPFQFPTQT
branch
1140.00000.05760.000250250250001-36036071.64102127.045924-71.641021-23.923127
2450.01700.09200.158250250250001-36036030.7036701.030006-30.537263-16.543365
3560.03900.17000.358150150150000-360360-59.462737-13.45663560.816586-18.074836
4360.00000.05860.000300300300001-36036085.000000-10.859709-85.00000014.955327
5670.01190.10080.209150150150001-36036024.1834143.119508-24.095417-24.295823
6780.00850.07200.149250250250001-360360-75.904583-10.70417776.379866-0.797331
7820.00000.06250.000250250250001-360360-163.0000009.178149163.0000006.653660
8890.03200.16100.306250250250000-36036086.620134-8.380817-84.320163-11.312751
9940.01000.08500.176250250250001-360360-40.679837-38.68724940.93735222.893121
\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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
F_BUST_BUSBR_RBR_XBR_BRATE_ARATE_BRATE_CTAPSHIFTBR_STATUSANGMINANGMAXPFQFPTQT
branch
1360.00000.05860.000300300300001-36036085.000000-10.859709-85.00000014.955327
2670.01190.10080.209150150150001-36036024.1834143.119508-24.095417-24.295823
3780.00850.07200.149250250250001-360360-75.904583-10.70417776.379866-0.797331
4820.00000.06250.000250250250001-360360-163.0000009.178149163.0000006.653660
\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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
BUS_IBUS_TYPEPDQDGSBSBUS_AREAVMVABASE_KVZONEVMAXVMIN
bus
222000011.0250009.28000534511.10.9
332000011.0250004.66475134511.10.9
661000011.0323531.96671634511.10.9
771100350011.0158830.72753634511.10.9
881000011.0257693.71970134511.10.9
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GEN_BUSPGQGQMAXQMINVGMBASEGEN_STATUSPMAXPMIN...PC2QC1MINQC1MAXQC2MINQC2MAXRAMP_AGCRAMP_10RAMP_30RAMP_QAPF
gen
121636.653660300-3001.025100130010...0000000000
2385-10.859709300-3001.025100127010...0000000000
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
F_BUST_BUSBR_RBR_XBR_BRATE_ARATE_BRATE_CTAPSHIFTBR_STATUSANGMINANGMAXPFQFPTQT
branch
1140.0000.05760.000250250250001-36036071.64102127.045924-71.641021-23.923127
2450.0170.09200.158250250250001-36036030.7036701.030006-30.537263-16.543365
3940.0100.08500.176250250250001-360360-40.679837-38.68724940.93735222.893121
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
BUS_IBUS_TYPEPDQDGSBSBUS_AREAVMVABASE_KVZONEVMAXVMIN
bus
113000011.0400000.00000034511.10.9
441000011.025788-2.21678834511.10.9
55190300011.012654-3.68739634511.10.9
991125500010.995631-3.98880534511.10.9
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GEN_BUSPGQGQMAXQMINVGMBASEGEN_STATUSPMAXPMIN...PC2QC1MINQC1MAXQC2MINQC2MAXRAMP_AGCRAMP_10RAMP_30RAMP_QAPF
gen
1171.64102127.045924300-3001.04100125010...0000000000
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
F_BUST_BUSBR_RBR_XBR_BRATE_ARATE_BRATE_CTAPSHIFTBR_STATUSANGMINANGMAX
branch
1450.01700.09200.158250250250001-360360
2560.03900.17000.358150150150001-360360
3670.01190.10080.209150150150001-360360
4780.00850.07200.149250250250001-360360
5890.03200.16100.306250250250001-360360
6940.01000.08500.176250250250001-360360
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
BUS_IBUS_TYPEPDQDGSBSBUS_AREAVMVABASE_KVZONEVMAXVMIN
bus
443000011.040000-2.21678834511.10.9
55190300011.019544-3.59930934511.10.9
662000011.0250002.20847134511.10.9
771100350011.0122760.91234734511.10.9
882000011.0250003.88564134511.10.9
991125500011.005122-3.90027134511.10.9
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GEN_BUSPGQGQMAXQMINVGMBASEGEN_STATUSPMAXPMIN
gen
1471.73042438.076988300-3001.040100125010
28163.000000-11.552844300-3001.025100130010
3685.000000-26.910102300-3001.025100127010
\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))