Nauč se Python > Kurzy > Python a jeho knihovny > Pandas > Pandas a poruchy veřejného osvětlení v Brně

Budeme pracovat se dvěma datovými soubory:

Nejprve naimportujeme knihovnu pandas a zkusíme si s ní trochu hrát.

In [1]:
import pandas

Načtení souboru ve formátu CSV uděláme pomocí funkce read_csv. První argument udává jméno souboru. Další argumenty jsou:

  • index_col: Název sloupce, pomocí kterého chceme data indexovat. Pokud nic nezadáme, Pandas vytvoří nový sloupec s čísly.
  • parse_dates: Tímto dané sloupce načteme jako data místo řetězců. Pozorný čtenář se všimne, že ve výpisu je sloupců s daty víc, ale my budeme potřebovat pouze tento jeden a na ostatních nám až tak moc nezáleží.
  • dayfirst: Pandas zkouší uhodnout, v jakém formátu jsou data zadaná. Den a měsíc je ale problematické rozlišit, takže tímto řekneme, že nejdříve je v datu den, až potom měsíc.
In [4]:
data = pandas.read_csv("2016-zavady_vo-1.csv", index_col="Číslo závady",
                       parse_dates=["Datum nahlášení závady"],
                       dayfirst=True)
data
Out[4]:
EC_SVE EČ objektu Katastr Ulice Sektor závady Rok závady Datum nahlášení závady Typ závady Plánovaný termín opravy Stav opravy Způsob opravy Datum opravy
Číslo závady
1 S-1148-011 Z-500 Řečkovice TEREZY NOVÁKOVÉ Brno - západ 2 016 2016-01-01 Z vypadený jistící prvek 8.1.2016 Definitivní vypadený jistící prvek 4.1.2016
2 S-1148-012 NaN Řečkovice TEREZY NOVÁKOVÉ Brno - západ 2 016 2016-01-01 S svítidlo-nesvítí 8.1.2016 Definitivní neopraveno 4.1.2016
3 S-1456-012 NaN Zábrdovice ŠPITÁLKA Brno - východ 2 016 2016-01-02 S svítidlo-bliká 9.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
4 S-1256-217 NaN Komín VESLAŘSKÁ Brno - západ 2 016 2016-01-02 S svítidlo-nesvítí 9.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
5 S-0478-003 Z-612 Staré Brno KOPEČNÁ Brno - východ 2 016 2016-01-02 Z vypadený jistící prvek 9.1.2016 Definitivní vypadený jistící prvek 4.1.2016
6 S-0703-001 R-0703-002 Starý Lískovec MÁCHALOVA Brno - západ 2 016 2016-01-02 S svítidlo-nesvítí 9.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
7 S-1257-019 Z-547 Veveří VEVEŘÍ Brno - východ 2 016 2016-01-02 SO nekomunikuje čip 9.1.2016 Definitivní při kontrole vše v pořádku 3.1.2016
8 S-0687-129 NaN Město Brno MORAVSKÉ NÁMĚSTÍ Brno - východ 2 016 2016-01-02 S svítidlo-nesvítí 9.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
9 S-1202-005 Z-518 Bosonohy U SMYČKY Brno - západ 2 016 2016-01-02 Z vypadený jistící prvek 9.1.2016 Definitivní vypadený jistící prvek 2.1.2016
10 S-0305-013 NaN Bosonohy HOŠTICKÁ Brno - západ 2 016 2016-01-02 S stožár-poškozen 9.1.2016 Definitivní není v majetku TsB 2.1.2016
11 S-0942-016 Z-425 Ivanovice PŘÍJEZDOVÁ Brno - západ 2 016 2016-01-02 Z vybitá PLC baterie 9.1.2016 Definitivní Z výměna baterie 4.1.2016
12 S-1485-038 Z-531 Stránice ÚVOZ Brno - východ 2 016 2016-01-03 SO nekomunikuje čip 10.1.2016 Definitivní jiná závada 4.1.2016
13 S-1179-133 Z-627 Slatina TUŘANKA Brno - východ 2 016 2016-01-03 Z vybitá PLC baterie 10.1.2016 Definitivní Z výměna baterie 4.1.2016
14 S-1269-049 NaN Slatina VLNITÁ Brno - východ 2 016 2016-01-03 S svítidlo-bliká 10.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
15 S-0375-191 Z-186 Nový Lískovec JIHLAVSKÁ Brno - západ 2 016 2016-01-03 Z vypnuta regulace, viz.poznámka 10.1.2016 Definitivní jiná závada 4.1.2016
16 S-1360-009 NaN Maloměřice ZIMNÍ Brno - východ 2 016 2016-01-03 S svítidlo-bliká 10.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
17 S-1360-008 NaN Maloměřice ZIMNÍ Brno - východ 2 016 2016-01-03 S svítidlo-bliká 10.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
18 S-1204-034 NaN Kohoutovice U VELKÉ CENY Brno - západ 2 016 2016-01-03 S svítidlo-bliká 10.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
19 S-0652-077 NaN Staré Brno MENDLOVO NÁMĚSTÍ Brno - východ 2 016 2016-01-03 S svítidlo-nesvítí 10.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
20 S-0455-038 Z-619 Královo Pole KOCIÁNKA Brno - východ 2 016 2016-01-04 Z vypadený jistící prvek 11.1.2016 Definitivní vypadený jistící prvek 4.1.2016
21 S-0527-003 Z-236 Žabovřesky KRÁLOVA Brno - západ 2 016 2016-01-04 Z vybitá PLC baterie 11.1.2016 Definitivní Z výměna baterie 4.1.2016
22 S-0808-035 Z-357 Židenice OTAKARA ŠEVČÍKA Brno - východ 2 016 2016-01-04 viz. poznámka 11.1.2016 Definitivní jiná závada 4.1.2016
23 S-0526-036 Z-035 Starý Lískovec KRYMSKÁ Brno - západ 2 016 2016-01-04 viz. poznámka 11.1.2016 Definitivní při kontrole vše v pořádku 5.1.2016
24 S-1354-003 NaN Žabovřesky ZEMKOVA Brno - západ 2 016 2016-01-04 S svítidlo-nesvítí 11.1.2016 Definitivní vypadený jistící prvek 5.1.2016
25 S-1259-003 NaN Židenice VINAŘICKÉHO Brno - východ 2 016 2016-01-04 S svítidlo-bliká 11.1.2016 Definitivní S výměna světelného zdroje 5.1.2016
26 S-0831-019 NaN Staré Brno PELLICOVA Brno - východ 2 016 2016-01-04 S svítidlo-nesvítí 11.1.2016 Definitivní S výměna světelného zdroje 5.1.2016
27 S-0421-007 R-0421-002 Stránice KAMPELÍKOVA Brno - západ 2 016 2016-01-04 S svítidlo-nesvítí 11.1.2016 Definitivní S výměna světelného zdroje 5.1.2016
28 S-0808-034 Z-357 Židenice OTAKARA ŠEVČÍKA Brno - východ 2 016 2016-01-04 Z vypnuta regulace, viz.poznámka 11.1.2016 Definitivní Z regulace seřízena 5.1.2016
29 S-0579-005 Z-261 Stránice LERCHOVA Brno - západ 2 016 2016-01-04 Z vybitá PLC baterie 11.1.2016 Definitivní Z výměna baterie 6.1.2016
30 S-1187-017 R-1187-002 Veveří TŮMOVA Brno - západ 2 016 2016-01-04 S svítidlo-nesvítí 11.1.2016 Definitivní S výměna světelného zdroje 5.1.2016
... ... ... ... ... ... ... ... ... ... ... ... ...
2 641 S-1070-036 R-1070-007 Lesná SOBĚŠICKÁ Brno - východ 2 016 2016-12-27 R poškozen 3.1.2017 Provizorní vandalizmus 27.12.2016
2 642 S-0560-054 NaN Trnitá KŘENOVÁ Brno - východ 2 016 2016-12-27 S svítidlo-bliká 3.1.2017 Definitivní S výměna světelného zdroje 3.1.2017
2 643 S-0271-001 R-0271-001 Černá Pole HELFERTOVA Brno - východ 2 016 2016-12-27 R poškozen 3.1.2017 Provizorní R oprava RS 27.12.2016
2 644 S-0770-067 R-0770-008 Černá Pole NÁM. SNP Brno - východ 2 016 2016-12-27 R poškozen 3.1.2017 Provizorní vandalizmus 28.12.2016
2 645 S-0066-001 Z-034 Řečkovice BOSKOVICKÁ Brno - západ 2 016 2016-12-27 Z vypadený jistící prvek 3.1.2017 Definitivní vypadený jistící prvek 27.12.2016
2 646 S-0956-008 Z-428 Bystrc RAKOVECKÁ Brno - západ 2 016 2016-12-27 Z vypadený jistící prvek 3.1.2017 Definitivní oprava volného vedení 28.12.2016
2 647 S-1438-009 Z-480 Bosonohy ŠEVČENKOVA Brno - západ 2 016 2016-12-27 Z vypadený jistící prvek 3.1.2017 Definitivní oprava volného vedení 28.12.2016
2 648 S-1202-006 Z-518 Bosonohy U SMYČKY Brno - západ 2 016 2016-12-27 Z vypadený jistící prvek 3.1.2017 Definitivní oprava volného vedení 28.12.2016
2 649 S-1343-035 NaN Dvorska ZAPLETALOVA Brno - východ 2 016 2016-12-28 viz. poznámka 4.1.2017 Definitivní jiná závada 28.12.2016
2 650 S-0175-001 NaN Husovice DUKELSKÁ TŘÍDA Brno - východ 2 016 2016-12-28 viz. poznámka 4.1.2017 Definitivní havárie 28.12.2016
2 651 S-0066-001 Z-034 Řečkovice BOSKOVICKÁ Brno - západ 2 016 2016-12-28 Z vypadený jistící prvek 4.1.2017 Definitivní S výměna světelného zdroje 29.12.2016
2 652 S-1496-022 Z-075 Bohunice DLOUHÁ Brno - západ 2 016 2016-12-28 Z vypnuta regulace, viz.poznámka 4.1.2017 Definitivní Z regulace zapnuta 29.12.2016
2 653 S-0802-007 Z-347 Město Brno ORLÍ Brno - východ 2 016 2016-12-28 Z vybitá PLC baterie 4.1.2017 Definitivní Z výměna baterie 29.12.2016
2 654 S-1000-019 Z-513 Medlánky RYSOVA Brno - západ 2 016 2016-12-29 Z vybitá PLC baterie 5.1.2017 Definitivní Z výměna baterie 29.12.2016
2 655 S-0169-060 Z-082 Černá Pole DROBNÉHO Brno - východ 2 016 2016-12-29 Z vybitá PLC baterie 5.1.2017 Definitivní Z výměna baterie 30.12.2016
2 656 S-1225-009 Z-533 Bohunice UZBECKÁ Brno - západ 2 016 2016-12-29 Z vybitá záložní baterie 5.1.2017 Definitivní Z výměna baterie 2.1.2017
2 657 S-1098-022 NaN Židenice STARÁ OSADA Brno - východ 2 016 2016-12-29 S svítidlo-nesvítí 5.1.2017 Definitivní S výměna světelného zdroje 5.1.2017
2 658 S-1269-013 NaN Slatina VLNITÁ Brno - východ 2 016 2016-12-29 S svítidlo-nesvítí 5.1.2017 Definitivní S výměna světelného zdroje 2.1.2017
2 659 S-0375-135 Z-187 Bohunice JIHLAVSKÁ Brno - západ 2 016 2016-12-29 Z vypnuta regulace, viz.poznámka 5.1.2017 Definitivní při kontrole vše v pořádku 6.1.2017
2 660 S-0345-005 NaN Město Brno JAKUBSKÉ NÁMĚSTÍ Brno - východ 2 016 2016-12-29 S svítidlo-nesvítí 5.1.2017 Definitivní S výměna světelného zdroje 14.1.2017
2 661 S-1352-022 NaN Město Brno ZELNÝ TRH Brno - východ 2 016 2016-12-29 S svítidlo-nesvítí 5.1.2017 Definitivní S výměna světelného zdroje 4.1.2017
2 662 S-0265-006 Z-628 Černovice HAVRANÍ Brno - východ 2 016 2016-12-30 Z vybitá PLC baterie 6.1.2017 Definitivní Z výměna baterie 2.1.2017
2 663 S-1092-002 Z-459 Královo Pole SRBSKÁ Brno - západ 2 016 2016-12-30 Z vybitá PLC baterie 6.1.2017 Definitivní Z výměna baterie 2.1.2017
2 664 S-0786-017 NaN Bohunice OKROUHLÁ Brno - západ 2 016 2016-12-30 S patice-poškozena, chybí 6.1.2017 Definitivní S montáž patice 3.1.2017
2 665 S-0476-005 R-0476-002 Líšeň KONRADOVA Brno - východ 2 016 2016-12-30 R poškozen 6.1.2017 Provizorní provizorní zajištění živých částí 5.1.2017
2 666 S-1549-083 NaN Bystrc OBVODOVÁ Brno - západ 2 016 2016-12-30 S svítidlo-nesvítí 6.1.2017 Definitivní S výměna světelného zdroje 2.1.2017
2 667 S-1339-004 R-1339-001 Líšeň ZAHRADNÍ Brno - východ 2 016 2016-12-30 S svítidlo-bliká 6.1.2017 Definitivní S výměna světelného zdroje 3.1.2017
2 668 S-0530-010 NaN Židenice KRÁSNÉHO Brno - východ 2 016 2016-12-30 S svítidlo-bliká 6.1.2017 Definitivní S výměna světelného zdroje 4.1.2017
2 669 S-0880-020 NaN Líšeň POHANKOVA Brno - východ 2 016 2016-12-31 S svítidlo-nesvítí 7.1.2017 Definitivní S výměna světelného zdroje 3.1.2017
2 670 S-1180-001 NaN Tuřany TUŘANSKÉ NÁMĚSTÍ Brno - východ 2 016 2016-12-31 S svítidlo-nesvítí 7.1.2017 Definitivní S výměna světelného zdroje 4.1.2017

