Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Code doesn't execute. #2284

Open
6 tasks done
i5sanchez opened this issue May 11, 2024 · 0 comments
Open
6 tasks done

Code doesn't execute. #2284

i5sanchez opened this issue May 11, 2024 · 0 comments
Labels

Comments

@i5sanchez
Copy link

i5sanchez commented May 11, 2024

Bug report checklis

  • Searched the issues page for similar reports

  • Read the relevant sections of the documentation

  • Browse the tutorials and tests for usefull code snippets and examples of use

  • Reproduced the issue after updating with pip install --upgrade pandapower (or git pull)

  • Tried basic troubleshooting (if a bug/error) like restarting the interpreter and checking the pythonpath

Reproducible Example

# -*- coding: utf-8 -*-
"""
Created on Thu May  9 15:30:17 2024
@author: Usuario
"""
import pandapower as pp
import pandas as pd
import os
os.environ["NUMBA_DISABLE_JIT"] = "1"


Vdc = 12

# Crear una red vacía
net = pp.create_empty_network()

#print(pp.available_std_types(net, "line"))

# Código para corregir los valores NaN en net.ext_grid
net.ext_grid['name'] = net.ext_grid['name'].fillna('bus_1')
net.ext_grid['bus'] = net.ext_grid['bus'].fillna(1)
net.ext_grid['bus'] = net.ext_grid['bus'].astype(int)


# Crear el bus 1 con coordenadas geográficas
bus1 = pp.create_bus(net, vn_kv=0.012, name='bus_1', geodata=(-65.4644, -18.169))

# Crear el bus 2 con coordenadas geográficas
bus2 = pp.create_bus(net, vn_kv=0.012, name='bus_2', geodata=(-65.4634, -18.1704))

# Crear el bus 3 con coordenadas geográficas
bus3 = pp.create_bus(net, vn_kv=0.012, name='bus_3', geodata=(-65.465, -18.1699))

net.bus_geodata['coords'] = net.bus_geodata.apply(lambda row: (row['x'], row['y']), axis=1)

print(net.bus_geodata.isnull().sum())

# Agregar almacenamiento de energía a cada bus
storage_capacity = 712  # Capacidad de almacenamiento en Wh
max_p_charge = 160  # Potencia máxima de carga en W
max_p_discharge = 160  # Potencia máxima de descarga en W
efficiency = 0.95  # Eficiencia de carga/descarga

for bus in [bus1, bus2, bus3]:
    pp.create_storage(net, bus=bus, p_mw=0, max_e_mwh=storage_capacity / 1000, max_p_mw=max_p_charge, min_p_mw=-max_p_discharge, efficiency=efficiency)

# Agregar la columna 'state_of_charge_mwh' al DataFrame net.storage e inicializarla con ceros
net.storage['state_of_charge_mwh'] = 0.0

# Ruta del archivo CSV a importar
ruta_archivo = "C:\\Users\\Usuario\\.spyder-py3\\data_proysolar\\df_4viviendas_30.97.csv"

# Cargar el archivo CSV en un DataFrame
df = pd.read_csv(ruta_archivo)

dc_line_std_type = {
    "r_ohm_per_km": 1.95,  # Resistencia de la línea en ohmios/km
    "x_ohm_per_km": 0,      # Reactancia de la línea en ohmios/km
    "c_nf_per_km": 0,       # Capacidad de carga de la línea en nF/km
    "max_i_ka": 88.2,       # Corriente máxima admisible en kA
    # Otros parámetros relevantes para la línea DC
}


# Nombre del tipo estándar de línea DC
dc_line_std_type_name = "tipo_estandar_linea_DC"

# Agregar el tipo estándar de línea DC a la red
net.std_types['line'][dc_line_std_type_name] = dc_line_std_type

# Crear la línea que conecta los buses 1 y 2 utilizando el tipo estándar de línea DC
pp.create_line(net, from_bus=bus1, to_bus=bus2, length_km=0.174, std_type= '15-AL1/3-ST1A 0.4')
pp.create_line(net, from_bus=bus2, to_bus=bus3, length_km=0.19137, std_type= '15-AL1/3-ST1A 0.4')
pp.create_line(net, from_bus=bus3, to_bus=bus1, length_km=0.03508, std_type= '15-AL1/3-ST1A 0.4')


# Función para adaptar el DataFrame
def adaptar_df(df, Vdc, x, y, name):
    df.drop(columns=['num_pan20', 'caida_tension', 'caida_porc'], inplace=True)
    df['vn_kv'] = Vdc / 1000
    df['x'] = x
    df['y'] = y
    df['name'] = name
    df['p_kw'] = df['gen'] / 1000
    df.drop(columns=['gen'], inplace=True)
    return df

