#!/usr/bin/env python3 # -*- coding: utf-8 -*- import argparse import json import sqlite3 import matplotlib.pyplot as plt def main() -> None: parser = argparse.ArgumentParser() parser.add_argument('db', type=str, metavar='DB', help='The sqlite database file') parser.add_argument('-s', '--season', type=int, required=False, help='The season to use') args = parser.parse_args() cnx = sqlite3.connect(args.db) cur = cnx.cursor() cur.execute("SELECT year, avnr FROM payment_variant WHERE NOT test_variant ORDER BY year, avnr") payment_vars = cur.fetchall() if args.season: payment_vars = [p for p in payment_vars if p[0] == args.season] cur.execute("SELECT data FROM payment_variant WHERE (year, avnr) = (?, ?)", payment_vars[-1]) data = json.loads(cur.fetchall()[0][0]) az_sort = data['AuszahlungSorten'] curves = [ { int(n[:-2]): d for n, d in [('50oe', c[sorted(c.keys(), key=lambda v: int(v[:-2]))[0]])] + list(c.items()) + [('120oe', c[sorted(c.keys(), key=lambda v: -int(v[:-2]))[0]])] } if len(c) > 0 else {50: 0, 120: 0} for c in az_sort['Kurven'] ] c_sort_idx = [sum(c.values()) / len(c) for c in curves] c_sort = sorted([i for i in range(len(curves))], key=lambda a: c_sort_idx[a])[::-1] c_sort_2 = {c: i for i, c in enumerate(c_sort)} names: list[list[str]] = [[] for c in curves] for sortid, d1 in az_sort.items(): if len(sortid) != 2: continue for attrid, d2 in d1.items(): for geb, d3 in d2.items(): names[c_sort_2[d3]].append(f'{sortid}/{attrid}/{geb}') title = f'Endabrechnung {payment_vars[-1][0]}' plt.figure(num=title) plt.title(title) for i in c_sort: c = curves[i] plt.plot(c.keys(), c.values()) plt.legend(['\n'.join(a) for a in names], fontsize=8) plt.xlabel('Gradation [°Oe]') plt.ylabel('Betrag [€/kg]') plt.vlines([55, 68, 73, 84], 0.0, 1.5, colors='black') plt.xlim([50, 120]) plt.ylim([0.0, 1.5]) plt.grid(linestyle='--') plt.show() if __name__ == '__main__': main()