2669 rows × 12 columns

Můžeme si nechat data popsat:

In [12]:
data.describe()
Out[12]:
EC_SVE EČ objektu Katastr Ulice Sektor závady Rok závady Datum nahlášení závady Typ závady Plánovaný termín opravy Stav opravy Způsob opravy Datum opravy
count 2666 1458 2669 2669 2669 2669 2669 2669 2669 2669 2668 2669
unique 1899 512 48 782 2 1 363 31 363 2 53 341
top S-1714-161 Z-531 Město Brno MERHAUTOVA Brno - východ 2 016 2016-04-02 00:00:00 S svítidlo-nesvítí 9.4.2016 Definitivní S výměna světelného zdroje 15.9.2016
freq 13 20 263 38 1502 2669 24 601 24 2589 665 28
first NaN NaN NaN NaN NaN NaN 2016-01-01 00:00:00 NaN NaN NaN NaN NaN
last NaN NaN NaN NaN NaN NaN 2016-12-31 00:00:00 NaN NaN NaN NaN NaN

Nebo si taky můžeme nechat vykreslit graf. Osa x je daná indexem, na ose y je vybraný sloupec. Datum je v našich datech jediný sloupec, kde dává trochu smysl vykreslovat graf.

In [14]:
data["Datum nahlášení závady"].plot()
Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f30dca2a470>

Můžeme si taky vybrat jenom určitou podmnožinu dat. Třeba prvních pět řádků.

In [15]:
data[:5]
Out[15]:
EC_SVE EČ objektu Katastr Ulice Sektor závady Rok závady Datum nahlášení závady Typ závady Plánovaný termín opravy Stav opravy Způsob opravy Datum opravy
Číslo závady
1 S-1148-011 Z-500 Řečkovice TEREZY NOVÁKOVÉ Brno - západ 2 016 2016-01-01 Z vypadený jistící prvek 8.1.2016 Definitivní vypadený jistící prvek 4.1.2016
2 S-1148-012 NaN Řečkovice TEREZY NOVÁKOVÉ Brno - západ 2 016 2016-01-01 S svítidlo-nesvítí 8.1.2016 Definitivní neopraveno 4.1.2016
3 S-1456-012 NaN Zábrdovice ŠPITÁLKA Brno - východ 2 016 2016-01-02 S svítidlo-bliká 9.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
4 S-1256-217 NaN Komín VESLAŘSKÁ Brno - západ 2 016 2016-01-02 S svítidlo-nesvítí 9.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
5 S-0478-003 Z-612 Staré Brno KOPEČNÁ Brno - východ 2 016 2016-01-02 Z vypadený jistící prvek 9.1.2016 Definitivní vypadený jistící prvek 4.1.2016

Nebo jenom jeden sloupec z prvních pěti řádků:

In [16]:
data["Katastr"][:5]
Out[16]:
Číslo závady
1     Řečkovice
2     Řečkovice
3    Zábrdovice
4         Komín
5    Staré Brno
Name: Katastr, dtype: object

Můžeme vybrat několik sloupců:

In [17]:
data[["Ulice", "Katastr"]]
Out[17]:
Ulice Katastr
Číslo závady
1 TEREZY NOVÁKOVÉ Řečkovice
2 TEREZY NOVÁKOVÉ Řečkovice
3 ŠPITÁLKA Zábrdovice
4 VESLAŘSKÁ Komín
5 KOPEČNÁ Staré Brno
6 MÁCHALOVA Starý Lískovec
7 VEVEŘÍ Veveří
8 MORAVSKÉ NÁMĚSTÍ Město Brno
9 U SMYČKY Bosonohy
10 HOŠTICKÁ Bosonohy
11 PŘÍJEZDOVÁ Ivanovice
12 ÚVOZ Stránice
13 TUŘANKA Slatina
14 VLNITÁ Slatina
15 JIHLAVSKÁ Nový Lískovec
16 ZIMNÍ Maloměřice
17 ZIMNÍ Maloměřice
18 U VELKÉ CENY Kohoutovice
19 MENDLOVO NÁMĚSTÍ Staré Brno
20 KOCIÁNKA Královo Pole
21 KRÁLOVA Žabovřesky
22 OTAKARA ŠEVČÍKA Židenice
23 KRYMSKÁ Starý Lískovec
24 ZEMKOVA Žabovřesky
25 VINAŘICKÉHO Židenice
26 PELLICOVA Staré Brno
27 KAMPELÍKOVA Stránice
28 OTAKARA ŠEVČÍKA Židenice
29 LERCHOVA Stránice
30 TŮMOVA Veveří
... ... ...
2 641 SOBĚŠICKÁ Lesná
2 642 KŘENOVÁ Trnitá
2 643 HELFERTOVA Černá Pole
2 644 NÁM. SNP Černá Pole
2 645 BOSKOVICKÁ Řečkovice
2 646 RAKOVECKÁ Bystrc
2 647 ŠEVČENKOVA Bosonohy
2 648 U SMYČKY Bosonohy
2 649 ZAPLETALOVA Dvorska
2 650 DUKELSKÁ TŘÍDA Husovice
2 651 BOSKOVICKÁ Řečkovice
2 652 DLOUHÁ Bohunice
2 653 ORLÍ Město Brno
2 654 RYSOVA Medlánky
2 655 DROBNÉHO Černá Pole
2 656 UZBECKÁ Bohunice
2 657 STARÁ OSADA Židenice
2 658 VLNITÁ Slatina
2 659 JIHLAVSKÁ Bohunice
2 660 JAKUBSKÉ NÁMĚSTÍ Město Brno
2 661 ZELNÝ TRH Město Brno
2 662 HAVRANÍ Černovice
2 663 SRBSKÁ Královo Pole
2 664 OKROUHLÁ Bohunice
2 665 KONRADOVA Líšeň
2 666 OBVODOVÁ Bystrc
2 667 ZAHRADNÍ Líšeň
2 668 KRÁSNÉHO Židenice
2 669 POHANKOVA Líšeň
2 670 TUŘANSKÉ NÁMĚSTÍ Tuřany

2669 rows × 2 columns

Základní analýza pro sloupce s řetězci může mýt spočítání četností: kolikrát se která hodnota ve sloupci objevuje. Zjistíme 10 ulic s nejvíce poruchami:

In [19]:
data["Ulice"].value_counts()[:10]
Out[19]:
MERHAUTOVA          38
LIBUŠINA TŘÍDA      32
VÍDEŇSKÁ            31
MORAVSKÉ NÁMĚSTÍ    29
OSTRAVSKÁ           28
JIHLAVSKÁ           28
ÚVOZ                24
ČESKÁ               22
HRADECKÁ            22
VESLAŘSKÁ           21
Name: Ulice, dtype: int64

Tato data můžeme zase vykreslit do grafu. Výchozí čárový graf tady není vhodný, proto radši použijeme sloupcový graf (v horizontální variantě).

In [24]:
data["Ulice"].value_counts()[:10].plot(kind="barh", figsize=(15,8))
Out[24]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f30dc7eae48>

Podmnožinu dat můžeme vybrat stejným způsobem jako v numpy pomocí pravdivostního výrazu. Nejpreve najdeme všechny řádky, které mají daný typ poruchy, a potom si vybereme pouze tyto řádky.