# Adaptar el DataFrame
df = adaptar_df(df, Vdc, 0, 0, 'grupo1')
"""
# Agregar buses desde el DataFrame
for index, row in df.iterrows():
    pp.create_bus(net, vn_kv=row['vn_kv'], name=row['name'], geodata=(row['x'], row['y']))
"""
"""
# Agregar líneas desde el DataFrame
for index, row in df.iterrows():
    pp.create_line(net, from_bus=1, to_bus=2, length_km=0.05, std_type=dc_line_std_type_name)

# Agregar cargas desde el DataFrame
for index, row in df.iterrows():
    pp.create_load(net, bus=bus1, p_mw=row['Demanda'] / 1e6, q_kvar=0)
    pp.create_load(net, bus=bus2, p_mw=row['Demanda'] / 1e6, q_kvar=0)
    pp.create_load(net, bus=bus3, p_mw=row['Demanda'] / 1e6, q_kvar=0)
 
    # Agregar generadores desde el DataFrame
for index, row in df.iterrows():
    pp.create_sgen(net, bus=bus1, p_mw=row['p_kw']/1000, q_mvar=0,sn_mva=row['p_kw']/1000, name=row['name'],slack=True)
    pp.create_sgen(net, bus=bus2, p_mw=row['p_kw']/1000, q_mvar=0,sn_mva=row['p_kw']/1000, name=row['name'])
    pp.create_sgen(net, bus=bus3, p_mw=row['p_kw']/1000, q_mvar=0,sn_mva=row['p_kw']/1000, name=row['name'])
"""
# Agregar generador con slack=True
#pp.create_gen(net, bus=bus1, p_mw=0, vm_pu=1.0, slack=True)


# Definir e inicializar los registros horarios de generación y consumo para cada nodo
generation_records = {"bus_1": [0] * 24, "bus_2": [0] * 24, "bus_3": [0] * 24}  # Registros horarios de generación inicializados en cero
consumption_records = {"bus_1": [0] * 24, "bus_2": [0] * 24, "bus_3": [0] * 24}  # Registros horarios de consumo inicializados en cero

# Función para actualizar los registros horarios
def update_hourly_records(df):
    for index, row in df.iterrows():
        surplus_energy = row['surplus']
        unsatisfied_energy = row['energia_insatisfecha']
        time_str = row['Time']
        hour = int(time_str.split(':')[0])  # Extraer solo la hora desde 'HH:MM:SS'
        for node in ["bus_1", "bus_2", "bus_3"]:
            if surplus_energy > 0:
                generation_records[node][hour] += surplus_energy
            elif unsatisfied_energy > 0:
                consumption_records[node][hour] += unsatisfied_energy

# Modificar los registros horarios con los datos del DataFrame
update_hourly_records(df)

for hour in range(24):
    for node in ["bus_1", "bus_2", "bus_3"]:
        bus_index = net.bus.index[net.bus['name'] == node]
        if len(bus_index) > 0:
            node_index = bus_index[0]
            pp.create_gen(net, bus=node_index, p_mw=generation_records[node][hour], vm_pu=1.0, name=f'gen_hour_{hour}_{node}')
            pp.create_load(net, bus=node_index, p_mw=consumption_records[node][hour], q_kvar=0, name=f'load_hour_{hour}_{node}')
            #print(f"Nivel de almacenamiento en {node}: {net.storage.at[node_index, 'state_of_charge_mwh']} MWh")
        else:
            print(f"No se encontró el nodo {node} en net.bus")

    # Modificar la potencia del ext_grid según los valores de 'energia_insatisfecha' y 'surplus' multiplicados por 3
    p_ext_grid = sum([consumption_records[node][hour] * 3 for node in ["bus_1", "bus_2", "bus_3"]])  # Multiplicar por 3 los valores de 'energia_insatisfecha'
    p_ext_grid -= sum([generation_records[node][hour] * 3 for node in ["bus_1", "bus_2", "bus_3"]])  # Multiplicar por 3 los valores de 'surplus'
    net.ext_grid.at[0, 'p_mw'] = p_ext_grid
