Asosiy qismga o'tish

pandas bilan chizish: df.plot

20-bob 6 kod bloki 1172 so'z

Bu bobdagi kod shu fayllar bilan ishlaydio'z kompyuteringizda ishga tushiring

Sahna: jadval tayyor — rasm bitta qatorda

2-qismda deyarli har bobda .plot() ni ko'rdingiz: value_counts().plot(kind="bar"), oylik.plot(marker="o"). Bu — pandas ning Matplotlib ustidagi qulay qatlami. Ma'lumot DataFrame da tayyor bo'lsa, pandas ustun nomlarini legend ga, index ni x o'qiga o'zi qo'yadi. Bu bobda u nimalarni qila olishini va qayerda Matplotlib ga qaytish kerakligini ko'ramiz.

python10 qator
import numpy as np
import pandas as pd

savdo = pd.read_csv(DATA / "dokon_savdo.csv", parse_dates=["sana"], date_format="%d.%m.%Y")
savdo["tushum"] = savdo["miqdor"] * savdo["narx"]
katalog = pd.read_csv(DATA / "mahsulotlar.csv").drop_duplicates("mahsulot_id")
savdo = savdo.merge(katalog[["mahsulot_id", "kategoriya"]], on="mahsulot_id", validate="many_to_one")
oylik = savdo.pivot_table(index=savdo["sana"].dt.month, columns="kategoriya", values="tushum", aggfunc="sum") / 1e6
oylik.index.name = "oy"
oylik.round(1).head(3)
oyBakaleyaIchimliklarNon mahsulotlariSut mahsulotlari
113.64.50.710.6
210.74.50.711.2
323.59.51.420.1

Bitta qator — bitta grafik

python3 qator
ax = oylik.plot(marker="o", figsize=(9, 3.4), title="Kategoriya bo'yicha oylik tushum, mln so'm")
print(type(ax).__name__)
plt.show()
Chiqish
Axes

pandas har ustunni alohida chiziq qildi, ustun nomlarini legend ga, index ni (oy) x o'qi nomiga yozdi. Va eng muhimi — Axes qaytardi. Ya'ni pandas chizgan rasmni keyin Matplotlib bilan istagancha sozlash mumkin (ax.set_ylabel, ax.axhline...).

kind: grafik turi

python10 qator
fig, axs = plt.subplots(2, 3, figsize=(13, 6.4), layout="constrained")
yillik = oylik.sum().sort_values()
oylik.plot(ax=axs[0, 0], title="line (standart)")
yillik.plot(kind="barh", ax=axs[0, 1], color="#b06000", title="barh")
oylik.plot(kind="area", ax=axs[0, 2], title="area (ustma-ust)", legend=False)
oylik.plot(kind="box", ax=axs[1, 0], title="box", rot=20)
chek = savdo.groupby("chek_id")["tushum"].sum() / 1000
chek.plot(kind="hist", bins=40, ax=axs[1, 1], color="#137333", title="hist: chek, ming so'm")
oylik.plot(kind="bar", stacked=True, ax=axs[1, 2], title="bar, stacked=True", legend=False, rot=0)
plt.show()

kind= — "line", "bar", "barh", "hist", "box", "area", "scatter", "pie". Har biri 18-bobdagi Matplotlib grafigining qisqa varianti.

ax= — qaysi chizmaga chizish. Shu argument bilan pandas grafiklari 19-bobdagi panjaraga joylashadi. ax= bermasangiz, pandas har safar yangi Figure yaratadi.

area va stacked=True — ustma-ust: eng yuqori chegara — jami. Tarkib (qaysi kategoriya qancha ulush) va jami bir rasmda ko'rinadi.

scatter: rang uchinchi ustun

python6 qator
kunlik = (savdo.groupby("sana").agg(tushum=("tushum", "sum"), cheklar=("chek_id", "nunique"))
          .assign(tushum=lambda d: d["tushum"] / 1e6, hafta_kuni=lambda d: d.index.dayofweek))
ax = kunlik.plot(kind="scatter", x="cheklar", y="tushum", c="hafta_kuni", cmap="viridis",
                 figsize=(8, 3.8), title="Kunlik cheklar va tushum (rang — hafta kuni, 0 = Du)")