In [35]:
blikajici = data[ data["Typ závady"] == "S svítidlo-bliká" ]
blikajici
Out[35]:
EC_SVE EČ objektu Katastr Ulice Sektor závady Rok závady Datum nahlášení závady Typ závady Plánovaný termín opravy Stav opravy Způsob opravy Datum opravy
Číslo závady
3 S-1456-012 NaN Zábrdovice ŠPITÁLKA Brno - východ 2 016 2016-01-02 S svítidlo-bliká 9.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
14 S-1269-049 NaN Slatina VLNITÁ Brno - východ 2 016 2016-01-03 S svítidlo-bliká 10.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
16 S-1360-009 NaN Maloměřice ZIMNÍ Brno - východ 2 016 2016-01-03 S svítidlo-bliká 10.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
17 S-1360-008 NaN Maloměřice ZIMNÍ Brno - východ 2 016 2016-01-03 S svítidlo-bliká 10.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
18 S-1204-034 NaN Kohoutovice U VELKÉ CENY Brno - západ 2 016 2016-01-03 S svítidlo-bliká 10.1.2016 Definitivní S výměna světelného zdroje 4.1.2016
25 S-1259-003 NaN Židenice VINAŘICKÉHO Brno - východ 2 016 2016-01-04 S svítidlo-bliká 11.1.2016 Definitivní S výměna světelného zdroje 5.1.2016
35 S-0625-011 NaN Řečkovice MARIE HÜBNEROVÉ Brno - západ 2 016 2016-01-05 S svítidlo-bliká 12.1.2016 Definitivní S výměna svítidla 18.1.2016
50 S-1261-091 R-1261-008 Židenice VINIČNÍ Brno - východ 2 016 2016-01-07 S svítidlo-bliká 14.1.2016 Definitivní S výměna světelného zdroje 21.3.2016
52 S-0404-006 NaN Chrlice K LÁZINKÁM Brno - východ 2 016 2016-01-08 S svítidlo-bliká 15.1.2016 Definitivní S výměna světelného zdroje 11.1.2016
83 S-0775-001 NaN Líšeň OBECKÁ Brno - východ 2 016 2016-01-11 S svítidlo-bliká 18.1.2016 Definitivní S výměna světelného zdroje 13.1.2016
90 S-0446-008 NaN Komárov KLÁŠTERSKÉHO Brno - východ 2 016 2016-01-12 S svítidlo-bliká 19.1.2016 Definitivní S výměna světelného zdroje 15.1.2016
95 S-0159-006 NaN Žabovřesky DOLEŽALOVA Brno - západ 2 016 2016-01-12 S svítidlo-bliká 19.1.2016 Definitivní S výměna světelného zdroje 13.1.2016
98 S-0507-003 NaN Řečkovice KOŘENSKÉHO Brno - západ 2 016 2016-01-13 S svítidlo-bliká 20.1.2016 Definitivní S výměna světelného zdroje 13.1.2016
99 S-0507-002 NaN Řečkovice KOŘENSKÉHO Brno - západ 2 016 2016-01-13 S svítidlo-bliká 20.1.2016 Definitivní S výměna světelného zdroje 13.1.2016
109 S-1058-003 NaN Komárov SLUNNÁ Brno - východ 2 016 2016-01-13 S svítidlo-bliká 20.1.2016 Definitivní S výměna světelného zdroje 15.1.2016
119 S-0731-004 NaN Lesná NARCISOVÁ Brno - východ 2 016 2016-01-14 S svítidlo-bliká 21.1.2016 Definitivní S výměna světelného zdroje 15.1.2016
126 S-1307-005 NaN Židenice VÁPENKA Brno - východ 2 016 2016-01-15 S svítidlo-bliká 22.1.2016 Definitivní S výměna světelného zdroje 18.1.2016
130 S-0134-002 NaN Líšeň CHMELNICE Brno - východ 2 016 2016-01-17 S svítidlo-bliká 24.1.2016 Definitivní S výměna světelného zdroje 19.1.2016
137 S-0883-009 NaN Štýřice POLNÍ Brno - západ 2 016 2016-01-18 S svítidlo-bliká 25.1.2016 Definitivní S výměna světelného zdroje 18.1.2016
142 S-1575-015 NaN Líšeň SEDLÁČKOVA Brno - východ 2 016 2016-01-18 S svítidlo-bliká 25.1.2016 Definitivní S výměna světelného zdroje 19.1.2016
163 S-1120-005 NaN Líšeň STŘELNICE Brno - východ 2 016 2016-01-20 S svítidlo-bliká 27.1.2016 Definitivní S výměna světelného zdroje 21.1.2016
170 S-0739-006 NaN Husovice NETUŠILOVA Brno - východ 2 016 2016-01-21 S svítidlo-bliká 28.1.2016 Definitivní S výměna světelného zdroje 22.1.2016
177 S-1020-005 R-1020-006 Stránice SEDLÁKOVA Brno - západ 2 016 2016-01-22 S svítidlo-bliká 29.1.2016 Definitivní S výměna světelného zdroje 25.1.2016
190 S-0504-017 NaN Královo Pole KOŠINOVA Brno - západ 2 016 2016-01-25 S svítidlo-bliká 1.2.2016 Definitivní S výměna světelného zdroje 26.1.2016
209 S-0113-010 NaN Černá Pole BŘENKOVA Brno - východ 2 016 2016-01-27 S svítidlo-bliká 3.2.2016 Definitivní S výměna světelného zdroje 27.1.2016
212 S-1100-011 NaN Ponava STAŇKOVA Brno - západ 2 016 2016-01-27 S svítidlo-bliká 3.2.2016 Definitivní S výměna světelného zdroje 28.1.2016
216 S-0022-006 NaN Židenice BALBÍNOVA Brno - východ 2 016 2016-01-27 S svítidlo-bliká 3.2.2016 Definitivní S výměna světelného zdroje 28.1.2016
218 S-0763-015 NaN Město Brno NÁM. SVOBODY Brno - východ 2 016 2016-01-28 S svítidlo-bliká 4.2.2016 Definitivní S výměna světelného zdroje 28.1.2016
226 S-0060-034 NaN Stránice BOHUSLAVA MARTINŮ Brno - západ 2 016 2016-01-28 S svítidlo-bliká 4.2.2016 Definitivní S výměna světelného zdroje 29.1.2016
233 S-0866-014 NaN Komín PODLESÍ Brno - západ 2 016 2016-01-29 S svítidlo-bliká 5.2.2016 Definitivní S výměna světelného zdroje 1.2.2016
... ... ... ... ... ... ... ... ... ... ... ... ...
2 419 S-1049-022 NaN Slatina SLAVKOVSKÁ Brno - východ 2 016 2016-11-30 S svítidlo-bliká 7.12.2016 Definitivní S výměna světelného zdroje 20.12.2016
2 464 S-1043-004 NaN Komárov SLADKÉHO Brno - východ 2 016 2016-12-05 S svítidlo-bliká 12.12.2016 Definitivní S výměna světelného zdroje 21.12.2016
2 471 S-1141-007 NaN Zábrdovice SÝPKA Brno - východ 2 016 2016-12-05 S svítidlo-bliká 12.12.2016 Definitivní S výměna světelného zdroje 12.12.2016
2 476 S-1731-042 NaN Útěchov u Brna VE VILKÁCH Brno - východ 2 016 2016-12-06 S svítidlo-bliká 13.12.2016 Definitivní S výměna světelného zdroje 12.12.2016
2 479 S-1253-010 NaN Husovice VENHUDOVA Brno - východ 2 016 2016-12-06 S svítidlo-bliká 13.12.2016 Definitivní S výměna zapalovače 12.12.2016
2 485 S-0577-006 NaN Jehnice LELEKOVICKÁ Brno - západ 2 016 2016-12-07 S svítidlo-bliká 14.12.2016 Definitivní S výměna světelného zdroje 8.12.2016
2 488 S-1160-011 R-1160-002 Žabovřesky TOPOLKY Brno - západ 2 016 2016-12-07 S svítidlo-bliká 14.12.2016 Definitivní S výměna světelného zdroje 8.12.2016
2 490 S-0627-020 NaN Lesná MARIE MAJEROVÉ Brno - východ 2 016 2016-12-07 S svítidlo-bliká 14.12.2016 Definitivní S výměna světelného zdroje 12.12.2016
2 522 S-0304-035 NaN Líšeň HOUBALOVA Brno - východ 2 016 2016-12-11 S svítidlo-bliká 18.12.2016 Definitivní S výměna světelného zdroje 16.12.2016
2 525 S-0589-006 NaN Lesná LILIOVÁ Brno - východ 2 016 2016-12-12 S svítidlo-bliká 19.12.2016 Definitivní S výměna světelného zdroje 6.3.2017
2 526 S-0079-035 NaN Řečkovice BRATŘÍ KŘIČKŮ Brno - západ 2 016 2016-12-12 S svítidlo-bliká 19.12.2016 Definitivní S výměna světelného zdroje 13.12.2016
2 534 S-1538-048 NaN Nový Lískovec KONIKLECOVÁ Brno - západ 2 016 2016-12-13 S svítidlo-bliká 20.12.2016 Definitivní S výměna světelného zdroje 14.12.2016
2 536 S-0899-042 NaN Žabovřesky POZNAŇSKÁ Brno - západ 2 016 2016-12-13 S svítidlo-bliká 20.12.2016 Definitivní S výměna světelného zdroje 14.12.2016
2 539 S-0079-013 R-0079-006 Řečkovice BRATŘÍ KŘIČKŮ Brno - západ 2 016 2016-12-13 S svítidlo-bliká 20.12.2016 Definitivní S výměna světelného zdroje 14.12.2016
2 541 S-0056-005 NaN Líšeň BODLÁKOVA Brno - východ 2 016 2016-12-13 S svítidlo-bliká 20.12.2016 Definitivní S výměna světelného zdroje 20.12.2016
2 546 S-1851-011 NaN Soběšice KLARISKY Brno - východ 2 016 2016-12-14 S svítidlo-bliká 21.12.2016 Definitivní S výměna světelného zdroje 19.1.2017
2 551 S-1032-015 NaN Židenice SKORKOVSKÉHO Brno - východ 2 016 2016-12-15 S svítidlo-bliká 22.12.2016 Definitivní S výměna světelného zdroje 20.12.2016
2 554 S-0222-004 NaN Stránice FRANTIŠKY STRÁNECKÉ Brno - západ 2 016 2016-12-15 S svítidlo-bliká 22.12.2016 Definitivní S výměna světelného zdroje 16.12.2016
2 555 S-0891-001 NaN Dolní Heršpice POPLUŽNÍ Brno - východ 2 016 2016-12-15 S svítidlo-bliká 22.12.2016 Definitivní S výměna světelného zdroje 21.12.2016
2 561 S-0775-006 NaN Líšeň OBECKÁ Brno - východ 2 016 2016-12-15 S svítidlo-bliká 22.12.2016 Definitivní S výměna světelného zdroje 21.12.2016
2 573 S-0398-005 R-0398-003 Město Brno JÁNSKÁ Brno - východ 2 016 2016-12-17 S svítidlo-bliká 24.12.2016 Definitivní S výměna světelného zdroje 21.12.2016
2 577 S-1484-023 NaN Soběšice ÚTĚCHOVSKÁ Brno - východ 2 016 2016-12-17 S svítidlo-bliká 24.12.2016 Definitivní S výměna světelného zdroje 19.12.2016
2 582 S-0789-051 NaN Černovice OLOMOUCKÁ Brno - východ 2 016 2016-12-17 S svítidlo-bliká 24.12.2016 Definitivní při kontrole vše v pořádku 22.12.2016
2 591 S-1076-008 NaN Jundrov SOSNOVÁ Brno - západ 2 016 2016-12-19 S svítidlo-bliká 26.12.2016 Definitivní S výměna světelného zdroje 20.12.2016
2 593 S-0594-044 NaN Lesná LOOSOVA Brno - východ 2 016 2016-12-19 S svítidlo-bliká 26.12.2016 Definitivní S výměna světelného zdroje 23.12.2016
2 601 S-0386-059 NaN Líšeň JOSEFY FAIMONOVÉ Brno - východ 2 016 2016-12-20 S svítidlo-bliká 27.12.2016 Definitivní S výměna světelného zdroje 22.12.2016
2 606 S-0051-003 R-0051-001 Černovice BLATOUCHOVÁ Brno - východ 2 016 2016-12-21 S svítidlo-bliká 28.12.2016 Definitivní S výměna světelného zdroje 22.12.2016
2 642 S-0560-054 NaN Trnitá KŘENOVÁ Brno - východ 2 016 2016-12-27 S svítidlo-bliká 3.1.2017 Definitivní S výměna světelného zdroje 3.1.2017
2 667 S-1339-004 R-1339-001 Líšeň ZAHRADNÍ Brno - východ 2 016 2016-12-30 S svítidlo-bliká 6.1.2017 Definitivní S výměna světelného zdroje 3.1.2017
2 668 S-0530-010 NaN Židenice KRÁSNÉHO Brno - východ 2 016 2016-12-30 S svítidlo-bliká 6.1.2017 Definitivní S výměna světelného zdroje 4.1.2017