"""
# Crear registros horarios de generación y consumo para cada nodo
generation_records = {"bus1": [0] * 24, "bus2": [0] * 24, "bus3": [0] * 24}  # Registros horarios de generación inicializados en cero
consumption_records = {"bus1": [0] * 24, "bus2": [0] * 24, "bus3": [0] * 24}  # Registros horarios de consumo inicializados en cero

# Función para actualizar los registros horarios
def update_hourly_records(df):
    for index, row in df.iterrows():
        surplus_energy = row['surplus']
        unsatisfied_energy = row['energia_insatisfecha']
        time_str = row['Time']
        hour = int(time_str.split(':')[0])  # Extraer solo la hora desde 'HH:MM:SS'
        for node in ["bus1", "bus2", "bus3"]:
            if surplus_energy > 0:
                generation_records[node][hour] += surplus_energy
            elif unsatisfied_energy > 0:
                consumption_records[node][hour] += unsatisfied_energy

# Actualizar los registros horarios con los datos del DataFrame
update_hourly_records(df)
# Calcular la generación y el consumo para cada nodo
# Calcular la generación y el consumo para cada nodo
for hour in range(24):
    for node in ["bus1", "bus2", "bus3"]:
        node_index = net.bus.index[net.bus.name == node][0]
        pp.create_gen(net, bus=node_index, p_mw=generation_records[node][hour], vm_pu=1.0, name=f'gen_hour_{hour}_{node}')
        pp.create_load(net, bus=node_index, p_mw=consumption_records[node][hour], q_kvar=0, name=f'load_hour_{hour}_{node}')
        print(f"Nivel de almacenamiento en {node}: {net.storage.at[node_index, 'state_of_charge_mwh']} MWh")
"""

# Crear generador con slack=True como bus de referencia
#pp.create_gen(net, bus=bus1, p_mw=0, vm_pu=1.0, slack=True)


# Crear el nodo PV para representar la generación y consumo de energía en la red
#pp.create_sgen(net, bus=bus2, p_mw=0, q_mvar=0, name='PV_generation', slack=True)  # Generador PV controlado

# Crear líneas y buses como se hizo antes...

# Función para adaptar el DataFrame como antes...

# Adaptar el DataFrame como antes...

# Agregar buses desde el DataFrame como antes...

# Agregar cargas desde el DataFrame como antes...

# Agregar generadores desde el DataFrame como antes...

# Ahora la red debería estar correctamente creada en Pandapower (variable 'net')

# Puedes utilizar funciones de Pandapower para analizar la red, como pp.runpp() para calcular flujos de potencia, etc.
pp.runpp(net)
print(net.res_line)  # Flujos de potencia en las líneas

Issue Description and Traceback

runfile('C:/Users/Usuario/Desktop/Mi ingeniería e. e/Contenidos por cursos/Cuarto curso/Octavo semestre (BOLIVIA)/RAMP/archivos_py_surplus/procesador_microred.py', wdir='C:/Users/Usuario/Desktop/Mi ingeniería e. e/Contenidos por cursos/Cuarto curso/Octavo semestre (BOLIVIA)/RAMP/archivos_py_surplus')
x         0
y         0
coords    0
dtype: int64
Traceback (most recent call last):

  File ~\anaconda3\envs\ramp\lib\site-packages\spyder_kernels\py3compat.py:356 in compat_exec
    exec(code, globals, locals)

  File c:\users\usuario\desktop\mi ingeniería e. e\contenidos por cursos\cuarto curso\octavo semestre (bolivia)\ramp\archivos_py_surplus\procesador_microred.py:207
    pp.runpp(net)

  File ~\anaconda3\envs\ramp\lib\site-packages\pandapower\run.py:250 in runpp
    _powerflow(net, **kwargs)

  File ~\anaconda3\envs\ramp\lib\site-packages\pandapower\powerflow.py:75 in _powerflow
    ppc, ppci = _pd2ppc(net)

  File ~\anaconda3\envs\ramp\lib\site-packages\pandapower\pd2ppc.py:101 in _pd2ppc
    net["_is_elements"] = aux._select_is_elements_numba(net, sequence=sequence)

  File ~\anaconda3\envs\ramp\lib\site-packages\pandapower\auxiliary.py:798 in _select_is_elements_numba
    set_elements_oos(element_df["bus"].values, element_df["in_service"].values,

  File ~\anaconda3\envs\ramp\lib\site-packages\numba\core\dispatcher.py:468 in _compile_for_args
    error_rewrite(e, 'typing')

  File ~\anaconda3\envs\ramp\lib\site-packages\numba\core\dispatcher.py:409 in error_rewrite
    raise e.with_traceback(None)

TypingError: non-precise type array(pyobject, 1d, C)
During: typing of argument at C:\Users\Usuario\anaconda3\envs\ramp\lib\site-packages\pandapower\auxiliary.py (756)

El sistema no puede encontrar la ruta especificada.

Expected Behavior

It should give the results and power fluxes in the grid.

Installed Versions

  • python version: 3.10.14
  • pandas version: 2.2.2
  • networkx version: 3.3
  • scipy version: 1.13.0
  • numpy version: 1.24.4
  • packaging version: 23.2
  • tqdm version: 4.66.2
  • deepdiff version: 7.0.1
    Operating System name/version: Microsoft Windows 11 Home / 10.0.22631 N/D Compilación 22631

Label

  • Relevant labels are selected
@i5sanchez i5sanchez added the bug label May 11, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant