holzdeko / Bodenfeuchte.py
BorowyP
panel app
fd0472a
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 7 12:04:33 2023
@author: BorowyP
"""
import pandas as pd
import hvplot.pandas # Adds .hvplot and .interactive methods to Pandas dataframes
from hvplot.plotting import scatter_matrix
import panel as pn # Panel is a simple, flexible and enterprise-ready data app framework
import holoviews as hv
from holoviews.operation.timeseries import rolling, rolling_outlier_std
hv.extension('bokeh')
#pn.extension('tabulator')
pn.extension(sizing_mode="stretch_width")
#pd.set_option("precision", 0)
PALETTE = ["#ff6f69", "#ffcc5c", "#88d8b0", ]
import numpy as np
from bokeh.models.formatters import DatetimeTickFormatter
formatter = DatetimeTickFormatter(months='%b %Y') # wird in .hvplot benötigt für x-achse!
soil_hum = pd.read_csv('df_soil_hum.csv',header=0,sep=',')
soil_hum.index = pd.to_datetime(soil_hum['Date'], format='%Y.%m.%d %H:%M:%S')
soil_hum.index.names = ['Date']
soil_hum = soil_hum.drop(['Date'], axis=1)
soil_hum = soil_hum.drop(['Unnamed: 0'], axis=1)
soil_hum[soil_hum.columns[list(range(6))]] = soil_hum[soil_hum.columns[list(range(6))]].round(1)
soil_hum = soil_hum.rename(columns={'Prof100' : '100',
'Prof200' : '200',
'Prof300' : '300',
'Prof400' : '400',
'Prof600' : '600' ,
'Prof1000' : '1000',
'Standort' : 'Standort'})
Stndrt = pn.widgets.RadioButtonGroup(name='Standort', options=['Glienig', 'Groß Liebitz', 'Krausnick', 'Halbe', 'Spreeau', 'Hangelsberg'],button_type='success')
soilhumbtn = pn.widgets.ToggleGroup(
name='soilhumidity',
options=['100', '200', '300', '400', '600', '1000'],
value=['100'],
button_type='success')
soil_date_slider = pn.widgets.DateRangeSlider(name='Date', start=soil_hum.index.min(), end=soil_hum.index.max())
soil_hum_i = soil_hum.interactive()
soil_hum_i = ( soil_hum_i[
(soil_hum_i.Standort == Stndrt) &
(soil_hum_i.index >= soil_date_slider.param.value_start) &
(soil_hum_i.index <= soil_date_slider.param.value_end) ])
soilhumplot = soil_hum_i.hvplot(x='Date',xlabel='Datum',title=Stndrt, y=soilhumbtn, color=PALETTE, line_width=1, xformatter=formatter, ylabel='Bodenfeuchte[%]')
def callback_hum(soil_hum_i):
df = soil_hum_i
monitor = pd.DataFrame({#'Standort' : [Stndrt.value, Stndrt.value],
#'von' : soil_temp_i.index.min(),
#'bis' : soil_temp_i.index.max(),
'Mittelwert' : [df['100'].mean(),
df['200'].mean(),
df['300'].mean(),
df['400'].mean(),
df['600'].mean(),
df['1000'].mean(),
] ,
'Median' : [df['100'].median(),
df['200'].median(),
df['300'].median(),
df['400'].median(),
df['600'].median(),
df['1000'].median(),
] ,
'Maximum' : [df['100'].max(),
df['200'].max(),
df['300'].max(),
df['400'].max(),
df['600'].max(),
df['1000'].max()],
'Minimum' : [df['100'].min(),
df['200'].min(),
df['300'].min(),
df['400'].min(),
df['600'].min(),
df['1000'].min()],
'Anzahl' : [df['100'].count(),
df['200'].count(),
df['300'].count(),
df['400'].count(),
df['600'].count(),
df['1000'].count()]
}, index=['100',
'200',
'300',
'400',
'600',
'1000',
])
monitor.index.name='Profiltiefe'
#soiltemp_scatter = scatter_matrix(soil_temp, alpha=0.2) #Scattermatrix zum Vergleich der einzelnen Profiltiefen???
soiltemp_scatter_df = soil_hum[soil_hum['Standort'] == Stndrt.value]#.iloc[df.index.min(): df.index.max()]
soiltemp_scatter = scatter_matrix(soiltemp_scatter_df, alpha=0.2)
scatter_headline = pn.pane.Markdown(f"## Scattermatrix Bodenfeuchte **{Stndrt.value}**")
scatter_discription = pn.pane.Markdown('scatter_matrix shows all the pairwise relationships between the columns of your data. Each non-diagonal entry plots the corresponding columns against another, while the diagonal plot shows the distribution of the data within each individual column.'
)
monitor_gesamt = pd.DataFrame({'Standort' : [Stndrt.value],
'von' : df.index.min(),
'bis' : df.index.max(),
'Mittelwert' : df.mean(numeric_only=True).mean(),
'Median' : df.median(numeric_only=True).median(),
'Maximum' : df.max(numeric_only=True).max(),
'Minimum' : df.min(numeric_only=True).min()
}, index=['Gesamt'])
return pn.Column(monitor_gesamt, monitor,scatter_headline, soiltemp_scatter, scatter_discription)
callback = soil_hum_i.pipe(callback_hum)
callback
hd_logo = pn.pane.PNG('HD_Logo.png', width=100)
hd_logo
lfe_logo = pn.pane.PNG('LFE_Logo.png', width=100)
fnr_logo = pn.pane.PNG('fnr_logo.png', width=100)
template = pn.template.FastListTemplate(
title='Holzdeko Dashboard',
sidebar=[hd_logo,
pn.pane.Markdown("## Einstellungen"),
'Standort',Stndrt,
lfe_logo,
fnr_logo
#'Boden',
#'Gekalkt/ungekalkt', yaxis,
],
main=[pn.pane.Markdown("## Bodenfeuchte"),
soilhumbtn,
soil_date_slider,
soilhumplot.panel(),
callback
#accent_base_color="#88d8b0",
#header_background="#88d8b0",
])
template.servable();
#print('fertig!')
# To launch this dashboard as a web server, we can simply run
# cd C:\Users\BorowyP\Desktop\Dashboard-Preasi\soil_air\
# panel serve 20230307_soil_hum_docker.ipynb --autoreload