Dashboard: Power BI va Streamlit
Hisobot va dashboard farqi
Hisobot bitta savolga bir marta javob beradi ("iyunda nima bo'ldi"). Dashboard bir nechta doimiy savolga har kuni javob beradi ("hozir qanday ketyapti"). Dashboard o'zi hech narsa tushuntirmaydi: u ko'rsatadi, va odam savol berganda filtrlaydi. Shuning uchun dashboard hisobotdan oldin emas, keyin quriladi: avval qaysi savollar har hafta takrorlanishini bilish kerak.
Bozor.uz rahbari har dushanba so'raydigan savollar va ularning dashboarddagi o'rni:
| Savol (har hafta) | Metrika | Vizual | Filtr |
|---|---|---|---|
| Qancha sotdik? | Savdo (yetkazilgan), buyurtmalar, AOV | KPI karta | Oy, hudud, kanal |
| Qayerga ketyapmiz? | Oylik savdo | Chiziqli | Oy oralig'i |
| Qaysi hudud? | Hudud bo'yicha savdo | Gorizontal ustun, tartiblangan | — |
| Nima sotilyapti? | Kategoriya bo'yicha savdo | Ustun | Oy |
| Muammo bormi? | Bekor foizi to'lov bo'yicha | Ustun | Oy |
Beshta savol, beshta vizual, bitta sahifa. O'ninchi vizual "qiziq bo'lgani uchun" qo'shilmaydi.
import matplotlib.patches as patches f, ax = plt.subplots(figsize=(10, 5.6)); ax.set_xlim(0, 100); ax.set_ylim(0, 60); ax.axis("off") def box(x, y, w, h, t, c="#eef2f7"): ax.add_patch(patches.FancyBboxPatch((x, y), w, h, boxstyle="round,pad=0.4", facecolor=c, edgecolor="#9aa5b1")) ax.text(x + w / 2, y + h / 2, t, ha="center", va="center", fontsize=10) box(1, 2, 16, 56, "FILTRLAR\n\nOy oralig'i\nHudud\nKanal", "#f7f7f7") box(19, 52, 80, 6, "SARLAVHA: Bozor.uz savdo, 2025 | yangilangan: sana", "#ffffff") for i, t in enumerate(["Savdo\n33.5 mlrd", "Buyurtmalar\n18 661", "O'rtacha chek\n1.79 mln", "Bekor\n3.8%"]): box(19 + i * 20.5, 42, 18.5, 8, t, "#dbe7f5") box(19, 22, 48, 18, "OYLIK SAVDO (chiziqli)\ntrend, mavsumiylik", "#eef2f7") box(69, 22, 30, 18, "HUDUD BO'YICHA\n(gorizontal ustun, top 8)") box(19, 2, 38, 18, "KATEGORIYA BO'YICHA (ustun)") box(59, 2, 40, 18, "BEKOR FOIZI, TO'LOV USULI (ustun)") fig("layout.png", "Bitta sahifa, yuqoridan pastga: filtrlar chapda, KPI kartalar tepada (eng muhim raqamlar), trend o'rtada, bo'linishlar pastda. Ko'z shu tartibda o'qiydi: avval 'qancha', keyin 'qayerga', keyin 'nima uchun'.")

