holzdeko / Bodentemperatur.py
BorowyP
panel app
fd0472a
# -*- coding: utf-8 -*-
"""
Created on Fri Mar 3 12:57:34 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_temp = pd.read_csv('df_soil_temp.csv',header=0,sep=',')
soil_temp.index = pd.to_datetime(soil_temp['Date'], format='%Y.%m.%d %H:%M:%S')
soil_temp.index.names = ['Date']
soil_temp = soil_temp.drop(['Date'], axis=1)
soil_temp = soil_temp.drop(['Unnamed: 0'], axis=1)
soil_temp[soil_temp.columns[list(range(6))]] = soil_temp[soil_temp.columns[list(range(6))]].round(1) #RUNDEN auf 1 Kommastelle fuer bessere Perfomance!!!
soil_temp = soil_temp.rename(columns={'Temp05' : '50',
'Temp10' : '100',
'Temp20' : '200',
'Temp30' : '300',
'Temp50' : '500' ,
'Temp100' : '1000',
'Standort' : 'Standort'})
Stndrt = pn.widgets.RadioButtonGroup(name='Standort', options=['Glienig', 'Groß Liebitz', 'Krausnick', 'Halbe', 'Spreeau', 'Hangelsberg'],button_type='success')
soiltempbtn = pn.widgets.ToggleGroup(
name='soiltemperature',
options=['50', '100', '200', '300', '500', '1000'],
value=['50'],
button_type='success')
soil_date_slider = pn.widgets.DateRangeSlider(name='Date', start=soil_temp.index.min(), end=soil_temp.index.max())
soil_temp_i= soil_temp.interactive()
soil_temp_i = (
soil_temp_i[
(soil_temp_i.Standort == Stndrt) &
(soil_temp_i.index >= soil_date_slider.param.value_start) &
(soil_temp_i.index <= soil_date_slider.param.value_end)
]
)
soiltempplot = soil_temp_i.hvplot(x='Date',xlabel='Datum',title=Stndrt, y=soiltempbtn, color=PALETTE, line_width=1, xformatter=formatter, ylabel='Bodentemperatur [°C]')
def callback_temp(soil_temp_i):
df = soil_temp_i
monitor = pd.DataFrame({#'Standort' : [Stndrt.value, Stndrt.value],
#'von' : soil_temp_i.index.min(),
#'bis' : soil_temp_i.index.max(),
'Mittelwert' : [df['50'].mean(),
df['100'].mean(),
df['200'].mean(),
df['300'].mean(),
df['500'].mean(),
df['1000'].mean(),
] ,
'Median' : [df['50'].median(),
df['100'].median(),
df['200'].median(),
df['300'].median(),
df['500'].median(),
df['1000'].median(),
] ,
'Maximum' : [df['50'].max(),
df['100'].max(),
df['200'].max(),
df['300'].max(),
df['500'].max(),
df['1000'].max()],
'Minimum' : [df['50'].min(),
df['100'].min(),
df['200'].min(),
df['300'].min(),
df['500'].min(),
df['1000'].min()],
'Anzahl' : [df['50'].count(),
df['100'].count(),
df['200'].count(),
df['300'].count(),
df['500'].count(),
df['1000'].count()]
}, index=['50',
'100',
'200',
'300',
'500',
'1000',
])
monitor.index.name='Profiltiefe'
#soiltemp_scatter = scatter_matrix(soil_temp, alpha=0.2) #Scattermatrix zum Vergleich der einzelnen Profiltiefen???
soiltemp_scatter_df = soil_temp[soil_temp['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 **{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_temp_i.pipe(callback_temp)
callback
hd_logo = pn.pane.PNG('HD_Logo.png', width=100)
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
],
main=[pn.pane.Markdown("## Bodentemperatur"),
soiltempbtn,
soil_date_slider,
soiltempplot.panel(),
callback.panel(),
#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_temp_docker.ipynb --autoreload