Upozornění: Tento dokument slouží jako příklad práce s otevřenými daty a nepředstavuje oficiální stanovisko Ministerstva financí.
Úvod¶
Pod tématem Hospodaření Ministerstva financí na našem portálu lze najít celkem šest datových sad, z nichž snad nejzajímavější je přehled uhrazených faktur. Právě této datové sadě se v tomto krátkém článku budeme věnovat, zatímco se budeme pokoušet nastínit základní specifika této datové sady, které uživatel nemůže při jejím zpracování opomenout. Kde se nám tak zdálo vhodné, doplňuje text názorná ukázka možného zpracování dat v programovacím jazyce Python za použití balíčku Pandas.
Denormalizovaná data¶
Uživatel si musí být především vědom, že tato datová sada vznikla denormalizací dat, která jsou jinak v tradičním, relačním modelu (v relační databázi) uložena ve dvou tabulkách. Těmi jsou celkový přehled faktur a k němu příslušné dělení dle položky rozpočtu. Jak to vypadá v praxi, lze vyčíst z letmého pohledu na prvních několik řádků.
import pandas as pd
dtype = {"dodavatel_ičo" : "str", "položka_rozpočtu" : "str", "účel_platby" : "str"}
faktury = pd.read_csv("https://opendata.mfcr.cz/exports/faktury/faktury.csv", dtype = dtype)
faktury.sort_values(by = ["částka", "číslo_faktury", "typ_záznamu"], ascending = False).head()
Zde vidíme, že ke každému souhrnnému záznamu (podle sloupce typ_záznamu) přísluší alespoň jeden (může jich být i více) záznam položkový. Jde-li nám o faktury nehledě na položku rozpočtu, můžeme tyto záznamy vynechat jednoduchým filtrem podle právě zmíněného sloupce.
Souhrnné záznamy¶
V takto vytvořené tabulce pak dává smysl počítat základní statistiky, jakými můžou být například počet faktur uhrazených v měsíci březnu roku 2021, či jejich celková částka (všimněme si, že na rozdíl od sloupce částka_v_měně odpovídají údaje ve sloupci částka vždy Kč).
faktury_souhrn = faktury[faktury["typ_záznamu"] == "souhrnný"]
brezen = ("2021-03-01" < faktury_souhrn["datum_úhrady"]) & (faktury_souhrn["datum_úhrady"] < "2021-04-01")
faktury_03_21 = faktury_souhrn[brezen]
def print_statistika(pocet, soucet_mil):
print("Počet faktur: " + str(pocet))
print("Částka v milionech Kč: " + "{:.0f}".format(soucet_mil))
pocet = len(faktury_03_21)
soucet_mil = sum(faktury_03_21["částka"])/10**6
print_statistika(pocet, soucet_mil)
Položkové záznamy¶
Pokud chceme naopak položku rozpočtu sledovat, můžeme analogicky vyfiltrovat záznamy položkové, případně můžeme v některých případech nechat tabulku tak, jak je, jelikož souhrnné záznamy nikdy položku rozpočtu obsahovat nebudou, jak se můžeme jednoduše přesvědčit.
len(faktury_souhrn.dropna(subset = ["položka_rozpočtu"])) == 0
Budeme-li chtít kupříkladu spočíst stejné statistiky, jako v předchozím případě, avšak pouze pro položku rozpočtu Programové vybavení, uděláme to třeba takto.
brezen = ("2021-03-01" < faktury["datum_úhrady"]) & (faktury["datum_úhrady"] < "2021-04-01")
vybaveni = (faktury["název_položky_rozpočtu"] == "Programové vybavení")
faktury_03_21_PV = faktury[brezen & vybaveni]
pocet = len(faktury_03_21_PV)
soucet_mil = sum(faktury_03_21_PV["částka"])/10**6
print_statistika(pocet, soucet_mil)
O jaké faktury jde, můžeme zjistit následovně.
faktury_03_21_PV[["dodavatel_název", "částka", "účel_platby", "číslo_faktury"]]
Závěr¶
Tolik tedy představení faktur, zbytek už je na Vás, na uživatelích našich otevřených dat.