mirror of
https://github.com/bbilly1/aqi_monitor.git
synced 2024-08-02 16:03:33 +00:00
91 lines
3.1 KiB
Python
91 lines
3.1 KiB
Python
|
""" makes the nice plots """
|
||
|
|
||
|
from datetime import datetime
|
||
|
|
||
|
from matplotlib import pyplot as plt
|
||
|
import numpy as np
|
||
|
import pandas as pd
|
||
|
import psycopg2
|
||
|
|
||
|
from app.db_connect import db_connect, db_close
|
||
|
|
||
|
|
||
|
def create_current(config):
|
||
|
""" recreate current graph """
|
||
|
# last three hours
|
||
|
now = datetime.now()
|
||
|
now_human = now.strftime('%c')
|
||
|
now_epoch = int(now.strftime('%s'))
|
||
|
last_3h = now_epoch - 3 * 60 * 60
|
||
|
last_3h_limit = int(60 * 3)
|
||
|
# connect
|
||
|
conn, cur = db_connect(config)
|
||
|
# get data
|
||
|
cur.execute(
|
||
|
"SELECT epoch_time, aqi_value FROM aqi \
|
||
|
WHERE epoch_time > " + str(last_3h) + " ORDER BY epoch_time DESC \
|
||
|
LIMIT " + str(last_3h_limit) + ";")
|
||
|
rows = cur.fetchall()
|
||
|
# close db
|
||
|
db_close(conn, cur)
|
||
|
# parse rows
|
||
|
x, y, plt_title = build_plt(rows, now)
|
||
|
# calc x_ticks
|
||
|
x_ticks = []
|
||
|
for num, i in enumerate(x):
|
||
|
minute = int(i.split(':')[1])
|
||
|
if minute % 15 == 0:
|
||
|
x_ticks.append(num)
|
||
|
# write plt
|
||
|
write_plt(x, y, plt_title, x_ticks)
|
||
|
message = f'recreated current graph: {now_human}'
|
||
|
print(message)
|
||
|
|
||
|
|
||
|
def build_plt(rows, now):
|
||
|
""" parse rows returns axis"""
|
||
|
# build x y
|
||
|
x_timeline = [datetime.fromtimestamp(i[0]) for i in rows]
|
||
|
y_aqi_values = [int(i[1]) for i in rows]
|
||
|
# build dataframe
|
||
|
data = {'timestamp': x_timeline, 'aqi': y_aqi_values}
|
||
|
df = pd.DataFrame(data)
|
||
|
# reindex as timeseries
|
||
|
indexed = df.set_index('timestamp')
|
||
|
indexed.sort_values(by=['timestamp'], inplace=True)
|
||
|
mean = indexed.resample('3min').mean()
|
||
|
mean.reset_index(level=0, inplace=True)
|
||
|
mean['timestamp'] = mean['timestamp'].dt.strftime('%H:%M')
|
||
|
mean['aqi'] = mean['aqi'].round()
|
||
|
# set axis
|
||
|
x = mean['timestamp']
|
||
|
y = mean['aqi']
|
||
|
# build title
|
||
|
data_from = now.strftime("%Y-%m-%d")
|
||
|
time_from = x_timeline[-1].strftime('%H:%M')
|
||
|
time_until = x_timeline[0].strftime('%H:%M')
|
||
|
plt_title = f'AQI values from: {data_from} {time_from} - {time_until}'
|
||
|
return x, y, plt_title
|
||
|
|
||
|
|
||
|
def write_plt(x, y, plt_title, x_ticks):
|
||
|
""" save plot to file """
|
||
|
# calc ticks
|
||
|
y_max = np.ceil(y.max()/50)*50 + 50
|
||
|
# setup plot
|
||
|
plt.style.use('seaborn')
|
||
|
plt.plot(x, y, color='#313131',)
|
||
|
plt.fill_between(x, y, y2=0, where=(y > 0), color='#85a762', interpolate=True) # good
|
||
|
plt.fill_between(x, y, y2=50, where=(y > 50), color='#d4b93c', interpolate=True) # moderate
|
||
|
plt.fill_between(x, y, y2=100, where=(y > 100), color='#e96843', interpolate=True) # ufsg
|
||
|
plt.fill_between(x, y, y2=150, where=(y > 150), color='#d03f3b', interpolate=True) # unhealthy
|
||
|
plt.fill_between(x, y, y2=200, where=(y > 200), color='#be4173', interpolate=True) # vunhealthy
|
||
|
plt.fill_between(x, y, y2=300, where=(y > 300), color='#714261', interpolate=True) # hazardous
|
||
|
plt.fill_between(x, y, y2=0, where=(y > 0), color='#ffffff', alpha=0.1, interpolate=True) # soft
|
||
|
plt.xticks(x_ticks)
|
||
|
plt.yticks(np.arange(0, y_max, step=50))
|
||
|
plt.title(plt_title)
|
||
|
plt.tight_layout()
|
||
|
plt.savefig('dyn/current.png', dpi = 300)
|
||
|
plt.figure()
|