RoyAalekh's picture
Updated app.py with chunking of data based on selection of date range. Optimized the data flow.
53eafd4 verified
raw
history blame
7.45 kB
import panel as pn
import pandas as pd
import os
from consts import INVERTER_ID_MAPPING, TEMPERATURE_COLUMNS_TO_USE
from plotting import (
create_heatmap,
create_iv_plot_with_power_curves,
create_iv_plot,
create_iv_plot_with_power_and_temperature_curves,
create_iv_plot_with_temperature_curves,
)
# Function to load data in chunks
def load_data_in_chunks(file_path, columns, start_date=None, end_date=None, chunksize=10000):
chunks = []
for chunk in pd.read_csv(file_path, usecols=['datetime'] + columns, chunksize=chunksize, parse_dates=['datetime']):
if start_date and end_date:
chunk = chunk[(chunk['datetime'] >= start_date) & (chunk['datetime'] <= end_date)]
chunks.append(chunk)
return pd.concat(chunks)
# Initialize Panel extension
pn.extension("plotly")
# Widgets for selecting columns
inverter_ids = pn.widgets.MultiSelect(
name="Inverter IDs",
value=[list(INVERTER_ID_MAPPING.keys())[0]],
options=list(INVERTER_ID_MAPPING.keys()),
size=8,
)
# Line Plots
plot_power_curves = pn.widgets.Checkbox(name="Plot P-dc and P-ac", value=False)
plot_temperature_curves = pn.widgets.Checkbox(name="Plot Temperatures", value=False)
# Heatmaps
heatmap_pr = pn.widgets.Checkbox(name="Heat Map PR", value=False)
heatmap_sy = pn.widgets.Checkbox(name="Heat Map SY", value=False)
heatmap_current = pn.widgets.Checkbox(name="Heat Map - Current", value=False)
heatmap_voltage = pn.widgets.Checkbox(name="Heat Map - Voltage", value=False)
heatmap_power = pn.widgets.Checkbox(name="Heat Map - Power", value=False)
heatmap_irradiance = pn.widgets.Checkbox(name="Heat Map - Irradiance", value=False)
heatmap_temperature = pn.widgets.Checkbox(
name="Heat Map - Temperature " "Heatsink", value=False
)
# Create a loading spinner
loading_spinner = pn.indicators.LoadingSpinner(width=50, height=50)
# Panel interactive functions
@pn.depends(
inverter_ids.param.value,
plot_power_curves.param.value,
plot_temperature_curves.param.value,
)
def update_iv_plot(inverter_ids, plot_power_curves, plot_temperature_curves):
if not inverter_ids:
return pn.pane.Markdown("No Inverters selected for Plotting.")
else:
columns = []
if plot_power_curves:
columns += [CURRENT, IRRADIANCE, VOLTAGE, POWER_DC, POWER_AC]
if plot_temperature_curves:
columns += [T_AMBIENT, T_MODULE, T_HEATSINK, T_CPU, T_BOARD]
if not plot_power_curves and not plot_temperature_curves:
columns += [CURRENT, IRRADIANCE, VOLTAGE]
data = load_data_in_chunks('multi_index_timeseries_data.csv', columns)
other_data = load_data_in_chunks('other_features_data.csv', TEMPERATURE_COLUMNS_TO_USE)
# Plot IV + Power + Temperature Curves
if plot_power_curves and plot_temperature_curves:
print("Plotting IV + Power + Temperature Curves")
return create_iv_plot_with_power_and_temperature_curves(
data, other_data, inverter_ids
)
# Plot IV + Temperature Curves
elif (not plot_power_curves) and plot_temperature_curves:
print("Plot IV + Temperature Curves")
return create_iv_plot_with_temperature_curves(
data, other_data, inverter_ids
)
# Plot IV + Power Curves
elif plot_power_curves and (not plot_temperature_curves):
print("Plot IV + Power Curves")
return create_iv_plot_with_power_curves(data, inverter_ids)
# Plot only IV Curves
else:
print("Plot only IV Curves")
return create_iv_plot(data, inverter_ids)
@pn.depends(heatmap_pr.param.value)
def update_heatmap_pr(heatmap_pr):
if heatmap_pr:
pr_df = kpi_data.filter(like="pr")
pr_df.columns = [i.split("-")[1] for i in pr_df.columns]
pr_heatmap = create_heatmap(pr_df, "PR Heatmap")
return pn.Row(pr_heatmap)
return pn.pane.Markdown("")
@pn.depends(heatmap_sy.param.value)
def update_heatmap_sy(heatmap_sy):
if heatmap_sy:
sy_df = kpi_data.filter(like="daily_specific_yield")
sy_df.columns = [i.split("-")[1] for i in sy_df.columns]
sy_heatmap = create_heatmap(sy_df, "SY Heatmap")
return pn.Row(sy_heatmap)
return pn.pane.Markdown("")
@pn.depends(heatmap_current.param.value)
def update_heatmap_current(heatmap_current):
if heatmap_current:
current_df = daily_timeseries_data.filter(like="I")
current_df.columns = [i.split("-")[1] for i in current_df.columns]
current_heatmap = create_heatmap(current_df, "Current Heatmap")
return pn.Row(current_heatmap)
return pn.pane.Markdown("")
@pn.depends(heatmap_voltage.param.value)
def update_heatmap_voltage(heatmap_voltage):
if heatmap_voltage:
voltage_df = daily_timeseries_data.filter(like="V")
voltage_df.columns = [i.split("-")[1] for i in voltage_df.columns]
voltage_heatmap = create_heatmap(voltage_df, "Voltage Heatmap")
return pn.Row(voltage_heatmap)
return pn.pane.Markdown("")
@pn.depends(heatmap_power.param.value)
def update_heatmap_power(heatmap_power):
if heatmap_power:
power_df = daily_timeseries_data.filter(like="P")
power_df.columns = [i.split("-")[1] for i in power_df.columns]
power_heatmap = create_heatmap(power_df, "Power Heatmap")
return pn.Row(power_heatmap)
return pn.pane.Markdown("")
@pn.depends(heatmap_irradiance.param.value)
def update_heatmap_irradiance(heatmap_irradiance):
if heatmap_irradiance:
irradiance_df = daily_timeseries_data.filter(like="G")
irradiance_df.columns = [i.split("-")[1] for i in irradiance_df.columns]
irradiance_heatmap = create_heatmap(irradiance_df, "Irradiance " "Heatmap")
return pn.Row(irradiance_heatmap)
return pn.pane.Markdown("")
@pn.depends(heatmap_temperature.param.value)
def update_heatmap_temperature(heatmap_temperature):
if heatmap_temperature:
temp_df = daily_timeseries_data.filter(like="THeatSink")
temp_df.columns = [i.split("-")[1] for i in temp_df.columns]
temp_heatmap = create_heatmap(temp_df, "T-Heatsink Heatmap")
return pn.Row(temp_heatmap)
return pn.pane.Markdown("")
# Create dashboard layout
dashboard = pn.Column(
"# ENEL Dashboard",
# IV Plots
pn.Row(
pn.Column(inverter_ids, plot_power_curves, plot_temperature_curves),
pn.panel(update_iv_plot, sizing_mode="stretch_width"),
),
# Heatmaps
pn.Row(
pn.Column(heatmap_pr), pn.panel(update_heatmap_pr, sizing_mode="stretch_width")
),
pn.Row(
pn.Column(heatmap_sy), pn.panel(update_heatmap_sy, sizing_mode="stretch_width")
),
pn.Row(
pn.Column(heatmap_current),
pn.panel(update_heatmap_current, sizing_mode="stretch_width"),
),
pn.Row(
pn.Column(heatmap_voltage),
pn.panel(update_heatmap_voltage, sizing_mode="stretch_width"),
),
pn.Row(
pn.Column(heatmap_power),
pn.panel(update_heatmap_power, sizing_mode="stretch_width"),
),
pn.Row(
pn.Column(heatmap_irradiance),
pn.panel(update_heatmap_irradiance, sizing_mode="stretch_width"),
),
pn.Row(
pn.Column(heatmap_temperature),
pn.panel(update_heatmap_temperature, sizing_mode="stretch_width"),
),
)
# Serve the dashboard
dashboard.servable()