278 rows × 12 columns

Na této podmnožině můžeme zase spočítat četnosti:

In [36]:
pocty_blikajicich = blikajici["Katastr"].value_counts()
pocty_blikajicich
Out[36]:
Židenice              28
Líšeň                 26
Černá Pole            18
Řečkovice             17
Lesná                 15
Město Brno            14
Královo Pole          13
Žabovřesky            12
Veveří                12
Husovice              12
Zábrdovice             8
Komín                  8
Bystrc                 8
Slatina                7
Štýřice                6
Staré Brno             6
Černovice              5
Stránice               5
Kohoutovice            5
Chrlice                5
Komárov                5
Bosonohy               4
Jundrov                3
Starý Lískovec         3
Bohunice               3
Ponava                 3
Útěchov u Brna         3
Medlánky               2
Kníničky               2
Soběšice               2
Obřany                 2
Žebětín                2
Ořešín                 2
Brněnské Ivanovice     2
Maloměřice             2
Trnitá                 2
Sadová                 1
Horní Heršpice         1
Jehnice                1
Nový Lískovec          1
Dolní Heršpice         1
Pisárky                1
Name: Katastr, dtype: int64

Co třeba zkusit zjistit, ve kterém katastru je nejvíce hlášených blikajících světel v poměru k ostatním poruchám?

In [37]:
celkove_pocty = data["Katastr"].value_counts()
pomery = pocty_blikajicich / celkove_pocty
pomery = pomery.dropna().sort_values(ascending=False)
pomery
Out[37]:
Útěchov u Brna        0.428571
Ořešín                0.400000
Sadová                0.333333
Chrlice               0.333333
Kníničky              0.333333
Husovice              0.250000
Řečkovice             0.223684
Líšeň                 0.214876
Bosonohy              0.210526
Zábrdovice            0.177778
Veveří                0.166667
Brněnské Ivanovice    0.166667
Židenice              0.160920
Soběšice              0.142857
Lesná                 0.128205
Černá Pole            0.127660
Ponava                0.120000
Žabovřesky            0.118812
Žebětín               0.100000
Medlánky              0.100000
Jundrov               0.096774
Obřany                0.095238
Královo Pole          0.091549
Dolní Heršpice        0.090909
Bystrc                0.089888
Komárov               0.089286
Stránice              0.086207
Komín                 0.082474
Štýřice               0.081081
Staré Brno            0.077922
Jehnice               0.071429
Černovice             0.070423
Trnitá                0.066667
Kohoutovice           0.057471
Město Brno            0.053232
Maloměřice            0.052632
Starý Lískovec        0.052632
Slatina               0.052632
Horní Heršpice        0.037037
Bohunice              0.029412
Nový Lískovec         0.017241
Pisárky               0.016393
Name: Katastr, dtype: float64

Tato data opět můžeme dostat do grafu:

In [38]:
pomery.plot(kind="bar", figsize=(15,5))
Out[38]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fe5e69e19b0>

Můžeme zkusit zjistit, jestli je nějaký den, kdy je hlášeno více poruch než v jiné dny. Pro jednoduchost se omezíme na jeden katastr.

Začneme výběrem podmnožiny dat.

In [39]:
slatina = data[data["Katastr"] == "Slatina"]
slatina = slatina[["Katastr", "Ulice", "Datum nahlášení závady"]]
slatina
Out[39]:
Katastr Ulice Datum nahlášení závady
Číslo závady
13 Slatina TUŘANKA 2016-01-03
14 Slatina VLNITÁ 2016-01-03
39 Slatina POMEZNÍ 2016-01-06
55 Slatina HVIEZDOSLAVOVA 2016-01-08
56 Slatina V NOVÉ ČTVRTI 2016-01-08
57 Slatina POMEZNÍ 2016-01-08
89 Slatina ŘÍPSKÁ 2016-01-12
104 Slatina V NOVÉ ČTVRTI 2016-01-13
105 Slatina POMEZNÍ 2016-01-13
106 Slatina V NOVÉ ČTVRTI 2016-01-13
107 Slatina HVIEZDOSLAVOVA 2016-01-13
120 Slatina HVIEZDOSLAVOVA 2016-01-14
150 Slatina HVIEZDOSLAVOVA 2016-01-19
166 Slatina VLNITÁ 2016-01-20
175 Slatina OSTRAVSKÁ 2016-01-22
179 Slatina HVIEZDOSLAVOVA 2016-01-22
180 Slatina POMEZNÍ 2016-01-22
247 Slatina TILHONOVA 2016-02-01
318 Slatina TUŘANKA 2016-02-14
376 Slatina OSTRAVSKÁ 2016-02-19
381 Slatina OSTRAVSKÁ 2016-02-19
412 Slatina ROUSÍNOVSKÁ 2016-02-24
432 Slatina MOUTNICKÁ 2016-02-26
436 Slatina TILHONOVA 2016-02-27
468 Slatina PŘEMYSLOVO NÁMĚSTÍ 2016-03-03
486 Slatina BLAŽOVICKÁ 2016-03-05
487 Slatina BLAŽOVICKÁ 2016-03-05
507 Slatina OSTRAVSKÁ 2016-03-09
562 Slatina HVIEZDOSLAVOVA 2016-03-15
564 Slatina ŘÍPSKÁ 2016-03-15
... ... ... ...
1 693 Slatina SLATINKA 2016-09-04
1 699 Slatina ROUSÍNOVSKÁ 2016-09-05
1 705 Slatina MIKULČICKÁ 2016-09-05
1 707 Slatina OSTRAVSKÁ 2016-09-06
1 718 Slatina SLATINKA 2016-09-07
1 758 Slatina PŘEMYSLOVO NÁMĚSTÍ 2016-09-12
1 776 Slatina LANGROVA 2016-09-14
1 800 Slatina OSTRAVSKÁ 2016-09-17
1 809 Slatina ŠMILOVSKÉHO 2016-09-18
1 812 Slatina LANGROVA 2016-09-19
1 841 Slatina POMEZNÍ 2016-09-22
1 846 Slatina POMEZNÍ 2016-09-23
1 847 Slatina HVIEZDOSLAVOVA 2016-09-24
1 852 Slatina HVIEZDOSLAVOVA 2016-09-25
1 859 Slatina POMEZNÍ 2016-09-27
1 867 Slatina HVIEZDOSLAVOVA 2016-09-28
1 869 Slatina HVIEZDOSLAVOVA 2016-09-28
1 886 Slatina HVIEZDOSLAVOVA 2016-09-30
2 076 Slatina LANGROVA 2016-10-21
2 092 Slatina ČERNOVIČKY 2016-10-24
2 100 Slatina PŘEMYSLOVO NÁMĚSTÍ 2016-10-24
2 162 Slatina DĚDICKÁ 2016-11-02
2 192 Slatina MIKULČICKÁ 2016-11-04
2 211 Slatina TILHONOVA 2016-11-07
2 342 Slatina LANGROVA 2016-11-21
2 419 Slatina SLAVKOVSKÁ 2016-11-30
2 556 Slatina MIKULČICKÁ 2016-12-15
2 565 Slatina ŘÍPSKÁ 2016-12-16
2 621 Slatina ŘÍPSKÁ 2016-12-24
2 658 Slatina VLNITÁ 2016-12-29

