Skip to content

KPI

This example demonstrates how to create a KPI page.

#!/usr/bin/env python3
from datetime import datetime, timedelta
from random import randint

from nicegui import ui

from rosys.analysis import Day, KpiChart, KpiLogger, date_to_str
from rosys.analysis import kpi_page as rosys_kpi_page


def generate_example_kpis(logger: KpiLogger) -> None:
    logger.days = [
        Day(
            date=date_to_str(datetime.today().date() - timedelta(days=i)),
            incidents={
                'wheels_slipped': randint(0, 100),
                'wheels_blocking': randint(0, 15),
                'tests_run': randint(0, 30),
                'finished_task': randint(0, 5),
                'connection_established': randint(0, 200),
                'bumps': randint(0, 50),
            },
        ) for i in range(7 * 3)
    ][::-1]


class kpi_page(rosys_kpi_page):

    @property
    def title(self) -> str:
        return 'KPI Example Page'

    @property
    def charts(self) -> list[KpiChart]:
        positives = KpiChart(title='Positive Events', indicators={
            'finished_task': 'Finished Tasks',
        }, colormap='Greens')
        neutral_events = KpiChart(title='Neutral Events', indicators={
            'connection_established': 'Connection was established',
            'tests_run': 'Tests',
        })
        negatives = KpiChart(title='Exceptions', indicators={
            'wheels_slipped': 'Wheels Slipping',
            'wheels_blocking': 'Wheels Blocking',
            'bumps': 'Robot bumped into something',
        }, colormap='Reds')
        return [positives, neutral_events, negatives]

    @property
    def timespans(self) -> dict[int, str]:
        return {
            7: '7 days',
            14: '2 weeks',
            21: '3 weeks',
        }


kpi_logger = KpiLogger()
generate_example_kpis(kpi_logger)
kpi_page(kpi_logger)

ui.run(title='KPI Example')