plt.show()
print("korrelyatsiya:", kunlik["cheklar"].corr(kunlik["tushum"]).round(2))
Chiqish
korrelyatsiya: 0.84

kind="scatter" uchun x va y ustun nomlari shart. c="hafta_kuni" — nuqta rangi uchinchi ustundan, cmap — ranglar shkalasi; o'ng tomonda shkala avtomatik chiqadi. Rasm ikki narsani aytadi: cheklar ko'p kun — tushum ko'p (aloqa kuchli), va eng o'ngdagi, sariq nuqtalar — dam olish kunlari.

Ikkita shkala: secondary_y

Tushum (mln so'm) va cheklar soni (dona) — boshqa birliklar. Bitta o'qda biri tekis chiziq bo'lib qoladi (19-bob mashqi). Yechim — ikkinchi y o'qi:

python5 qator
haftalik = kunlik[["tushum", "cheklar"]].resample("W").sum()
ax = haftalik.plot(secondary_y="cheklar", figsize=(10, 3.4), title="Haftalik tushum va cheklar")
ax.set_ylabel("tushum, mln so'm")
ax.right_ax.set_ylabel("cheklar, dona")
plt.show()

secondary_y="cheklar" — shu ustun o'ng o'qda, o'z shkalasida. ax.right_ax — o'ng o'qning Axes i. Ikki shkalali grafik kuchli, lekin xavfli: o'q chegaralarini o'zgartirib, ikki chiziqni xohlagancha "mos" yoki "mos emas" ko'rsatish mumkin. Ishlatsangiz — ikkala o'qni aniq nomlang.

subplots=True: har ustun alohida

python3 qator
axs = oylik.plot(subplots=True, layout=(2, 2), figsize=(10, 5), sharex=True, legend=False,
                 title=list(oylik.columns), marker=".")
plt.show()

subplots=True — har ustun o'z chizmasida (19-bobdagi siklsiz). layout=(2, 2) — panjara shakli. Lekin e'tibor: bu yerda sharey yo'q — har chizma o'z shkalasida. Non mahsulotlari va sut mahsulotlari chiziqlari bir xil balandlikda ko'rinadi, aslida esa ular orasida 16 barobar farq bor. Solishtirish kerak bo'lsa — sharey=True qo'shing (19-bob).

pandas yoki Matplotlib?

Vaziyat Nima qulay
Jadval tayyor, tez ko'rish kerak df.plot()
Bir nechta ustun — legend kerak df.plot() (o'zi qo'yadi)
Murakkab maket, nozik sozlash fig, ax + Matplotlib, ichida df.plot(ax=ax)
Hisobot uchun yakuniy rasm Matplotlib bilan sozlangan (21-bob)

Eng yaxshi usul — ikkalasi birga: fig, ax = plt.subplots(), keyin df.plot(ax=ax), keyin ax.set_... bilan pardozlash.

Xulosa

  • df.plot() — ustunlar legend ga, index x o'qiga; Axes qaytaradi.
  • kind= — line, bar, barh, hist, box, area, scatter; stacked=True — ustma-ust.
  • ax= — panjaradagi aniq chizmaga.
  • scatter: x, y shart; c= + cmap — rang uchinchi ustundan.
  • secondary_y — boshqa birlikdagi ustun o'ng o'qda.
  • subplots=True — har ustun alohida; solishtirish uchun sharey=True ni unutmang.

Mashqlar

  1. oylik ni kind="bar" bilan, lekin har kategoriya foiz ulushida chizing (har qator yig'indisi 100).
  2. Har filialning kunlik tushumini box grafikda solishtiring (pivot_table → plot(kind="box")).
  3. kunlik scatter ida c= o'rniga s= (nuqta o'lchami) bilan cheklar sonini ko'rsating. Qaysi biri o'qilishi oson?

Javoblar

  1. oylik.div(oylik.sum(axis=1), axis=0).mul(100).plot(kind="bar", stacked=True) — 5-bobdagi ulush, pandas varianti.
  2. savdo.pivot_table(index="sana", columns="filial_id", values="tushum", aggfunc="sum").plot(kind="box").
  3. Rang yaxshiroq: odam ko'zi nuqta o'lchamlari farqini rangdan yomonroq sezadi.

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar