beer_data/src/flask/table/table_builder.py
Andrew Ridgway 589c1f62fa
All checks were successful
Build and Push Image / Build and push image (push) Has been skipped
add in current runs table
2024-09-23 03:04:38 +00:00

91 lines
3.0 KiB
Python

import sys
from mongo.get_conn import db_conn
import pandas as pd
import duckdb
class TableBuilder():
def __init__(self) -> None:
self.db = db_conn()
data = self.db.beer_db
data = data.find({}).sort("date", -1)
df_dict = {}
df_dict["beer_run_id"]=[]
df_dict["sg"] = []
df_dict["date"] = []
df_dict["final_reading"] = []
for record in data:
df_dict["beer_run_id"].append(record["beer_run_id"])
df_dict["sg"].append(record["sg"])
df_dict["date"].append(record["date"])
df_dict["final_reading"].append(record["final_reading"])
self.df_dict = df_dict
self.df = pd.DataFrame(data=self.df_dict)
def done_runs_build(self, limit=10) -> pd.DataFrame:
df = self.df
sql = f"""
SELECT x.beer_run_id as beer_run_id,
max(sg) as max,
min(sg) as min,
y.date as final_reading_date
FROM df x
JOIN
( SELECT DISTINCT beer_run_id, date
FROM df
WHERE final_reading = 'True'
) y ON x.beer_run_id = y.beer_run_id
GROUP BY x.beer_run_id, y.date
ORDER BY x.beer_run_id desc
LIMIT {limit}
"""
df_sum = duckdb.sql(sql).df()
sql = f"""
SELECT x.beer_run_id as "Beer Run",
x.max as "Max",
x.min as "Min",
ROUND(((CAST (max AS INTEGER) - CAST(min AS INTEGER)) / 7.36) + 0.5, 2) AS "Alcohol Prediction +/- 0.5",
cast(final_reading_date as DATE) + INTERVAL 14 DAY as "Ready Date"
FROM df_sum x
"""
df_calc = duckdb.sql(sql).df()
return df_calc
def current_runs_build(self, limit=10) -> pd.DataFrame:
df = self.df
sql = f"""
SELECT x.beer_run_id as beer_run_id,
max(sg) as max,
min(sg) as min,
min(cast(x.date as DATE)) as first_reading_date
FROM df x
LEFT JOIN
( SELECT DISTINCT beer_run_id
FROM df
WHERE final_reading = 'True'
) y ON x.beer_run_id = y.beer_run_id
WHERE y.beer_run_id is null
GROUP BY x.beer_run_id
ORDER BY x.beer_run_id desc
LIMIT {limit}
"""
df_sum = duckdb.sql(sql).df()
sql = f"""
SELECT x.beer_run_id as "Beer Run",
x.max as "Max",
x.min as "Min",
ROUND(((CAST (max AS INTEGER) - 1012) / 7.36) + 0.5, 2) AS "Alcohol Prediction (1012) +/- 0.5",
first_reading_date + INTERVAL 7 DAY as "Earliest Bottling/Kegging Date"
FROM df_sum x
"""
df_calc = duckdb.sql(sql).df()
return df_calc