Bitta sahifa, yuqoridan pastga: filtrlar chapda, KPI kartalar tepada (eng muhim raqamlar), trend o'rtada, bo'linishlar pastda. Ko'z shu tartibda o'qiydi: avval 'qancha', keyin 'qayerga', keyin 'nima uchun'.
Power BI ni o'rnatish
Power BI Desktop bepul va faqat Windows da ishlaydi. Uch xil o'rnatish yo'li bor; qaysi biri ishlashi kompyuteringizga bog'liq.
1. Buyruq bilan (eng tez). Windows Terminal yoki PowerShell ni oching va bitta qatorni yozing:
winget install --id Microsoft.PowerBI
Bu kitob tayyorlanayotganda shu buyruq PBIDesktopSetup-2026-08_x64.exe ni yuklab oldi (661 MB) va 2.157.1354.0 versiyasini o'rnatdi. Diskda 2.7 GB egallaydi. O'rnatish administrator huquqini so'raydi: ekranda UAC oynasi chiqadi, "Ha" bosiladi. Tugagach dastur C:\Program Files\Microsoft Power BI Desktop\bin\PBIDesktop.exe da bo'ladi.
2. Microsoft Store. Store ni ochib "Power BI Desktop" ni qidiring → Get. Administrator huquqi shart emas va yangilanishlar avtomatik keladi. Korporativ kompyuterda Store yopiq bo'lishi mumkin.
3. Saytdan. powerbi.microsoft.com/desktop → "Download free" → PBIDesktopSetup_x64.exe. Bu yo'l internet cheklangan tarmoqlarda qulay: faylni bir marta yuklab, boshqa kompyuterlarga ko'chirish mumkin.
Tekshirish (PowerShell):
(Get-Item 'C:\Program Files\Microsoft Power BI Desktop\bin\PBIDesktop.exe').VersionInfo.ProductVersion
| Talab | Qiymat |
|---|---|
| Operatsion tizim | Windows 10 yoki 11, 64-bit (Windows Server 2019+ ham) |
| Xotira | Kamida 4 GB; 20 000 qatorli bizning dataset uchun yetarli, million qatorlarda 16 GB |
| Disk | Dastur 2.7 GB + ma'lumot va kesh uchun bir necha GB |
| Ekran | 1440 × 900 dan katta |
| Hisob | O'rnatish va mahalliy ishlash uchun shart emas |
| Narx | Desktop bepul; faqat internetda ulashish (Service) pullik bo'lishi mumkin |
Ro'yxatdan o'tish kerakmi? Yo'q. Excel, CSV, SQLite yoki SQL Server dan ma'lumot olib, model qurib, dashboard yasash uchun kirish shart emas: "Sign in" tugmasini bosmasangiz ham hamma narsa ishlaydi. Kirish faqat Publish (Power BI Service ga chiqarish) uchun kerak, va u yerda shaxsiy gmail/outlook qabul qilinmaydi: ish yoki o'quv muassasasi elektron pochtasi (@kompaniya.uz, @universitet.uz) talab qilinadi. Kursda buni bilib qo'yish yetarli; dashboard ni .pbix fayl sifatida yuborish ham mumkin.
Windows bo'lmasa. Power BI Desktop macOS va Linux uchun yo'q. Uch variant: (1) Windows virtual mashinasi (Parallels, VMware, VirtualBox), (2) brauzerdagi Power BI Service (ish hisobi kerak, mahalliy fayldan model qurish cheklangan), (3) shu bobning ikkinchi yarmi: Streamlit, u har uch tizimda ishlaydi. Kurs uchun uchinchi variant to'liq yetarli.
Til. File → Options and settings → Options → Regional settings → Application language. O'zbek tili yo'q; ingliz tilida qoldiring, chunki hamma darslik, forum javobi va ish e'loni ingliz atamalarida yozilgan (bu kitob ham).
Yangilanish. Power BI Desktop har oy yangilanadi (2026-08 = 2.157). Store yoki winget varianti o'zi yangilaydi, saytdan o'rnatilgani esa yangi versiyani qo'lda so'raydi. Kurs davomida versiya farqi muhim emas: menyular joyi yiliga bir-ikki marta o'zgaradi, mantiq o'zgarmaydi.
Power BI: bosqichma-bosqich
Quyidagi qadamlar dokon_savdo.xlsx bilan 60–90 daqiqa oladi. Rasmlar shu kitob uchun Power BI Desktop 2.157 (2026-08) da olingan; menyular yiliga bir-ikki marta joyini o'zgartiradi, mantiq o'zgarmaydi.
1. Ma'lumot olish. Home → Get Data → Excel workbook → dokon_savdo.xlsx → Navigator da beshta varaqni belgilang (orders, customers, products, order_items, regions) → Transform Data (Load emas: avval tozalash).
2. Power Query: turlar. Har jadvalda ustun sarlavhasidagi belgi turni ko'rsatadi. orders: order_date → Date, total_amount → Whole Number, delivery_days → Whole Number (null lar qoladi). order_items: unit_price → Whole Number. Query Settings → Applied Steps da har o'zgarish yozilib boradi: bu 18-bobdagi tozalash logi, avtomatik. Close & Apply.
3. Model: bog'lanishlar. Model view (chapda uchinchi belgi). Power BI ko'pincha kalitlarni o'zi topadi; tekshiring, to'rtta bog'lanish bo'lishi kerak, hammasi "bir → ko'p" (1 → *):
| Bir (dimension) | Ko'p (fact) | Kalit |
|---|---|---|
| customers | orders | customer_id |
| regions | customers | region_id |
| products | order_items | product_id |
| orders | order_items | order_id |

