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 kolumnadatajest 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
- Raport miesiąc po miesiącu: użyj
resample("M"), narysuj słupki. - Funkcja
top(df, kolumna, n=3)– zwróci top 3 miasta po przychodzie. - Dodaj kolumnę
koszti policz marżę(przychod - koszt)/przychod. - Wczytaj duży CSV, wybierając tylko potrzebne kolumny (
usecols) i typy (dtype). - 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.

