Odcinek 15/15– jednoplikiowa apka raportowa (CSV → KPI → wykresy → raporty)

foto kurs pythona odcinek 15

Co to robi

Program czyta plik CSV ze sprzedażą, sprawdza dane, liczy KPI, rysuje wykresy, zapisuje wyniki (CSV/Excel/JSON) i drukuje czytelne podsumowanie w konsoli.


1) Wymagania (co musisz mieć)

  • Python 3.10+
  • Biblioteki: pip install pandas matplotlib openpyxl openpyxl jest tylko do zapisu Excela – jak nie chcesz Excela, możesz to pominąć i uruchomić z --no-excel.

2) Dane wejściowe (twój CSV)

Utwórz plik sprzedaz.csv i wklej np. to (UTF-8, przecinki):

data,miasto,produkt,ilosc,cena
2025-01-03,Warszawa,Kawa,3,18.5
2025-01-03,Gdańsk,Herbata,2,12
2025-01-05,Poznań,Kawa,1,19
2025-01-06,Warszawa,Czekolada,5,7.5
2025-01-07,Gdańsk,Kawa,4,18.5
2025-01-12,Warszawa,Herbata,3,12
2025-01-17,Poznań,Czekolada,10,7.5
2025-01-25,Warszawa,Kawa,6,18.5

3) Struktura katalogu (prosto)

projekt_raport/
  app.py          <- plik z kodem
  sprzedaz.csv    <- dane
  out/            <- tu wylądują wyniki (folder zrobi się sam)

4) Jak uruchomić

W terminalu (będąc w folderze projektu):

python app.py --input sprzedaz.csv --out out

Dodatkowe opcje:

  • --sep ";" – jeśli CSV ma średniki,
  • --encoding "cp1250" – jeśli masz inne kodowanie,
  • --no-excel – jeśli nie chcesz pliku Excel.

Po uruchomieniu pojawi się folder out/ z:

  • dane_wzbogacone.csv (oryginał + wyliczony przychód, miesiąc),
  • top_miasta.csv, top_produkty.csv, miesiecznie.csv, dziennie.csv,
  • raport.xlsx (jeśli nie wyłączyłeś/aś),
  • kpi.json (krótkie podsumowanie liczb),
  • wykres_top_miasta.png, wykres_miesiecznie.png, wykres_dziennie.png.

5) Co robi kod – krok po kroku, po ludzku

(A) Wczytanie i walidacja

  • load_csv(...) – otwiera CSV. Jeśli pliku brak albo separator/kodowanie nie gra – dostaniesz jasny komunikat.
  • validate_df(df):
    • sprawdza, czy są wymagane kolumny: data, miasto, produkt, ilosc, cena,
    • czyści tekst: obcina spacje, ujednolica miasta (np. warszawaWarszawa),
    • zamienia kolumny na właściwe typy: data → daty, ilosc/cena → liczby,
    • jeśli są braki (NaN) – wypisze ile i wyrzuci te wiersze,
    • jeśli ilosc lub cenaujemne – usuwa takie rekordy (to „sanity check”).

Po tym kroku masz czysty, spójny zestaw danych.

(B) Wzbogacenie danych + KPI

  • enrich(df):
    • liczy przychod = ilosc * cena,
    • robi kolumnę miesiac (przydatne do raportów miesięcznych).
  • compute_kpi(df):
    • zwraca słownik z liczbami:
      • sztuki_sum – suma sprzedanych sztuk,
      • przychod_sum – łączny przychód,
      • transakcje – ile wierszy (rekordów),
      • srednia_cena – średnia cena,
      • sredni_koszyk_pln – przychód / liczba transakcji.

(C) Raporty tabelaryczne

  • build_reports(df) tworzy 4 tabele:
    • top_miastaprzychód zgrupowany po mieście, malejąco,
    • top_produktysuma sztuk po produkcie, malejąco,
    • miesiecznieprzychód per miesiąc (chronologicznie),
    • dziennieprzychód per dzień (puste dni uzupełnione zerami).

