Odcinek 14/15 – Mini-projekty z danymi: od CSV do prostego „dashboardu”

foto kurs pythona odcinek 14

Cel:
Weźmiemy zwykły plik z danymi sprzedażowymi (CSV), wczytamy go do Pythona, policzymy podstawowe liczby (KPI), zrobimy wykresy i prosty raport w konsoli.
Każdy krok jest dokładnie opisany i możesz go skopiować 1:1.


1) Dane startowe – plik CSV

Najpierw przygotuj plik sprzedaz.csv (np. w Notatniku). Wklej do niego:

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

Zapisz plik obok swojego skryptu Pythona.


2) Wczytanie i szybkie czyszczenie

import pandas as pd

df = pd.read_csv("sprzedaz.csv", encoding="utf-8")     # wczytaj dane
df["data"] = pd.to_datetime(df["data"], errors="coerce")  # zamień tekst na daty
df["przychod"] = df["ilosc"] * df["cena"]                 # nowa kolumna: przychód

print(df.head())   # podgląd pierwszych 5 wierszy
print(df.info())   # typy kolumn i liczba wierszy

Co tu robimy:

  • read_csv – otwieramy plik CSV.
  • to_datetime – upewniamy się, że kolumna data jest prawdziwą datą.
  • Dodajemy kolumnę przychod (ilość × cena).

3) Pierwsze liczby – KPI (kluczowe wskaźniki)

sprzedaz_sum = df["ilosc"].sum()
przychod_sum = df["przychod"].sum()
srednia_cena = df["cena"].mean()

print("Suma sztuk:", sprzedaz_sum)
print("Suma przychodu:", round(przychod_sum, 2))
print("Średnia cena:", round(srednia_cena, 2))

W jednym spojrzeniu wiesz: ile sprzedano sztuk, jaki był łączny przychód i średnia cena produktu.


4) Raport: miasta, produkty, sprzedaż w czasie

# Top miasta wg przychodu
top_miasta = (df.groupby("miasto")["przychod"]
                .sum()
                .sort_values(ascending=False))
print("\nTOP miasta (przychód):\n", top_miasta)

# Top produkty wg sprzedanych sztuk
top_produkty = (df.groupby("produkt")["ilosc"]
                  .sum()
                  .sort_values(ascending=False))
print("\nTOP produkty (sztuki):\n", top_produkty)

# Przychód dzień po dniu
dziennie = (df.set_index("data")
              .resample("D")["przychod"]
              .sum()
              .fillna(0))
print("\nSprzedaż dzienna (podgląd):\n", dziennie.head(10))

Co tu robimy:

  • groupby – grupuje dane np. po mieście lub produkcie.
  • resample("D") – liczy przychód dla każdego dnia (D = day).

5) Wykresy – słupki i linia trendu

import matplotlib.pyplot as plt

# Słupki: przychód wg miast
top_miasta.plot(kind="bar", title="Przychód wg miast")
plt.xlabel("Miasto")
plt.ylabel("Przychód (PLN)")
plt.tight_layout()
plt.show()

# Linia: przychód dzienny + średnia krocząca z 3 dni
dziennie.plot(title="Przychód dzienny")
dziennie.rolling(3).mean().plot()  # wygładzona linia
plt.xlabel("Data")
plt.ylabel("Przychód (PLN)")
plt.legend(["Dziennie", "Średnia(3)"])
plt.tight_layout()
plt.show()

Tipy:

  • rolling(3).mean() – uśrednia dane, dzięki czemu wykres jest gładszy.
  • tight_layout() – automatycznie dba o odstępy.

6) „Dashboard” w konsoli

Prosty raport w terminalu, bez otwierania okna wykresu.

def kreski(n, znak="█"):
    return znak * int(n)

def dash_konsola(df):
    total_qty = df["ilosc"].sum()
    total_rev = df["przychod"].sum()
    print("\n=== RAPORT DZIENNY ===")
    print(f"Sztuk razem: {total_qty}")
    print(f"Przychód razem: {total_rev:.2f} PLN")

    print("\nTop miasta (przychód):")
    top = (df.groupby("miasto")["przychod"]
             .sum()
             .sort_values(ascending=False).head(5))
    mmax = top.max()
    for m, v in top.items():
        pasek = kreski(v / mmax * 40)   # skala paska
        print(f"{m:<12} {pasek} {v:.0f}")

dash_konsola(df)

Wynik to szybki, tekstowy raport z mini-„wykresami” w terminalu.


7) Dokładniejsze sprzątanie danych

# Usuwanie duplikatów
dups = df.duplicated().sum()
df = df.drop_duplicates()
print("Usunięto duplikatów:", dups)

# Filtrowanie skrajnych wartości (1% skrajnych)
q_low, q_hi = df["przychod"].quantile([0.01, 0.99])
df = df[(df["przychod"] >= q_low) & (df["przychod"] <= q_hi)]

# Łączenie z tabelą stawek VAT
slownik_vat = pd.DataFrame({
    "produkt": ["Kawa","Herbata","Czekolada"],
    "vat": [0.23, 0.08, 0.05]
})
df = df.merge(slownik_vat, on="produkt", how="left")
df["brutto"] = df["przychod"] * (1 + df["vat"])

8) Zapis wyników – CSV, Excel, wykres

# Eksport raportu
raport = pd.DataFrame({
    "miasto": top_miasta.index,
    "przychod": top_miasta.values
})
raport.to_csv("raport_miasta.csv", index=False)

# Excel (wymaga openpyxl: pip install openpyxl)
with pd.ExcelWriter("raport.xlsx") as xls:
    df.to_excel(xls, sheet_name="dane", index=False)
    raport.to_excel(xls, sheet_name="miasta", index=False)

# Zapis wykresu do pliku
# plt.savefig("wykres.png", dpi=150, bbox_inches="tight")

9) Ćwiczenia dla Ciebie

  1. Raport miesiąc po miesiącu: użyj resample("M"), narysuj słupki.
  2. Funkcja top(df, kolumna, n=3) – zwróci top 3 miasta po przychodzie.
  3. Dodaj kolumnę koszt i policz marżę (przychod - koszt)/przychod.
  4. Wczytaj duży CSV, wybierając tylko potrzebne kolumny (usecols) i typy (dtype).
  5. Zapisz główne liczby (łączne przychody, datę raportu) do zwykłego raport.txt.

Co już umiesz po odcinku 14

  • Wczytać CSV, zamienić kolumnę na datę i wyliczyć KPI.
  • Grupować dane, liczyć sumy i średnie, rysować wykresy.
  • Napisać mały dashboard w konsoli i zapisać wyniki do CSV/Excel.
  • Poradzić sobie z duplikatami, skrajnymi wartościami i łączeniem tabel.