Spaces:
Running
Running
# -*- coding: utf-8 -*- | |
""" | |
Created on Fri Feb 24 15:24:06 2023 | |
@author: BorowyP | |
""" | |
import pandas as pd | |
import hvplot.pandas # Adds .hvplot and .interactive methods to Pandas dataframes | |
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", ] | |
ACCENT_BASE_COLOR = PALETTE[0] | |
#import time | |
#start = time.time() | |
#print('load data') | |
import numpy as np | |
from math import pi | |
from bokeh.palettes import Category20c, Category20 | |
from bokeh.plotting import figure | |
from bokeh.transform import cumsum | |
from bokeh.layouts import row | |
from bokeh.models.formatters import DatetimeTickFormatter | |
formatter = DatetimeTickFormatter(months='%b %Y') # wird in .hvplot benötigt für x-achse! | |
air_temp = pd.read_csv(r'df_air_temp.csv', sep=',', | |
header=0, | |
#skiprows=[1], | |
decimal=',', | |
#dtype={'temp': np.float64}, | |
na_values=('#-INF', '#NAN')) | |
air_temp.index = pd.to_datetime(air_temp['Date'], format='%Y.%m.%d %H:%M:%S') | |
air_temp = air_temp.drop(['Date'], axis=1) | |
air_temp['temp'] = air_temp['temp'].astype(np.float64, copy=True, errors='ignore') | |
air_temp = air_temp.round(1) | |
air_date_slider = pn.widgets.DateRangeSlider(name='Date', start=air_temp.index.min(), end=air_temp.index.max()) | |
Stndrt = pn.widgets.RadioButtonGroup(name='Standort', options=['Glienig', 'Groß Liebitz', 'Krausnick', 'Halbe', 'Spreeau', 'Hangelsberg'],button_type='success') | |
air_temp_inter = air_temp.interactive() | |
air_temp_inter = ( | |
air_temp_inter[ | |
(air_temp_inter.Standort == Stndrt) & | |
(air_temp_inter.index >= air_date_slider.param.value_start) & | |
(air_temp_inter.index <= air_date_slider.param.value_end) | |
]) | |
def lin_reg(dfx,dfy, date): | |
# Formel für regres-gerade: y= alpha + b * x | |
# https://www.crashkurs-statistik.de/einfache-lineare-regression/ | |
lin_df = pd.DataFrame({'Date' : date, | |
'Temperatur' : dfy, | |
'x-x.mean' : dfx-dfx.mean(), | |
'y-y.mean' : dfy-dfy.mean(), | |
'(x-x.mean) * (y-y.mean)': (dfx-dfx.mean()) * (dfy-dfy.mean()), | |
'(x-x.mean)²' : (dfx-dfx.mean()) * (dfx-dfx.mean()),}) | |
b = lin_df['(x-x.mean) * (y-y.mean)'].sum()/ lin_df['(x-x.mean)²'].sum() | |
alpha = dfy.mean() - b * dfx.mean() | |
lin_df['Lineare Regression'] = round(alpha + b * dfx,2) | |
lin_plot = lin_df.hvplot(x='Date', | |
xlabel='Datum', | |
title=Stndrt, | |
y=['Temperatur', 'Lineare Regression'], | |
ylabel='Lufttemperatur [°C]', | |
color=PALETTE, | |
line_width=0.5, | |
xformatter=formatter) | |
SQE = ((lin_df['Lineare Regression']-dfy.mean())*(lin_df['Lineare Regression']-dfy.mean())).sum() | |
SQT = (lin_df['y-y.mean'] * lin_df['y-y.mean']).sum() | |
R_Wert = round(SQE/SQT,2) | |
mean = round(dfy.mean(),2) | |
median = dfy.median() | |
maxm = dfy.max() | |
minm = dfy.min() | |
anz = dfy.count() | |
monitor_df = pd.DataFrame({'Standort' : [Stndrt.value], | |
'von' : [air_date_slider.value[0]], | |
'bis' : [air_date_slider.value[1]], | |
'Mittelwert' : [mean], | |
'Median' : [median], | |
'Maximum' : [maxm], | |
'Minimum' : [minm], | |
'Anzahl' : [anz], | |
'R²' : [R_Wert] | |
}) | |
return pn.Column(lin_plot, monitor_df) | |
def callback(air_temp_inter): | |
y = air_temp_inter.temp | |
x = air_temp_inter['Unnamed: 0'] | |
return pn.Column(lin_reg(x,y, air_temp_inter.index)) | |
airtempplot = air_temp_inter.pipe(callback) | |
temp_glienig = pd.DataFrame({'Glienig': air_temp.loc[air_temp['Standort'] == 'Glienig']['temp']}, | |
index = air_temp.loc[air_temp['Standort'] == 'Glienig'].index) | |
temp_grlieb = pd.DataFrame({'Groß Liebitz': air_temp.loc[air_temp['Standort'] == 'Groß Liebitz']['temp']}, | |
index = air_temp.loc[air_temp['Standort'] == 'Groß Liebitz'].index) | |
temp_halbe = pd.DataFrame({'Halbe' : air_temp.loc[air_temp['Standort'] == 'Halbe']['temp']}, | |
index= air_temp.loc[air_temp['Standort'] == 'Halbe'].index) | |
temp_hberg = pd.DataFrame({'Hangelsberg' : air_temp.loc[air_temp['Standort'] == 'Hangelsberg']['temp']}, | |
index= air_temp.loc[air_temp['Standort'] == 'Hangelsberg'].index) | |
temp_krausnick = pd.DataFrame({'Krausnick' : air_temp.loc[air_temp['Standort'] == 'Krausnick']['temp']}, | |
index= air_temp.loc[air_temp['Standort'] == 'Krausnick'].index) | |
temp_spreeau = pd.DataFrame({'Spreeau' : air_temp.loc[air_temp['Standort'] == 'Spreeau']['temp']}, | |
index= air_temp.loc[air_temp['Standort'] == 'Spreeau'].index) | |
air_temp_hist = pd.concat([temp_glienig,temp_grlieb,temp_halbe,temp_hberg,temp_krausnick,temp_spreeau]) | |
dfi_temp = air_temp_hist.interactive() | |
filtered = dfi_temp[ | |
(dfi_temp.index >= air_date_slider.param.value_start) & | |
(dfi_temp.index <= air_date_slider.param.value_end)] | |
plot_air_temphist = filtered.hvplot(y=['Glienig', | |
'Groß Liebitz', | |
'Halbe', | |
'Hangelsberg', | |
'Krausnick', | |
'Spreeau'], kind='hist', responsive=True, min_height=300, xlabel='Lufttemperatur', alpha=0.5) | |
import os | |
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 | |
], | |
main=[pn.pane.Markdown("## Luft Temperaturdaten"), | |
air_date_slider, | |
airtempplot.panel(), | |
plot_air_temphist, | |
#accent_base_color="#88d8b0", | |
#header_background="#88d8b0", | |
]) | |
template.servable(); | |