(D) Zapisy wyników

  • save_outputs(...):
    • zapisuje wzbogacone dane do dane_wzbogacone.csv,
    • zapisuje każdy raport do osobnego CSV,
    • (opcjonalnie) pakuje wszystko do Excela (osobne arkusze),
    • zapisuje KPI do kpi.json (ładny, czytelny JSON).

(E) Wykresy

  • make_plots(...) tworzy 3 obrazki:
    • słupki: Przychód wg miast,
    • linia: Przychód miesięczny + średnia krocząca (3),
    • linia: Przychód dzienny.
  • Każdy wykres ma tytuł i opisy osi; zapisywany jest do PNG.

(F) Czytelny wydruk w konsoli

  • print_console_summary(...) drukuje na ekran:
    • najważniejsze KPI w wierszach,
    • TOP miasta z prostym „paskiem” (ASCII) – od razu widać, kto prowadzi.

6) Co zobaczysz w konsoli (przykładowo)

=== PODSUMOWANIE ===
Suma sztuk:         34
Suma przychodu:     715.50 PLN
Liczba transakcji:  8
Śr. cena:           14.69 PLN
Śr. wartość koszyka:89.44 PLN

TOP miasta (przychód):
Warszawa     ████████████████████████████████████  ...
Gdańsk       ██████████████████████               ...
Poznań       ███████████████                      ...

(paski są skalowane do najlepszego miasta, żeby było proporcjonalnie)


7) Typowe problemy i szybkie naprawy

  • „Plik nie istnieje” – sprawdź ścieżkę i nazwę (--input).
  • Złe separator/kodowanie – użyj --sep ";" albo --encoding "cp1250".
  • Brakuje kolumn – CSV musi mieć: data, miasto, produkt, ilosc, cena.
  • SettingWithCopyWarning – w kodzie modyfikujemy przez loc, więc nie powinno wyskakiwać; jeśli dorobisz własne operacje, też używaj df.loc[...,"kol"] = ....
  • Excel nie zapisuje – doinstaluj openpyxl albo uruchom z --no-excel.

8) Jak to rozbudować (łatwe pomysły)

  • Filtr dat: dodaj opcje --date-from / --date-to i przed raportami wyfiltruj: df = df[(df["data"] >= data_od) & (df["data"] <= data_do)]
  • TOP-N: dorzuć --top 10 i bierz .head(top) przy drukowaniu/wykresach.
  • Tryb interaktywny: proste input() z menu (np. „1 – TOP miasta, 2 – miesięcznie”).
  • Logi do pliku: moduł logging i zapis czasu + błędów do out/run.log.
  • Schemat w JSON/YAML: lista kolumn i typów – walidujesz przed obróbką.

9) Checklista przed wysłaniem raportu

  • CSV otwiera się bez błędów (ścieżka, separator, kodowanie).
  • Wymagane kolumny są; braki i ujemne wartości obsłużone.
  • KPI mają sens (np. przychód nie ujemny).
  • Wykresy mają tytuł i osie i zapisują się do PNG.
  • Pliki CSV/Excel otwierają się w arkuszu bez „krzaczków” (UTF-8).

Masz już wszystko

Ta apka to gotowy szkielet. Wrzucasz swój CSV, odpalasz, a ona:

  1. sprząta dane,
  2. liczy KPI,
  3. buduje raporty/wykresy,
  4. zapisuje wyniki,
  5. drukuje podsumowanie.

Masz gotową mini-apkę raportową, która łączy umiejętności z całego kursu: wczytywanie i czyszczenie danych, logiczne decyzje i pętle, funkcje, moduły, wyjątki, operacje na plikach oraz podstawową analitykę i wizualizację. To nie jest „zabawka” — to szkielet, który łatwo rozbudujesz pod własne dane i potrzeby.

Dziękuję za wspólną drogę przez 15 odcinków.