133 rows × 3 columns

Na začátku jsme si nastavili index na číslo poruchy. Pro tuto analýzu ale bude praktičtější indexovat pomocí data nahlášení poruchy. Index můžeme změnít, takže to můžeme napravit bez nového načítání dat. Nejprve se ale podívejme, jak vypadá index teď.

In [40]:
slatina.index
Out[40]:
Index(['13', '14', '39', '55', '56', '57', '89', '104', '105', '106',
       ...
       '2 100', '2 162', '2 192', '2 211', '2 342', '2 419', '2 556', '2 565',
       '2 621', '2 658'],
      dtype='object', name='Číslo závady', length=133)

Nastavíme nový index a podíváme se na data:

In [11]:
slatina_podle_data = slatina.set_index("Datum nahlášení závady")
slatina_podle_data[:5]
Out[11]:
Katastr Ulice
Datum nahlášení závady
2016-01-03 Slatina TUŘANKA
2016-01-03 Slatina VLNITÁ
2016-01-06 Slatina POMEZNÍ
2016-01-08 Slatina HVIEZDOSLAVOVA
2016-01-08 Slatina V NOVÉ ČTVRTI

I na index samotný.

In [12]:
slatina_podle_data.index
Out[12]:
DatetimeIndex(['2016-01-03', '2016-01-03', '2016-01-06', '2016-01-08',
               '2016-01-08', '2016-01-08', '2016-01-12', '2016-01-13',
               '2016-01-13', '2016-01-13',
               ...
               '2016-10-24', '2016-11-02', '2016-11-04', '2016-11-07',
               '2016-11-21', '2016-11-30', '2016-12-15', '2016-12-16',
               '2016-12-24', '2016-12-29'],
              dtype='datetime64[ns]', name='Datum nahlášení závady', length=133, freq=None)

Pokud je indexem datum, můžeme s ním pracovat a podívat se třeba jenom na den v měsíci:

In [13]:
slatina_podle_data.index.day
Out[13]:
Int64Index([ 3,  3,  6,  8,  8,  8, 12, 13, 13, 13,
            ...
            24,  2,  4,  7, 21, 30, 15, 16, 24, 29],
           dtype='int64', name='Datum nahlášení závady', length=133)

Nebo na den v týdnu. Překvapivě 0 znamená pondělí:

In [54]:
slatina_podle_data.index.weekday
Out[54]:
Int64Index([6, 6, 2, 4, 4, 4, 1, 2, 2, 2,
            ...
            0, 2, 4, 0, 0, 2, 3, 4, 5, 3],
           dtype='int64', name='Datum nahlášení závady', length=133)

Takto získaný den v týdnu si můžeme přidat do datového rámce:

In [14]:
slatina_podle_data.loc[:, "den v týdnu"] = slatina_podle_data.index.weekday
slatina_podle_data[:5]
Out[14]:
Katastr Ulice den v týdnu
Datum nahlášení závady
2016-01-03 Slatina TUŘANKA 6
2016-01-03 Slatina VLNITÁ 6
2016-01-06 Slatina POMEZNÍ 2
2016-01-08 Slatina HVIEZDOSLAVOVA 4
2016-01-08 Slatina V NOVÉ ČTVRTI 4

Pomocí metody groupby můžeme data shlukovat podle hodnot určitého sloupce. Tato metoda vrací objekt reprezentující několik shluků. Nás primárně zajímá, kolik je v každé skupině položek (tedy kolik poruch bylo hlášeno v ten který den).

Další možnosti agregování skupin jsou třeba sum nebo mean. Většina ale dává smysl hlavně pro číselné sloupce.

In [16]:
pocty_podle_dne = slatina_podle_data.groupby("den v týdnu").aggregate("size")
pocty_podle_dne
Out[16]:
den v týdnu
0    17
1    23
2    20
3    14
4    24
5    21
6    14
dtype: int64

Pro snažší čtení by bylo lepší zobrazovat jména dní místo čísel. Můžeme si nastavit nový index čistě pomocí seznamu hodnot:

In [17]:
pocty_podle_dne.index = ["Po", "Út", "St", "Čt", "Pá", "So", "Ne"]
pocty_podle_dne
Out[17]:
Po    17
Út    23
St    20
Čt    14
Pá    24
So    21
Ne    14
dtype: int64

A nakonec vykreslíme graf:

In [63]:
pocty_podle_dne.plot(kind="bar")
Out[63]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f30dc47bbe0>

Mapa

Pro vykreslování map existuje mnoho různých knihoven. Tady si ukážeme geopandas, která má poměrně hezké rozhraní. Její velkou nevýhodou je komplikovaná instalace na Windows.

Nejprve si knohovnu naimportujeme, potom načteme soubor s daty a vybereme pouze Brno.

Dostaneme datový rámec jako v Pandas. Několik posledních sloupců ale obsahuje zajímavé hodnoty. Kromě souřadnic tam najdeme geometry: definici tvaru nějaké oblasti v mapě.

In [22]:
import geopandas
mapa = geopandas.read_file("Městské_obvody_a_městské_části__polygony.shp", encoding="utf-8")
brno = mapa[mapa["NAZ_OBEC"] == "Brno"].copy()
brno.head()
Out[22]:
OBJECTID KOD_MOaMC NAZ_ZKR_MO NAZ_MOaMC KOD_OBEC NAZ_OBEC KOD_ZUJ NAZ_ZUJ KOD_OKRES KOD_LAU1 NAZ_LAU1 KOD_KRAJ KOD_CZNUTS NAZ_CZNUTS SX SY SHAPE_Leng SHAPE_Area geometry
68 69 550973 Brno-střed Brno-střed 582786 Brno 550973 Brno-střed 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -599107.126826 -1.161208e+06 21011.712879 1.464882e+07 POLYGON ((-598972.9499999993 -1159048.82009999...
69 70 550990 Brno-Žabovřesky Brno-Žabovřesky 582786 Brno 550990 Brno-Žabovřesky 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -600420.609804 -1.158450e+06 10865.113284 4.348780e+06 POLYGON ((-600602.1099999994 -1157005.50010000...
70 71 551007 Brno-Královo Pole Brno-Královo Pole 582786 Brno 551007 Brno-Královo Pole 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -598393.224288 -1.157041e+06 18814.138777 1.007402e+07 POLYGON ((-597252.6999999993 -1155051.28999999...
71 72 551031 Brno-sever Brno-sever 582786 Brno 551031 Brno-sever 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -596387.912140 -1.156034e+06 28461.268033 1.224207e+07 POLYGON ((-596552.0500000007 -1152248.35000000...
72 73 551058 Brno-Židenice Brno-Židenice 582786 Brno 551058 Brno-Židenice 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -595306.099433 -1.160699e+06 13108.262329 5.045712e+06 POLYGON ((-594706.5100000016 -1159323.91, -594...

Zkusíme si nakreslit mapu všech brněnských částí:

In [25]:
from matplotlib import pyplot
brno.plot(figsize=(10,10))
Out[25]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fe5e486e978>

To by asi mohlo být Brno. Kdybychom ale měli popisky pro jednotlivé oblasti, možná by to bylo přehlednější. Můžeme si je přidat. Nejprve ale potřebujeme vědět, kam popisek nakreslit. Můžeme si pro každou oblast spočítat vhodný bod, a přidat ho do dat.

In [26]:
brno["coords"] = brno["geometry"].apply(lambda x: x.representative_point().coords[:])
brno["coords"] = [coords[0] for coords in brno["coords"]]

Teď můžeme vykreslit mapu jako předtím, a potom pro každou oblast přidat anotaci:

In [29]:
brno.plot(figsize=(10,10))
for idx, radek in brno.iterrows():
    pyplot.annotate(s=radek["NAZ_MOaMC"], xy=radek["coords"], horizontalalignment="center")

Jako poslední příklad si do mapy zkusíme znázornit, kolik v dané oblasti je hlášeno poruch veřejného osvětlení. Na to budeme muset spočítat, kolik ji vlastně je, a přidat data do rámce s mapovými informace.

Spojování datových rámců je možné jako po řádcích, tak po sloupcích. Pokud chceme spojovat po sloupcích, potřebujeme index, podle kterého se dají poznat stejné řádky. Nastavíme si proto index na název městské části.

In [30]:
brno = brno.set_index("NAZ_MOaMC", drop=False)
brno.head()
Out[30]:
OBJECTID KOD_MOaMC NAZ_ZKR_MO NAZ_MOaMC KOD_OBEC NAZ_OBEC KOD_ZUJ NAZ_ZUJ KOD_OKRES KOD_LAU1 NAZ_LAU1 KOD_KRAJ KOD_CZNUTS NAZ_CZNUTS SX SY SHAPE_Leng SHAPE_Area geometry coords
NAZ_MOaMC
Brno-střed 69 550973 Brno-střed Brno-střed 582786 Brno 550973 Brno-střed 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -599107.126826 -1.161208e+06 21011.712879 1.464882e+07 POLYGON ((-598972.9499999993 -1159048.82009999... (-599089.0881825134, -1161418.7800999992)
Brno-Žabovřesky 70 550990 Brno-Žabovřesky Brno-Žabovřesky 582786 Brno 550990 Brno-Žabovřesky 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -600420.609804 -1.158450e+06 10865.113284 4.348780e+06 POLYGON ((-600602.1099999994 -1157005.50010000... (-600242.0081863957, -1158264.8850999996)
Brno-Královo Pole 71 551007 Brno-Královo Pole Brno-Královo Pole 582786 Brno 551007 Brno-Královo Pole 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -598393.224288 -1.157041e+06 18814.138777 1.007402e+07 POLYGON ((-597252.6999999993 -1155051.28999999... (-598973.9478040718, -1157189.1750499997)
Brno-sever 72 551031 Brno-sever Brno-sever 582786 Brno 551031 Brno-sever 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -596387.912140 -1.156034e+06 28461.268033 1.224207e+07 POLYGON ((-596552.0500000007 -1152248.35000000... (-596332.4486210528, -1156330.1843500007)
Brno-Židenice 73 551058 Brno-Židenice Brno-Židenice 582786 Brno 551058 Brno-Židenice 40711 CZ0642 Brno-město 3115 CZ064 Jihomoravský kraj -595306.099433 -1.160699e+06 13108.262329 5.045712e+06 POLYGON ((-594706.5100000016 -1159323.91, -594... (-595741.415136773, -1160651.2446999997)

Počet poruch v různých katastrech už máme spočítaný. Potřebujeme ale data trochu zpracovat, aby si odpovídaly názvy částí. Bohužel ne každý katastr patří do jediné městské části, takže tady dojde k určitým nepřesnostem.

In [41]:
poruchy = dict(celkove_pocty)
poruchy["Řečkovice a Mokrá Hora"] = poruchy.pop("Řečkovice") + poruchy.pop("Mokrá Hora")
poruchy["Maloměřice a Obřany"] = poruchy.pop("Maloměřice") + poruchy.pop("Obřany")
poruchy["Ivanovice"] = poruchy.pop("Brněnské Ivanovice")
poruchy["střed"] = poruchy.pop("Město Brno") + poruchy.pop("Staré Brno") + poruchy.pop("Štýřice") + poruchy.pop("Veveří") + poruchy.pop("Pisárky") + poruchy.pop("Stránice")
poruchy["Útěchov"] = poruchy.pop("Útěchov u Brna")
poruchy["sever"] = poruchy.pop("Soběšice") + poruchy.pop("Lesná") + poruchy.pop("Husovice") + poruchy.pop("Černá Pole") + poruchy.pop("Zábrdovice")
poruchy["jih"] = poruchy.pop("Dolní Heršpice") + poruchy.pop("Horní Heršpice") + poruchy.pop("Komárov") + poruchy.pop("Přízřenice") + poruchy.pop("Trnitá")
poruchy["Královo Pole"] += poruchy.pop("Ponava") + poruchy.pop("Sadová")
poruchy["Tuřany"] += poruchy.pop("Dvorska") + poruchy.pop("Holásky")
poruchy = [(f"Brno-{k}", v) for k, v in poruchy.items()]
poruchy_df = pandas.DataFrame.from_records(poruchy, columns=["NAZ", "pocet"], index="NAZ")
poruchy_df
Out[41]:
pocet
NAZ
Brno-Židenice 174
Brno-Královo Pole 170
Brno-Slatina 133
Brno-Líšeň 121
Brno-Bohunice 102
Brno-Žabovřesky 101
Brno-Komín 97
Brno-Bystrc 89
Brno-Kohoutovice 87
Brno-Černovice 71
Brno-Nový Lískovec 58
Brno-Starý Lískovec 57
Brno-Jundrov 31
Brno-Medlánky 20
Brno-Žebětín 20
Brno-Bosonohy 19
Brno-Chrlice 15
Brno-Jehnice 14
Brno-Tuřany 14
Brno-Kníničky 6
Brno-Ivanovice 12
Brno-Ořešín 5
Brno-Řečkovice a Mokrá Hora 78
Brno-Maloměřice a Obřany 59
Brno-střed 605
Brno-Útěchov 7
Brno-sever 365
Brno-jih 134

Tento nový rámec teď můžeme spojit s mapovými podklady. Výchozí spojování je po řádcích, proto musíme určit osu.

In [43]:
brno_s_poruchami = pandas.concat([brno, poruchy_df], sort=False, axis=1)
brno_s_poruchami
Out[43]:
OBJECTID KOD_MOaMC NAZ_ZKR_MO NAZ_MOaMC KOD_OBEC NAZ_OBEC KOD_ZUJ NAZ_ZUJ KOD_OKRES KOD_LAU1 ... KOD_KRAJ KOD_CZNUTS NAZ_CZNUTS SX SY SHAPE_Leng SHAPE_Area geometry coords pocet
Brno-střed 69 550973 Brno-střed Brno-střed 582786 Brno 550973 Brno-střed 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -599107.126826 -1.161208e+06 21011.712879 1.464882e+07 POLYGON ((-598972.9499999993 -1159048.82009999... (-599089.0881825134, -1161418.7800999992) 605.0
Brno-Žabovřesky 70 550990 Brno-Žabovřesky Brno-Žabovřesky 582786 Brno 550990 Brno-Žabovřesky 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -600420.609804 -1.158450e+06 10865.113284 4.348780e+06 POLYGON ((-600602.1099999994 -1157005.50010000... (-600242.0081863957, -1158264.8850999996) 101.0
Brno-Královo Pole 71 551007 Brno-Královo Pole Brno-Královo Pole 582786 Brno 551007 Brno-Královo Pole 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -598393.224288 -1.157041e+06 18814.138777 1.007402e+07 POLYGON ((-597252.6999999993 -1155051.28999999... (-598973.9478040718, -1157189.1750499997) 170.0
Brno-sever 72 551031 Brno-sever Brno-sever 582786 Brno 551031 Brno-sever 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -596387.912140 -1.156034e+06 28461.268033 1.224207e+07 POLYGON ((-596552.0500000007 -1152248.35000000... (-596332.4486210528, -1156330.1843500007) 365.0
Brno-Židenice 73 551058 Brno-Židenice Brno-Židenice 582786 Brno 551058 Brno-Židenice 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -595306.099433 -1.160699e+06 13108.262329 5.045712e+06 POLYGON ((-594706.5100000016 -1159323.91, -594... (-595741.415136773, -1160651.2446999997) 174.0
Brno-Černovice 74 551066 Brno-Černovice Brno-Černovice 582786 Brno 551066 Brno-Černovice 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -595373.018355 -1.162892e+06 10449.323314 6.291806e+06 POLYGON ((-596356.1099999994 -1161487.45010000... (-595322.4330897855, -1162854.1150499992) 71.0
Brno-jih 75 551074 Brno-jih Brno-jih 582786 Brno 551074 Brno-jih 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -598118.332968 -1.164941e+06 19718.090816 1.279240e+07 POLYGON ((-596731.120000001 -1161671.18, -5967... (-598325.5423521271, -1164508.7350499984) 134.0
Brno-Bohunice 76 551082 Brno-Bohunice Brno-Bohunice 582786 Brno 551082 Brno-Bohunice 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -600545.202641 -1.163337e+06 10195.831411 3.017709e+06 POLYGON ((-601002.7100000009 -1161967.82009999... (-600625.2344267721, -1163263.2112499997) 102.0
Brno-Starý Lískovec 77 551091 Brno-Starý Lískovec Brno-Starý Lískovec 582786 Brno 551091 Brno-Starý Lískovec 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -601824.274064 -1.163777e+06 9638.476181 3.283573e+06 POLYGON ((-601051.9600000009 -1162542.89999999... (-601873.3829225947, -1163770.700100001) 57.0
Brno-Nový Lískovec 78 551112 Brno-Nový Lískovec Brno-Nový Lískovec 582786 Brno 551112 Brno-Nový Lískovec 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -602113.027342 -1.162014e+06 5849.668623 1.654432e+06 POLYGON ((-601902.0199999996 -1161269.00010000... (-602141.5874489998, -1161991.3051000014) 58.0
Brno-Kohoutovice 79 551147 Brno-Kohoutovice Brno-Kohoutovice 582786 Brno 551147 Brno-Kohoutovice 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -602724.318354 -1.160502e+06 9945.563722 4.085491e+06 POLYGON ((-602977.370000001 -1159558.5601, -60... (-602845.8283676622, -1160474.31745) 87.0
Brno-Jundrov 80 551171 Brno-Jundrov Brno-Jundrov 582786 Brno 551171 Brno-Jundrov 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -602469.191502 -1.158802e+06 11761.802804 4.221080e+06 POLYGON ((-603188.6799999997 -1157361.87000000... (-602340.8641554874, -1158993.5900500007) 31.0
Brno-Bystrc 81 551198 Brno-Bystrc Brno-Bystrc 582786 Brno 551198 Brno-Bystrc 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -607059.680294 -1.155566e+06 39812.756010 2.724224e+07 POLYGON ((-608145.9400000013 -1150485.60000000... (-607374.9921216916, -1154503.6900500003) 89.0
Brno-Kníničky 82 551210 Brno-Kníničky Brno-Kníničky 582786 Brno 551210 Brno-Kníničky 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -606000.584398 -1.152704e+06 22000.104018 1.092800e+07 POLYGON ((-607550.8299999982 -1149918.64999999... (-605819.1174333331, -1153034.6750000007) 6.0
Brno-Komín 83 551228 Brno-Komín Brno-Komín 582786 Brno 551228 Brno-Komín 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -602024.339840 -1.156080e+06 16272.660264 7.598840e+06 POLYGON ((-602512.9499999993 -1153508.30999999... (-601832.7081711115, -1156108.9000000004) 97.0
Brno-Medlánky 84 551236 Brno-Medlánky Brno-Medlánky 582786 Brno 551236 Brno-Medlánky 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -600645.914466 -1.155057e+06 10601.740155 3.510207e+06 POLYGON ((-601463.7300000004 -1153941.05999999... (-600770.6437999412, -1154899.8100000005) 20.0
Brno-Řečkovice a Mokrá Hora 85 551244 Brno-Řečkov. a M.Hora Brno-Řečkovice a Mokrá Hora 582786 Brno 551244 Brno-Řečkovice a Mokrá Hora 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -598775.848808 -1.154307e+06 16472.916389 7.571217e+06 POLYGON ((-598721.129999999 -1153198.4201, -59... (-598767.8359843933, -1154394.9800000004) 78.0
Brno-Maloměřice a Obřany 86 551252 Brno-Maloměřice a Obř. Brno-Maloměřice a Obřany 582786 Brno 551252 Brno-Maloměřice a Obřany 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -594712.425429 -1.157349e+06 17036.942625 9.291087e+06 POLYGON ((-595813.620000001 -1154939.23, -5958... (-594459.9119527972, -1157225.0899999999) 59.0
Brno-Vinohrady 87 551279 Brno-Vinohrady Brno-Vinohrady 582786 Brno 551279 Brno-Vinohrady 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -594000.500322 -1.159879e+06 9640.930008 1.955207e+06 POLYGON ((-592737.5500000007 -1158832.30009999... (-593998.9414789472, -1159853.3806499988) NaN
Brno-Líšeň 88 551287 Brno-Líšeň Brno-Líšeň 582786 Brno 551287 Brno-Líšeň 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -591448.485685 -1.159769e+06 23753.010689 1.570760e+07 POLYGON ((-589128.0199999996 -1156195.84, -589... (-591500.1399165738, -1159344.9351000004) 121.0
Brno-Slatina 89 551295 Brno-Slatina Brno-Slatina 582786 Brno 551295 Brno-Slatina 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -592953.302418 -1.163336e+06 12221.935650 5.829742e+06 POLYGON ((-593091.3500000015 -1161596.96999999... (-592977.0980891805, -1163369.8249999993) 133.0
Brno-Tuřany 90 551309 Brno-Tuřany Brno-Tuřany 582786 Brno 551309 Brno-Tuřany 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -594104.817780 -1.166296e+06 21357.605905 1.784122e+07 POLYGON ((-595983.120000001 -1163916.359999999... (-594598.9249158911, -1166357.4499999993) 14.0
Brno-Chrlice 91 551317 Brno-Chrlice Brno-Chrlice 582786 Brno 551317 Brno-Chrlice 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -595592.270326 -1.168729e+06 16026.030228 9.492907e+06 POLYGON ((-596347.5100000016 -1166738.84, -596... (-595516.1788480217, -1168558.8000000007) 15.0
Brno-Bosonohy 92 551325 Brno-Bosonohy Brno-Bosonohy 582786 Brno 551325 Brno-Bosonohy 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -604417.861598 -1.161660e+06 13888.641269 7.147886e+06 POLYGON ((-605152.1799999997 -1160070.39009999... (-604119.7012236556, -1161715.2551000006) 19.0
Brno-Žebětín 93 551368 Brno-Žebětín Brno-Žebětín 582786 Brno 551368 Brno-Žebětín 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -606460.760666 -1.158772e+06 23206.733123 1.359924e+07 POLYGON ((-606417.8599999994 -1156672.88010000... (-606467.2769532457, -1158575.460000001) 20.0
Brno-Ivanovice 94 551376 Brno-Ivanovice Brno-Ivanovice 582786 Brno 551376 Brno-Ivanovice 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -600046.704618 -1.152829e+06 10054.771687 2.446103e+06 POLYGON ((-599444.4100000001 -1151725.62000000... (-600026.629237962, -1152798.205050001) 12.0
Brno-Jehnice 95 551406 Brno-Jehnice Brno-Jehnice 582786 Brno 551406 Brno-Jehnice 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -598347.215759 -1.151818e+06 12194.556985 4.072894e+06 POLYGON ((-597563.6400000006 -1150055.85999999... (-598684.7447784491, -1151578.1449999996) 14.0
Brno-Ořešín 96 551422 Brno-Ořešín Brno-Ořešín 582786 Brno 551422 Brno-Ořešín 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -596850.057372 -1.151235e+06 8671.946618 3.064507e+06 POLYGON ((-596615.2800000012 -1150145.77, -596... (-596828.6547211574, -1151328.875) 5.0
Brno-Útěchov 97 551431 Brno-Útěchov Brno-Útěchov 582786 Brno 551431 Brno-Útěchov 40711 CZ0642 ... 3115 CZ064 Jihomoravský kraj -595171.280371 -1.150839e+06 6203.556569 1.178099e+06 POLYGON ((-594745.6900000013 -1150536.32, -594... (-595180.3209008181, -1150669.1050000004) 7.0

29 rows × 21 columns

Nakonec můžeme vykreslit graf, ve kterém budeme definovat barvy pomocí hodnot ve sloupci pocet. Taky si přidáme legendu.

In [77]:
from matplotlib import pyplot
brno_s_poruchami.plot(figsize=(10,10), column="pocet", legend=True)
for idx, radek in brno_s_poruchami.iterrows():
    pyplot.annotate(s=radek["NAZ_MOaMC"], xy=radek["coords"], horizontalalignment="center")

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.