Power BI Model view: regions, customers, products, orders, order_items va Sana jadvallari, ular orasidagi besh bog'lanish 1 va * belgilari bilan
Yuqoridagi rasm shu kursning tayyor loyihasidan olingan: har chiziqda bir uchida 1, ikkinchisida * turadi. Chiziqning yo'nalishi (strelka) filtr qaysi tomonga oqishini bildiradi.
Bu yulduz sxema: markazda fakt jadvali (orders, order_items), atrofida ta'rif jadvallari. 3-bobdagi PK/FK ning o'zi. Bog'lanish yo'nalishi (filter direction) "Single" qoladi: filtr "bir" tomondan "ko'p" tomonga oqadi (hudud tanlansa, mijozlar, keyin buyurtmalar filtrlanadi).
4. Sana jadvali. Modeling → New table:
Sana = CALENDAR(DATE(2025,1,1), DATE(2025,12,31))
Keyin Sana[Date] → orders[order_date] bog'lanish, va Modeling → Mark as date table. Bu vaqt funksiyalari (oy, chorak, o'tgan davr) uchun shart. Ustunlar: Oy = FORMAT(Sana[Date], "yyyy-MM"), Hafta kuni = FORMAT(Sana[Date], "ddd").
5. O'lchovlar (DAX measures). Modeling → New measure. Har metrika bitta o'lchov, 25-bobdagi metrika kartasining Power BI dagi ko'rinishi:
Savdo = CALCULATE(SUM(orders[total_amount]), orders[status] = "delivered") Buyurtmalar = CALCULATE(COUNTROWS(orders), orders[status] = "delivered") AOV = DIVIDE([Savdo], [Buyurtmalar]) Bekor foizi = DIVIDE(CALCULATE(COUNTROWS(orders), orders[status] = "cancelled"), COUNTROWS(orders)) Savdo oldingi oy = CALCULATE([Savdo], DATEADD(Sana[Date], -1, MONTH)) Oyma-oy % = DIVIDE([Savdo] - [Savdo oldingi oy], [Savdo oldingi oy]) Mijozlar = CALCULATE(DISTINCTCOUNT(orders[customer_id]), orders[status] = "delivered")
CALCULATE(hisob, filtr) DAX ning asosiy funksiyasi: SQL dagi WHERE ni o'lchov ichiga qo'yadi. DIVIDE nolga bo'lishda xato o'rniga bo'sh qaytaradi. O'lchov ustun emas: u har vizualda, har filtrda qayta hisoblanadi (pandas groupby ni Power BI o'zi bajaradi).
6. Vizuallar (Report view, Visualizations paneli). Layout rasmidagi tartibda:
| Vizual | Turi | Maydonlar |
|---|---|---|
| 4 KPI | Card (yoki yangi Card) | [Savdo], [Buyurtmalar], [AOV], [Bekor foizi] |
| Oylik savdo | Line chart | X: Sana[Oy], Y: [Savdo] |
| Hudud | Clustered bar chart | Y: regions[region], X: [Savdo]; Sort by Savdo descending |
| Kategoriya | Clustered column chart | X: products[category], Y: Tovar savdosi (order_items uchun alohida o'lchov: SUMX(order_items, order_items[quantity] * order_items[unit_price]), item_status = "delivered" filtri bilan) |
| Bekor | Clustered column chart | X: orders[payment_method], Y: [Bekor foizi] |
| Filtrlar | Slicer ×3 | Sana[Oy] (Between), regions[region], customers[channel] |
Format (bo'yoq mo'yqalami belgisi): sarlavha xulosa bilan ("Oylik savdo: dekabr rekord"), o'q birligi (Display units: Millions), ranglar 22-bobdagi qoida (bitta rang, urg'u uchun ikkinchisi), Data labels faqat KPI va ustunlarda.
7. Tekshiruv. Dashboard raqamlari kitob raqamlari bilan mos kelishi shart: Savdo 33.48 mlrd, buyurtmalar 18 661, AOV 1.79 mln, bekor 3.8%. Mos kelmasa, sabab 99% holda filtr (status) yoki bog'lanish yo'nalishi. Bu "birinchi kun" tekshiruvi har dashboardda: ma'lum javobli savol bilan solishtirish.

Power BI hisoboti: 4 KPI karta (33bn, 19K, 2M, 3.8%), oylik savdo chizig'i, hudud bo'yicha gorizontal ustun, kategoriya va bekor foizi ustunlari, chapda uchta slicer
Tayyor sahifa shunday ko'rinadi. Kartalardagi raqamlar kitobning boshqa boblari bilan bir xil: 33 mlrd savdo, 18.7 ming buyurtma, 1.79 mln o'rtacha chek (kartada 2M deb qisqartirilgan), 3.8% bekor. Chiziqda iyun chuqurligi va dekabr cho'qqisi, ustunlarda Elektronika ustunligi va naqd to'lovning yuqori bekor foizi ko'rinadi: birinchi bobdagi olti sirning to'rttasi bitta sahifada.
8. Ulashish. File → Publish → Power BI Service (bepul akkaunt, ish emaili kerak) yoki .pbix faylni yuborish (Power BI Desktop bilan ochiladi). Yangilanish: Service da Scheduled refresh, fayl OneDrive/SharePoint da bo'lsa avtomatik.
Tayyor loyiha: powerbi/BozorUz.pbip
Kurs papkasida shu dashboardning tayyor varianti bor. Ikki fayl turini ajratib oling:
| Format | Nima | Qachon |
|---|---|---|
.pbix |
Bitta ikkilik (binary) fayl: model, ma'lumot va hisobot birga | Odatiy ish; pochta orqali yuboriladi |
.pbip |
Papka: BozorUz.SemanticModel/model.bim (model, DAX, M so'rovlar) va BozorUz.Report/report.json (vizuallar) — hammasi matn |
Git bilan versiyalash, farqni ko'rish, kod bilan yaratish |
.pbip matn bo'lgani uchun uni dastur yozishi mumkin. Shu kursning loyihasi powerbi/make_pbip.py bilan yaratilgan: 6 jadval, 8 DAX o'lchov, 5 bog'lanish va 11 vizual Python kodidan chiqadi. Loyihani qayta yaratish:
python powerbi/make_pbip.py
Ochish: powerbi/BozorUz.pbip faylini Power BI Desktop bilan oching. Birinchi ochilishda ma'lumot yo'q (matn faylda faqat ta'riflar bor), shuning uchun tepadagi sariq chiziqda Refresh now ni bosing: Power BI datasets/dokon_savdo.xlsx dan 60 mingdan ortiq qatorni o'qiydi va kartalar 33bn, 19K, 2M, 3.8% ni ko'rsatadi.
Fayl yo'li FaylYoli parametrida saqlanadi (Home → Transform data → Manage parameters). Papkani boshqa kompyuterga ko'chirsangiz, shu parametrni o'zgartiring, hamma so'rovlar yangi yo'ldan o'qiydi. Bu 21-bobdagi qoidaning Power BI dagi ko'rinishi: yo'l bitta joyda, kodda emas.
Streamlit: Python bilan dashboard
Power BI bo'lmasa yoki brauzerda ochiladigan, kod bilan boshqariladigan dashboard kerak bo'lsa: Streamlit. dashboard/app.py shu kitobdagi barcha vositalar bilan yozilgan (SQL, pandas, grafik) va 90 qator:
from pathlib import Path import sqlite3 import pandas as pd import plotly.express as px import streamlit as st DB = Path(__file__).resolve().parent.parent / "datasets" / "dokon_savdo.sqlite" st.set_page_config(page_title="Bozor.uz savdo", layout="wide") @st.cache_data def load(): con = sqlite3.connect(DB) q = """SELECT o.order_id, o.order_date, o.status, o.payment_method, o.total_amount, c.channel, r.region FROM orders o JOIN customers c ON c.customer_id = o.customer_id JOIN regions r ON r.region_id = c.region_id""" df = pd.read_sql_query(q, con, parse_dates=["order_date"]) items = pd.read_sql_query("""SELECT oi.order_id, oi.quantity * oi.unit_price AS summa, p.category, oi.item_status FROM order_items oi JOIN products p ON p.product_id = oi.product_id""", con) con.close() df["oy"] = df.order_date.dt.strftime("%Y-%m") return df, items df, items = load() st.title("Bozor.uz: savdo dashboardi, 2025") with st.sidebar: # filtrlar st.header("Filtrlar") hududlar = st.multiselect("Hudud", sorted(df.region.unique()), default=[]) kanallar = st.multiselect("Kanal", sorted(df.channel.unique()), default=[]) oylar = st.select_slider("Oylar", options=sorted(df.oy.unique()), value=(df.oy.min(), df.oy.max())) f = df[(df.oy >= oylar[0]) & (df.oy <= oylar[1])] if hududlar: f = f[f.region.isin(hududlar)] if kanallar: f = f[f.channel.isin(kanallar)] yetk = f[f.status == "delivered"] c1, c2, c3, c4 = st.columns(4) # KPI kartalar c1.metric("Savdo (yetkazilgan)", f"{yetk.total_amount.sum() / 1e9:.2f} mlrd so'm") c2.metric("Buyurtmalar", f"{len(yetk):,}") c3.metric("O'rtacha chek", f"{yetk.total_amount.mean() / 1e6:.2f} mln") c4.metric("Bekor foizi", f"{100 * (f.status == 'cancelled').mean():.1f}%") left, right = st.columns([3, 2]) # trend va hudud with left: oylik = yetk.groupby("oy").total_amount.sum().reset_index(); oylik["mln"] = oylik.total_amount / 1e6 st.plotly_chart(px.line(oylik, x="oy", y="mln", markers=True, title="Oylik savdo, mln so'm"), use_container_width=True) with right: hudud = yetk.groupby("region").total_amount.sum().sort_values().reset_index(); hudud["mln"] = hudud.total_amount / 1e6 st.plotly_chart(px.bar(hudud.tail(8), x="mln", y="region", orientation="h", title="Hudud bo'yicha savdo (top 8)"), use_container_width=True) left, right = st.columns(2) # kategoriya va bekor with left: it = items[items.order_id.isin(yetk.order_id) & (items.item_status == "delivered")] kat = it.groupby("category").summa.sum().sort_values(ascending=False).reset_index(); kat["mln"] = kat.summa / 1e6 st.plotly_chart(px.bar(kat, x="category", y="mln", title="Kategoriya bo'yicha savdo"), use_container_width=True) with right: bekor = f.assign(bekor=f.status == "cancelled").groupby("payment_method").bekor.mean().reset_index(); bekor["foiz"] = 100 * bekor.bekor st.plotly_chart(px.bar(bekor.sort_values("foiz"), x="payment_method", y="foiz", title="Bekor foizi, to'lov usuli bo'yicha"), use_container_width=True) st.caption(f"Manba: dokon_savdo.sqlite | {len(f):,} buyurtma filtrda | Savdo = status 'delivered' bo'yicha total_amount")
Ishga tushirish:
pip install streamlit plotly streamlit run dashboard/app.py
Brauzerda http://localhost:8501 ochiladi. Natija (bu rasm shu kodni ishga tushirib, brauzerdan olingan):

Streamlit dashboard: KPI kartalar, oylik savdo, hudud, kategoriya, bekor foizi
Kodning tuzilishi Power BI qadamlari bilan bir xil: (1) ma'lumot SQL bilan olinadi (load, va @st.cache_data uni bir marta o'qib xotirada saqlaydi), (2) filtrlar yon panelda (st.sidebar, Power BI slicer), (3) KPI (st.metric, Card), (4) grafiklar (plotly.express, interaktiv: hover da raqam, zoom), (5) izoh (st.caption): manba va ta'rif. Har filtr o'zgarganda butun skript qayta ishlaydi: Streamlit ning modeli shu, va kichik ma'lumotda bu yetarli.
Ulashish: kodni GitHub ga qo'yib, share.streamlit.io (Streamlit Community Cloud, bepul) da repo ni ko'rsatish; 5 daqiqada ochiq havola. Ma'lumot fayli ham repo da bo'lishi kerak (yoki baza havolasi st.secrets da).
Power BI yoki Streamlit
| Mezon | Power BI | Streamlit |
|---|---|---|
| Kim quradi | Kod bilmaydigan analitik ham | Python biladigan analitik |
| Interaktivlik | Har vizual bir-birini filtrlaydi (cross-filter) bepul | Faqat siz yozgan filtrlar |
| Katta ma'lumot | Millionlab qator, siqilgan model | Xotirada; ~1 mln qatorgacha qulay |
| Ulashish | Power BI Service (litsenziya kompaniyada bo'lsa) | Har qanday server, bepul cloud |
| Nazorat | Ko'rinish chegaralangan, "standart" | Har piksel siz aytganday; statistika, model, matn |
| Ish bozori | O'zbekistonda "BI analyst" e'lonlarida Power BI eng ko'p | Startap, data science guruhlari |
Qoida: kompaniyada Power BI bo'lsa Power BI (odamlar o'rganib bo'lgan). Bo'lmasa yoki tahlil murakkab bo'lsa (A/B test natijasi, bashorat oralig'i, matnli izoh) Streamlit. Ikkalasini bilish intervyuda ustunlik.
Dashboard xatolari
| Xato | Nima bo'ladi | Himoya |
|---|---|---|
| 15 ta vizual | Hech kim qaramaydi | 5–6 vizual, qolgani ikkinchi sahifada |
| Ta'rif yo'q | "Savdo" bu yerda 33, moliya hisobotida 36 | Izohda ta'rif: "Savdo = delivered total_amount" |
| Filtr holati ko'rinmaydi | Rahbar "Buxoro" filtrini unutib, "savdo tushdi" deydi | Sarlavhada faol filtrlar; "hammasi" tugmasi |
| Yangilanish sanasi yo'q | Ikki hafta eski raqamga qarab qaror | "Yangilangan: ..." har sahifada |
| Pie va 3D | 22-bob | Ustun, chiziq |
| Raqam formatlanmagan | 33476904000 | 33.5 mlrd; Display units |
| Ma'lum javob bilan tekshirilmagan | Bog'lanish noto'g'ri, summa 3 marta katta (3-bob JOIN tuzog'i) | Birinchi kun: 5 ta ma'lum raqam bilan solishtirish |
| Dashboard hisobot o'rnida | "Nega tushdi?" ga dashboard javob bermaydi | Dashboard + oylik 1 sahifali hisobot (31-bob) |
Xulosa
| Tushuncha | Asosiy fikr |
|---|---|
| Dashboard nima | Takrorlanadigan savollarga doimiy javob; hisobotdan keyin quriladi |
| Loyiha | Savol → metrika → vizual → filtr jadvali; bitta sahifa, 5–6 vizual |
| O'rnatish | winget install --id Microsoft.PowerBI, Store yoki sayt; Windows kerak, hisob shart emas |
| Power BI | Get Data → Power Query (turlar) → Model (yulduz, 1→*) → Sana jadvali → DAX o'lchovlar → vizuallar → tekshiruv |
| .pbix va .pbip | Ikkilik bitta fayl / matnli papka; .pbip ni kod yaratadi va git ko'radi |
| DAX | CALCULATE, DIVIDE, DATEADD, DISTINCTCOUNT, SUMX; o'lchov ustun emas |
| Streamlit | SQL + pandas + plotly + st.*; 90 qator; streamlit run |
| Tanlov | Kompaniyada nima bor: Power BI; murakkab tahlil, bepul ulashish: Streamlit |
| Tekshiruv | Ma'lum javobli 5 raqam bilan solishtirish; ta'rif va yangilanish sanasi sahifada |
Talaba ishi
- Power BI Desktop ni o'rnating (uch yo'ldan biri) va yuqoridagi 8 qadamni bajaring. Tekshiruv raqamlari mos keldimi? Mos kelmagan bo'lsa, qaysi qadamda xato edi? Keyin
powerbi/BozorUz.pbipni ochib o'zingiznikiga solishtiring: qaysi o'lchov boshqacha yozilgan? - Streamlit ilovasiga oltinchi vizual qo'shing: kanal bo'yicha mijozlar soni va buyurtma per mijoz (hikoya 4). Qaysi qatorda qo'shildi, nega o'sha joyda?
st.metricgadelta=qo'shing: joriy oy vs oldingi oy savdo o'zgarishi. Filtr bitta oyni tanlaganda ishlashi kerak.- Ikki dashboardni bir odamga ko'rsating (Power BI va Streamlit) va 3 daqiqa kuzating: u qayerga birinchi qaradi, qaysi filtrni bosdi, nimani tushunmadi. Shu kuzatuvdan bitta o'zgarish kiriting.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.